常用的配置
<?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>
<!-- include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用 -->
<include file="struts-default.xml"></include>
<!-- 所有匹配*.action的请求都由struts2处理 -->
<constant name="struts.action.extension" value="action" />
<!-- 是否启用开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- struts配置文件改动后,是否重新加载 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 设置浏览器是否缓存静态内容 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 请求参数的编码方式 -->
<constant name="struts.i18n.encoding" value="utf-8" />
<!-- 每次HTTP请求系统都重新加载资源文件,有助于开发 -->
<constant name="struts.i18n.reload" value="true" />
<!-- 文件上传最大值 -->
<constant name="struts.multipart.maxSize" value="104857600" />
<!-- 让struts2支持动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- Action名称中是否还是用斜线 -->
<constant name="struts.enable.SlashesInActionNames" value="false" />
<!-- 允许标签中使用表达式语法 -->
<constant name="struts.tag.altSyntax" value="true" />
<!-- 对于WebLogic,Orion,OC4J此属性应该设置成true -->
<constant name="struts.dispatcher.parametersWorkaround" value="false" />
<package name="basePackage" extends="struts-default">
<!-- 配置默认Action -->
<default-action-ref name="defaultAction" />
<action name="defaultAction">
<result>/error/error404.jsp</result>
</action>
<action name="first" class="action.HelloAction" method="test">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
constant配置Strut2的常量,也可以通过struts.properties和在web.xml中以参数的方式配置
include属性
include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用
bean属性配置
Struts2的大部分核心组件不是以硬编码的形式写在代码中,而是通过自身的IoC容器来管理的。
Struts2以可配置的形式来管理核心组件,所以开发者可以很容易的扩展框架的核心组件。当开发者需要扩展或者替换Struts2的核心组件时,只需要提供自己的组件实现类,并部署在Struts2的IoC容器中即可。
我们打开struts2-core-2.3.8.jar中的struts-default.xml文件,可以看到大量的Bean的定义。如下代码片段:
<struts>
<bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" />
<bean type="com.opensymphony.xwork2.ObjectFactory" name="struts" class="org.apache.struts2.impl.StrutsObjectFactory" />
<bean type="com.opensymphony.xwork2.FileManager" class="com.opensymphony.xwork2.util.fs.DefaultFileManager" name="system" scope="singleton"/>
<bean type="com.opensymphony.xwork2.FileManagerFactory" class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory" name="xwork" scope="singleton"/>
<bean type="com.opensymphony.xwork2.FileManagerFactory" class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory" name="struts" scope="singleton"/>
而我们在struts.xml定义Bean时,通常有以下两个作用:
- 1、 创建的Bean实例作为Struts2框架的核心组件使用。
- 2、 Bean的静态方法需要一个值注入。
- class:这个属性是个必填属性,它指定了Bean实例的实现类。
- type:这个属性是个可选属性,它指定了Bean实例实现的Struts2的规范,该规范通常是通过某个接口或者在此前定义过的Bean,因此该属性值通常是个接口或者此前定义过的Bean的name属性值。如果需要将Bean的实例作为Strut2组件使用,则应该指定该属性的值。
- name:该属性是个可选属性,它指定的Bean实例的名字,对于有相同type的多个Bean。则它们的name属性不能相同。
- scope:该属性是个可选属性,它指定Bean实例的作用域,该属性的值只能是default、singleton、request、session或thread之一。
- static:该属性是个可选属性,它指定Bean是否使用静态方法注入。通常而言,当指定了type属性时,该属性就不应该指定为true。
- optional:该属性是个可选属性,它指定Bean是否是一个可选Bean。
package
属性:
- name:package名称,package的名字必须是唯一的
- extends:继承的父package名称,package可以扩展 当一个package扩展自另一个package时该package会在本身配置的基础上加入扩展的package的配置父package必须在子package前配置
- abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false
- namespace:定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action
package提供了将多个Action组织为一个模块的方式,可以区分管理一个项目的不同模块
action配置
action是struts2用来代替servlet的,action是一个多实例,线程安全的对象
- name属性: 决定了Action访问资源名.
- class属性: action的完整类名
- method属性: 指定调用Action中的哪个方法来处理请求
<action name="user*" class="com.wy.action.VaildateAction" method="{1}">
<result name="success">/success.jsp</result>
<result name="input">/{1}.jsp</result>
</action>
其中*是通配符,比如当请求的action的名字为userlogin时,请求的方法为login方法,放回的input页面为login.jsp,多个通配符分别以{1},{2}…分别表示
result属性
- name属性: 标识结果处理的名称.与action方法的返回值对应.
- type属性: 指定调用哪一个result类来处理结果,默认使用转发.
- 标签体:填写页面的相对路径或者绝对路径
result映射(标签体):
在result映射的配置中,在指定实际资源的位置时,可以使用绝对路径,也可以使用相对路径。
绝对路径以斜杠(/)开头,相对于当前的Web应用程序的上下文路径;
相对路径不以斜杠(/)开头,相对于当前执行的action的路径,也就是namespace指定的路径。
type属性:
默认属性为dispatcher
Type 类型值 | 作用说明 | 对应类 |
---|---|---|
chain | 用来处理Action 链 | com.opensymphony.xwork2.ActionChainResult |
dispatcher(默认值) | 用来转向页面,通常处理 JSP | org.apache.struts2.dispatcher.ServletDispatcherResult |
redirect | 重定向到一个URL | org.apache.struts2.dispatcher.ServletRedirectResult |
redirectAction | 重定向到一个 Action | org.apache.struts2.dispatcher.ServletActionRedirectResult |
plainText | 显示源文件内容,如文件源码 | org.apache.struts2.dispatcher.PlainTextResult |
freemarker | 处理 FreeMarker 模板 | org.apache.struts2.views.freemarker.FreemarkerResult |
httpheader | 控制特殊 http 行为的结果类型 | org.apache.struts2.dispatcher.HttpHeaderResult |
stream | 向浏览器发送 InputSream 对象,通常用来处理文件下载,还可用于返回 AJAX 数据。 | org.apache.struts2.dispatcher.StreamResult |
velocity | 处理 Velocity 模板 | org.apache.struts2.dispatcher.VelocityResult |
xslt | 处理 XML/XLST 模板 | org.apache.struts2.views.xslt.XSLTResult |
常用的有dispacher,redirect,chain,redirectAction,stream
<result name=“success” type=“dispatcher”>
<param name=“location” >/success.jsp</param>
<param name=“parse” >true</param>
</result>
location参数用于指定action执行完毕后要转向的目标资源,parse属性是一个布尔类型的值,如果为true,则解析location参数中的OGNL表达式;如果为false,则不解析。parse属性的默认值就是true.location参数是默认的参数,一般省略。
全局result
<global-results>
<result></result>
</global-results>
action可以不配置result,直接使用全局结果
result的查找
有了全局Result之后,根据execute方法的返回值寻找Result顺序如下:
(1)首先,先找自己的
(2)其次,再找自己的
(3)再次,递归的寻找自己的包的父包、祖父包中的全局Result是否有匹配的,如果有就执行这个Result,如果没有,下一步。
(4)最后,如果上述三种情况都没有匹配的Result的话,则抛出Exception。
result-types
<result-types>
<result-type name="" class="">
<param name=""></param></result-type>
</result-types>
Result是Action执行完后返回的一个字符串,它指示了Action执行完成后,下一个页面在哪里。Result仅仅是个字符串,仅仅是用来指示下一个页面的,那么如何才能够到达下一个页面呢?下一个页面如何能正确地展示结果呢?这就该引出一个新概念——ResultType,所谓ResultType,指的是具体执行Result的类,由它来决定采用哪一种视图技术,将执行结果展现给用户。
很多时候,我们并不去区分Result和ResultType,而是笼统的称为Result。因此,Result除了当作上面讲述的字符串来理解外,还可以把Result当作技术,把Result当作实现MVC模型中的View视图的技术,也就是ResultType来看待。
在Struts2中,可以使用多种视图技术,如jsp、freemarker、velocity、jfreechart等等,同时,Struts2也支持用户自定义ResultType,来打造自己的视图技术。
预定义ResultType
在Struts2中,预定义了很多ResultType,其实就是定义了很多展示结果的技术。Struts2把内置的
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
<result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" />
</result-types>
default-action-ref
<!-- 配置默认Action -->
<default-action-ref name="defaultAction" />
<action name="defaultAction">
<result>/error/error404.jsp</result>
</action>
如上,当一个不存在的action被访问时,转发到404页面
default-class-ref
action的默认处理类
在action配置时,如果class不写。默认情况下是 com.opensymphony.xwork2.ActionSupport。如果设置了,就会自动使用该类。
<default-class-ref class="action.HelloAction"></default-class-ref>
interceptors,interceptor,interceptor-ref
<interceptors>
<interceptor name="" class=""></interceptor>
<interceptor-stack name="">
<interceptor-ref name=""></interceptor-ref>
</interceptor-stack>
</interceptors>
拦截器interceptor
1、name:拦截器名称
2、class:拦截器类路径
interceptor-stack 截器栈,可以一次包括多个拦截器一起使用
interceptor-ref 使用名为name值的拦截器
default-interceptor-ref
<default-interceptor-ref name="mystack"></default-interceptor-ref>
定义默认的拦截器或者拦截器栈,如果action中定义了拦截器,默认拦截器无效
global-exception-mappings
<global-exception-mappings>
<exception-mapping result="" exception=""></exception-mapping>
</global-exception-mappings>
全局异常映射,把action请求处理时没有捕获的异常在执行时进行处理。
exception-mapping节点有两个属性:
- exception
- result
1、exception属性是用来指定需要捕获异常的类型,属性值一般是异常类型的类全路径。
2、result则是指定捕获异常后需要执行的result结果,该result可以是来自当前的action中声明的result也可以是来自global-result中声明的result。当然一个action中可以声明多个exception-mapping节点,因为一个action请求可能会有多个异常发生。
需要注意的是global-exception-mapping下的exception-mapping元素只能引用global-results下配置的某个result元素。
常量配置
struts2的常量配置文件位置在struts2-core-2.3.8.jar/org.apache.struts2/default.properties中,可以打开此文件进行查看。
配置修改有三个方法:
1、修改常量配置
修改constant属性
此属性用于修改struts的常量,name为要修改常量的名字,value为想要修改的值。
2、修改struts.properties
想要修改常量也可以在src目录下创建struts.properties在里面进行键值对的配置
struts.devMode=true
3、web.xml中修改
<context-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</context-param>
读取配置文件的加载顺序
struts框架读取配置文件的加载顺序
- default.properties 该文件保存在 struts2-core-2.3.8.jar 中 org.apache.struts2包里面 (常量的默认值)
- struts-default.xml 该文件保存在 struts2-core-2.3.8.jar (Bean、拦截器、结果类型 )
- struts-plugin.xml 该文件保存在struts-Xxx-2.3.8.jar (在插件包中存在 ,配置插件信息 )
- struts.xml 该文件是web应用默认的struts配置文件
- struts.properties 该文件是Struts的默认配置文件 (配置常量 )
- web.xml 该文件是Web应用的配置文件 (配置常量 )
这是struts2的框架读取配置的顺序,实际项目启动时先读的肯定是web.xml,当读到strut2的过滤器时启动struts2
参考
Struts2 XML配置详解
Struts2中 Result类型配置详解
struts2中struts.xml配置文件详解
struts2Result和ResultType
struts2中的exception-mapping声明时异常处理