Struts2与Servlet

本文详细介绍了Struts2框架中的各种结果类型,包括dispatcher、redirect、chain等,以及如何使用这些类型进行页面转发和重定向。同时,深入解析了Struts2中参数的获取方式,涵盖属性驱动、对象驱动和模型驱动,以及如何封装集合类型参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

名称类型描述
chaincom.opensymphony.xwork2.ActionChainResult转发到Action
dispatcherorg.apache.struts2.dispatcher.ServletDispatcherResult转发(默认)
freemarkerorg.apache.struts2.views.freemarker.FreemarkerResultFreemarker模板
httpheaderorg.apache.struts2.dispatcher.HttpHeaderResult返回http响应头
redirectorg.apache.struts2.dispatcher.ServletRedirectResultAction重定向
redirectActionorg.apache.struts2.dispatcher.ServletActionRedirectResult重定向到Action
streamorg.apache.struts2.dispatcher.StreamResult下载文件
velocityorg.apache.struts2.dispatcher.VelocityResultVelocity模板
xsltorg.apache.struts2.views.xslt.XSLTResultXML/XSLT模板
plainTextorg.apache.struts2.dispatcher.PlainTextResult普通文本
postbackorg.apache.struts2.dispatcher.PostbackResult表单形式
常用 转发 重定向 转发到Action 重定向Action
<package name="test" namespace="/test" extends="struts-default" >
	<!--  转发 -->
	<action name="Test1Action" class="com.java.Test1Action" method="execute" >
		<result name="success" type="dispatcher" >/index.jsp</result>
	</action>
	<!-- 重定向 -->
	<action name="Test2Action" class="com.java.Test2Action" method="execute" >
		<result name="success" type="redirect" >/index.jsp</result>
	</action>
	<!-- 转发到Action -->
	<action name="Test3Action" class="com.java.Test3Action" method="execute" >
		<result name="success" type="chain">
			<!-- action的名字 -->
			<param name="actionName">Test1Action</param>
			<!-- action所在的命名空间 -->
			<param name="namespace">/test</param>
		</result>
	</action>
	<!-- 重定向到Action -->
	<action name="Test4Action" class="com.java.Test4Action" method="execute" >
		<result  name="success"  type="redirectAction">
			<!-- action的名字 -->
			<param name="actionName">Test1Action</param>
			<!-- action所在的命名空间 -->
			<param name="namespace">/test</param>
		</result>
	</action>
</package>

ActionContext数据Map含有其他对象的引用

名称描述
原生RequestHttpServletRequest
原生ReponseHttpServletReponse
原生ServletContextServletContext
Param参数Map 原生Request的获取参数函数
Request域原生Request中的Map
Session域HttpSession中的Map
Application域原生ServletContext的Map
Attr域Map 上述三个域的集合
ValueStack值栈
ActionContext对象生命周期 每次请求都会创建一个与请求对应的对象 请求处理完销毁该对象
ActionContext只能创建数据对象而不能销毁数据对象 销毁ActionContext对象不会影响其他
ActionContext对象创建后会与当前线程绑定 使用时在ThreadLocal中获取该对象即可

StrutsMVCAction(M)Result(V)Filter(C)Struts MVC Action(M) Result(V) Filter(C)StrutsMVCAction(M)Result(V)Filter(C)

Action生命周期 每次请求都会创建一个Action对象 线程安全 可以使用成员变量接受参数
//Request域 -> Map Struts2不建议使用原生Request域 用ActionContext替代
//Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
//Request域与ActionContext生命周期一致 直接用ActionContext存取数据 无差别使用
ActionContext.getContext().put("test", "request");
//Session域 -> Map
Map<String, Object> sessionScope = ActionContext.getContext().getSession();
sessionScope.put("test", "session");
//Application域 -> Map
Map<String, Object> ApplicationScope = ActionContext.getContext().getApplication();
ApplicationScope.put("test", "application");
request : ${requestScope.test }<br>
session : ${sessionScope.test }<br>
application : ${applicationScope.test }<br>

通过ServletActionContext访问ServletAPI

//原生request
HttpServletRequest request = ServletActionContext.getRequest();
//原生session
HttpSession session = request.getSession();
//原生response
HttpServletResponse response = ServletActionContext.getResponse();
//原生servletContext
ServletContext servletContext = ServletActionContext.getServletContext();

通过implement接口名为Aware结尾的方式访问ServletAPI

/*
* 共有八个此类接口 此处演示配置单个 其余配置同理
* ServletRequestAware
* ServletResponseAware
* ParameterAware
* ApplicationAware
* SessionAware
* RequestAware
* PrincipalAware
* ServletContextAware
*/
public class TestAction implements ServletRequestAware {

	private HttpServletRequest request;
	public String test() {
		request.getParameter("test");
		return "success";
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

}

struts-default.xml

<!-- 拦截器栈 引用一组拦截器 -->
<interceptor-stack name="defaultStack">
	<!-- 一个拦截器封装一个功能 默认会执行此二十个拦截器 -->
	...
</interceptor-stack>
<!-- 注册拦截器 -->
<interceptors>
	<!-- 拦截器对应Java类 -->
	<interceptor name="test" class="xxx.xxx.xxx"/>
	...
</interceptors>

struts2获取参数

属性驱动

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
	<form action="${pageContext.request.contextPath}/test">
		name:<input type="text" name="name" value="Struts2"/><br>
		age:<input type="text" name="age" value="18"/><br>
		birthday:<input type="text" name="birthday" value="2019-01-01"/><br>
		<input type="submit" value="提交"/>
	</form>
</body>
</html>
public class TestAction extends ActionSupport {
	//添加与表单name对应的属性 即私有成员变量 和 getter setter
	private String name;
	//自动类型转换 支持八大基本类型及其对应包装类和Date
	private Integer age;
	private Date birthday;

	public String getName() {return name;}
	public void setName(String name) {this.name = name;}

	public Integer getAge() {return age;}
	public void setAge(Integer age) {this.age = age;}

	public Date getBirthday() {return birthday;}
	public void setBirthday(Date birthday) {this.birthday = birthday;}

	//直接使用变量name获取表单name的值
	public String test() {
		System.out.println("name:"+name);
		System.out.println("age:"+age);
		System.out.println("birthday:"+birthday);
		return SUCCESS;
	}
}
<?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>
	<package name="test" namespace="/" extends="struts-default" >
		<action name="test" class="com.java.TestAction" method="test" >
			<result name="success">/index.jsp</result>
		</action>
	</package>
</struts>

Console打印如下说明测试成功

name:Struts2
age:18
birthday:Tue Jan 01 00:00:00 CST 2019

对象驱动

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
	<!-- 对象驱动要求参数明为 对象名 + '.' + 对象属性名的方式 -->
	<form action="${pageContext.request.contextPath}/test">
		name:<input type="text" name="user.name" value="Struts2"/><br>
		age:<input type="text" name="user.age" value="18"/><br>
		birthday:<input type="text" name="user.birthday" value="2019-01-01"/><br>
		<input type="submit" value="提交"/>
	</form>
</body>
</html>
public class User {
	private String name;
	private Integer age;
	private Date birthday;

	public String getName() {return name;}
	public void setName(String name) {this.name = name;}

	public Integer getAge() {return age;}
	public void setAge(Integer age) {this.age = age;}

	public Date getBirthday() {return birthday;}
	public void setBirthday(Date birthday) {this.birthday = birthday;}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", birthday=" + birthday + "]";
	}
}
public class TestAction extends ActionSupport {
	//User属性
	private User user;

	public User getUser() {return user;}
	public void setUser(User user) {this.user = user;}

	public String test() {
		System.out.println("name:"+name);
		System.out.println("age:"+age);
		System.out.println("birthday:"+birthday);
		return SUCCESS;
	}
}
<?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>
	<package name="test" namespace="/" extends="struts-default" >
		<action name="test" class="com.java.TestAction" method="test" >
			<result name="success">/index.jsp</result>
		</action>
	</package>
</struts>

Console打印如下说明测试成功

user:User [name=Struts2, age=18, birthday=Tue Jan 01 00:00:00 CST 2019]

模型驱动

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
	<form action="${pageContext.request.contextPath}/test">
		name:<input type="text" name="name" value="Struts2"/><br>
		age:<input type="text" name="age" value="18"/><br>
		birthday:<input type="text" name="user.birthday" value="2019-01-01"/><br>
		<input type="submit" value="提交"/>
	</form>
</body>
</html>
public class User {
	private String name;
	private Integer age;
	private Date birthday;

	public String getName() {return name;}
	public void setName(String name) {this.name = name;}

	public Integer getAge() {return age;}
	public void setAge(Integer age) {this.age = age;}

	public Date getBirthday() {return birthday;}
	public void setBirthday(Date birthday) {this.birthday = birthday;}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", birthday=" + birthday + "]";
	}
}
//模型驱动要求实现ModelDriven 重写getModel方法return成员变量
public class TestAction extends ActionSupport implements ModelDriven<User> {
	//User成员变量 手动实例化
	private User user = new User();

	@Override
	public User getModel() {return user;}

	public String test() {
		System.out.println("name:"+name);
		System.out.println("age:"+age);
		System.out.println("birthday:"+birthday);
		return SUCCESS;
	}
}
<?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>
	<package name="test" namespace="/" extends="struts-default" >
		<action name="test" class="com.java.TestAction" method="test" >
			<result name="success">/index.jsp</result>
		</action>
	</package>
</struts>

Console打印如下说明测试成功

user:User [name=Struts2, age=18, birthday=Tue Jan 01 00:00:00 CST 2019]

封装集合类型参数

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
	<!-- 封装集合类型参数 参数明为集合属性名 -->
	<form action="${pageContext.request.contextPath}/test">
		list:<input type="text" name="list" value="list1"/><br>
		list:<input type="text" name="list[3]" value="list2"/><br>
		map:<input type="text" name="map['map1']" value="map1"/><br>
		map:<input type="text" name="map['map2']" value="map2"/><br>
		<input type="submit" value="提交"/>
	</form>
</body>
</html>
public class TestAction extends ActionSupport {
	//List属性
	private List<String> list;
	//Map属性
	private Map<String,String> map;

	public List<String> getList() {return list;}
	public void setList(List<String> list) {this.list = list;}

	public Map<String, String> getMap() {return map;}
	public void setMap(Map<String, String> map) {this.map = map;}

	public String test() {
		System.out.println("list:"+list);
		System.out.println("map:"+map);
		return SUCCESS;
	}
}
<?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>
	<package name="test" namespace="/" extends="struts-default" >
		<action name="test" class="com.java.TestAction" method="test" >
			<result name="success">/index.jsp</result>
		</action>
	</package>
</struts>

Console打印如下说明测试成功

list:[list1, null, null, list2]
map:{map2=map2, map1=map1}

转载于:https://www.cnblogs.com/setlilei/p/10629448.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值