Struts1.x和Struts2在处理请求参数上区别
2012-10-05 23:20
507 查看
J2EE开发各类资源下载清单, 史上最全IT资源,个人收藏总结!
(1)Struts1.x 对于客户端的请求参数,如果<action>上配有name属性,且对应有formbean,那么struts1.x会按照请求参数名与formbean的成员变量名匹配,相同的则调用其setter方法,为其赋值,没有匹配的,则可以通过request.getParameter("paramName")取得参数值。注意,填充formbean时,struts是按照formbean的成员变量名与请求参数名匹配的,而不是按照setter方法匹配的,这一点,我认为Struts1.x做的不是很好。如:http://localhost:8080/Struts_01/login.do?userName=itcast&userPass=4444&birth=1978-9-23&score=100
LoginForm.java
public class LoginForm extends ActionForm{
private String name;
private String userPass;
public void setUserName(String userName){
System.out.println("setter userName is invoked...");//不会被调用
this.name = userName;
}
public void setUserPass(String userPass){
System.out.println("setter userPass is invoked...");//会被调用
this.userPass= userPass;
}
}
由此可以证明Struts1.x是匹配请求参数名来填充formBean的,而不是匹配请求参数名对应的setter方法
另外注意:ActionForm中的Date必须是java.sql.Date,不能是java.util.Date;而pojo类都可以。
(2)Struts2 是根据匹配请求参数名的setter方法,如userName=xxx,struts2是在Action中寻找setUserName方法并调用,与Action中是否有userName成员变量无关。
Struts2提供了两种方法处理客户端请求:
采用基本类型接收请求参数(get/post).如:http://localhost:8080/Struts2_03/request/regist.action?userName=itstar&userPass=huahua
采用复合类型接收请求参数(get/post).如:http://localhost:8080/Struts2_03/request/regist.action?userName=itstar&product.productId=11 Struts2首先通过反射技术调用Product的默认构造器创建product对象,然后再通过反射技术调用product中与请求参数想匹配的setter方法来获取请求参数值。
解决所有疑惑的例子:
Product.java
RegistProductAction.java
struts-request.xml
registProduct.jsp
showRequestParam.jsp
浏览器上输入: http://localhost:8080/Struts2_03/page/registProduct.jsp
点击regist按钮
控制台:
总结:
(1)对于请求参数,struts2是用request的请求参数匹配Action的setter方法,如对于userName=xxx,struts2是在Action中匹配并调用setUserName()方法,而不管Action中是否有userName成员变量。这一点与struts1不一样,struts1填充formbean是用request的请求参数匹配ActionForm中的成员变量,而不是setter方法,这一点struts1设置的不好。
(2)对于操作Action中的成员变量的值,struts2提供了三种方式,并且当同时操作Action中的成员变量时候,其顺序如下:
一、在<action>的<param>中指定要赋值的属性名,这里也是根据setter方法赋值的,如:<param name="userPass">param of userPass</param>则在Action中匹配并调用setUserPass()方法。
二、从客户端传来的参数,struts2根据request的参数名匹配Action中的setter方法并调用。
三、调用<action>的method属性对应的方法时,为其设值。
(3) struts2中的Date型参数,struts2既可以用java.sql.Date接收,也可以用java.util.Date接收,这与strut1不一样,struts1填充formbean时,对于Date型数据,formbean只能用java.sql.util处理,java.util.Date不能处理。
(4)struts2在响应客户端请求时,会根据getter方法,将Action中的属性保存在requestScope作用域中,jsp页面中可以通过EL表达式取得Action中的属性。
(5)对于采用复合类型接收请求参数的方式,应用"product.id"这种格式作为参数名传递给服务器,以及通过${requestScope.product.id}这张方法取得requestScope作用域的id值。
(6)对于采用复合类型接收请求参数的方式,复合对象必须有无参构造方法,否则会抛出java.lang.InstantiationException: edu.action.Product异常
(7)补充:struts1.x中Action是单实例,只会被实例化一次,在第一次请求到来时实例化,所以是非线程安全的;而struts2中Action不是单实例,对于用户的每一次请求,都会被实例化,所以是线程安全的。
相关文章推荐
- struts1和struts2在处理用户请求是的区别
- struts2-Action处理请求参数
- Struts 2.3.24源码解析+Struts2拦截参数,处理请求,返回到前台过程详析
- struts2的常量、动态方法调用、接受请求参数处理、类型转换
- Java乔晓松-Struts2中通配符、常量、自定义类型转换器以及接受请求参数处理
- struts2请求参数处理
- struts2教程(3)--请求参数处理
- struts2中请求包含参数如何处理
- struts2的常量、动态方法调用、接受请求参数处理、类型转换 .
- struts2 请求参数接收
- Struts2中一个Action多个请求处理方法的三种实现方式
- Struts2请求参数校验
- Struts2源码分析--请求处理
- 无论url请求什么.都可以拼接class类名.实例化.传递get参数-->给当前控制器-->传递给抽象父类-->都交给抽象父类.这个方法去处理call_user_func_array()
- jmeter对请求参数的签名处理
- struts2的set get方法工作原理 在处理参数上的机制
- Struts2 指定需要Struts 2处理的请求后缀-定义常量
- struts2 处理请求流程分析(结合源码)3
- Struts2 请求参数的接收
- struts2业务控制类(Action)获取页面请求参数的几种方式