一、结果跳转方式
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