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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值