spring2.5 mvc官方文档笔记(1)

以下笔记按照官方文档的顺序记录重点部分

' spring3的mvc使用servlet来进行分发工作,具体由DispatcherServlet来进行过滤分发
以下是他在web.xml里的配置
[ccn lang="xml" tab_size="4" theme="blackboard" width="800"]


example
org.springframework.web.servlet.DispatcherServlet
1


example
*.form


[/ccn]
需要注意的是在完成此配置之后,spring框架会在WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,生成文件中定义的bean
这个可以在web.xml里进行配置

` spring自身也有许多bean分别有自身的职责
控制器(Controllers) 控制器 实现的是MVC中的C 。
处理器映射(Handler mapping) 处理器映射包含预处理器(pre-processor), 后置处理器(post-processor)和控制器的列表,它们在符合某种条件时才被执行(例如符合控制器指定的URL)。
视图解析器(View resolvers) 视图解析器 可以将视图名解析为对应的视图。
本地化解析器(Locale resolver) 本地化解析器能够解析用户正在使用的本地化设置,以提供国际化视图。
主题解析器(Theme resolver) 主题解析器能够解析你的web应用所使用的主题,以提供个性化的布局。
文件上传解析器(Multipart File resolver) 文件上传解析器提供HTML表单文件上传功能。
处理器异常解析器(Handler exception resolver(s)) 处理器异常解析器可以将异常对应到视图,或者实现更加复杂的异常处理逻辑。

` DispatcherServlet初始化参数
contextClass 实现WebApplicationContext接口的类,当前的servlet用它来创建上下文。如果这个参数没有指定, 默认使用XmlWebApplicationContext。
contextConfigLocation 传给上下文实例(由contextClass指定)的字符串,用来指定上下文的位置。这个字符串可以被分成多个字符串(使用逗号作为分隔符) 来支持多个上下文(在多上下文的情况下,如果同一个bean被定义两次,后面一个优先)。
namespace WebApplicationContext命名空间。默认值是[server-name]-servlet。

` spring的基础控制器接口org.springframework.mvc.Controller
[ccn lang="java" tab_size="4" theme="blackboard" width="800"]
public interface Controller {

/**
* Process the request and return a ModelAndView object which the DispatcherServlet
* will render.
*/
ModelAndView handleRequest(
HttpServletRequest request,
HttpServletResponse response) throws Exception;

}

[/ccn]
可以看出是单纯的处理请求并返回响应
记住一个非常核心的概念在spring的mvc里
基本功能: 处理请求并返回一个模型和一个视图。也就是上面代码里的ModelAndView

` 如果使用AbstractController 则有以下一些属性是可以配置的
supportedMethods 指定这个控制器应该接受什么样的请求方法。通常它被设置成同时支持GET和POST,但是可以选择你想支持的方法。如果控制器不支持请求发送的方法, 客户端会得到通知(通常是抛出一个ServletException)。
requiresSession 表明这个控制器是否需要HTTP session才能正常工作。如果控制器在没有session的情况下接收到请求,客户端会因为抛出ServletException 而得到通知。
synchronizeOnSession 指定controller是否同步用户的HTTP session。
cacheSeconds 指定controller通知客户端对数据内容缓存的秒数,一般为大于零的整数。默认值为-1,即不缓存。
useExpiresHeader 指定Controller在响应请求时是否兼容HTTP 1.0 Expires header。缺省值为true。
useCacheHeader 指定Controller在相应请求时是否兼容HTTP 1.1 Cache-Control header。默认值为true。

比如自定义的一个controller
[ccn lang="java" tab_size="4" theme="blackboard" width="800"]
package samples;

public class SampleController extends AbstractController {

public ModelAndView handleRequestInternal(
HttpServletRequest request,
HttpServletResponse response) throws Exception {

ModelAndView mav = new ModelAndView("hello");
mav.addObject("message", "Hello World!");
return mav;
}
}
[/ccn]
在applicationcontext.xml里的配置 来配置上面所提到的参数
[ccn lang="xml" tab_size="4" theme="blackboard" width="800"]

[/ccn]

` 以上所说的那些都是只能处理一个请求的controller,和webwork一样的多请求处理器,MultiActionController
先理解MethodNameResolver这个接口的作用,它的作用是指定解析和调用方法的方式
spring有一些自身的实现
InternalPathMethodNameResolver -从请求路径中获取文件名作为方法名,比如,http://www.sf.net/testing.view的请求会调用testing(HttpServletRequest,HttpServletResponse)方法。
ParameterMethodNameResolver - 解析请求参数,并将它作为方法名。比如,对应http://www.sf.net/index.view?method=testIt的请求,会调用 testIt(HttpServletRequest, HttpServletResponse)方法)。使用paramName属性定义要使用的请求参数名称。
PropertiesMethodNameResolver - 使用用户自定义的属性(Properties)对象,将请求的URL映射到方法名。比如,当属性中包含 /index/welcome.html=doIt时,对/index/welcome.html 的请求会调用 doIt(HttpServletRequest, HttpServletResponse)方法。 PropertiesMethodNameResolver内部使用了 Spring的PathMatcher,所以支持路径通配符,比如上边那个URL写成/**/welcom?.html也是可以的。

那么MethodNameResolver接口的作用就是负责从请求中解析出需要调用的方法名称

MultiActionController需要一种策略,使其可以通过解析请求信息来获得要调用的方法。这个解析策略由 MethodNameResolver接口定义。MultiActionController提供了'methodNameResolver' 属性使得你可以注入需要的MethodNameResolver
使用方法是
1 创建MultiActionController的子类,并指定将被MethodNameResolver解析的方法,这种方式不需要指定委托参数
这个的意思就是所有的方法解析和处理在子类里面都包含了,不需要再额外的创建委托者Delegate了

2 先定义一个委托对象,MethodNameResolver解析出目标方法后将调用该对象的相应方法。这种情况下需要定义MultiActionController 的实例并将委托对象作为协作者注入(可通过构造参数或者setDelegate方法)。
而这种方式呢需要在声明使用的MethodNameResolver以后来创建相关的委托者来具体描写处理的方法
比如如果使用ParameterMethodNameResolver这个MethodNameResolver,需要在配置中配置相应的委托者 如下面的配置
[ccn lang="java" tab_size="4" theme="blackboard" width="800"]
public class SampleDelegate {
public ModelAndView retrieveIndex(HttpServletRequest req, HttpServletResponse resp) {
return new ModelAndView("index", "date", new Long(System.currentTimeMillis()));
}
}
[/ccn]
[ccn lang="xml" tab_size="4" theme="blackboard" width="800"]]


[/ccn]

如果使用属性参数配置的PropertiesMethodNameResolver
[ccn lang="xml" tab_size="4" theme="blackboard" width="800"]

/index/welcome.html=retrieveIndex
/**/notwelcome.html=retrieveIndex
/*/user?.html=retrieveIndex


[/ccn]