Struts2框架的struts.xml详解
- Struts总结一
- Struts的jar
- Struts2的简介
- Struts2的工作原理
- 4、Struts2的优点
- 5、Struts2的第一个案例
- 6、Struts2配置文件的加载顺序
- 7、Struts2提供的常量(constant)
- 8、package元素
- 9、action元素(动作名称)
- 10、result元素
- 11、default-action-ref元素
- 12、default-class-ref元素
- 13、global-results元素
- 14、global-exception-mapping元素
- 15、include元素
- 16、interceptor元素
- 17、interceptor-ref元素
- 18、default-interceptor-ref元素
- 参考
Struts总结一
很久没更新了,原因是"懒"和"没时间做笔记"。于是还是做一个小总结吧!(不然容易忘记)
Struts的jar
Struts2下载地址
下载完成后,打开压缩包中apps目录下的struts-blank.war包。将得到本次学习的所有jar,如下:
Struts2的简介
Struts2是Apache发行的MVC开源框架。注意:它只是表现层(MVC)框架。
Struts2的工作原理
在理解下面那幅图之前,我们先回想一下在学习JavaEE时,Filter和Servlet的区别!
Filter和Servlet的区别:Filter能够处理(或者说过滤)所有东西,Servlet只能处理Servlet的请求,那么可见,Servlet能做的时候Filter都能做!
那么以下的图就好理解了,Struts2应用中只有一个Filter,没错就是FilterDispatcher过滤器!它将处理所有请求!也就是说,我们将配置web.xml中的一个信息!如下:
<filter>
<filter-name>struts2Filter</filter-name>
<!-- 下面这个是Struts2的过滤器 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
接下来这幅图可以说是非常容易理解了!
上图是 Struts2 的体系结构。一个请求在 Struts2 框架中的处理大概会经过以下几个步骤:
- 客户端发出一个指向 Servlet 容器(例如Tomcat)的请求。
- 这个请求会经过几个过滤器 Filter(ActionContextCleanUp 可选过滤器、其他 Web 过滤器如 SiteMesh 等),最后到达 FilterDispatcher 过滤器。
- 接着 FilterDispatcher 过滤器被调用,FilterDispatcher 询问 ActionMapper 来决定这个请求是否需要调用某个 Action。
- 如果 ActionMapper 决定需要调用某个 Action,FilterDispatcher 把请求的处理交给 Action 对象的代理(ActionProxy)。
- ActionProxy 通过配置管理器(Configuration Manager)读取框架的相关配置文件(
struts.xml
以及它包含的*.xml
配置文件),找到需要调用的 Action 类。 - 找到需要调用的 Action 类后,ActionProxy 会创建一个 ActionInvocation 的实例。
- ActionInvocation 在调用 Action 的过程之前,会先依次调用相关配置拦截器(Intercepter),执行结果返回 结果字符串。
- ActionInvocation 负责查找 结果字符串 对应的 Result,然后执行这个 Result,再返回对应的结果视图(如JSP等等)来呈现页面。
- 再次调用所用的配置拦截器(调用顺序与第7步相反),然后响应(HttpServletResponse)被返回给浏览器。
举个例子,如下图:
4、Struts2的优点
下面列举 Struts2 的一些主要优点:
- Struts2 是非侵入式设计,即不依赖于Servlet API 和 Struts API.
- Struts2 提供了强大的拦截器,利用拦截器可以进行 AOP编程(面向切面的编程),实现如权限拦截等功能。
- Struts2 提供了类型转换器,可以很方便地进行类型转换,例如将特殊的请求参数转换成需要的类型。
- Struts2 支持多种表现层技术,如 JSP、FreeMarker、Velocity 等。
- Struts2 的输入验证可以对指定的方法进行验证。
5、Struts2的第一个案例
第一个案例步骤如下:
- 开发环境和导入Struts2的jar
- 创建一个Action
- 配置struts.xml
- 配置web.xml
5.1、开发环境和导入jar包
5.2、创建Action
5.3、配置struts.xml
源代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
<!-- action处理类 -->
<action name="hello" class="com.csa.action.HelloAction" method="hello">
<!-- 查找相应结果的字符串的result -->
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
5.4、配置web.xml
源代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<!-- 配置struts2过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- 处理所有路径 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
5.5、success.jsp和实验结果
6、Struts2配置文件的加载顺序
顺序 | 配置文件名 | 所在位置 | 说明 |
---|---|---|---|
1 | default.properties | struts2-core-2.3.15.3.jar\org\apache\struts2 | 不能修改 |
2 | struts-default.xml | struts2-core-2.3.15.3.jar | 不能修改 |
3 | strtuts-plugin.xml | 在struts2提供的插件jar包中 | 不能修改 |
4 | struts.xml | 我们的应用中 | 我们能修改的 |
5 | struts.properties | struts2-core-2.3.15.3.jar | 我们能修改的 |
6 | web.xml | 我们的应用中 我们修改的 | 可以给过滤器配置参数 |
7、Struts2提供的常量(constant)
常量名 | 常量值 | 说明 |
---|---|---|
struts.i18n.encoding | UTF-8 | 应用中使用的编码 |
struts.objectFactory.spring.autoWire | name | 和spring框架整合有关 |
struts.multipart.parser | jakarta | 指定文件上传用的组件 |
struts.multipart.maxSize | 2097152 | 文件上传总文件大小限制:2M |
struts.action.extension | action | 能进入Struts2框架内部的url地址后缀名。多个值用逗号分隔 |
struts.enable.DynamicMethodInvocation | false | 是否允许动态方法调用 |
struts.devMode | false | 是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true。 |
struts.ui.theme | xhtml | 页面展示用的主题 |
例如(在struts.xml中配置):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="struts.devMode" value="true"></constant>
</struts>
8、package元素
在struts中,package用来管理action、result、interceptor、interceptor-stack等配置信息,它的属性如下:
属性 | 是否必须 | 含义 |
---|---|---|
name | 是 | 包名,唯一标记,其他package可以利用name来引用 |
extends | 否 | 设置继承其它package,会继承父package的所有配置属性(例如action、result等等);默认继承自struts-default.xml |
namespace | 否 | package的命名空间,会改变url访问地址,主要是针对比较大型的项目以方便管理action,因为不同namespace中的action可以同名,从而解决action重名的问题。 |
abstract | 否 | 是否设置为抽象包 |
例如(在struts.xml中配置):
<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
<!-- action处理类 -->
<action name="hello" class="com.csa.action.HelloAction" method="hello">
<!-- 查找相应结果的字符串的result -->
<result name="success">/success.jsp</result>
</action>
</package>
8.1、对namespace的详解
namespace的默认值:"",而不是"/"。
动作类的搜索顺序(重点):
如果请求访问的服务在访问指定的namespace下不存在,则默认依次将访问的namespace缩短一级寻找,如果该namespace存在则在其下寻找服务,如果依次缩短寻找的namespace还是找不到对应的namespace则在名为"/"的namespace下寻找,找到了就访问,找不到就返回找不到。
9、action元素(动作名称)
属性 | 是否必须 | 含义 |
---|---|---|
name | 是 | action的名称 |
class | 否 | action对应的JAVA类 |
method | 否 | 类中的具体方法 |
converter | 否 | 类型转换器 |
如果没有为action指定class,默认的是ActionSupport。
如果没有为action指定method,默认执行action中的execute()方法。
例如(在struts.xml中配置):
<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
<!-- action处理类 -->
<action name="hello" class="com.csa.action.HelloAction" method="hello">
<!-- 查找相应结果的字符串的result -->
<result name="success">/success.jsp</result>
</action>
</package>
9.1、通配符方法
例如(在struts.xml中配置):
<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
<!-- action处理类 -->
<action name="*_*" class="com.csa.action.HelloAction" method="{1}{2}">
<!-- 查找相应结果的字符串的result -->
<result name="success">/{1}{2}.jsp</result>
</action>
</package>
9.2、Action类的几种创建方式
动作类的几种创建方式:
- 动作类就是一个POJO。
- 动作类实现com.opensymphony.xwork2.Action接口。
- 动作类继承com.opensymphony.xwork2.ActionSupport(一般使用这种方法)。
9.3、动态方法调用
例如(在struts.xml中配置):
<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
<!-- action处理类 -->
<action name="hello" class="com.csa.action.HelloAction">
<!-- 查找相应结果的字符串的result -->
<result name="success">/success.jsp</result>
</action>
</package>
url访问方式:http://ip:prot/web应用/命名空间/动作名称!方法名.action
。
10、result元素
属性 | 是否必须 | 含义 |
---|---|---|
name | 否 | Action对应返回的逻辑响应视图,默认是success。 |
type | 否 | 返回结果的类型,默认为dispatcher |
例如(在struts.xml中配置):
<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
<!-- action处理类 -->
<action name="hello" class="com.csa.action.HelloAction" method="hello">
<!-- 查找相应结果的字符串的result -->
<result name="success">/success.jsp</result>
</action>
</package>
10.1、param元素(依赖注入:DI)
<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
<!-- action处理类 -->
<action name="hello" class="com.csa.action.HelloAction" method="hello">
<!-- 查找相应结果的字符串的result -->
<result type="redirectAction(或者其他自定义结果类型)">
<param name="namespace(或者自定义结果类型的参数)">/world</param>
<param name="actionName(或者自定义结果类型的参数)">world</param>
</result>
</action>
</package>
10.2、自定义结果类型
自定义结果类型需要做的有以下几步:
- 自定义一个类,继承org.apache.struts2.dispatcher.StrutsResultSupport类。
- 在struts.xml的package中声明结果类型视图。
- 在struts.xml的action中使用结果类型。
10.2.1、自定义结果类型的类
package com.csa.type;
import org.apache.struts2.dispatcher.StrutsResultSupport;
import com.opensymphony.xwork2.ActionInvocation;
public class CaptchaResult extends StrutsResultSupport {
private Integer width;
private Integer height;
public void setWidth(Integer width) {
this.width = width;
}
public void setHeight(Integer height) {
this.height = height;
}
@Override
protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {
//以下是生成验证码的算法!省略不写。width和height决定宽度和高度
}
}
10.2.2、在struts.xml中声明结果类型视图
<!-- 下面的内容省略掉 -->
<package ...>
<!-- 声明结果类型 -->
<result-types>
<result-type name="captcha" class="com.csa.type.CaptchaResult"></result-type>
</result-types>
</package>
10.2.3、在struts.xml中使用结果视图
<!-- 没有class是执行默认的ActionSupport,没有方法是默认执行execute() -->
<action name="captchaAction">
<result name="success" type="captcha">
<!-- 设置验证码的宽和高度分别为200和100 -->
<param name="width">200</param>
<param name="height">100</param>
</result>
</action>
10.2.3、访问路径
http://ip:port/web应用/命名空间/动作名称
,这样就可以得到以上的自定义结果类型的东西的。在这里我们得到的是验证码!
11、default-action-ref元素
如果找不到项目请求的action,就会报出404错误,而且这种错误不可避免,所以我们可以使用 default-action-ref 来指定一个默认的action,如果系统出现找不到action的情况,就会来调用这个默认的action。
例如:
<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
<default-action-ref name="hello"></default-action-ref>
<!-- action处理类 -->
<action name="hello">
<!-- 查找相应结果的字符串的result -->
<result name="success">/success.jsp</result>
</action>
</package>
访问路径:http://ip:port/web应用/命名空间/任意名称
会发现,最后返回的都会是/success.jsp
的内容!
12、default-class-ref元素
与action的一毛一样,不做阐述!
<!-- 指定默认class为Test -->
<default-class-ref class="com.csa.action.HelloAction"/>
13、global-results元素
设置package范围内的全局响应结果。在多个action都返回同一个逻辑视图(通常为某个jsp页面)的情况下,可以通过该标签来统一配置。
例如:
<package ...>
<!-- 全局结果视图 -->
<global-results>
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</global-results>
<action name="hello">
<!-- 局部结果视图 -->
<result name="hello">/hello.jsp</result>
</action>
</package>
这样子,只要在同一个包下的所有动作(action)返回的字符串都将先去匹配局部结果视图,如果找不到对应的字符串,再去全局结果视图中寻找有无对应的字符串。如果有,则返回相应的结果视图,如果没有,则404!
14、global-exception-mapping元素
配置发生异常时的视图信息。exception-mapping是控制action范围内的,而global-exception-mapping是控制package范围内的。两个都配置时,exception-mapping的优先级更高。
属性 | 是否必须 | 含义 |
---|---|---|
name | 否 | exception名称 |
result | 是 | 设置异常相应结果的视图信息 |
exception | 是 | 设置异常类型 |
这里已经很详细(跟result一毛一样)了,就不需要在说明了!
15、include元素
你还可以使用 include 来引入外部配置文件,直接给出 url 即可:
<include file="**/**/***.xml" />
使用 include 的好处在于,例如当我们开发一个比较大型的项目的时候,配置文件肯定会写一大堆。如果写在一个配置文件里就不好查看和修改,不便于维护;所以使用 include 后可以根据模块、也可以根据功能来划分,这样就比较清晰,方便管理和维护。
16、interceptor元素
通过该标签可以向Struts2框架中注册拦截器或者拦截器栈,一般多用于自定义拦截器或拦截器栈的注册。该标签使用方法如下:
<package ...>
<interceptors>
<interceptor name="拦截器名" class="拦截器类"/>
<interceptor-stack name="拦截器栈名">
<interceptor-ref name="拦截器名">
</interceptor-stack>
</interceptors>
</package>
17、interceptor-ref元素
通过该标签可以为其所在的Action添加拦截器功能。当为某个Action单独添加拦截器功能后,中所指定的拦截器将不再对这个Action起作用。
<action name="hello">
<interceptor-ref name="拦截器名(或者拦截器栈名)">
<param name="参数名">参数值</param>
</interceptor-ref>
<result name="success">/success.jsp</result>
</action>
18、default-interceptor-ref元素
该标签用来设置整个包范围内所有Action所要应用的默认拦截器信息。事实上我们的包继承了struts-default包以后,使用的是Struts的默认设置。我们可以在struts-default.xml中找到相关配置:
<package ...>
<default-interceptor-ref name="defaultStack"/>
</package>
在实际开发过程中,如果我们有特殊的需求是可以改变默认拦截器配置的。当时一旦更改这个配置,“defaultStack”将不再被引用,需要手动最加。
如下:
<action name="hello">
<interceptor-ref name="拦截器名(或者拦截器栈名)">
<param name="参数名">参数值</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">/success.jsp</result>
</action>
参考
实验楼的Struts2教程
还有黑马的word笔记!这里木得url!