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