Struts2数据封装详解

1 属性驱动

1.1 提供set方法的方式

该方式需要在action类中提供相应的属性并提供属性的set方法,并且jsp页面中的name属性要与Action类中的属性相对应,下面是对应的Action类和jsp页面

  • Action类
package com.itykd.web.action;

import java.util.Date;

import com.itykd.domain.User;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{
    private String username;
    private String password;
    private Integer age;
    private Date birthday;
    private Double salary;
    public String executeBySetAttributeDriven() throws Exception{
    	System.out.println(username);
    	System.out.println(password);
    	System.out.println(age);
    	System.out.println(birthday);
    	System.out.println(salary);
    	User user = new User();
    	user.setName(name);
    	user.setPassword(password);
    	user.setAge(age);
    	user.setBirthday(birthday);
    	user.setSalary(salary);
    	return NONE;
    }
	public void setUsername(String name) {
		this.name = name;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public void setSalary(Double salary) {
		this.salary = salary;
	}
    
}
  •  jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h3>属性驱动:提供set方法的方式</h3>
    <form action="${pageContext.request.contextPath}/userAction_executeBySetAttributeDriven" method="post">
         用户名:<input type="text" name="username"/><br/>
               密码:<input type="password" name="password"/><br/>
               年龄:<input type="text" name="age"/><br/>
               生日:<input type="text" name="birthday"/><br/>
               薪资:<input type="text" name="salary"/><br/>
      <input type="submit" value="提交"/>
    </form>
</body>
</html>

 

1.2 页面表达式的方式 

提供一个User的成员,并提供该成员的get和set方法;且jsp页面的name属性要使用“实例对象名.对象的成员名”,这里jsp页面中的表单中要使用“user.username

  • Action类
package com.itykd.web.action;

import com.itykd.domain.User;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{
	private User user;
	public String executeByPageExpression() {
		System.out.println(user);
		return NONE;
		
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	
}
  • jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h3>属性驱动-页面中提供表达式的方式</h3>
    <form action="${pageContext.request.contextPath }/userAction_executeByPageExpression" method="post">
               用户名:<input type="text" name="user.username"/><br/>
               密码:<input type="password" name="user.password"/><br/>
               年龄:<input type="text" name="user.age"/><br/>
               生日:<input type="text" name="user.birthday"/><br/>
               薪资:<input type="text" name="user.salary"/><br/>
      <input type="submit" value="提交"/> 
    </form>
</body>
</html>

2 模型驱动的方式(最常用)

模型驱动的方式要实现ModelDriven<T>接口,并重写其getModel方法;

  • Action类
package com.itykd.web.action;

import com.itykd.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class UserAction extends ActionSupport implements ModelDriven<User>{
	private User user = new User();

	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}
	public String excuteByModelDriven() {
		System.out.println(user);
		
		return NONE;
	}
  • jsp页面
     <h3>模型驱动方式</h3>
    <form action="${pageContext.request.contextPath }/userAction_excuteByModelDriven" method="post">
               用户名:<input type="text" name="username"/><br/>
               密码:<input type="password" name="password"/><br/>
               年龄:<input type="text" name="age"/><br/>
               生日:<input type="text" name="birthday"/><br/>
               薪资:<input type="text" name="salary"/><br/>
      <input type="submit" value="提交"/> 
    </form>

模型驱动的缺点:只能同时在一个对象中封装数据,而使用页面表达式的方法可以同时向多个对象中同时封装数据

3 Struts2为什么能进行数据封装

 

Struts2能够提供数据封装是因为它在经过核心过滤器后执行了一组拦截器,modelDriven拦截器执行的是模型驱动封装参数,而params拦截器则封装了属性驱动的参数conversionError拦截器完成了数据的转换,validation拦截器负责数据校验

4 数据类型封装错误

比如我们提交表单数据时,年龄我们设置的类型为Integer,但是输入表单的时候我们在年龄上输入字符串:aaa,就会报出input视图错误,这时候我们需要在action中result标签中配置input视图;

5 复杂类型数据的封装

5.1 封装数据到List集合中

  • Action类
package com.itykd.web.action;

import java.util.List;

import com.itykd.domain.Product;
import com.opensymphony.xwork2.ActionSupport;

public class ProductAction extends ActionSupport {
    private List<Product> productList;


	public List<Product> getProductList() {
		return productList;
	}


	public void setProductList(List<Product> productList) {
		this.productList = productList;
	}


	public String execute() throws Exception{
		for(Product product : productList)
			System.out.println(product);
		return NONE;
	} 
}
  • jsp页面
<body>
    <h3>封装数据到List集合中</h3>
    <form action="${pageContext.request.contextPath }/productAction">
                商品名称:<input type="text" name="productList[0].name"/><br/>
                商品价格:<input type="text" name="productList[0].price"/><br/>
                商品名称:<input type="text" name="productList[1].name"/><br/>
                商品价格:<input type="text" name="productList[1].price"/><br/>
                商品名称:<input type="text" name="productList[2].name"/><br/>
                商品价格:<input type="text" name="productList[2].price"/><br/>
      <input type="submit" value="提交"/>    
    </form>
</body>

5.2 封装数据到Map集合中

  • Action类
package com.itykd.web.action;

import java.util.Map;

import com.itykd.domain.Product;
import com.opensymphony.xwork2.ActionSupport;


public class ProductAction2 extends ActionSupport {
    private Map<String,Product> map;

	public Map<String, Product> getMap() {
		return map;
	}

	public void setMap(Map<String, Product> map) {
		this.map = map;
	}
	@Override
	public String execute() throws Exception {
		for (String key : map.keySet()) {
			Product product = map.get(key);
			System.out.println(key+" "+product);
		}
		return NONE;
	}
}
  • jsp页面
<body>
    <h3>封装数据到Map集合中</h3>
    <form action="${pageContext.request.contextPath }/productAction2">
                商品名称:<input type="text" name="map['xxx'].name"/><br/>
                商品价格:<input type="text" name="map['xxx'].price"/><br/>
                商品名称:<input type="text" name="map['yyy'].name"/><br/>
                商品价格:<input type="text" name="map['yyy'].price"/><br/>
                商品名称:<input type="text" name="map['zzz'].name"/><br/>
                商品价格:<input type="text" name="map['zzz'].price"/><br/>
      <input type="submit" value="提交"/>    
    </form>
</body>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值