Struts2

Posted 蓝天的永恒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2相关的知识,希望对你有一定的参考价值。

现在Struts2慢慢退出舞台了,但是很多项目还需要用Struts2进行开发和维护,这里就简单的重新快速的掌握这门技术

Struts2的相关配置文件

    * default.properties        -- 在org/apache/struts2/目录下,代表的是配置的是Struts2的常量的值

    * struts-default.xml        -- 在Struts2的核心包下,代表的是Struts2核心功能的配置(Bean、拦截器、结果类型等)

    * struts-plugin.xml         -- 配置插件的信息

    * struts.xml                -- 重点中的重点配置,代表WEB应用的默认配置,可以配置常量,基本就配置它就可以

    * struts.properties         -- 该文件是Struts的默认配置文件  (可以配置常量 )

    * web.xml                   -- 配置前端控制器(可以配置常量)

 

注意:后加载的配置文件会覆盖掉之前加载的配置文件(在这些配置文件中可以配置常量)

 

 

Struts2核心配置文件Struts2.xml的配置入门

 

  <package>标签

如果要配置<Action>的标签,那么必须要先配置<package>标签,代表的包的概念。

包含的属性

name         包的名称,要求是唯一的,管理action配置。

extends      继承,可以继承其他的包,只要继承了,那么该包就包含了其他包的功能,一般都是继承struts-default

namespace  名称空间,一般与<action>标签中的name属性共同决定访问路径,常见的配置如下:

                * namespace=""      -- 默认的名称空间(访问的方式和namespace="/"是一样的)

                * namespace="/"     -- 根名称空间

                * namespace="/aaa"  -- 带有名称的名称空间

                * abstract          -- 抽象的。这个属性基本很少使用,值如果是true,那么编写的包是被继承的。     

 

<action>标签

 代表配置action类,包含的属性

name              和<package>标签的namespace属性一起来决定访问路径的。

class                配置Action类的全路径(默认值是ActionSupport类)

 method          Action类中执行的方法,如果不指定,默认值是execute

 

<result>标签

action类中方法执行,返回的结果跳转的页面

name      结果页面逻辑视图名称

type        结果类型(默认值是转发,也可以设置其他的值)

 

 

默认的Action和Action默认的处理类

 默认的Action

 在地址栏上输入一个不存在的action请求,程序会报404的异常。

 但是在<package>标签中通过<default-action-ref name="指定action标签name属性"></default-action-ref>来该请求。

 

Action默认处理类

 在地址栏上输入一个正确的action请求,但是<action>标签中的class属性没有写具体的Action类

 在<package>标签中通过<default-class-ref class="指定action类的全路径"></default-class-ref>

 

Struts2配置常用的常量

可以在Struts2框架中的哪些配置文件中配置常量

struts.xml

 <constant name="key" value="value"></constant>

web.xml

在StrutsPrepareAndExecuteFilter配置文件中配置初始化参数

 

struts.i18n.encoding=UTF-8            指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 

struts.action.extension=action,,       该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开

 struts.serve.static.browserCache=true     设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 

struts.configuration.xml.reload=false     当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 

struts.devMode = false                    开发模式下使用,这样可以打印出更详细的错误信息 

struts.enable.DynamicMethodInvocation = true  开启对Action的动态方法访问

 

 

指定多个struts的配置文件

在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。

为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。

可以在<package>标签中,使用<include>标签来引入其他的struts_xx.xml的配置文件。例如:

1
2
3
4
<code class="hljs xml">    <span class="hljs-tag"><span class="hljs-tag"><<span class="hljs-name"><span class="hljs-tag"><span class="hljs-name">struts<span class="hljs-tag">>
<span class="hljs-tag"><span class="hljs-tag"><<span class="hljs-name"><span class="hljs-tag"><span class="hljs-name">include<span class="hljs-tag"> <span class="hljs-attr"><span class="hljs-tag"><span class="hljs-attr">file<span class="hljs-tag">=<span class="hljs-string"><span class="hljs-tag"><span class="hljs-string">"struts-part1.xml"<span class="hljs-tag">/>
<span class="hljs-tag"><span class="hljs-tag"><<span class="hljs-name"><span class="hljs-tag"><span class="hljs-name">include<span class="hljs-tag"> <span class="hljs-attr"><span class="hljs-tag"><span class="hljs-attr">file<span class="hljs-tag">=<span class="hljs-string"><span class="hljs-tag"><span class="hljs-string">"struts-part2.xml"<span class="hljs-tag">/>
    <span class="hljs-tag"><span class="hljs-tag"></<span class="hljs-name"><span class="hljs-tag"><span class="hljs-name">struts<span class="hljs-tag">></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

 

 

实现Action的三种方式

 

Action类就是一个POJO类

POJO类:

POJO(Plain Ordinary Java Object)简单的Java对象。简单来说,没有继承某个类,没有实现接口,就是POJO的类。

 

Action类可以实现Action接口

Action接口中定义了5个常量,5个常量的值对应的是5个逻辑视图跳转页面(跳转的页面还是需要自己来配置),还定义了一个方法,execute方法。

大家需要掌握5个逻辑视图的常量

SUCCESS       -- 成功.

INPUT         -- 用于数据表单校验.如果校验失败,跳转INPUT视图.

LOGIN         -- 登录.

ERROR         -- 错误.

NONE          -- 页面不转向.

 

Action类可以去继承ActionSupport类

对请求参数进行校验

设置错误信息

读取国际化信息

 

 

在Action中获取Servlet相关API的三种方式

 

在Action类中也可以获取到Servlet一些常用的API,有如下三种方式获取

    * 完全解耦合的方式

    * 使用接口注入的方式

    * 使用ServletActionContext中静态方法直接访问Servlet的API

 

 

完全解耦合的方式

如果使用该种方式,Struts2框架中提供了一个类,ActionContext类,该类中提供一些方法,通过方法获取Servlet的API

 一些常用的方法如下:

static ActionContext getContext()        获取ActionContext对象实例

java.util.Map<java.lang.String,java.lang.Object> getParameters()      获取请求参数,相当request.getParameterMap();

 java.util.Map<java.lang.String,java.lang.Object> getSession()     获取的代表session域的Map集合,就相当于操sessio域

 java.util.Map<java.lang.String,java.lang.Object> getApplication()    获取代表application域的Map集合

  void put(java.lang.String key, java.lang.Object value)         注意:向request域中存入值。

 

 

使用接口注入的方式

Struts2框架中提供了一些接口,编写的Action类可以是去实现这些接口,然后实现这些接口中的方法,这些方法都是把一些Servlet的常用对象通过参数的方式传递进来。

    常用的接口如下:

        * ServletRequestAware       -- 注入request

        * ServletContextAware       -- 注入ServletContext

        * ServletResponseAware      -- 注入response.

 

使用ServletActionContext中静态方法直接访问Servlet的API

    Struts2框架提供了一个类,ServletActionContext,该类中提供了一些静态的方法

     具体的方法如下

        * getPageContext();

        * getRequest()

        * getResponse();

        * getServletContext();

 

 

访问Action的三种方式

通过<action>标签中的method属性,访问到Action中的具体的方法

 

传统的配置方式

    具体的实例如下:

        页面代码

1
2
<code class="hljs dust"><span class="xml"><span class="xml">      <span class="hljs-tag"><span class="xml"><span class="hljs-tag"><<span class="hljs-name"><span class="xml"><span class="hljs-tag"><span class="hljs-name">a<span class="xml"><span class="hljs-tag"> <span class="hljs-attr"><span class="xml"><span class="hljs-tag"><span class="hljs-attr">href<span class="xml"><span class="hljs-tag">=<span class="hljs-string"><span class="xml"><span class="hljs-tag"><span class="hljs-string">"$<span class="hljs-template-variable">{pageContext.request.contextPath}<span class="xml"><span class="hljs-tag"><span class="hljs-string"><span class="xml"><span class="hljs-tag"><span class="hljs-string">/addBook.action"<span class="xml"><span class="hljs-tag">><span class="xml">添加图书<span class="hljs-tag"><span class="xml"><span class="hljs-tag"></<span class="hljs-name"><span class="xml"><span class="hljs-tag"><span class="hljs-name">a<span class="xml"><span class="hljs-tag">><span class="xml">
            <span class="hljs-tag"><span class="xml"><span class="hljs-tag"><<span class="hljs-name"><span class="xml"><span class="hljs-tag"><span class="hljs-name">a<span class="xml"><span class="hljs-tag"> <span class="hljs-attr"><span class="xml"><span class="hljs-tag"><span class="hljs-attr">href<span class="xml"><span class="hljs-tag">=<span class="hljs-string"><span class="xml"><span class="hljs-tag"><span class="hljs-string">"$<span class="hljs-template-variable">{pageContext.request.contextPath}<span class="xml"><span class="hljs-tag"><span class="hljs-string"><span class="xml"><span class="hljs-tag"><span class="hljs-string">/deleteBook.action"<span class="xml"><span class="hljs-tag">><span class="xml">删除图书<span class="hljs-tag"><span class="xml"><span class="hljs-tag"></<span class="hljs-name"><span class="xml"><span class="hljs-tag"><span class="hljs-name">a<span class="xml"><span class="hljs-tag">></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

 

         配置文件的代码

1
2
3
4
<code class="hljs javascript">            <package name=<span class="hljs-string">"demo" extends=<span class="hljs-string">"struts-default" namespace=<span class="hljs-string">"/">
                <span class="xml"><span class="hljs-tag"><span class="xml"><span class="hljs-tag"><<span class="hljs-name"><span class="xml"><span class="hljs-tag"><span class="hljs-name">action<span class="xml"><span class="hljs-tag"> <span class="hljs-attr"><span class="xml"><span class="hljs-tag"><span class="hljs-attr">name<span class="xml"><span class="hljs-tag">=<span class="hljs-string"><span class="xml"><span class="hljs-tag"><span class="hljs-string">"addBook"<span class="xml"><span class="hljs-tag"> <span class="hljs-attr"><span class="xml"><span class="hljs-tag"><span class="hljs-attr">class<span class="xml"><span class="hljs-tag">=<span class="hljs-string"><span class="xml"><span class="hljs-tag"><span class="hljs-string">"cn.zlq.demo.BookAction"<span class="xml"><span class="hljs-tag"> <span class="hljs-attr"><span class="xml"><span class="hljs-tag"><span class="hljs-attr">method<span class="xml"><span class="hljs-tag">=<span class="hljs-string"><span class="xml"><span class="hljs-tag"><span class="hljs-string">"add"<span class="xml"><span class="hljs-tag">><span class="hljs-tag"><span class="xml"><span class="hljs-tag"></<span class="hljs-name"><span class="xml"><span class="hljs-tag"><span class="hljs-name">action<span class="xml"><span class="hljs-tag">>
                <action name=<span class="hljs-string">"deleteBook" <span class="hljs-class"><span class="hljs-keyword">class=<span class="hljs-string">"cn.zlq.demo.BookAction" method=<span class="hljs-string">"delete"><span class="xml"><span class="hljs-tag"><span class="xml"><span class="hljs-tag"></<span class="hljs-name"><span class="xml"><span class="hljs-tag"><span class="hljs-name">action<span class="xml"><span class="hljs-tag">>
            <<span class="hljs-regexp">/package></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

 

         Action的代码

1
2
3
4
5
6
7
8
<code class="hljs kotlin">            <span class="hljs-keyword">public String add(){
                System.<span class="hljs-keyword">out.println(<span class="hljs-string">"添加图书");
                <span class="hljs-keyword">return NONE;
            }
            <span class="hljs-keyword">public String delete(){
                System.<span class="hljs-keyword">out.println(<span class="hljs-string">"删除图书");
                <span class="hljs-keyword">return NONE;
            }</span></span></span></span></span></span></span></span></code>

 

通配符的访问方式

使用通配符的方式可以简化配置文件的代码编写,而且扩展和维护比较容易。

具体实例如下:

  页面代码

1
2
<code class="hljs dust"><span class="xml"><span class="xml">  <span class="hljs-tag"><span class="xml"><span class="hljs-tag"><<span class="hljs-name"><span class="xml"><span class="hljs-tag"><span class="hljs-name">a<span class="xml"><span class="hljs-tag"> <span class="hljs-attr"><span class="xml"><span class="hljs-tag"><span class="hljs-attr">href<span class="xml"><span class="hljs-tag">=<span class="hljs-string"><span class="xml"><span class="hljs-tag"><span class="hljs-string">"$<span class="hljs-template-variable">{pageContext.request.contextPath}<span class="xml"><span class="hljs-tag"><span class="hljs-string"><span class="xml"><span class="hljs-tag"><span class="hljs-string">/order_add.action"<span class="xml"><span class="hljs-tag">><span class="xml">添加订单<span class="hljs-tag"><span class="xml"><span class="hljs-tag"></<span class="hljs-name"><span class="xml"><span class="hljs-tag"><span class="hljs-name">a<span class="xml"><span class="hljs-tag">><span class="xml">
            <span class="hljs-tag"><span class="xml"><span class="hljs-tag"><<span class="hljs-name"><span class="xml"><span class="hljs-tag"><span class="hljs-name">a<span class="xml"><span class="hljs-tag"> <span class="hljs-attr"><span class="xml"><span class="hljs-tag"><span class="hljs-attr">href<span class="xml"><span class="hljs-tag">=<span class="hljs-string"><span class="xml"><span class="hljs-tag"><span class="hljs-string">"$<span class="hljs-template-variable">{pageContext.request.contextPath}<span class="xml"><span class="hljs-tag"><span class="hljs-string"><span class="xml"><span class="hljs-tag"><span class="hljs-string">/order_delete.action"<span class="xml"><span class="hljs-tag">><span class="xml">删除订单<span class="hljs-tag"><span class="xml"><span class="hljs-tag"></<span class="hljs-name"><span class="xml"><span class="hljs-tag"><span class="hljs-name">a<span class="xml"><span class="hljs-tag">></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span以上是关于Struts2的主要内容,如果未能解决你的问题,请参考以下文章

struts2怎么防止sql注入

struts2请求过程源代码分析

[struts2学习笔记] 第五节 编写struts2的action代码

Struts2 s2-032远程代码执行分析

S2-053:Apache Struts2远程代码执行漏洞(中危)

struts2 s2-062 ONGL远程代码执行

(c)2006-2024 SYSTEM All Rights Reserved IT常识