论坛首页 Java企业应用论坛

Spring 3.0 MVC 开发指南[强烈推荐1个小时掌握精华]

浏览 127281 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-02-16  
yin_bp 写道
downpour 写道
yin_bp 写道


我不晓得这个问题和struts 2有没有关系,我只晓得很多人这么用了struts 2后就出现这种问题,很多应用都是外网系统。

拦截器扫描参数过滤特殊字符,应该是有性能开销的,和request.getParameterMap没关系。

明明是struts 2的问题还要赖到OGNL身上,其实有问题不可怕,可怕的是出了问题还这么瞎扯蛋,那就不对了。


其实有问题不可怕,可怕的是像你如此无知的人还在那边大言不惭和混淆视听。求求你先看看ParametersInterceptor的源码再来讨论好不?

就你这样对待技术的态度简直让人脸红。


懒得和你这样的人磨嘴皮子,眼睛里面揉不得半点沙子,我对struts不感兴趣,也没有时间去看那个什么ParametersInterceptor的源码。


瞧瞧你的逻辑,和方舟子有什么区别?我只晓得很多人XXX,XXX应该是有性能开销的。你证实了嘛?凭空下结论是一个技术人员应该有的严谨态度嘛?

你有观点可以表达,但是程序都是由code构成的,你只要有code证明,有理有据,就有人信服。

你这样的人,不适合做技术,乘早改行吧。
0 请登录后投票
   发表时间:2012-02-17   最后修改:2012-02-17
引用

懒得和你这样的人磨嘴皮子,眼睛里面揉不得半点沙子,我对struts不感兴趣,也没有时间去看那个什么ParametersInterceptor的源码。



抱歉插一句,您不感兴趣,也别随便下结论说struts2不好,本人是struts2的忠实用户,请别误导新手行么!!
0 请登录后投票
   发表时间:2012-02-17  
”秋哥“跟楼主都有新书出啊。。。。都很不错。

个人觉得楼主的spring2那本书在我刚入行的时候帮助挺大的。总比把国外经典翻译成烂书的厚道多了。
0 请登录后投票
   发表时间:2012-02-17  
pindai 写道
”秋哥“跟楼主都有新书出啊。。。。都很不错。

个人觉得楼主的spring2那本书在我刚入行的时候帮助挺大的。总比把国外经典翻译成烂书的厚道多了。


楼主推荐的那本新书我买了一本,读下来感觉还可以。大的概念把握比较准确,很少有错误。偏于实战,对于初学者比较合适。
0 请登录后投票
   发表时间: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="双星"/>
定义了具有三级结构的级联属性。
0 请登录后投票
   发表时间:2012-02-17  
请教LZ个问题:
    java.lang.IllegalStateException: Cannot access properties on null bean instance 'command'!

    初步猜测是丢失了传递的参数。
    还请LZ指点!
0 请登录后投票
   发表时间: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,看看到底是个什么结果。

我是看你讨论问题的态度还不错才和你继续讨论下去的,要是还这样下去,恐怕也没什么好说的了。
0 请登录后投票
   发表时间:2012-02-17  
学习学习,好资料
0 请登录后投票
   发表时间: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;
	}

}

    为响应严谨程序员的倡议,特做了代码实验,结果请看附图:
  • 大小: 39.6 KB
0 请登录后投票
   发表时间:2012-02-17  
To stamen,按你这么改肯定是可以的啊,但getOwner这个方法被覆盖了啊。最恶心的是,owner的初始化,还不能直接写在属性变量上。为了实现这个功能,把getter方法给覆盖了,这实在不是什么好方法。老实说,你可以说这的确支持,不过难道你没有觉得是投机取巧?考虑一下一个很复杂的表达式:a.b.c.d,按照你的写法,你的getOwner方法得写的多复杂?

在Spring3.0之后,整个绑定机制移交给了SpringEL,才不需要对owner进行初始化。所以,我还是感觉SpringEL的引入才是参数绑定的里程碑。唯一的问题就是无法利用参数的名称。

你的严谨态度值得称赞,这样的讨论才有意义。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics