该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-16
yin_bp 写道 downpour 写道 yin_bp 写道 我不晓得这个问题和struts 2有没有关系,我只晓得很多人这么用了struts 2后就出现这种问题,很多应用都是外网系统。 拦截器扫描参数过滤特殊字符,应该是有性能开销的,和request.getParameterMap没关系。 明明是struts 2的问题还要赖到OGNL身上,其实有问题不可怕,可怕的是出了问题还这么瞎扯蛋,那就不对了。 其实有问题不可怕,可怕的是像你如此无知的人还在那边大言不惭和混淆视听。求求你先看看ParametersInterceptor的源码再来讨论好不? 就你这样对待技术的态度简直让人脸红。 懒得和你这样的人磨嘴皮子,眼睛里面揉不得半点沙子,我对struts不感兴趣,也没有时间去看那个什么ParametersInterceptor的源码。 瞧瞧你的逻辑,和方舟子有什么区别?我只晓得很多人XXX,XXX应该是有性能开销的。你证实了嘛?凭空下结论是一个技术人员应该有的严谨态度嘛? 你有观点可以表达,但是程序都是由code构成的,你只要有code证明,有理有据,就有人信服。 你这样的人,不适合做技术,乘早改行吧。 |
|
返回顶楼 | |
发表时间:2012-02-17
最后修改:2012-02-17
引用 懒得和你这样的人磨嘴皮子,眼睛里面揉不得半点沙子,我对struts不感兴趣,也没有时间去看那个什么ParametersInterceptor的源码。 抱歉插一句,您不感兴趣,也别随便下结论说struts2不好,本人是struts2的忠实用户,请别误导新手行么!! |
|
返回顶楼 | |
发表时间:2012-02-17
”秋哥“跟楼主都有新书出啊。。。。都很不错。
个人觉得楼主的spring2那本书在我刚入行的时候帮助挺大的。总比把国外经典翻译成烂书的厚道多了。 |
|
返回顶楼 | |
发表时间:2012-02-17
pindai 写道 ”秋哥“跟楼主都有新书出啊。。。。都很不错。
个人觉得楼主的spring2那本书在我刚入行的时候帮助挺大的。总比把国外经典翻译成烂书的厚道多了。 楼主推荐的那本新书我买了一本,读下来感觉还可以。大的概念把握比较准确,很少有错误。偏于实战,对于初学者比较合适。 |
|
返回顶楼 | |
发表时间:2012-02-17
最后修改:2012-02-17
downpour 写道 你回复很不错,不过我还是要指出你概念上的一些错误。
SpringMVC能够处理级联属性映射的问题,但不是Spring一出生就支持的。我在回复中已经提到,Spring3.0中引入了SpringEL,而级联属性的映射内在机理是SpringEL,所以这一支持是从Spring3.0才开始的。Spring2.X的任何版本都无法支持这一特性。这也就是长期以来,SpringMVC在属性映射上无法战胜Struts2的一个很重要原因 ... downpour兄,这个真的可以有,哈。和Spring EL没有关系。在Bean配置时引用Bean中的属性或方法的新功能才是Spring EL所带来的。如以下的配置: <mvc:default-servlet-handler/> <bean id="rpe" class="com.book.base.web.ResourcePathExposer" init-method="init"/> <mvc:resources mapping="#{rpe.resourceRoot}/**" location="/" cache-period="31536000"/> 的那个mapping="#{rpe.resourceRoot}/**" 才是Spring EL表达式(引用ResourcePathExposer Bean的一个resourceRoot的属性),级联属性和Spring EL木的关系。 以下是我《精通Spring 2.x》第4章的一段原话,摘录如下: 和Struts、Hibernate等框架一样,Spring支持级联属性的配置。假设我们希望在定义Boss时直接为Car的属性提供注入值,则可以采取以下的配置方式: <bean id="boss3" class="com.baobaotao.attr.Boss"> <property name="car.brand" value="吉利CT50"/>① </bean> 按照上面的配置,Spring将调用Boss.getCar().setBrand(“吉利CT50”)方法进行属性的注入操作。这时必须对Boss类进行改造,为car属性声明一个初始化的对象: public class Boss { private Car car = new Car(); ① public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } } 在①处,我们为Boss的car属性提供了一个非空的Car实例,如果没有为car属性提供Car对象,Spring在设置级联属性时将抛出NullValueInNestedPathException的异常。 Spring没有对级联属性的层级数进行限制,只要配置的Bean拥有对应于级联属性的类结构,就可以配置任意层级的级联属性,如: <property name="car.wheel.brand" value="双星"/> 定义了具有三级结构的级联属性。 |
|
返回顶楼 | |
发表时间:2012-02-17
请教LZ个问题:
java.lang.IllegalStateException: Cannot access properties on null bean instance 'command'! 初步猜测是丢失了传递的参数。 还请LZ指点! |
|
返回顶楼 | |
发表时间:2012-02-17
stamen 写道 downpour 写道 你回复很不错,不过我还是要指出你概念上的一些错误。
SpringMVC能够处理级联属性映射的问题,但不是Spring一出生就支持的。我在回复中已经提到,Spring3.0中引入了SpringEL,而级联属性的映射内在机理是SpringEL,所以这一支持是从Spring3.0才开始的。Spring2.X的任何版本都无法支持这一特性。这也就是长期以来,SpringMVC在属性映射上无法战胜Struts2的一个很重要原因 ... downpour兄,这个真的可以有,哈。和Spring EL没有关系。在Bean配置时引用Bean中的属性或方法的新功能才是Spring EL所带来的。如以下的配置: <mvc:default-servlet-handler/> <bean id="rpe" class="com.book.base.web.ResourcePathExposer" init-method="init"/> <mvc:resources mapping="#{rpe.resourceRoot}/**" location="/" cache-period="31536000"/> 的那个mapping="#{rpe.resourceRoot}/**" 才是Spring EL表达式(引用ResourcePathExposer Bean的一个resourceRoot的属性),级联属性和Spring EL木的关系。 以下是我《精通Spring 2.x》第4章的一段原话,摘录如下: 和Struts、Hibernate等框架一样,Spring支持级联属性的配置。假设我们希望在定义Boss时直接为Car的属性提供注入值,则可以采取以下的配置方式: <bean id="boss3" class="com.baobaotao.attr.Boss"> <property name="car.brand" value="吉利CT50"/>① </bean> 按照上面的配置,Spring将调用Boss.getCar().setBrand(“吉利CT50”)方法进行属性的注入操作。这时必须对Boss类进行改造,为car属性声明一个初始化的对象: public class Boss { private Car car = new Car(); ① public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } } 在①处,我们为Boss的car属性提供了一个非空的Car实例,如果没有为car属性提供Car对象,Spring在设置级联属性时将抛出NullValueInNestedPathException的异常。 Spring没有对级联属性的层级数进行限制,只要配置的Bean拥有对应于级联属性的类结构,就可以配置任意层级的级联属性,如: <property name="car.wheel.brand" value="双星"/> 定义了具有三级结构的级联属性。 兄弟,求你真的别抬杠了。最好写个程序测试一下好吗?程序员的严谨态度哪儿去了? 你说的在bean的定义中支持级联属性设置和在SpringMVC中支持级联属性的参数绑定是完全两码子事情。一个是配置设值,一个是参数映射。你以为配置设值支持的,参数映射就一定支持?这是你的猜测还是主观臆断? 作为一个严谨的程序员,我给你上传了一个最简单的例子,Spring的版本是2.5.6。eclipse打开工程直接运行src/runtime/JettyStarter,你再访问下:http://127.0.0.1/sample/login?email=joe&owner.email=ken,看看到底是个什么结果。 我是看你讨论问题的态度还不错才和你继续讨论下去的,要是还这样下去,恐怕也没什么好说的了。 |
|
返回顶楼 | |
发表时间:2012-02-17
学习学习,好资料
|
|
返回顶楼 | |
发表时间:2012-02-17
最后修改:2012-02-17
downpour 写道 兄弟,求你真的别抬杠了。最好写个程序测试一下好吗?程序员的严谨态度哪儿去了? 你说的在bean的定义中支持级联属性设置和在SpringMVC中支持级联属性的参数绑定是完全两码子事情。一个是配置设值,一个是参数映射。你以为配置设值支持的,参数映射就一定支持?这是你的猜测还是主观臆断? 作为一个严谨的程序员,我给你上传了一个最简单的例子,Spring的版本是2.5.6。eclipse打开工程直接运行src/runtime/JettyStarter,你再访问下:http://127.0.0.1/sample/login?email=joe&owner.email=ken,看看到底是个什么结果。 我是看你讨论问题的态度还不错才和你继续讨论下去的,要是还这样下去,恐怕也没什么好说的了。 downpour兄,淡定:),真可以,Spring MVC的数据绑定和Bean属性设置内部实现是同源的,都由 org.springframework.validation.DataBinder 负责,怎能Bean的级联属性设置可以,而Spring MVC的级联属性数据绑定就不行了呢? 不过由于你原来的User.java的owner属性是null的,所以你代码的getOwner()要稍微调整下: package com.demo2do.sample.entity; /** * @author Downpour * */ public class User { private String email; private String password; private User owner; public User getOwner() { if(this.owner == null){//<--要添加这个判断,否则会NullPointerException this.owner = new User(); } return owner; } } 为响应严谨程序员的倡议,特做了代码实验,结果请看附图: |
|
返回顶楼 | |
发表时间:2012-02-17
To stamen,按你这么改肯定是可以的啊,但getOwner这个方法被覆盖了啊。最恶心的是,owner的初始化,还不能直接写在属性变量上。为了实现这个功能,把getter方法给覆盖了,这实在不是什么好方法。老实说,你可以说这的确支持,不过难道你没有觉得是投机取巧?考虑一下一个很复杂的表达式:a.b.c.d,按照你的写法,你的getOwner方法得写的多复杂?
在Spring3.0之后,整个绑定机制移交给了SpringEL,才不需要对owner进行初始化。所以,我还是感觉SpringEL的引入才是参数绑定的里程碑。唯一的问题就是无法利用参数的名称。 你的严谨态度值得称赞,这样的讨论才有意义。 |
|
返回顶楼 | |