引用出处:cnblogs.com/haimishasha/p/6193235.htmlhtml
Struts2中Action接收参数的方法主要有如下三种:
1.使用Action的属性接收参数(最原始的方式):
a.定义:在Action类中定义属性,建立get和set方法;
b.接收:经过属性接收参数,如:userName;
c.发送:使用属性名传递参数,如:user1!add?userName=jim;
2.使用DomainModel接收参数:
a.定义:定义Model类,在Action中定义Model类的对象(不须要new),建立该对象的get和set方法;
b.接收:经过对象的属性接收参数,如:user.getUserName();
c.发送:使用对象的属性传递参数,如:user2!add?user.userName=mike;
3.使用ModelDriven接收参数(如今用的比较多的方式):
a.定义:Action实现ModelDriven泛型接口,定义Model类的对象(必须new),经过getModel方法返回该对象;
b.接收:经过对象的属性接收参数,如:user.getUserName();
c.发送:直接使用属性名传递参数,如:user2!add?userName=tom
1.使用Action的属性接收参数(最原始的方式):
a.定义:在Action类中定义属性,建立get和set方法;
b.接收:经过属性接收参数,如:userName;
c.发送:使用属性名传递参数,如:user1!add?userName=jim;
2.使用DomainModel接收参数:
a.定义:定义Model类,在Action中定义Model类的对象(不须要new),建立该对象的get和set方法;
b.接收:经过对象的属性接收参数,如:user.getUserName();
c.发送:使用对象的属性传递参数,如:user2!add?user.userName=mike;
3.使用ModelDriven接收参数(如今用的比较多的方式):
a.定义:Action实现ModelDriven泛型接口,定义Model类的对象(必须new),经过getModel方法返回该对象;
b.接收:经过对象的属性接收参数,如:user.getUserName();
c.发送:直接使用属性名传递参数,如:user2!add?userName=tom
一 、Action接收请求参数java
struts2内部提供三种请求参数封装机制dom
1) Action 自己做为model对象,经过成员setter封装(使用与成员少的)ide
<form action="${pageContext.request.contextPath }/regist1.action" method="post"> 用户名 <input type="text" name="username" /><br/> 密码<input type="password" name="password"/><br/> 年龄 <input type="text" name="age" /><br/> <input type="submit" value="注册" /> </form> public class RegistAction1 extends ActionSupport { 提交的有什么参数就设置什么字段,并写好setter方法 private String username; private String password; private int age; public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public void setAge(int age) { this.age = age; } }
注:经过以上特性就能清楚,struts2的action是多例的,每一个用户有每一个用户的参数,每一个参数封装到一组javabean中,也就是说每次请求都会建立 struts2的Action 对象。post
2) 建立独立model对象,页面经过ognl表达式封装this
<form action="${pageContext.request.contextPath }/regist2.action" 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="submit" value="注册" /> </form> * 页面中使用ognl写法 name="user.username" 底层就会执行 Action的setUser() --- > setUsername(); 在action中的写法 public class RegistAction2 extends ActionSupport { private User user;持有对象 public void setUser(User user) { this.user = user; } // 必须提供get方法 ----- 若是不提供只能封装一个属性,下次再封装第二个属性的时候又是一个新的user public User getUser() { return this.user; } } 单首创建一个user的domain public class User { private String username; private String password; private int age; ... }
3)使用ModelDriven接口,对请求数据进行封装spa
<form action="${pageContext.request.contextPath }/regist3.action" method="post"> 用户名 <input type="text" name="username" /><br/> 密码<input type="password" name="password"/><br/> 年龄 <input type="text" name="age" /><br/> <input type="submit" value="注册" /> </form> public class RegistAction3 extends ActionSupport implements ModelDriven<User> { private User user = new User(); // 必须手动new,否则就出现空指针异常 @Override public User getModel() { return user; } } 单首创建一个user的domain public class User { private String username; private String password; private int age; }
原理:发起请求后, struts2 会调用 getModel().setUsername()、 getModel().setPassword()所以必须手动 对model进行初始化指针
结论:三种参数封装方式,在开发中主要使用第三种code
第一种只适用于请求参数很是少的状况的封装,第二种更加灵活,支持一个表单数据封装到不一样model对象,第三种封装方式,只能支持一个model对象。orm