struts学习笔记--(2)

第四章: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,包括:

  1. ServletRequestAware:实现该接口的Action可以直接访问Web应用的HttpServletRequest实例。
  2. ServletResponseAware:实现该接口的Action可以直接访问Web应用的HttpServletResponse实例。
  3. ServletResponseAware:实现该接口的Action可以直接访问Web应用的HttpServletResponse实例。
  4. 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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值