一、结果跳转方式
1)转发(默认)
<!-- 转发 --> <action name="Demo1Action" class="cn.itheima.a_result.Demo1Action" method="execute" > <result name="success" type="dispatcher" >/hello.jsp</result> </action>
2)重定向
<!-- 重定向 --> <action name="Demo2Action" class="cn.itheima.a_result.Demo2Action" method="execute" > <result name="success" type="redirect" >/hello.jsp</result> </action>
3)转发到Action
<!-- 转发到Action --> <action name="Demo3Action" class="cn.itheima.a_result.Demo3Action" method="execute" > <result name="success" type="chain"> <!-- action的名字 --> <param name="actionName">Demo1Action</param> <!-- action所在的命名空间 --> <param name="namespace">/</param> </result> </action>
4)重定向到Action
<!-- 重定向到Action --> <action name="Demo4Action" class="cn.itheima.a_result.Demo4Action" method="execute" > <result name="success" type="redirectAction"> <!-- action的名字 --> <param name="actionName">Demo1Action</param> <!-- action所在的命名空间 --> <param name="namespace">/</param> </result> </action>
二、访问servlet的API
注:域对象实际上就是一个Map
获取这些对象的方法
方法一:通过ActionContext(建议,只有它是获取的域对象:字典形式)
//request域=> map (struts2并不推荐使用原生request域) //不推荐 Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request"); //推荐(因为ActionContext的生命周期和request域相同) ActionContext.getContext().put("name", "requestTom"); //session域 => map Map<String, Object> sessionScope = ActionContext.getContext().getSession(); sessionScope.put("name", "sessionTom"); //application域=>map Map<String, Object> applicationScope = ActionContext.getContext().getApplication(); applicationScope.put("name", "applicationTom");
获取方法
<body> request: ${requestScope.name}<br> session:${sessionScope.name}<br> application:${applicationScope.name}<br> </body>
方法二:通过ServletActionContext
//原生request HttpServletRequest request = ServletActionContext.getRequest(); //原生session HttpSession session = request.getSession(); //原生response HttpServletResponse response = ServletActionContext.getResponse(); //原生servletContext ServletContext servletContext = ServletActionContext.getServletContext();
方法三:通过实现接口方式
public class Demo7Action extends ActionSupport implements ServletRequestAware { // 如果想获得其他的,在实现其他接口 private HttpServletRequest request; public String execute() throws Exception { System.out.println("原生request:"+request); return SUCCESS; } @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } }
Struts与Struts2的生命周期的区别
Struts1的模式(servlet的生命周期)
默认在第一次访问的时候实例化(init方法)servlet类
然后每次请求来的时候执行service方法
这样大家都修改同一个类成员变量,就会有线程不安全的隐患
Struts2的模式
每来一个请求实例化一个Action对象,请求结束销毁
这样各自操作各自的,没有线程安全问题
Struts MVC
详情请看:这里
三、接收参数
方法一:属性驱动获得参数
注:要有get,set方法
方法二:对象驱动
public class Demo9Action extends ActionSupport { //准备user对象 private User user; public String execute() throws Exception { System.out.println(user); return SUCCESS; } public User getUser() { // 前两种方式都需要提供get,set方法 return user; } public void setUser(User user) { this.user = user; } }
方法三:模型驱动
public class Demo10Action extends ActionSupport implements ModelDriven<User> { // 实现接口 //准备user 成员变量 private User user =new User(); public String execute() throws Exception { System.out.println(user); return SUCCESS; } @Override public User getModel() { return user; } }
其他:获取list,map
list
Map