名称 | 类型 | 描述 |
---|---|---|
chain | com.opensymphony.xwork2.ActionChainResult | 转发到Action |
dispatcher | org.apache.struts2.dispatcher.ServletDispatcherResult | 转发(默认) |
freemarker | org.apache.struts2.views.freemarker.FreemarkerResult | Freemarker模板 |
httpheader | org.apache.struts2.dispatcher.HttpHeaderResult | 返回http响应头 |
redirect | org.apache.struts2.dispatcher.ServletRedirectResultAction | 重定向 |
redirectAction | org.apache.struts2.dispatcher.ServletActionRedirectResult | 重定向到Action |
stream | org.apache.struts2.dispatcher.StreamResult | 下载文件 |
velocity | org.apache.struts2.dispatcher.VelocityResult | Velocity模板 |
xslt | org.apache.struts2.views.xslt.XSLTResult | XML/XSLT模板 |
plainText | org.apache.struts2.dispatcher.PlainTextResult | 普通文本 |
postback | org.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含有其他对象的引用
名称 | 描述 |
---|---|
原生Request | HttpServletRequest |
原生Reponse | HttpServletReponse |
原生ServletContext | ServletContext |
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}