SSH笔记-Struts2的result标签中type的使用

1、result中type的类型有:

dispatcher(服务端的页面跳转,跳转到jsp,用户看到的是配置的访问地址,而不是真正的页面访问地址)  
chain(将请求发送到一个action)  
freemarker(处理freemarker模板)  
httpheader(返回报文头给用户)  
redirect(客户端页面重定向,跳转到jsp页面)  
redirectAction(客户端页面重定向,跳转到action)  
stream(用于下载文件)  
velocity(用于velocity技术集成)  
xslt(用于xml/xslt技术集成)  
plainText(普通文本)

2、默认的是dispatcher,常用的有:dispatcher、chain、redirect、redirectAction、stream

3、因为stream使用的时候,需要有对应的输出类型,所以单独一个action比较方便

4、struts.xml的写法
(1) 不填type,使用默认

<result name="result1">/result.jsp?result=result1</result>

(2)type用dispatcher

<result name="result2" type="dispatcher">/result.jsp?result=result2</result>

(3)type用redirect

<result name="result3" type="redirect">
   <param name="location">/result.jsp?result=result3</param>
</result>

(4)type用redirectAction

  • actionName:需要跳转的action名
  • namespace:按照跳转的目标action写
  • name=”“里面写参数名,可以用用传递参数
<result name="result4" type="redirectAction">
  <param name="actionName">RedirectActionTest</param>
  <param name="namespace">/</param>
  <param name="pid">${pid}</param>
  <param name="pName">${pName}</param>
</result>

(5)type用chain

  • actionName:要跳转的action名
<result name="result5" type="chain">
  <param name="actionName">ChainTest</param>
</result>

(6)type用stream

  • 输出文件的类写actino里面
  • action不写method的话,默认调用excute(),所以action类里面要写excute()方法
  • contentType是指需要输出的文件类型,默认写text/plain
  • inputName指的是输出方法的类型,默认写inputStream
  • contentDisposition,这个看下面代码注释
  • bufferSize输出缓存区大小,可设可不设
<action name="StreamTest" class="com.demo.sshtest.StreamTest">
            <result name="success" type="stream">
                <param name="pid">${pid}</param>
                <param name="pName">${pName}</param>
                <!--默认为 text/plain-->
                <param name="contentType">text/plain</param>
                <!-- 默认就是 inputStream,它将会指示 StreamResult 通过 inputName 属性值的 getter 方法, 意味着 Action 要有 getInputStream()方法 -->     
                <param name="inputName">inputStream</param>
                <!-- 默认为 inline(在线打开),设置为 attachment 将会告诉浏览器下载该文件 -->
                <!-- filename 指定下载文件保有存时的文件名,若未指定将会是以浏览的页面名作为文件名 -->
                <!-- 可以是动态文件名 ${fileName} -->
                <param name="contentDisposition">attachment;filename="${pName}.txt"</param>
                <!-- 输出时缓冲区的大小 -->       
                <param name="bufferSize">4096</param>
            </result>
        </action>

5、struts.xml最终代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <constant name="struts.action.extension" value="action,do,"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    <package name="default" namespace="/" extends="struts-default">
        <action name="SSHTest" class="com.demo.sshtest.SSHTest" method="doTest">
        <!-- ====================默认==================== -->
            <result name="result1">/result.jsp?result=result1</result>
        <!-- ====================dispatcher==================== -->
            <result name="result2" type="dispatcher">/result.jsp?result=result2</result>
        <!-- ====================redirect==================== -->
            <result name="result3" type="redirect">
                <param name="location">/result.jsp?result=result3</param>
            </result>
        <!-- ====================redirectAction==================== -->
            <result name="result4" type="redirectAction">
                <param name="actionName">RedirectActionTest</param>
                <param name="namespace">/</param>
                <param name="pid">${pid}</param>
                <param name="pName">${pName}</param>
            </result>
        <!-- ====================chain==================== -->
            <result name="result5" type="chain">
                <param name="actionName">ChainTest</param>
            </result>

        </action>

    <!-- ====================for redirectAction==================== -->
        <action name="RedirectActionTest" class="com.demo.sshtest.RedirectActionTest" method="doRedirect">
            <result name="success">/result.jsp?result=redirect</result>
        </action>
    <!-- ====================for chain==================== -->
        <action name="ChainTest" class="com.demo.sshtest.ChainTest" method="doChain">
            <result name="success">/result.jsp?result=Chain</result>
        </action>
    <!-- ====================for stream==================== -->
        <action name="StreamTest" class="com.demo.sshtest.StreamTest">
            <result name="success" type="stream">
                <param name="pid">${pid}</param>
                <param name="pName">${pName}</param>
                <!--默认为 text/plain-->
                <param name="contentType">text/plain</param>
                <!-- 默认就是 inputStream,它将会指示 StreamResult 通过 inputName 属性值的 getter 方法, 意味着 Action 要有 getInputStream()方法 -->     
                <param name="inputName">inputStream</param>
                <!-- 默认为 inline(在线打开),设置为 attachment 将会告诉浏览器下载该文件 -->
                <!-- filename 指定下载文件保有存时的文件名,若未指定将会是以浏览的页面名作为文件名 -->
                <!-- 可以是动态文件名 ${fileName} -->
                <param name="contentDisposition">attachment;filename="${pName}.txt"</param>
                <!-- 输出时缓冲区的大小 -->       
                <param name="bufferSize">4096</param>
            </result>
        </action>

    </package>
</struts>

6、dispatcher、redirect的action类代码

package com.demo.sshtest;

public class SSHTest {

    public int pid = 0;
    public String pName = "";
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getpName() {
        return pName;
    }
    public void setpName(String pName) {
        this.pName = pName;
    }

    public String doTest(){
        System.out.println(">>>>>pid:"+getPid()+" pName:"+getpName());
        if(1==getPid()){
            return "result1";
        }else if(2==getPid()){
            return "result2";
        }else if(3==getPid()){
            return "result3";
        }else if(4==getPid()){
            return "result4";
        }else if(5==getPid()){
            return "result5";
        }else{
            return "result0";
        }
    }
}

7、redirectAction的action类代码

package com.demo.sshtest;

public class RedirectActionTest {

    public int pid = 0;
    public String pName = "";
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getpName() {
        return pName;
    }
    public void setpName(String pName) {
        this.pName = pName;
    }

    public String doRedirect(){
        System.out.println("doRedirect");
        System.out.println(">>>>>pid:"+getPid()+" pName:"+getpName());
        return "success";
    }

}

8、chain的action类代码

package com.demo.sshtest;


public class ChainTest {

    //自动获取上下文Context
    //不用写getting setting 在前台看是一样可以有redirectAction的getting setting效果
    //如果要在action里面获取传过来的值,写getting setting是最简单的
    public String doChain(){
        System.out.println("doChain");
        return "success";
    }
}

9、stream的action类代码

package com.demo.sshtest;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class StreamTest {
    public int pid = 0;
    public String pName = "";
    public InputStream inputStream = null;

    public InputStream getInputStream() {
        return inputStream;
    }
    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getpName() {
        return pName;
    }
    public void setpName(String pName) {
        this.pName = pName;
    }
    public String execute() {
        System.out.println("doStream");
        System.out.println(">>>>>pid:"+getPid()+" pName:"+getpName());
        String output_data = ">>>>>pid:"+getPid()+" pName:"+getpName();
        InputStream in = new ByteArrayInputStream(output_data.getBytes());
        setInputStream(in);
        return "success";
    }

}

10、调用action的jsp页面代码

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script>
function changeaction(){
    var obj = document.getElementById("pid");
    var index = obj.selectedIndex;
    var text = obj.options[index].text;
    var value = obj.options[index].value;
    if(6==value){
        document.getElementById("ActionForm").action="StreamTest.action";
    }else{
        document.getElementById("ActionForm").action="SSHTest.action";
    }

}
</script>
</head>
<body>
    <form method="post" id="ActionForm" name="ActionForm" action="SSHTest.action">
        <select id="pid" name="pid" onchange="changeaction()">
            <option value="1" select>默认</option>
            <option value="2">dispatcher</option>
            <option value="3">redirect</option>
            <option value="4">redirectAction</option>
            <option value="5">chain</option>
            <option value="6">stream</option>
        </select>
        <input type="text" id="pName" name="pName" value="pName">
        <input type="submit" id="submit" name="submit" value="submit">
    </form>
</body>
</html>

11、项目目录
项目目录

12、注意事项

  1. 需要传什么参数就在result里面的写对应的参数名和值
    <param name="参数名">${参数值}</param>
  2. action类里面需要写需要接收的值的getting setting方法(chain的时候,可以不写也不影响前台接收数据,后台接收不写会变得麻烦一点)
  3. action类里面那些参数初始化的时候如果设private,可能出现接收不到的情况(具体解决方法,请大神伸出援手吧)
  4. demo地址:http://download.csdn.net/download/qq_22778717/10244349
  5. 这个demo是基于SSH笔记-Struts2配置中的demo修改的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值