今天来说下struts里面action的参数什么时间必须要有get方法什么时间不需要get方法那。当然,set方法是必须要有的,否则我们action里面的参数就没有办法设置进去了。
1.首先看一个对象实例首先看action:
package action;
import model.User;
import org.apache.log4j.Logger;
import service.Userservice;
import com.opensymphony.xwork2.ActionContext;
/**
*
* @author wb-shiminghui
*
*/
public class LoginAction {
/** 摘要日志 */
private static final Logger log = Logger.getLogger(LoginAction.class);
private Userservice userservice;
private User user;
// 表单中的rand
private String rand;
public String Login() {
// 从session中取出RandomAction.java 中生成的验证码random
String arandom = (String) (ActionContext.getContext().getSession().get("random"));
if (!rand.equals(arandom)) {
log.info("登录失败");
return "false";
}
User resUser = userservice.findUser(user);
if (resUser == null || !resUser.getName().equals(user.getName()) || resUser.getPass() != user.getPass()) {
log.info("登录失败");
return "false";
}
log.info("登录成功");
return "success";
}
public void setUserservice(Userservice userservice) {
this.userservice = userservice;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public void setRand(String rand) {
this.rand = rand;
}
}
2.再来看action里面的参数user
package model;
/**
*
* @author smh
*
*/
public class User {
/**
* 主键
*/
private int id;
/**
* 姓名
*/
private String name;
/**
* 密码
*/
private int pass;
public User() {
}
public User(int id, String name, int pass) {
this.setId(id);
this.setName(name);
this.setPass(pass);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPass() {
return pass;
}
public void setPass(int pass) {
this.pass = pass;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
3.大家可以看到,我在action类里面只有user对象里面写了get方法,其他两个属性userservice和rand没写get方法
public User getUser() {
return user;
}
</pre>4.下面具体说下什么情况下必须有get方法那。<pre name="code" class="java">userservice和rand都没写get方法,
首先说userservice,这是一个接口,在我们项目启动时间容器就帮我们实例化好了他的接口实现类,并注入到我们的action中,至于如何实例化和注入,就不多说了,大家感兴趣可以研究下 java反射、jdk动态代理、cglib代理就明白了。</span>
接下来说rand,这个参数是页面带进来的,也就是会封装到request对象里面,当请求过来时间,会把参数具体的值注入到我们的action中,由于这个参数其是一个简单单属性(不是复杂属性,如user对象里面还有属性),此时请求到达action之前,会调用action的setRand方法直接注入,而不需要get。
再来说下user,当页面传递的参数是user.name 和user.paas两个参数,这两个参数会一个一个的封装到user对象,之后注入的action,并不是一次性封装两个参数,这个是个复杂点的属性。
(1)进入action之前,会先从调用action里面getUser方法,得不到或者没有getuser方法,就会帮我们代理出一个对象proxYUser,并设置名称proxYUser.setname,之后调用action的setUser设置user属性(注意:此时user只设置了一个属性name
(2)设置paas属性,同样的会调用action的getuser,得不到或者没有getuser方法, 就会帮我们代理出一个对象 proxYUser ,并设置名称 proxYUser.setpaas,之后调用action的setUser设置user属性(注意:此时user是新对象,只设置了一个属性paas,之前的name属性就是null)
5.到此大家明白了吗。总之就是:简单的参数(复杂属性,如user对象里面还有属性),我们可以不带get方法,但是复杂参数,由于进入action之前是一个一个set到复杂参数,每次set都会get复杂参数,获取不到或者没有get就会帮我们代理一个,因此如果我们复杂参数没有get方法,那么最终传到action的复杂参数就会只有一个属性被赋值,并且是最后一个属性被赋值了
<span style="font-family: Arial, Helvetica, sans-serif;">大家可以参考下我写的例子!这个例子包括:ssh、jquery、aop编程进行日志管理、注解等一些东东!记得debug LogInterceptor这个拦截器</span></span>
地址http://download.csdn.net/detail/shiminghui497565/9306103