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中有对应的配置。

原文地址:https://www.cnblogs.com/youngchaolin/p/10850779.html

时间: 2024-10-07 14:45:50

SSH学习-struts2的result类型的相关文章

struts2学习笔记之七:Result类型

一:关于Struts2的type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute方法 他们体现了策略模式,具体Result类型参见:struts-default.xml文件: <result-types> <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> <result-type name=&

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

一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出.在com.opensymphony.xwork2.Action接口中定义了一组标准的结果代码,可供开发人员使用,当然了只有我们的action继承ActionSupport 这个类才可以使用下面的结果代码,如下所示:public interface Action{    public static final String SUCCESS =

Struts2中 Result类型配置详解

一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出. 在com.opensymphony.xwork2.Action接口中定义了一组标准的结果代码,可供开发人员使用,当然了只有我们的action继承ActionSupport 这个类才可以使用下面的结果代码,如下所示: public interface Action {     public static final String SUCCES

SSH学习-Struts2中的session

Struts中也有session,跟其他框架类似,也需要用它保存用户信息,或者其他信息.学习发现,Struts2获取session有三种方式,下面引入登录的案例,分别使用三种方式验证用户名和密码信息. Struts2获取session的三种方式 (1)使用工厂方法获取,使用ActionContext实现,session为Map<String,Object>类型 (2)使用注入方式获取session,session为Map<String,Object>类型 (3)使用ServletA

struts2结果(result)类型

result的type属性默认为dispatcher,其他常见的属性有redirect\chain\redirectAction <action name="a1"> <result type="dispatcher"> /a1.jsp </result> </action> <action name="a2"> <result type="redirect"&

配置Result——学习Struts2

使用Struts2的MVC思想中,学习Struts2的配置文件必不可少.此处重点介绍Result的学习心得并记录,Result在Struts2中-------- 本文为作者学习笔记,源于对<轻量级Java_EE企业实战(第三版)>一书的学习,内容借鉴于它. 1.Struts2提供了2种返回结果 -局部结果:将<result-/>作为<action-/>元素的子元素配置 -全局结果:将<result-/>作为<global-result-/>元素的

【SSH学习笔记】用Struts2实现简单的用户登录

准备阶段 在使用学习Struts2的时候首先要下载相应的架包 Struts2资源下载 这里建议下载第一个,在struts-2.5.14.1-all.zip里有很多实用的东西,不仅有架包还有官方为开发者准备的实例等. 任何所学的知识最有效的检测方式就是做一个小小的实例,这里吉力就带着大家看看Struts2是怎么实现这个功能的. Struts2核心jar包: struts2-core-2.3.15.3.jar asm-3.3jar asm-common-3.3jar asm-tree-3.3jar

Struts2的result中各种type类型以及配置文件的一些细节

Struts2支持的不同类型的返回结果为: Chain Result-->type="chain"用来处理Action链 Dispatcher Result -->type="dispatcher"用来转向页面,通常处理JSPFreeMarker Result -->type="freemarker"处理FreeMarker模板HttpHeader Result -->type="httpheader"

SSH学习

SSH 学习笔记 SSH:struts + hibernate + spring 第一部分:struts2 (没有数据库) struts2 简介 servlet解耦,实现了MVC的思想: struts2 配置文件的标签 package name:唯一标识一个包,不能重名: extends:继承其他包,可以直接使用该包中的资源: abstract:true 包为抽象包,不能写action标签.默认为false: namespace:命名空间,注意搜索机制,默认namespace="/":