zoukankan      html  css  js  c++  java
  • 【struts2】名为dispatcher的ResultType

      1)基本使用

      名称为“dispatcher”的ResultType,在struts-default.xml里的配置如下:

    <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>

      通过配置可以看出,它对应的实现类是ServletDispatcherResult。

      如果采用JSP作为视图的实现技术,那么这个ResultType是最常用的。在这个ResultType的实现中,调用了javax.servlet.RequestDispatcher类的forward方法,也就是说它相当于是对RequestDispatcher的一个再包装。

      既然是这样,那么在Servlet中使用RequestDispatcher来进行页面跳转的特性,也就自然被“dispatcher”这个ResultType继承下来了。那么Servlet中的RequestDispatcher,到底有什么特性呢?那就是是通过RequestDispatcher来进行页面跳转,将会保持是同一个请求对象。这有什么好处呢?由于是同一个对象,那就意味着有同样的数据,而请求对象里面数据众多,在Servlet的request对象里面,典型有如下数据:

    • 参数区(parameter),就是用户在页面上填写并提交的数据
    • Head区,由浏览器在发出请求的时候,自动加入到请求包的数据
    • 属性区(Attribute),由开发人员存储在属性区的值,通常是通过request.setAttribute方法、request.getAttribute方法来进行访问
    • cookie区,由浏览器在发出请求的时候,自动把相关的Cookie数据通过request传递到服务端

      好处是不是很大?因此这也是使用Struts2来进行web开发中最常使用的ResultType。

      2)特殊用法

      在<result>元素的定义中可以使用Action的execute方法运行之后的数据。怎么做呢?一起来看看示例。或许我们都已经习惯于以下这种简单的<result>配置:

    <result name="toWelcome">/s2impl/welcome.jsp</result>  

      里面用于指定jsp位置的字符串都是固定的。如果我们希望这个字符串是活动的,可以根据某些参数值来变化,该怎么做到呢?如果我们在Action中定义一个folder字符串,并在execute中或validate中对它进行赋值,这里我们放到validate中,代码如下:

    package cn.javass.hello.struts2impl.action;  
    
    import com.opensymphony.xwork2.ActionSupport;
      
    public class HelloWorldAction extends ActionSupport {  
        private String account;  
        private String password;  
        private String submitFlag;  
        private String folder; 
        
        public String execute() throws Exception {  
            this.businessExecute();  
            return "toWelcome";  
        }  
        public void validate(){  
            this.folder = "s2impl"; //放在这里的原因是:validate先与execute执行,如果fieldError里面有值,execute就不执行了
            if(account==null || account.trim().length()==0){  
                this.addFieldError("account", this.getText("k1"));  
            }  
            if(password==null || password.trim().length()==0){  
                this.addFieldError("password", this.getText("k2"));  
            }
            if(password!=null && !"".equals(password.trim()) && password.trim().length()<6){  
                this.addFieldError("password", this.getText("k3"));  
            }  
        }  
        /** 
         * 示例方法,表示可以执行业务逻辑处理的方法, 
         */  
        public void businessExecute(){  
            System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag);  
        }
        public String getAccount() {
            return account;
        }
        public void setAccount(String account) {
            this.account = account;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getSubmitFlag() {
            return submitFlag;
        }
        public void setSubmitFlag(String submitFlag) {
            this.submitFlag = submitFlag;
        }
        public String getFolder() {
            return folder;
        }
        public void setFolder(String folder) {
            this.folder = folder;
        }  
        
    }  
    View Code

      那么,在<result>的定义中就可以引用folder这个变量,示例如下:

    <package name="helloworld"  extends="struts-default">  
       <action name="helloworldAction" class="cn.javass.hello.struts2impl.action.HelloWorldAction">  
           <result name="toWelcome" type="dispatcher">/${folder}/welcome.jsp</result> 
           <result name="input">/${folder}/login.jsp</result>   
       </action>  
    </package>  

      这样配置的结果和前面写死的路径效果时完全一样的。仔细观察一下你会发现,“${folder}”的写法跟以前在jsp上写的el表达式类似,而里面的“folder”是跟Action的属性相对应的。

      3)更完整的配置方式

       平时我们把result对应的jsp的路径,直接作为<result>元素中的文本来配置,这是简化的写法,实际上对于dispatcher还有两个参数可以配置,示例如下:

    <result name="toWelcome" type="dispatcher">  
        <param name="location">/s2impl/welcome.jsp</param>  
        <param name="parse">true</param>  
    </result>  

      location参数就是咱们平时写的下一个jsp的位置,而parse参数决定了location是否可以通过使用OGNL来引用参数,默认为true。其实,前面使用${folder}来引用Action的folder属性的值的例子,就是使用的OGNL来引用参数。

      参考资料:http://www.iteye.com/topic/1124526

  • 相关阅读:
    pytorch——nn.Module
    jQuery性能优化的28个建议
    javascript string 转 date
    javascript 追加date format属性。
    javascript翻页小控件paginator
    getTime()的00:00:00问题。
    禁止输入表情的方法
    解决带有导航的情况下 关于present自动返回的问题
    设置透明色
    class can not be find with platformType:1 step 1
  • 原文地址:https://www.cnblogs.com/ningvsban/p/3735025.html
Copyright © 2011-2022 走看看