`

Struts2.0深入学习 Strust2与Servlet API,Action多方法调用,result标签的type的类型

阅读更多

Struts2深入探索:
    1,package中的abstract="true"表示该package里面不能包函action元素
   
    2,package中若指定namespace="/mynamespace"则:
        <!--
            包的namespace要以"/"开头,对应的页面的路径前面也加上/mymengya/ActionName.action
            如:<s:form action="/mymengya/register.action" method="post" theme="simple">
         -->
        <package name="mengya" extends="struts-default" namespace="/mymengya">
           
            <action name="register"
                class="com.mengya.action.RegisterAction">
                <result name="success">/show.jsp</result>
                <result name="input">/index.jsp</result>
                <result name="invalid.token">/index.jsp</result>
                <interceptor-ref name="token"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
               
            </action>
           
        </package>
        在页面form的action中也要加上/mynamespase并且还要加上后缀action(不管是不是用的struts标签)
       
    3,模型驱动
        /**
         * 模型Bean
         * @author 张明学
         *
         */
        public class RegisterBean {
            private String username;
       
            private String password;
       
            public String getPassword() {
                return password;
            }
       
            public void setPassword(String password) {
                this.password = password;
            }
       
            public String getUsername() {
                return username;
            }
       
            public void setUsername(String username) {
                this.username = username;
            }
       
        }
        Action则要接实com.opensymphony.xwork2.ModelDriven接口:
        public class RegisterAction extends ActionSupport implements ModelDriven {
   
            /**
             * 模型驱动,该模型Bean必须实例化
             */
            private RegisterBean loginBean = new RegisterBean();
       
            public Object getModel() {
                return loginBean;
            }
       
            @Override
            public String execute() throws Exception {
       
                return SUCCESS;
            }
       
        }
        对应页面则可以直接用模型Bean的属性
        如:<tr>
            <td>
                用户名:   
                <s:textfield name="username"></s:textfield>
                <%-- 将form的theme="simple"就可以自由布局了,对于fielderror加上name属性就可以显示这个属生的错误信息 --%>
                <s:fielderror name="username"></s:fielderror>
            </td>
           </tr>
           <tr>
                <td>
                    密码:
                    <s:password name="password"></s:password>
                    <s:fielderror name="password"></s:fielderror>
                </td>
           </tr>
          
          <s:property value="username"/>
            <s:property value="password"/>
           
      5,表单重复提交:
          一,在form里面加上<s:token id="register"></s:token>标签
          二,在Action里加上<interceptor-ref name="token"></interceptor-ref>拦截器
              默认拦截器:<interceptor-ref name="defaultStack"></interceptor-ref>
          三:原理:
              当页面第一次生成的时候<s:token id="register"></s:token>会生成一个隐藏表单域其中包涵一个值,该值也同样被存放到session当中去了
              当页面第一次提交的时候token拦截器会比较这两个值是否相同,相同则第一次提交,第一次提交后会把session这个值清空,表单若再一次提交时则
              session当中没有值即两个值不相同提交失败,返回的resut的name为:invalid.token 即:<result name="invalid.token">/index.jsp</result>
              <s:form action="/mymengya/register.action" method="post" theme="simple">
            <s:token id="register"></s:token>
            <table width="50%">
                <tr>
                    <td>
                        用户名:   
                        <s:textfield name="username"></s:textfield>
                        <s:fielderror name="username"></s:fielderror>
                    </td>
                </tr>
                <tr>
                    <td>
                        密码:
                        <s:password name="password"></s:password>
                        <s:fielderror name="password"></s:fielderror>
                    </td>
                </tr>
                <tr>
                    <td>
                        <s:submit value="注册"></s:submit>
                    </td>
               
                </tr>
            </table>
            </s:form>
           
            <package name="mengya" extends="struts-default" namespace="/mymengya">
       
                <action name="register"
                    class="com.mengya.action.RegisterAction">
                    <result name="success">/show.jsp</result>
                    <result name="input">/index.jsp</result>
                    <result name="invalid.token">/index.jsp</result>
                    <interceptor-ref name="token"></interceptor-ref>
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                   
                </action>
               
            </package>
           
            修改Struts2默认的重复提交的错误提示信息:
            在Struts2国际化属性文件中添加一条信息:
            struts.messages.invalid.token = \u8868\u5355\u4e0d\u5141\u8bb8\u91cd\u590d\u63d0\u4ea4
            struts.messages.invalid.token = 不能重复提交
   
    6,Strust2与Servlet API
        第一种方式:使用ActionContext

/**
             * ActionContext类降低了与servlet API的耦合(获得不了response)
             */
            // 实例化,用ActionContext的getContext()静态方法
            ActionContext actionContext = ActionContext.getContext();
            // 与request.setAttribute("mengya", "xiaobo")类似
            actionContext.put("mengya", "xiaobo");
            // request.getAttribute("mengya")类似
            actionContext.get("mengya");
            // 相当于ServletContext
            // Returns a Map of the ServletContext when in a servlet environment or
            // a generic application level Map otherwise
            actionContext.getApplication();
   
            // 相当于HttpServletSession
            Map session = actionContext.getSession();
            // 相当于request.getParameterMap();
            Map parametersMap = actionContext.getParameters();
 

           
         
        第二种方式:让Action实现ServletRequestAware或ServletResponseAware接口
            /**
             * 获得HttpServletRequest 实现ServletRequestAware接口
             *
             * @author 张明学
             *
             */
            public class RegisterAction2 extends ActionSupport implements ModelDriven,
                    ServletRequestAware {
                private HttpServletRequest request;
               
                private RegisterBean loginBean = new RegisterBean();
           
                public Object getModel() {
                    return loginBean;
                }
           
                @Override
                public String execute() throws Exception {
                    request.setAttribute("mengya", "xiaobo");
                    request.getAttribute("mengya");
                    return SUCCESS;
                }
           
                public void setServletRequest(HttpServletRequest arg0) {
                    request = arg0;
                }
           
            }
           
            /**
             * 获得HttpServletResponse 实现ServletResponseAware接口
             *
             * @author 张明学
             *
             */
            public class RegisterAction3 extends ActionSupport implements ModelDriven,
                    ServletResponseAware {
           
                private HttpServletResponse response;
           
                private RegisterBean loginBean = new RegisterBean();
           
                public Object getModel() {
                    return loginBean;
                }
           
                @Override
                public String execute() throws Exception {
                    Cookie cookie = new Cookie("username", this.loginBean.getUsername());
                    response.addCookie(cookie);
                    return SUCCESS;
                }
           
                public void setServletResponse(HttpServletResponse arg0) {
                    this.response = arg0;
                }
           
            }
           
        第三种方式:ServletActionContext
            /**
             * ServletActionContext真接获得HttpServletRequest和HttpServletResponse
             */
            HttpServletRequest reqeust = ServletActionContext.getRequest();
            HttpSession httpsession = reqeust.getSession();
            HttpServletResponse response = ServletActionContext.getResponse();   
           
    7,Action多方法调用
        方式一:
            在struts.xml中的action标签中添加method值如:
       
            <!-- 没有method属性值则这是MyTestAction默认的调用方法即execute方法将被调用 -->
            <action name="myTest" class="com.mengya.action.MyTestAction">
                <result name="success">/index.jsp</result>
            </action>
           
            <!-- method属性值为text1则这是MyTestAction调用方法即text1方法将被调用 -->
            <action name="text1" class="com.mengya.action.MyTestAction" method="text1">
                <result name="success">/index.jsp</result>
            </action>       
       
        方式二:
            在struts.xml中的action标签不改
            <action name="myTest" class="com.mengya.action.MyTestAction">
                <result name="success">/index.jsp</result>
            </action>
            页面修改:
            <a href="myTest.action">Action默认的方法</a><br>
              <a href="myTest!text1.action">Action的text1方法</a><br>
              <a href="myTest!text2.action">Action的text2方法</a>
             
        方式三:通配符(个人不推荐使用)
            struts.xml的配置:
            <action name="*myTest" class="com.mengya.action.MyTestAction" method={1}>
                <result name="success">/index.jsp</result>
            </action>                      
            页面:
            <a href="myTest.action">Action默认的方法</a><br>
              <a href="text1myTest.action">Action的text1方法</a><br>
              <a href="text2myTest.action">Action的text2方法</a>
                   
      8,result标签的type的类型
          在struts2-core-2.1.6.jar中的struts-default.xml中:
          <result-types>
              <!-- Action链 -->
            <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
           
            <!-- 默认的type类型,请求转发 request.getRequestDispatcher(url).forward(request, response)-->
           
            <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"/>
           
            <!-- 重定向response.sendRedirect(url); -->
           
            <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
           
            <!-- 重定向到另一个Action -->
            <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-types>

  • Struts2_12.rar (3.6 MB)
  • 描述: Struts2.0深入学习 Strust2与Servlet API,Action多方法调用,result标签的type的类型实例
  • 下载次数: 89
分享到:
评论

相关推荐

    Struts2中直接和间接访问ServletAPI以及动态方法调用之感叹号

    其次,间接访问Servlet API是指通过Struts2的内部机制,如Interceptor(拦截器)和Result(结果类型)来间接操作Servlet API。这些内部组件允许开发者在不直接接触Servlet API的情况下实现一些功能,如登录验证、...

    Struts2.0 入门学习资料

    1. 动态方法调用:Struts2.0支持动态方法调用,允许开发者直接通过URL来调用Action类的方法,增强了路由的灵活性。 2. 拦截器:拦截器是Struts2.0的一大亮点,可以实现如日志记录、权限验证、事务管理等通用功能,...

    struts 2.0 详细配置

    Struts 2.0 是一个功能强大的框架,为开发者提供了很多便利的功能,如自动类型转换、国际化支持等。通过上述介绍,我们可以了解到 Struts 2.0 的核心概念及其工作原理。掌握了这些基础知识后,开发者可以更轻松地...

    struts2.0所有jar包

    3. **Interceptor(拦截器)**:拦截器是Struts2的一大特色,它可以拦截Action调用前后执行特定的逻辑,如权限验证、日志记录等。例如,`ValidationInterceptor`用于进行数据验证,`PrepareInterceptor`则用于准备...

    struts 2.0 核心jar包

    Struts 2是Struts 1的升级版,引入了更多的特性,如拦截器(Interceptor)、OGNL(Object-Graph Navigation Language)表达式语言和动态方法调用。它弥补了Struts 1在灵活性和可扩展性上的不足,使开发者能够更加...

    struts2.0中文教程

    Interceptor(拦截器)则是Struts2的一大特色,它允许在Action调用前后插入自定义逻辑,如日志记录、权限验证等,增强了框架的灵活性和可扩展性。 配置是Struts2框架的关键部分,主要通过struts.xml文件进行。在这...

    Struts2.0中文教程

    Struts2.0的请求处理流程大致如下:用户发送HTTP请求到Servlet容器,Struts2的Front Controller(StrutsPrepareAndExecuteFilter)拦截请求,根据配置文件找到对应的Action,调用其执行方法,执行完毕后,通过Result...

    struts2.0拦截器、crud例子与用法

    2. Struts2框架根据配置文件解析请求,确定Action类、Action方法和需要的拦截器。 3. 创建新的Action实例,执行Action方法,处理业务逻辑。 4. Action方法执行完成后,返回一个Result对象,表示后续的处理步骤,如...

    Struts2.0框架技术详解

    Struts2支持多种result类型,例如dispatcher、redirect、chain等。 **示例**: ```xml &lt;action name="myAction" class="com.example.MyAction" method="execute"&gt; &lt;result type="dispatcher" name="success" ...

    struts2.0架构及详解

    在Struts2.0中,控制器由`ActionServlet`和`FilterDispatcher`组成,它们负责接收HTTP请求,解析请求参数,调用Action,根据Action返回的结果跳转到相应的视图。 7. **OGNL(Object-Graph Navigation Language)**...

    struts2.0搭建

    Struts2.0是一款强大的Java Web开发框架,它基于MVC(Model-View-Controller)设计模式,旨在简化企业级...要深入学习Struts2,需要掌握更多关于Action、Result、Interceptor、ValueStack以及OGNL表达式等方面的知识。

    Struts2.0学习系列(整理)

    3. **拦截器(Interceptors)**:Struts2的一个强大特性,它们按照预定义的顺序在Action调用前后执行,可以实现如日志记录、权限检查、事务管理等功能。 4. **结果类型(Result Types)**:定义了Action执行后如何...

    struts2.0帮助文档

    学习Struts2.0时,除了阅读文档,还需要动手实践,通过创建项目、配置Action、编写Interceptor、调试运行,以深入理解其工作原理。此外,了解和掌握相关的Java Web技术,如Servlet、JSP、EL等,能更好地运用Struts...

    struts2.0 pdf书

    根据提供的信息,我们可以深入探讨Struts 2.0框架及其在构建MVC架构Web应用程序中的应用方式。以下是对Struts框架的重要概念和技术细节的详细解释: ### Struts 2.0 概述 Struts 2.0 是一个用于开发Java Web应用...

    struts2.0教程

    1. **过滤器Dispatcher**: 代替了Struts1.x的ActionServlet,使得Struts2.0可以更好地与其他过滤器和Servlet容器集成。 2. **Action上下文**: 为Action提供了一个上下文对象,包含了请求、会话、应用级的数据,以及...

    struts2.0技术资料1

    Interceptor是拦截器,可以插入到Action调用的前后,实现如日志记录、权限检查等功能。 **2. 动态方法调用** Struts2.0支持动态方法调用,允许开发者通过URL直接调用Action类的方法,无需预先在配置文件中声明。这...

    struts 2.0的详细讲解.rar

    4. **Action执行**:当拦截器链完成后,Struts 2将请求映射到相应的Action实例并调用其方法。 5. **结果渲染**:Action执行完毕后,根据返回的结果类型和结果配置,决定如何展示给用户,可能包括跳转页面、重定向等...

    struts2.0学习资料

    Struts2预定义了一些常见的结果类型,如`dispatcher`(用于转发到JSP或其他Servlet),`stream`(用于处理流式数据),`redirect`(用于重定向URL)等。 7. **包(Package)的继承与扩展**: - `package`元素可以...

    struts2.0源码

    深入研究Struts2.0的源码,我们可以学习到如何构建MVC框架、理解AOP在Web应用中的实现、掌握OGNL的表达式解析以及了解如何通过拦截器实现灵活的业务逻辑扩展。这对于提升Java Web开发技能和理解其他类似的框架(如...

    freemarker+struts2.0 实例20090309.rar

    - 创建`struts.xml`配置文件,配置Struts2.0的拦截器、Action和Result类型。 - 在`web.xml`中配置Struts2.0的前端控制器Filter。 - 设定FreeMarker的配置,包括模板路径、编码格式等。 - 创建FreeMarker模板文件...

Global site tag (gtag.js) - Google Analytics