1.Strust2应用开发步骤
- 在web.xml文件中定义核心Filter来拦截用户请求。
- 如果需要以POST方式提交请求,则定义包含表单数据的JSP页面。如果仅仅只是以GET方式发送请求,则无须经过这一步。
- 定义处理用户请求的Action类。
- 配置Action。(“约定优于配置”)
- 配置处理结果和物理视图资源之间的对应关系。
- 编写视图资源。如果Action需要把一些数据传给视图资源,则可以借助于OGNL表达式。
(XML配置见下)
提示:
在MVC框架中,控制器实际上由两个部分共同完成,即拦截所有用户请求,处理请求的通用代码都由核心控制器完成,而实际的业务控制则由Action处理。
2.XML配置
web.xml配置:
<!-- 定义Struts2的核心Filter -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!-- 让Struts2的核心Filter拦截所有请求 -->
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts.xml配置:
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="*">
<result>/WEB-INF/{1}.jsp</result>
</action>
</package>
</struts>
将一个Action类定义成多个逻辑Action
<struts>
<package name="user " extends="struts-default">
<!-- 使用模式字符串定义Action的name,指定所有以Action结尾的请求,
都可用LoginRegistAction来处理,method属性使用{1},
这个{1}代表进行模式匹配时第一个*所代替的字符串 -->
<action name="*Action" class="com.action.LoginAction" method="{1}">
<!-- 定义逻辑视图和物理视图之间的映射关系 -->
<result name="error">/WEB-INF/content/error.jsp</result>
<result>/WEB-INF/welcome.jsp</result>
</action>
<action name="*">
<result>/WEB-INF/{1}.jsp</result>
</action>
</package>
</struts>
3.DMI动态方法调用
DMI(Dynamic Method Invocation),动态方法调用,是指表单元素的action并不是直接等于某个Action的名字,而是以如下的形式来指定表单的action属性。
<!-- action属性为actionName!methodName的形式,其中actionName指定提交到哪个Action,而methodName指定提交到指定方法 -->
action="actionName!methodName"
注意:
使用动态方法调用前必须设置Struts2允许动态方法调用,通过设置struts.enable. DynamicMethodInvocation常量为true开启。
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
注:
Struts2的动态方法调用存在一些安全问题方面的缺陷,应尽量少用。
解决:
将一个Action类定义为多个逻辑Action,即Action类的每个处理方法都映射成一个逻辑Action(通配符)
<action name="emp-*" class="employeeAction" method="{1}">
<result name="list">/WEB-INF/views/emp-list.jsp</result>
<result name="input">/WEB-INF/views/emp-input.jsp</result>
<result name="success" type="redirect">/emp-list</result>
</action>
4.参数传递
- 客户端(client)传递值至服务器端(Action)如type=1,此时若Action1传递值给Action2,不需要传递值的操作,因为对于客户端是同一请求(request),所有Action共用同一值栈(Value Stack)
- 客户端(client)传递值至服务器端(Action)如type=1,此时若Action1通过redirect返回视图(如jsp页面)并传递值,不能直接从值栈(Value Stack)取值,而需要从Stack Context取值。
5.路径
struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)或者使用myeclipse经常用的,指定basePath