strust2的开发步骤
- 编写一个发送请求的页面,表单或超链接
- 编写一个action类
1. 推荐实现action接口或继承actionsupport
2. 为所有请求参数,包括需要传到下一个页面显示的数据提供filed
并提供相应的setter和getter
3. 要有无参的构造器
4. 处理请求的方法,该方法不能有形参声明
5. 处理请求的返回值是String
- 在struts.xml文件配置action
struts.xml配制方法
- 常量配置
- 包配置和命名空间配置
这种设计是为了企业应用的模块化开发,把多个配置文件以include的方式包含进来
- 处理结果的控制
-------------------- | -------根据逻辑视图跳转物理视图2 | | -------根据逻辑视图跳转物理视图1 ^ | 逻辑视图<-------------------- | | | | 发送请求----->struts分发器---->创建action实例,调用execute
- action只是负责struts2控制器的部分,所以它不能直接生成浏览者的响应
- action只会负责处理请求,负责生成响应的视图组件,通常是JSP页面,而action会为JSP页面提供显示的数据
- 当action处理用户请求后,控制器根据
<result.../>
元素决定具体使用哪个资源生成响应- 配置逻辑视图和物理视图之间的映射关系是通过result子元素来定义的。每个result定义逻辑视图和物理视图之间的一次映射
result使用方法
<result .../>
支持的属性- name:逻辑视图名。name属性的默认是success
- type:指定物理视图资源的类型。默认值是dispatch,
与dispatch对应的是redirect—-重定向
- 目前的视图资源类型可能有(不一定是JSP)
- Velocity
- FreeMarker
- JFreeChart
- 报表(JasperReports)
- XSLT
- result的标准格式
<result name="" type>
<param></param>
<param></param>
....
</result>
如果有如下的配置
<result name="逻辑视图" type="视图配型">
<param name="location">物理视图位置<param>
<param name="parse">true<param>----是否解析OGNL表达式的值
</result>
就可以简化为
<result name="逻辑视图" type="视图配型">物理视图位置</result>
- 属性
- name:指定逻辑视图名。
默认是success(题外话:不会偷懒的人不是好的程序员,一个人勤劳并不定是优秀的,重要的是勤奋的由价值,偷懒有时候也是勤奋)
- type:指定所使用的物理视图类型
在struts-default.xml中的struts-default抽象包中:
- name:指定逻辑视图名。
<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>
从以上可知,type的默认值是dispatch。
- 重要的类型
- chain :Action处理完请求之后,转发到下一个Action继续处理,形成一个链式处理
- dispatch
- redirect
/********
forward : 依然使用一次请求,地址栏url没有变化,请求参数和请求属性都不会丢失
redirect:重新发送一次新的请求,就像在地址栏中重新输入一个url并回车的效果一样,地址栏的url变化,请求参数和请求属性都会丢失
dispatch和redirect的区别也是上面的区别
*********/
- redirectAction:重定向到action
- stream:做文件下载
- plainText:显示页面源码
- 常用type示例
1、chain
假设在regist的action里注册成功之后跳转到一个浏览所有用户的action
<action name="regist" class="registAction">
<result type="chain">userList</result>
</action>
<action name="userList" class="userListAction">
<result ...> .... </result>
</action>
2、redirect
直接“重定向”到新的URL,生成一次新的请求,原有的请求参数请求属性都会丢失。
与默认的dispatch(“转发”)相应
3、 dispatch
4、plainText
直接显示视图页面的源代码
<action name="login" class="loginAction">
<!--当处理方法返回success,系统跳转到welcome.jsp-->
<result type="plainText">
<param name="locaiont">/WEB-INF/content/welcome.jsp</param>
<!-- 指定物理视图资源的编码字符集-->
<param name="charSet">utf-8</param>
</result>
</action>
一般没有太大的用处,主要用于显示源代码,教学类型的,为了让学生看到源代码学习
5、stream —直接生成“二进制”文件流
- result的两种形式
1、局部
将<result .../>
作为<action>
的子元素,只对action有效
2、全局
将<result .../>
用于全局
<global-results>
<result type="">
</result>
</global-results>
1、当全局result配置与局部result配置冲突时,局部result会覆盖全局result
尽量少用全局result,只有在多个action都具有某个通用性质的result,才考虑全局result
2、不同的result类型,可使用的参数不同
/*********
struts的配置文件,包括:
struts-default.xml: 核心包使用该配置文件
struts-plugin.xml: 插件包使用该配置文件
struts.xml : struts2应用使用该配置文件
struts-abc.xml : 其他的配置文件,必须被include加载
**********/
如dispatch的参数有location和parse
需要使用的时候,查阅文档,
- 动态结果
使用{1},{2}….
例:
通用的action
<action name="*">
<result>
/WEB-INF/content/{1}.jsp
</result>
</action>
{1}匹配*所匹配的第一个匹配值
<action name="*Action">
<result>
/WEB-INF/content/{1}_{2}.jsp
</result>
</action>
Action属性值决定视图资源
不仅可以使用{1}…,还可以使用${属性}
<action name="myPro" class="">
<!--在定义物理视图资源时,可以直接使用OGNL表达式,所以这个物理视图可以动态的改变。通过OGNL来计算${res}表达式的值
-->
<result>
/WEB-INF/content/{res}.jsp
</result>
- 动态方法调用(DMI Dynamic Method Invocation)
用法不是特别大,大致了解
功能:可以在提交请求的时候,直接提交给action的指定方法。
- 未使用DMI:
<form action="myPro" method="post"></form>
上述代码只能看出提交给哪个action,而无法看到提交给哪个方法,
具体调用的需要查看struts.xml
- 使用DMI:
可以直接在action后增加”!method”的形式,来DMI
<form action="myPro!login" method="post"></form>
所谓的DMI其实就是在页面上指定请求地址为:actionName!methodName
缺点:
1、安全性不高
2、没有必要,完全可以在action元素中指定method来代替动态方法调用
- 未使用DMI:
第一次用markdown的语法写,总体感觉还是可以,就是有序列表不是很好,或许是自己没用好,以后多多体会