SSH学习-struts2的result类型

Posted youngchaolin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH学习-struts2的result类型相关的知识,希望对你有一定的参考价值。

在学习struts2整合spring的过程中,以前result类型只有name属性,后面发现struts-default.xml中定义了10种result类型,在result标签中可以使用type属性来指定是哪种类型,接下来对常用的几种类型做案例进行理解。

result常用类型

result类型参考struts-default.xml中对result的配置,如下所示:

        <result-types>
            <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
            <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"/>
            <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
            <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>

其中常用的类型就是dispatcher, redirectAction, redirect, stream, json,其具体作用如下:

(1)dispatcher:默认类型,转发

(2)redirectAction:重定向到其他action,语法有两种,参考struts.xml中配置

(3)redirect:重定向URL,也有两种写法,参考struts.xml中配置

(4)stream:用于图片的传输下载,可以参考struts2 API文档进行配置

(5)json:待补充

案例说明-dispatcher、redirectAction、redirect

案例以用户提交action请求时,提交num属性的值,不同的数字返回不同的result类型,从而达到测试理解的效果。这里主要讲struts.xml中的配置,以及action对应类的写法,其他的配置省略。

(1)struts.xml中的配置,具体参考注释部分。

  <package name="demo" namespace="/hello" extends="struts-default">
    <!-- 当和Spring整合后,class不需要写全名,使用bean id即可,默认为类名首字母小写 -->
    <action name="helloStruts" class="helloStruts"> 
       <result name="success">
         /WEB-INF/helloStruts.jsp
       </result>
    </action>
  </package>

  <!-- result类型测试 -->
  <package name="result" namespace="/result" extends="struts-default">
    <action name="helloStruts" class="helloStruts">
      <result name="success">
        /WEB-INF/helloStruts.jsp
      </result>      
    </action>       
       <!-- 用户提交不同的数字,实现dispatcher,redirectAction,redirect三种功能 -->
       <action name="sw" class="switchAction" method="doSwitch">
         <!-- 返回1,实现转发 -->
         <result name="1" type="dispatcher">
           /WEB-INF/helloStruts.jsp
         </result>
         <!-- 返回2,实现重定向到其他action -->
         <!-- 转发到内部的action -->
         <result name="2" type="redirectAction">
           helloStruts
         </result>
         <!-- 转发到其他的action -->
         <result name="3" type="redirectAction">
           <param name="namespace">/hello</param>
           <param name="actionName">helloStruts</param>
         </result>
         <!-- 转发到URL -->
         <result name="4" type="redirect">
           https://www.cnblogs.com/youngchaolin/
         </result>
       </action>      
       
  </package>

(2)控制器类switchAction中代码,用num属性来接受用户提交的数字。

package Controller;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 * 用户从浏览器提交不同的数字,得到不同的result处理结果
 * @author yangchaolin
 *
 */
@Controller("switchAction")
@Scope("prototype")
public class switchAction {
    
    //属性,用于接受用户提交的数字
    private int num;

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
    
    //具体自定义执行方法
    //方法里写参数会报错,不写参数就OK
    public String doSwitch() {
          String numStr=Integer.toString(num);
          System.out.println("用户提交的数字为:"+numStr);
          return numStr;
    }

}

测试结果-dispatcher、redirectAction、redirect

(1)num提交数字1

技术图片

当用户提交1,执行的result为转发,直接跳转到jsp页面并显示结果。

(2)num提交数字2

技术图片

当用户提交2时,会跳转到/result/helloStruts.action请求,此时跳转范围在/result下,为内部跳转action。

 (3)num提交数字3

技术图片

当用户提交3时,会跳转到/hello/helloStruts.action请求,此时跳转范围在/hello下,为外部跳转action。

(4)num提交数字4

技术图片

当用户提交4时,会跳转到自己的博客园地址,为重定向到URL,上面只写了一种,另一种跟redirectAction类似,也是需要使用param标签。

         <result type="redirect">
           <param name="location">
             https://www.cnblogs.com/youngchaolin/
           </param>
         </result>

案例分析-stream

result类型为stream时,采用浏览器从服务端获取图片的案例,这里需要参考struts2 API来进行result的配置,如下是API描述,常用的几个参数为:

(1)contentType:发送到浏览器的类型,默认为text/plain

(2)contentLength:对应字节数组的长度

(3)inputName:为action实现类中inputStream属性的名字

(4)bufferSize:传输缓冲大小,默认1024byte ,即1kib

(5)contentDisposition:强制下载时需要配置

这里也配置了struts.xml,另外还有实现类,其他省略。

技术图片

(1)struts.xml中的配置,其中主要配置好contentType和inputName就可以显示服务端生成的图片,其中inputName对应的参数值image,需要action实现类中属性InputStream的变量名一致,如果还需要强制下载,就需要配置contentDisposition。

       <!-- result类型指定为stream,浏览器向服务端请求一张图片,并显示在网页 -->
       <action name="image" class="imageAction">
         <result name="success" type="stream">
           <param name="contentType">image/png</param>
           <param name="inputName">image</param>
           <param name="contentDisposition">attachment;filename="test.png"</param>
           <param name="bufferSize">1024</param>
         </result>
       </action>

(2)控制器imageAction中的写法,其中在服务端生成图片,并将图片内容转换成字节数组,然后利用字节数组作为参数初始化InputStream。

package Controller;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 * 服务端给浏览器发送图片
 * @author yangchaolin
 *
 */
@Controller("imageAction")
@Scope("prototype")
public class imageAction {
    
    //属性
    //属性名需要和struts.xml配置文件中inputName属性值一致
    InputStream image;

    //浏览器从服务器获取图片需要设置get方法,使用工具一般两个都配置了
    public InputStream getImage() {
        return image;
    }

    public void setImage(InputStream image) {
        this.image = image;
    }
    
    //具体执行方法
    public String execute() throws IOException {
        //准备画布
        BufferedImage img=new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
        //准备画笔
        Graphics2D g=img.createGraphics();
        //画图
        g.setColor(Color.CYAN);
        Font font=new Font("微软雅黑",Font.BOLD,20);
        g.setFont(font);
        g.drawString("Hello Struts2", 30, 100);        
        //将图片转换成字节数组
        ByteArrayOutputStream out=new ByteArrayOutputStream();
        ImageIO.write(img, "png", out);
        byte[] imgByte=out.toByteArray();
        //将字节数组作为参数,传入inputStream构造方法
        image=new ByteArrayInputStream(imgByte);
        return "success";
    }

}

测试结果-stream

技术图片

结论:

result类型就相当如菜谱名,根据不同的菜谱名可以做出不同的菜,几种常见的result类型,其struts.xml中有对应的配置。

以上是关于SSH学习-struts2的result类型的主要内容,如果未能解决你的问题,请参考以下文章

Struts2学习笔记 - 结果类型result

SSH之Spring整合struts2

Struts2中 Result类型配置详解

Struts2中 Result类型配置详解(转)

Struts2--result页面跳转forward--get方式和post方式的获取参数

struts2学习笔记-------struts2的ajax支持