SpringMVC学习(二)

今天又看了一点儿SpringMVC的东东,明天就要开始百阿的培训了,赶紧记下来,要不又都忘了,呵呵~~

如果在项目中启用Log4J呢,需要你的log4j.properties文件,当然了,要配置一下才行啊,要不Spring容器怎么知道去哪里找log4j.properties啊,呵呵,那只需要在web.xml中配置一下,哈哈,如下:
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
这样就行啦~~~

接下来咱们再来说一下控制器、处理器映射和视图解析器的高级点儿的东东,哈哈~~

先来回顾一下,咱们已经知道,Controller接口是控制器的接口,它的所有实现类都要实现一个叫做handleRequest的方法,默认呢,进入Controller的时候就会调用它的handleRequest方法,对数据进行处理,并返回一个ModelAndView对象。如果像提交表单类的操作,咱们需要将Request参数和咱们的类对象进行绑定,那就需要Command Controller啦。那现在Controller返回了一个带名字的ModelAndView对象,根据ViewResolver的配置,它就能去找到合适的页面解析后呈现给客户端,哈~~~大致过程明白了吧,呵呵。

但是要是对于每个请求都写一个Controller,那样多麻烦啊,唉呀,不好不好,要是能够把一类操作都写在一个类里多好啊,呵呵,别急,SpringMVC有实现的噢~~~这个Controller就是MultiActionController,Spring2.5参考手册中是这样写它的,“它可以定义页面请求到控制器方法名的映射, 然后在处理相应请求时调用该方法。”所以如果有一些Controller有公用方法啊,或是处理相关逻辑啊什么的,就可以写到一个MultiActionController里,但是如果逻辑比较复杂或是各个处理关系不大的话,不建议使用噢~~~
一般来讲,使用MultiActionController有两种方式,一种呢就是继承MultiActionController,另一种就是给它指定一个委托对象,当有请求来的时候呢,实际上是去调用这个委托对象里的方法,哈哈。有点晕吧,是不是很疑问这一个类里这么多处理请求的方法,Spring怎么根据请求去调用正确的方法来呢,哈哈,其实呢,咱们需要MethodNameResolver来对请求进行解析,然后根据解析出来的参数去调用合适的方法。那先说说对于MultiActionController咱们该怎么用,呵呵。
对于咱们自己的MultiActionController的方法,咱们有个规矩,就是要符合这样的格式:public [ModelAndView | Map | void] anyMeaningfulName(HttpServletRequest, HttpServletResponse [,HttpSession] [,AnyObject])
返回类型呢,当然最好就是ModelAndView啦,呵呵,这样跟咱们之前的Controller一样了,不多说。要是返回值是void呢,就是直接往客户端写response了,就不用后面的视图解析器了,呵呵,这个也不难理解,那如果返回值是Map呢,视图解析器就从请求中抽取视图名,而返回数据将被放入model,也就是说,根据请求的URL找到页面,而Map里封装的呢就是咱们要的数据啦,呵呵~~还需要注意的是,函数的参数,HttpSession和AnyObject都是可选的,HttpSession如果有的话,必须是在第三个位置上,一定噢~~
好啦,那现在MultiActionController写好了,那MethodNameResolver呢?哈哈,Spring也有很多实现啦,默认是使用InternalPathMethodNameResolver,规则就是如果你的请求url为http://localhost:8080/springmvc/test.do,那么就会调用test方法啦,呵呵。有一种实现是ParameterMethodNameResolver,它呢是根据你的url参数进行方法匹配的,比如说url为http://localhost:8080/springmvc/index.do?method=test,那他就获取method参数值,也就是test,调用test方法,具体呢,咱拿个例子来说~~
<bean class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
<property name="methodNameResolver">
<bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName" value="method"/>
</bean>
</property>
<property name="delegate">
<bean class="com.springmvc.Delegate "/>
</property>
</bean>

public class Delegate {
public ModelAndView test(HttpServletRequest req, HttpServletResponse resp) {
return new ModelAndView("index", "date", new Long(System.currentTimeMillis()));
}
}
这样呢,对于http://localhost:8080/springmvc/index.do?method=test的请求,就会调用这个test方法啦,还有啊,那个参数名并不是定死的是method的啊,是可以配置的,你也应该看到了,在配置MethodNameResolver的时候有个属性是paramName,哈哈~~
还有一种实现呢,是PropertiesMethodNameResolver,它可以完成与我们定义的方法的任意数量的URL的匹配,不多说,咱还是看例子~~
<bean id="propsResolver"
class="org....mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<value>
/index/welcome.html=test
/**/notwelcome.html=nottest
/*/user?.html=user
</value>
</property>
</bean>
<bean id="paramMultiController" class="org....mvc.multiaction.MultiActionController">
<property name="methodNameResolver" ref="propsResolver"/>
<property name="delegate">
<bean class=" com.springmvc.Delegate "/>
</property>
</bean>
看吧,很简单吧,呵呵, 直接将请求要调用的方法名和请求映射到一块儿了,哈哈,牛叉!!!

然后再看看处理器映射吧,它呢,是把DispatcherServlet转发过来的请求进行处理,并调用相应的Controller进行处理的,那它是怎么处理请求的呢?拦截器呗,哈哈~~
AbstractHandlerMapping及其子类都有一个叫做interceptors的属性,可以通过它来注入要注入的拦截器,拦截器的实现都要继承org.springframework.web.servlet包中的HandlerInterceptor接口。 这个接口定义了三个方法,一个在处理器执行前被调用,一个在处理器执行后被调用,另一个在整个请求处理完后调用。 这三个方法提供你足够的灵活度做任何处理前后的操作。
preHandle(..)方法有一个boolean返回值。 使用这个值,可以调整执行链的行为。 当返回true时,处理器执行链将继续执行,当返回false时,DispatcherServlet认为该拦截器已经处理完了请求(比如显示正确的视图),而不继续执行执行链中的其它拦截器和处理器。

嗯,接下来,咱们看看本地化解析器,i18n嘛,呵呵~~
当收到请求时,DispatcherServlet查找一个本地化解析器,如果找到,就使用它设置本地化信息。 通过RequestContext.getLocale()方法,总可以获取由本地化解析器解析的客户端的本地化信息。 可以通过在应用上下文中配置得到启用,呵呵,先来看一些实现类~~
AcceptHeaderLocaleResolver,这个本地化解析器检查请求中客户端浏览器发送的accept-language头信息, 通常这个HTTP Header包含客户端操作系统的本地化信息。
CookieLocaleResolver,这个本地化解析器检查客户端中的Cookie是否包含本地化信息。 如果有的话,就使用。当配置这个解析器的时候,可以指定cookie名,以及cookie的最长生存期(Max Age)。 下面这个例子定义了一个CookieLocaleResolver。
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="clientlanguage"/>
<property name="cookieMaxAge" value="100000">
</bean>
SessionLocaleResolver,允许从用户请求相关的session中获取本地化信息。

嗯嗯,差不多了,哈哈,咱们再进一步吧~~~

不管说Ruby还是Python,这些发展很迅速的语言都有个优点就是约定优于配置,就是说,咱们先约定好规则,这样就省去了挨个配置的麻烦,嗯嗯,SpringMVC也有实现噢~~
原来咱们需要配置handlerMapping,容器才知道请求应该让哪个Controller去处理,哈,现在呢,有ControllerClassNameHandlerMapping啦,就不需要去配置根据挨个请求去配置handlerMapping啦,比如说有个叫testController的Controller,所有对test.do的请求都会调用这个请求,很强悍吧~~
还有就是咱们Controller里,一般要返回一个ModelAndView,因为它是一个Map实现,所以都是Key-Value对应的,现在呢,咱们不用显示的给它名字了,它自己会处理,比如有个User类型的对象,它默认的名字就是user,不过在加入一个Set、List或者对象数组之后, 生成名称的策略是深入这个集合,取出集合中第一个对象的简短类名,并使用这个名称并在后面加上List。比如是ArrayList<User> users,默认是解析为userList的~~
RequestToViewNameTranslator接口的功能是当没有显式的提供这样一个逻辑视图名称的时候, 确定一个逻辑的View名称。 这个接口只有一个实现,叫做 DefaultRequestToViewNameTranslator。 默认就是这样处理的啦,比如在registerController里返回的ModelAndView木有名字,那怎么办呢?就返回register算啦~~~~

,那现在呢,咱们再进一步,咱们看注解驱动滴开发,嘿嘿~~配置更少了哈~~~

Controller的注解呢,是在Controller类名的前面加上@Controller注解,这样呢,就认为这是一个Controller实现啦,在其类前或是实现方法前加上@RequestMapping(“/test.do”)注解呢,那就能处理“/test.do”请求啦~~那对于来的请求参数怎么办呢?哈哈,有@RequestParam注解啦,现在咱来看个例子,呵呵
@Controller
Public Class TestController{
@Autowired
Public TestController(){
}
@RequestMapping(“/test.do”)
Public ModelAndView test(@RequestParam(“paramId”) int id){
//do something with the id and return a ModelAndView~~
}
}
哈,还有个问题,参数咱可以获取了,那怎么绑定到一个目标对象上呢,嘿嘿,还有一招,就是@ ModelAttribute 注解,使用方式呢和@RequestParam差不多,例如Public ModelAndView test(@ModelAttribute(“user”)User user){
//do something with the user and return a ModelAndView~~
}

哎呀哎呀,SpringMVC太强大啦,看看人家这设计,皑皑,葱白啊~~~~~~~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值