Strust2应用开发步骤及注意事项

1.Strust2应用开发步骤

  1. 在web.xml文件中定义核心Filter来拦截用户请求。
  2. 如果需要以POST方式提交请求,则定义包含表单数据的JSP页面。如果仅仅只是以GET方式发送请求,则无须经过这一步。
  3. 定义处理用户请求的Action类。
  4. 配置Action。(“约定优于配置”)
  5. 配置处理结果和物理视图资源之间的对应关系。
  6. 编写视图资源。如果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.参数传递

  1. 客户端(client)传递值至服务器端(Action)如type=1,此时若Action1传递值给Action2,不需要传递值的操作,因为对于客户端是同一请求(request),所有Action共用同一值栈(Value Stack)
  2. 客户端(client)传递值至服务器端(Action)如type=1,此时若Action1通过redirect返回视图(如jsp页面)并传递值,不能直接从值栈(Value Stack)取值,而需要从Stack Context取值。

5.路径

struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。

解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)或者使用myeclipse经常用的,指定basePath

猜你喜欢

转载自blog.csdn.net/why_still_confused/article/details/52761272