主要从下面几个方面讲解
- 访问Servlet API
- Action搜索顺序
- 动态方法调用
- 指定多个配置文件
- 默认Action
- Struts2后缀
- 接收参数
- 处理结果类型
1. 访问Servlet API
Struts2提供了三种方式去访问Servlet API:
1. ActionContext
实现***Aware接口
ServletActionContext
2. Action搜索顺序
http://localhost:8080/struts2/path1/path2/path3/student.action
第一步:判断package是否存在,如:path1/path2/path3/
存在的情况
第二步:判断action是否存在,如果不存在则去默认namespace的package里面寻找action
第三步:如果没有,则报错
不存在的情况
第二步:检测上一级路径的package是否存在(直到默认namespace),重复第一步
第三步:如果没有,则报错
3. 动态方法调用
为了解决一个Action对应多个请求的处理,以免Action太多。
三种方式:
1. 指定method属性
- 感叹号方式
<!-- 让struts2支持动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
- 通配符方式
4. 指定多个配置文件
使用include指令包含多个文件
<include file="login.xml"></include>
<include file="system.xml"></include>
5. 默认Action
6. Struts2后缀
在struts.xml中配置
<constant name="struts.action.extension" value="html"></constant>
在struts.properties中配置
struts.action.extension=do,action,html,
在web.xml中配置
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>do</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
7. 接收参数
- 使用Action的属性接收参数
需要提供get、set方法,属性名和前端页面的表单中name一致
使用DomainModel接收参数
提供实体类get、set方法,前端实体类名.属性名(user.username)使用ModelDriven接收参数(==推荐==)
继承ModelDriven(T为需要封装的实体类)
提供实体类的get、set方法,在getModel()中实例化该类的实例
- 前端直接使用属性名(username)提交
8. 处理结果类型
Struts2处理流程:
用户请求–>Struts框架–>控制器(Action)–>Struts2框架–>视图资源
处理结果是==字符串==
Struts1和Struts2区别:
1. Struts1返回的处理结果是ActionForward类
2. Struts2返回的处理结果是String字符串
Struts2相对于Struts1的优点:
- 提供代码复用性
- 有利于框架分离
<!-- result元素中name就是result的逻辑视图名称 -->
<result name="success">/success.jsp</result>
<!-- 如果省略了name属性,系统将采用默认的name属性值,默认的name值是success -->
<result>/success.jsp</result>
内置属性(字符串常量):
==com.opensymphony.xwork2.Action==
- SUCCESS:Action正确的执行完成,返回相应的视图,success是name属性的默认值
- NONE:表示Action正确的执行完成,但并不返回任何视图
- ERROR:表示Action执行失败,返回到错误处理视图
- LOGIN:Action因为用户满意登录的原因没有正确执行,将返回该登录视图,要求用户进行登录验证
- INPUT:Action的执行,需要从前端页面获取参数,IINPUT就是代表这个参数输入的界面,一般在应用中,会对这些参数进行验证,如果验证没有通过,将自动返回到该视图。
result标签
处理结果是通过在struts.xml使用标签配置结果。根据位置的不同,分为两种结果:
- 局部结果:将作为元素的子元素配置
- 全局结果:将作为元素的子元素配置
result子标签param
<result name="...">
<param name="location">resource</param>
</result>
子标签具有两个属性:
1. location:该属性定义了该视图对应的实际视图资源
2. parse:该参数指定是否可以在实际视图名字中使用OGNL表达式,Struts2框架默认该属性为true,即支持OGNL表达式。
例子如下:
<result name="add">
<param name="location">/{2}.jsp</param>
<param name="parse">false</param>
</result>
type属性
Result还有一个最重要的属性type,Struts2支持多种视图技术,例如JSP、Valocity、FreeMarker等,当我们没有定义type的时候,默认值为==dispatcher==,这个类型支持JSP视图技术。
struts-default中有支持如下result的type属性:
<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>