12.Result结果类型

.  一个result元素,对应一个result类,类中接收不同的参数;

   1)在result路径问题
      在result映射的配置中,在指定实际资源的位置时,可以使用绝对路径也可以使用相对路径。
      绝对路径是以斜杠(/)开头,相对于当前web项目的上下文路径,相对路径不以斜杠(/)开头,
      相当于当前执行的action路径。
 

 <package name="default" extends="struts-default" namespace="/admin">
   <action name="login" class="cn.com.LoginAction">
    <result>success.jsp</result>
    <result name="error">/error.jsp</result>
   </action>
  </package>
  如果当前 Web应用程序的上下文路径是/test,那么请求/test/admin/login.action,执行成功后,转向的页面路径为
   /test/admin/success.jsp,否则,执行失败后,转向的页面路径为
   /test/error.jsp
 

   2)Struts2支持的结果类型

  chain     用于Action链式处理
  dispatcher 转发 默认值
freemarker 用于FreeMarker的集成 httpheader 用于控制特殊的HTTP行为 redirect 用于重定向到另外的URL(web资源) redirectAction 用于重定向到别外的action映射 stream 用于向浏览器返回一个InputStream(用于文件下载) velocity 用于Velocity集成 xslt 用于XML
/XSLTWYS DN plainText 用于显示某个特定页面(如jsp,html的原始内容)
    //示例::redirect重定向
    <package name="result"  extends="struts-default">
        <!-- 定义全局结果 -->
        <global-results>
            <result name="global">/jsps/res.jsp</result>
        </global-results>
        <!-- 定义一个action -->
        <action name="result" class="cn.xt.result.ResultAction">
            <result name="global" type="redirect">
                <param name="location">/jsps/res.jsp</param>
                <param name="name">${name}</param> //redirect下传参
                <param name="age">90</param>
                <param name="addr">${addr}</param>
                <param name="sg">${#session.height}</param>
                <param name="parse">false</param>    //parse是否解析串在url上做为参数的el表达式;不包括<param name="name">${name}</param> 
            </result>
        </action>
    </package>
    3)plainText 用于显示某个特定页面的原始内容(如jsp,html的原始内容)
            <action name="plain">
                <result name="success" type="plainText">
                    <param name="location">/jsps/a.jsp</param>
                    <param name="charSet">UTF-8</param>
                </result>
            </action>    
            
            
    4)Redirect:- 重定向到一个jsp页面。
    5)redirectAction    用于重定向到别外的action映射
            <!-- 从一个actioin转到另一个action上去执行 -->
            <action name="one" class="cn.xt.redirect.OneAction">
                <result name="success" type="redirectAction">
                    <param name="actionName">two</param>
                    <param name="namespace">/abc</param>//命名空间
                    <param name="nm">${name}</param>
                    <param name="age">${age}</param>
                    <param name="addr">${addr}</param>
                    <param name="suppressEmptyParameters">true</param> //当获取不到参数时 参数的key也不显示在url上
                </result>
            </action>
    
    6)Chain:  - dipatcherAction – 转发一个action
            <!--使用chain,chain1!save-->
            <!-- <action name="chain1_*_*" class="cn.xt.chain.Chain1Action">
                <result type="chain">
                    <param name="actionName">{2}</param> //转发到那个action
                    <param name="method">{1}</param>   //执行什么方法
                </result>
            </action> -->
            
            //转发到chain2
            <action name="chain1" class="cn.xt.chain.Chain1Action">
                <result type="chain">
                    <param name="actionName">chain2</param>
                </result>
            </action>
            <action name="chain2" class="cn.xt.chain.Chain2Action">
                <!-- 通过aliases给参数设置别名,即myname这个参数来自于name的值 -->
                <param name="aliases">#{'name':'myname'}</param> //aliases取别名 ,当chain1中的属性名为name,chain2的属性名为myname
                                                                //这时转发时设置别名#{'name':'myname'},就可以所chain1中的name 改名为myname
                                                                //在chain2中使用;
                <result>/jsps/a.jsp</result>
            </action>    

    7)httpheader    用于控制特殊的HTTP行为
        用于返回http响头
    
    
    
    8)自定义result步骤:
        第一步:实现一个Result接口的类。必须要实现一个方法
          class MyResult implements Result{//xwork
                //ai对象是当前执行action的代理,通过ai.getAction可以返回当前正在执行的对象
                public void execute(ActionInvocation ai) throws exception{
                    //处理代理。包括 使用request,response输出IO流。
                }
          }
      第二步:配置struts.xml中去
            <result-types>
                <result name="myresult" class="MyResult"/>
            </result-types>
        一个result仅对一个package有效。如果希望让所所有package有效,则其他的package应该extends它。
        
        第三步:可以在MyResult中接收参数,并在sturts.xml中通过<pamam>元素设置值,如:
          class MyResult....{
               private String name;
               //getxxx,setxxx
            }

            <action name="show" class="...">
                    <result name="myserult">
                        <param name="name">Jack</pamam>
                    </result>
            </action>
           
           在MyResult的exexute方法中建议不要使用某个Action的具体类名.
           应该使用Object来操作。
           可以回调某个Action的代码。    
           
        //示例:: 功能1 自定义result   生成验证码
        //          功能2 获取正在执行的action对象 回调action中的方法
            /**
             * ServletActionContext
             */
            public class ImgResult implements Result{
                int width=60;
                int height=30;
                public int getWidth() {
                    return width;
                }
                public void setWidth(int width) {
                    this.width = width;
                }
                public int getHeight() {
                    return height;
                }
                public void setHeight(int height) {
                    this.height = height;
                }
                public void execute(ActionInvocation ai) throws Exception {
                    /*
                    //通过ai对象,获取正在执行的action对象
                    
                    Object obj = ai.getAction();
                    System.err.println("正在执行的是:"+obj);//ImageAction
                    if(obj instanceof ImageAction){
                        ImageAction ia = (ImageAction) obj;
                        String ss = ia.aaa("xtksfm");  //调用action中的方法aaa并传参xtksfm 
                        System.err.println("返回的值是:"+ss);
                    }
                    */HttpServletResponse response = ServletActionContext.getResponse();
                    response.setContentType("image/jpeg");
                    
                    BufferedImage img = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
                    Graphics g = img.getGraphics();
                    Random r = new Random();
                    int code = r.nextInt(10000);
                    
                    ActionContext.getContext().getSession().put("code",code);//放到session中去
                    
                    g.setFont(new Font("st",Font.BOLD,19));
                    g.drawString(""+code,0,30);
                    g.dispose();
                    ImageIO.write(img,"JPEG",response.getOutputStream());
                }

            }

            <!--使用自定义的结果 -->
            <action name="imgAction">
                <result type="img">
                    <param name="width">160</param>
                    <param name="height">300</param>
                </result>
            </action>
            
        
        9)stream        

        //示例::简单下载
        public class DownAction extends ActionSupport{
            //stream对应的结果类中会调用getInputStream()这个方法
            public InputStream getInputStream() throws Exception{
                System.err.println("开始下载。。。。");
                String path = ServletActionContext.getServletContext().getRealPath("/down/1.jpg");
                InputStream in = new FileInputStream(path);
                return in;
            }
            @Override
            public String execute() throws Exception {
                return SUCCESS;
            }
        }
        ----------------------------------------------
        //示例2:: 设置了中文編码和改变了回调的下载
        用于向浏览器返回一个InputStream(用于文件下载)\
            <!-- 配置下载 -->
            <action name="down" class="cn.xt.down.DownAction">
                <result type="stream">
                    <param name="contentType">image/bmp</param>        //指定响应类型
                    <param name="contentDisposition">attachment;filename="${name}"</param>//指定下载为附件,和文件名
                    <param name="inputName">myimg</param>//指定回调action中的那个下载方法,
                                                        //如果不写默认调用getInputStream方法-->
                </result>
            </action>
        --------
        public class DownAction extends ActionSupport{
            private String name;
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            //在配置文件中指它了回调 该方法进行下载
            public InputStream getMyimg() throws Exception{
                System.err.println("开始下载。。。。");
                String path = ServletActionContext.getServletContext().getRealPath("/down/1.jpg");
                InputStream in = new FileInputStream(path);
                return in;
            }
            
            @Override
            public String execute() throws Exception {
                System.err.println("开始下载.....");
                String nm = "开始下载.bmp";
                nm = URLEncoder.encode(nm,"UTF-8");
                setName(nm);
                return SUCCESS;
            }
        }

 

posted @ 2013-02-13 19:50  一灵  阅读(310)  评论(0编辑  收藏  举报