第四章:result视图配置
- 4.1 标签
<result name=”success” type=”redirect”>
<param name=””/>
<param/>
<result/>
name属性:视图名称,对应action的返回值
type 属性:结果类型,指用什么方式跳转到指定页面,默认转发(dispatcher)
结果类型包括(不全):
redirect:重定向到指定页面,信息丢失
dispatcher:转发到指定页面
redirectAction:重定向到指定动作,信息丢失(客户端)
chain:处理action链,被跳转的action仍可获得上个页面的信息(服务端转发)
注释:转发和重定向的区别
转发:
-
服务端行为(浏览器只做一次访问请求)
-
地址栏不发生变化
-
两次跳转信息不丢失
重定向: -
客户端行为
-
URL发生变化
-
两次跳转信息丢失
-
4.2 局部视图和全局视图
全局视图:多个action公共的视图
局部视图:单个action的视图
优先级:action在执行时,先执行局部视图,没有找到相应的局部视图,再查找全局视图
定义全局视图:
<!—先定义一个公共包--->
<pakage name=”my-default” extends=”struts-default” abstract=”true”>
< global-results >
<result name=”login”>/login.jsp</result>
</global-results>
</pakage>
第五章:访问servlet的API方式
- 5.1 使用ServletActionContext获得(常用)
Struts2并没有和Servlet API进行耦合,方便action的单元测试,对于request,response,HttpSession的调用无可避免,struts2采用两种方式进行API调用。
使用ServletActionContext的方式和实现接口的方式。
ServletActionContext:通过调用ServletActionContext静态类的工厂方法,来实现serveltAPI的调用。
public class HelloAction extends ActionSupport{
private HttpServletRequest request;
private HttpServletResponse response;
private HttpSession session;
private ServletContext application;
public String sayHello(){
request = ServletActionContext.getRequest();
response = ServletActionContext.getResponse();
session = request.getSession();
application = ServletActionContext.getServletContext();
}
- 5.2 实现接口方式
action可以通过实现相应接口来调用servletAPI,包括:
- ServletRequestAware:实现该接口的Action可以直接访问Web应用的HttpServletRequest实例。
- ServletResponseAware:实现该接口的Action可以直接访问Web应用的HttpServletResponse实例。
- ServletResponseAware:实现该接口的Action可以直接访问Web应用的HttpServletResponse实例。
- SessionAware:实现该接口的Action可以直接访问Web应用的session实例
在执行动作方法之前,ServletConfig拦截器会进行动作配置,实现接口方法,进行servletAPI对象配置
第六章:封装请求参数
- 6.1 属性驱动(无实体类,action包含model)
当浏览器请求不需要实体类封装时,可采用无实体类属性封装方式。将请求参数以action属性的方式写入,且表单请求参数的name属性要和action属性保持一致。
- 6.2 属性驱动(有实体类,利用ognl表达式)
动作类:
请求参数的封装:
* 属性驱动:
* 动作类和模型数据分开
* 使用要求:
* 首先动作类中需要提供模型的get/set方法
* 模型中要提供私有成员变量的get/set方法
* 并且这些get/set方法必须和表单的name属性取值能对应上。
*
*/
public class Demo2Action extends ActionSupport {
private User user = new User();
public String demo2(){
System.out.println(user);//输出有对象
return SUCCESS;
}
public User getUser() {
System.out.println("getUser");
return user;
}
public void setUser(User user) {
System.out.println("setUser");
this.user = user;
}
}
jsp页面表单:
//此时name并非是字符串,而是ognl表达式
<form action="${pageContext.request.contextPath}/demo2.action" method="post">
用户名:<input type="text" name="user.name"/><br/>
年龄:<input type="text" name="user.age"/><br/>
<input type="submit" value="提交"/>
</form>
- 6.3 model驱动(有实体类)
动作类可以实现ModelDriven接口来接收请求参数。
要求:
- 实现ModleDriven接口
- 动作类中必须定义一个模型且将模型实例化
- 动作类中必须实现接口的抽象方法,且返回值为模型对象
- public class Demo3Action extends ActionSupport implements ModelDriven<User> {
- private User user = new User();
-
- @Override
- public User getModel() {
- return user;
- }
- public String demo3(){
- System.out.println(user);
- return SUCCESS;
- }
- }
-
jsp页面:
<%--表单3:模型驱动 --%>
- <form action="${pageContext.request.contextPath}/demo3.action" method="post">
- 用户名:<input type="text" name="name"/><br/>
- 年龄:<input type="text" name="age"/><br/>
- <input type="submit" value="提交"/>
- </form>
- 6.4 多对象封装(list,map)
实际应用过程中,有时需要将多个action的对象作为请求对象进行封装,此时就需要List和Map。集合并非是model数据模型,可以看做是实体类属性驱动的扩展。
6.4.1 list集合封装】
public class Demo4Action extends ActionSupport {
private List<User> users;
public String demo4(){
System.out.println(users);
return SUCCESS;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
jsp页面:
<%--表单4:封装List集合数据 --%>
<form action="${pageContext.request.contextPath}/demo4.action" method="post">
用户名1:<input type="text" name="users[0].name"/><br/>
年龄1:<input type="text" name="users[0].age"/><br/>
用户名2:<input type="text" name="users[1].name"/><br/>
年龄2:<input type="text" name="users[1].age"/><br/>
用户名3:<input type="text" name="users[2].name"/><br/>
年龄3:<input type="text" name="users[2].age"/><br/>
<input type="submit" value="提交"/>
</form>
6.4.2 map集合封装
动作类:
/**
* 封装集合数据:
* 它用的也是属性驱动
*
*/
public class Demo5Action extends ActionSupport {
private Map<String,User> users;
public String demo5(){
System.out.println(users);
return SUCCESS;
}
public Map<String, User> getUsers() {
return users;
}
public void setUsers(Map<String, User> users) {
this.users = users;
}
}
jsp页面:
<%--表单5:封装map集合数据 --%>
<form action="${pageContext.request.contextPath}/demo5.action" method="post">
用户名1:<input type="text" name="users['one'].name"/><br/>
年龄1:<input type="text" name="users['one'].age"/><br/>
用户名2:<input type="text" name="users['two'].name"/><br/>
年龄2:<input type="text" name="users['two'].age"/><br/>
用户名3:<input type="text" name="users['three'].name"/><br/>
年龄3:<input type="text" name="users['three'].age"/><br/>
<input type="submit" value="提交"/>
</form>