结果处理
1.转发
type可以不写,默认就是转发
<package name="hello" namespace="/hello" extends="struts-default"> <action name="HelloAction" class="com.struts2.web.HelloAction" method="hello"> <result name="success" type="dispatcher">/index.jsp</result> </action> </package>
运行后浏览器地址不变
2.重定向
type="redirect" 就是重定向
<package name="hello" namespace="/hello" extends="struts-default"> <action name="HelloAction" class="com.struts2.web.HelloAction" method="hello"> <result name="success" type="redirect">/index.jsp</result> </action> </package>
运行后浏览器地址变为index.jsp了
3.转发到Action(不常用)
运行后地址不变
<package name="hello" namespace="/hello" extends="struts-default"> <action name="HelloAction" class="com.struts2.web.HelloAction" method="hello"> <result name="success" type="chain"> <param name="actionName">HaHaAction</param> <!--要转发的命名空间 --> <param name="namespace">/hello</param> </result> </action> <action name="HaHaAction" class="com.struts2.web.UserAction" method="Add"> <result name="success">/chain.jsp</result> </action> </package>
先执行hello 执行完毕后 再执行Add
4.重定向到Action
运行后地址变为/hello/HaHaAction.action (默认.action 或不写)
<package name="hello" namespace="/hello" extends="struts-default"> <action name="HelloAction" class="com.struts2.web.HelloAction" method="hello"> <result name="success" type="redirectAction"> <param name="actionName">HaHaAction</param> <!--要转发的命名空间 --> <param name="namespace">/hello</param> </result> </action> <action name="HaHaAction" class="com.struts2.web.UserAction" method="Add"> <result name="success">/chain.jsp</result> </action> </package>
获得原生ServletAPI
struts2 中 有一个ActionContext 数据中心对象 通过他可以获得
原生request、原生response、原生ServletContext、request域、session域、application域、param参数、attr域 分别对应
HttpServletRequest、HttpServletResponse、ServletContext、 四大域和param参数都是Map 通过setAttribute 和getAttribute 分别设置和获取他们的Map键值对 attr域是(request域、session域、application域 三合一)
ActionContext 数据中心 也是一个Map
ActionContext生命周期:每次请求时都会创建一个与请求对应的ActionContext对象,请求处理完ActionContext销毁。
获得ActionContext对象,struts2设计的是,将ActionContext对象创建好之后,将ActionContext与当前线程绑定。我们要获得ActionContext,只需要从ThreadLocal中获得即可。
方式1.通过ActionContext
public class HelloAction extends ActionSupport{ public String hello(){ //request域(struts2并不推荐获取原生request域) Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request"); //推荐设置request域方式 ActionContext.getContext().put("requestKey","requestValue"); //session域 Map<String, Object> sessionScope = ActionContext.getContext().getSession(); sessionScope.put("name","zhagnsan"); //application域 Map<String, Object> applicationScope = ActionContext.getContext().getApplication(); applicationScope.put("username","zhangsan"); return "success"; } }
<body> ${request.requestKey} ${session.name} ${application.username} </body>
方式2.通过ServletActionContext(代码中其实也是从ActionContext中获得的) struts不推荐原生的
public class HelloAction extends ActionSupport{ public String hello(){ //原生request HttpServletRequest request = ServletActionContext.getRequest(); //原生resposne HttpServletResponse response = ServletActionContext.getResponse(); //原生session HttpSession session = request.getSession(); //原生ServletContext ServletContext servletContext = ServletActionContext.getServletContext(); return "success"; } }
方式3.实现接口的方式(实现各自对应的接口)(通过拦截器完成的)
public class HelloAction extends ActionSupport implements ServletRequestAware{ private HttpServletRequest request; public String hello(){ request.setAttribute("adsf","sdf"); return "success"; } @Override public void setServletRequest(HttpServletRequest httpServletRequest) { this.request = request; } }
获取参数
方式1.属性驱动获得参数(只能转换8大基本数据类型及对应包装类和Date日期类)
设置带get set方法的属性 参数名要与属性名一致 (每次请求Action时都会创建新的Action实例对象,struts是线程安全的,可以使用成员变量接收参数。servlet不行)
<form action="${pageContext.request.contextPath}/User/User_Add"> <input name="name"> <button type="submit">提交</button> </form>
import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String Add(){ System.out.println(name); return "success"; } }
方式2.对象驱动 新建一个user类
package com.struts2.domain; public class User { public String getName() { return name; } public void setName(String name) { this.name = name; } private String name; }
提交表单时,名字设置为user.name
<form action="${pageContext.request.contextPath}/User/User_Add"> <input name="user.name"> <button type="submit">提交</button> </form>
action中
package com.struts2.web; import com.opensymphony.xwork2.ActionSupport; import com.struts2.domain.User; public class UserAction extends ActionSupport { private User user = new User(); public String Add(){ System.out.println(user); return "success"; } }
方式3.模型驱动(缺点只能返回一个对象)
User类不变,前台不需要user.name了
<form action="${pageContext.request.contextPath}/User/User_Add"> <input name="name"> <button type="submit">提交</button> </form>
Action实现ModelDriven<T>接口
package com.struts2.web; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.struts2.domain.User; public class UserAction extends ActionSupport implements ModelDriven<User>{ private User user = new User(); public String Add(){ user = getModel(); System.out.println(user); return "success"; } @Override public User getModel() { return user; } }
集合类型参数
public class UserAction extends ActionSupport{ public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } private List<String> list; public String Add(){ System.out.println(list.size()); return "success"; } }
<form action="${pageContext.request.contextPath}/User/User_Add" method="post"> <input name="list[0]"> <input name="list[1]"> <button type="submit">提交</button> </form>