一、结果跳转方式
1.1 转发
这是默认的方式,转发到某个jsp页面,地址栏不发生变化
<package name="Action2" namespace="/action2" extends="struts-default">
<action name="StrutsAction2" class="cn.itcast.action.StrutsAction2">
<result name="success" type="dispatcher">/index.jsp</result>
</action>
</package>
1.2 重定向
重定向和转发差不多,但是重定向会设计到地址栏的变化。
<package name="Action2" namespace="/action2" extends="struts-default">
<action name="StrutsAction2" class="cn.itcast.action.StrutsAction2">
<result name="success" type="redirect">/hello.jsp</result>
</action>
</package>
可以发现地址栏就会变成了hello.jsp
1.3 转发到Action
<package name="Action1" namespace="/action1" extends="struts-default">
<action name="StrutsAction1" class="cn.itcast.action.StrutsAction1">
<result name="success" type="chain">
<param name="actionName">StrutsAction2</param>
<param name="namespace">/action2</param>
</result>
</action>
</package>
1.4 重定向到Action
<package name="Action1" namespace="/action1" extends="struts-default">
<action name="StrutsAction1" class="cn.itcast.action.StrutsAction1">
<result name="success" type="redirectAction">
<param name="actionName">StrutsAction2</param>
<param name="namespace">/action2</param>
</result>
</action>
</package>
访问 http://emmapc:8080/strutsday01/action1/StrutsAction1 地址栏变化为
二、访问Servlet原生Api
2.1 原理
ActionContext是struts2的Action封装的上下文,包含了所有原生的域对象,保存了他们的引用。
2.2 访问域对象的方式
2.2.1 通过ActionContext
@Override
public String execute() throws Exception {
// 获取request域对象 不推荐
Map<String, Object> requestScope = (Map<String, Object>) ActionContext
.getContext().get("request");
// 获取类似的request域对象 推荐
ActionContext.getContext().put("name", "lisi");
//获取session域对象
Map<String,Object> sessionScope = (Map<String,Object>)ActionContext.getContext().getSession();
sessionScope.put("name", "sessionScope");
Map<String,Object> applicationScope = (Map<String,Object>)ActionContext.getContext().getApplication();
applicationScope .put("name", "applicationScope");
return super.execute();
}
jsp中的写法
<body>
action2,jsp<br>
request:${requestScope.name}<br>
session:${sessionScope.name}<br>
application:${applicationScope.name}<br>
</body>
2.2.2 通过ServletActionContext
@Override
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
HttpServletResponse response = ServletActionContext.getResponse();
ServletContext servletContext = ServletActionContext.getServletContext();
return super.execute();
}
2.2.3 通过实现接口的方式
public class StrutsAction2 extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
类似的还有 ServletResponseAware,ServletSessionAware等分别获得response和session对象。
三、参数接收
3.1 扩展
3.3.1 struts2的MVC模式
3.3.2 Action的生命周期
1.每次请求来时,都会创建一个Action的实例
2.Action是线程安全的,可以使用成员变量接受参数。
3.2 属性驱动获得参数
public class PropertyDrivenAction implements Action {
private Integer age;
private String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String execute() throws Exception {
System.out.println(age);
System.out.println(name);
return SUCCESS;
}
}
访问参数名称对应的值会被填充到age和name中
3.3 对象驱动获取参数
public class ObjectDrivenAction implements Action {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return SUCCESS;
}
}
<body>
<form action="${pageContext.request.contextPath}/action1/StrutsAction1" method="post">
name:<input name="user.age" type="text"/>
age:<input name="user.name" type="text"/>
<input type="submit" value="提交" />
</form>
</body>
提交的时候 参数名为user.age和user.name 就可以了,这是一个区别
3.4 模型驱动获取参数
public class StrutsAction1 implements Action,ModelDriven<User> {
private User user = new User();
@Override
public String execute() throws Exception {
System.out.println(user);
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
这样的话直接提交 age和name就可以了,不过这种方式也有缺点,就是只能用接受一个对象绑定参数。
3.5 集合参数绑定
public class StrutsAction1 implements Action {
private List<String> list;
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
@Override
public String execute() throws Exception {
System.out.println(list);
return SUCCESS;
}
}
<body>
<form action="${pageContext.request.contextPath}/action1/StrutsAction1" method="post">
list:<input name="list" type="text"/>
list:<input name="list[2]" type="text"/>
<input type="submit" value="提交" />
</form>
</body>
提交之后会打印出来[123,null,123],name中的方括号表示了集合中的索引值,是要绑定到集合的那个索引位置。
3.6 Map参数绑定
public class StrutsAction1 implements Action,ModelDriven<User> {
private Map<String,String> map;
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String execute() throws Exception {
System.out.println(map);
return SUCCESS;
}
}
<body>
<form action="${pageContext.request.contextPath}/action1/StrutsAction1" method="post">
<input type="text" name="map['username']" />
<input type="submit" value="提交" />
</form>
</body>
便是绑定到名称为map的Map中的key为username的值中,绑定完之后打印输出{username=123}
四、总结
今天我们学些了struts的一些高级用法,为接下来的开发做准备