spring mvc 之 servlet.xml
最近在研究springmvc,于是乎把看到的相关文章贴来,没事看一看,转自http://code.google.com/p/simplejee/source/browse/trunk/simplejee/WebContent/WEB-INF/springmvc-servlet.xml?r=46
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--struts1的action的方法是返回ActionForward,找到相应的JSP,
而spring是根据controller的方法返回的ModelAndView对象,找到相应的JSP
前者actionForward对象是调用mapping对象,和struts-config.xml里的actionForward的配置对应起来的
而springmvc是根据ModelAndView和viewResolver来决定的,
不同的viewResolver有不同的决定方法。
这里的逻辑是这样,比如你返回的ModelAndView是这么生成的newModelAndView("hello")
那么这里的viewResolver,就是去找prefix+"hello"+suffix,也就是
/springmvc/hello.jsp
InternalResourceViewResolver
AconveniencesubclassofUrlBasedViewResolverthatsupports
InternalResourceView(i.e.ServletsandJSPs),andsubclassessuchas
JstlViewandTilesView.Theviewclassforallviewsgeneratedbythis
resolvercanbespecifiedviasetViewClass(..).SeetheJavadocsfor
theUrlBasedViewResolverclassfordetails.
-->
<beanid="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="prefix"value="/springmvc/"/>
<propertyname="suffix"value=".jsp"/>
</bean>
<!--这是urlMapping
意思就是说什么请求由哪个controller来处理
-->
<beanid="simpleUrlHandlerMapping"class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<propertyname="mappings">
<props>
<propkey="/hello.spring">helloController</prop>
</props>
</property>
</bean>
<!--这里定义了一个controller,就是一个实现了Controller接口的普通类-->
<beanid="helloController"class="com.yuqiaotech.simplejee.spring.springmvc.HelloController">
<!--
<propertyname="helloManager"ref="helloManager"/>
-->
</bean>
<!--BeanNameUrlHandlerMapping顾名思义,是根据bean的name来决定某个url应该由哪个Contrlloer的bean来处理的
除此之外,如下所示你还可以添加拦截器,以便在Controller处理请求之前和之后做一些预处理和善后处理。
只要是实现了HandlerMapping的bean,spring都会用来做url影射,但如果两个HandlerMapping都能解析
某个url就出现问题了,所以常用的HandlerMapping还实现了Ordered接口。用来决定其优先顺序。
-->
<beanid="handlerMapping"class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<propertyname="order"value="1"/><!---->
<propertyname="interceptors">
<list>
<refbean="authInterceptor"/>
</list>
</property>
</bean>
<!--拦截器-->
<beanid="authInterceptor"class="com.yuqiaotech.simplejee.spring.springmvc.AuthInterceptor">
<propertyname="redirectTo"value="/unAuth.html"/>
</bean>
<!--以下为SimpleFormController的例子
注意的是当你访问/login.spring的时候,onSubmit方法没有被执行,
而是在你点击了提交按钮后onSubmit方法才被执行的,另外是如果你把login.jsp里的form中的method去掉的话,
即便点击提交按钮onSubmit方法也不会被调用。
-->
<beanname="/login.spring"
class="com.yuqiaotech.simplejee.spring.springmvc.LoginController">
<propertyname="commandClass">
<value>com.yuqiaotech.simplejee.hibernate.model.User</value>
</property>
<propertyname="formView">
<value>login</value>
</property>
<propertyname="successView">
<value>redirect:/index.html</value><!--注意这里的redirect方式-->
</property>
<propertyname="jdbcTemplate"ref="jdbcTemplate"/><!--注入了一个jdbcTemplate对象-->
</bean>
<!---->
<beanid="methodNameResolver"class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<propertyname="paramName">
<value>method</value>
</property>
<propertyname="defaultMethodName">
<value>list</value>
</property>
</bean>
<beanname="/userAdmin.spring"
class="com.yuqiaotech.simplejee.spring.springmvc.UserAdminController">
<propertyname="methodNameResolver"ref="methodNameResolver"/>
<propertyname="jdbcTemplate"ref="jdbcTemplate"/>
<propertyname="dataSource"ref="dataSource"/>
</bean>
<!--最开始的例子我是如下来写的,但对于User里的birthday属性,没办法处理
因为除了重写initBinder方法似乎无法为springmvc指定定制的CustomEditor,只能写一个
Controller继承MultiActionController,然后重写initBinder了。
当然也可以写个MultiActionController的子类来替换下面这个配置里的MultiActionController,
并保持delegate方式。
spring有个CustomEditorConfigurer可以添加自定义的CustomEditor,但只在ApplicationContext
范围内有效,就是说在<propertyname="birthday"value="2009-01-01"/>
这种场合才能使用。
还有个办法就是在User类的包里添加一个UserPropertyEditorextendsPropertyEditorSupport。
但像日期转换这种通用操作而给User添加一个PropertyEditor类,似乎不太好。
-->
<!--<beanname="/userAdmin.spring"-->
<!--class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">-->
<!--<propertyname="methodNameResolver"ref="methodNameResolver"/>-->
<!--<propertyname="delegate">-->
<!--<beanclass="com.yuqiaotech.simplejee.spring.springmvc.UserAdminController">-->
<!--<propertyname="jdbcTemplate"ref="jdbcTemplate"/>-->
<!--<propertyname="dataSource"ref="dataSource"/>-->
<!--</bean>-->
<!--</property>-->
<!--</bean>-->
<!--这种配置方法把methodNameResolver直接定义在里面了,这种方式有点类似匿名类的用法
这是spring里的标准用法,和MultiActionController没有特定关系。
-->
<!--<beanid="paramMultiController"-->
<!--class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">-->
<!--<propertyname="methodNameResolver">-->
<!--<bean-->
<!--class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">-->
<!--<propertyname="paramName"value="method"/>-->
<!--</bean>-->
<!--</property>-->
<!--<propertyname="delegate">-->
<!--<beanclass="com.yuqiaotech.simplejee.spring.springmvc.StudentController"/>-->
<!--</property>-->
<!--</bean>-->
<beanname="/chart.spring"class="com.yuqiaotech.simplejee.spring.springmvc.ChartController">
</bean>
<beanid="messageSource"class="org.springframework.context.support.ResourceBundleMessageSource">
<propertyname="basename"value="messages"/>
</bean>
</beans>