struts2在处理参数上的机制,参数什么时候被传到这个类中?get和set方法什么时候被调用?
通过链接访问package下action,name都是myname传递一个参数type=1。如:http://localhost:8080/struct2/myname/...
通过链接访问package下action,name都是myname传递一个参数type=1。如:http://localhost:8080/struct2/myname/myname?type=1
action接收后调用相应的类,如下:
public class UserAction extends ActionSupport { private int type;
private String r;
public String getR() {
return r;
}
public void setR(String r) {
this.r = r;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
}
问题是:我只传递type=1,并没传递r的值,但是访问正常。所以我感到奇怪,因为r的值是在execute方法中才被赋予的,而execute使用的type的值却是在调用execute之前就有的,这两种情况是相反的。
假如我不传递type参数则就报错了。
所以我想弄清楚的就是struts2在处理参数上的机制,参数什么时候被传到这个类中?get和set方法什么时候被调用? 展开
action接收后调用相应的类,如下:
public class UserAction extends ActionSupport { private int type;
private String r;
public String getR() {
return r;
}
public void setR(String r) {
this.r = r;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
}
问题是:我只传递type=1,并没传递r的值,但是访问正常。所以我感到奇怪,因为r的值是在execute方法中才被赋予的,而execute使用的type的值却是在调用execute之前就有的,这两种情况是相反的。
假如我不传递type参数则就报错了。
所以我想弄清楚的就是struts2在处理参数上的机制,参数什么时候被传到这个类中?get和set方法什么时候被调用? 展开
4个回答
展开全部
我来给你解释下。机制:
1,其实,你在调用这个ACTION的时候是首选调用了2的一个拦截机制(拦截器)
2,调用拦截机制的时候,2会把你的URL作为一个参数进行解析
3,通过一个反射机制和STRUTS2.XML的配置解析出你的动作
4,通过解析后得到你的域名。类名,方法名,属性名
5,然后通过你的类名(其实是个字符串比如com.cn.test.myname.myaction)然后用反射机制初始化你的类实例
6,然后透过线程保存JSP页面传过来的REQUEST
7,然后得到你的属性(type),第4步已经得到了你在类中定义的GET,SET方法了。然后把这个TYPE=1的值,利用反射得到SET方法,并且赋值给类的TYPE属性,
在以上的步骤中并没有真正调用方法,但属性值已经赋值了
8.其次,如果你的配置文件中配置了要调用的方法名,在解析的时候会得到,如果没有定义方法名(也即是只有一个方法,这样解释是只有一个,如果是多个,那必须是有方法别名的,不然是找不到的)
9,通过方法名然后反射到你的类中的方法名,
10,执行你的方法
11,执行完成后,通过返回的STRING(1)找到当时解析XML时保存的STRING(2)返回值(这个返回是XML定义的,不要搞混了)而第一个STRING(1)是你执行方法后返回的
12,他们直接匹配后拦截器返回当时你配置的页面,
13,成功返回你的结果否则内部报错,拦截失败(报错可能不是你想像的有时拦截器没有那么智能)
14,当再次提交是会和内存的匹配,如果有变动,一新的解析为准,进行从1-13的循环。
15,整个过程就是这样
可能有些粗糙,希望这样的白话你能看的更明白。
1,其实,你在调用这个ACTION的时候是首选调用了2的一个拦截机制(拦截器)
2,调用拦截机制的时候,2会把你的URL作为一个参数进行解析
3,通过一个反射机制和STRUTS2.XML的配置解析出你的动作
4,通过解析后得到你的域名。类名,方法名,属性名
5,然后通过你的类名(其实是个字符串比如com.cn.test.myname.myaction)然后用反射机制初始化你的类实例
6,然后透过线程保存JSP页面传过来的REQUEST
7,然后得到你的属性(type),第4步已经得到了你在类中定义的GET,SET方法了。然后把这个TYPE=1的值,利用反射得到SET方法,并且赋值给类的TYPE属性,
在以上的步骤中并没有真正调用方法,但属性值已经赋值了
8.其次,如果你的配置文件中配置了要调用的方法名,在解析的时候会得到,如果没有定义方法名(也即是只有一个方法,这样解释是只有一个,如果是多个,那必须是有方法别名的,不然是找不到的)
9,通过方法名然后反射到你的类中的方法名,
10,执行你的方法
11,执行完成后,通过返回的STRING(1)找到当时解析XML时保存的STRING(2)返回值(这个返回是XML定义的,不要搞混了)而第一个STRING(1)是你执行方法后返回的
12,他们直接匹配后拦截器返回当时你配置的页面,
13,成功返回你的结果否则内部报错,拦截失败(报错可能不是你想像的有时拦截器没有那么智能)
14,当再次提交是会和内存的匹配,如果有变动,一新的解析为准,进行从1-13的循环。
15,整个过程就是这样
可能有些粗糙,希望这样的白话你能看的更明白。
展开全部
在action中定义的type这个属性,及以这个属性的getter和setter方法,只要url请求的地址是参数名是和type同名的,struts2的拦截器就调用这个action中的setType()方法把这个参数赋值给这个type属性
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
请求到达struts2的action时会经过很多拦截器,我们用的action实际是一个代理的action,数据就是在拦截器里被封装的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
说白了就是vo定义好了以后,在action里进行get set
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询