Spring学习笔记之二: Spring MVC
Spring MVC的请求路线
在Spring MVC中,DispatcherServlet就是前端控制器
- DispatcherServlet的任务是将请求(包含URL)发送给Spring MVC控制器(controller)
- DispatcherServlet会查询一个或多个处理器映射(handler mapping), 选择合适的控制器
- 请求到达控制器,等待控制器处理,控制器将业务逻辑委托给一个或多个服务对象
- 控制器完成逻辑处理后,将模型(model)和视图名返回给DispatcherServlet
- DispatcherServlet使用视图解析器(view resolver)将逻辑视图名匹配成一个特定的视图实现
- 视图渲染输出
搭建Spring MVC
配置Spring MVC
Spring MVC通常带有两个应用上下文
- DispatcherServlet加载包含Web组件的bean,如控制器、视图解析器和处理器映射
- ContextLoaderListener要加载应用中的其他bean,这些bean通常是驱动应用后端的中间层和数据层组件
example:
import org.springframework.web.servlet. support.
AbstractAnnotationConfigDispatcherServletInitializer
public class WebAppInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override protected String [] getServletMappings () {
return new String[] { "/" };
}
@Ovemde protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class };
}
}
AbstractAnnotationConfigDispatcherServletInitializer会同时创建DispatcherServlet
和ContextLoadeListener
:
- getServletConfigClasses()方法返回的带有@Configuration
注解的类会用来定义DispatcherServlet创建的应用上下文中的bean
- getRootConfigClasses()方法返回的带有@Configuration
注解的类会用来配置ContextLoaderListener创建的应用上下文中的bean
启用Spring MVC
- 通过启用注解驱动的Spring MVC
- 通过@EnableWebMvc注解实现配置类WebConfig
接受请求的输入
Spring MVC允许以三种方式将客户端的数据传送到控制器的处理器方法中:
- 查询参数(Query Parameter)
- 表单参数(Form Parameter)
- 路径变量(Path Variable)
通过查询参数输入
通过注解@RequestParam实现,该注解可以增加参数:
- value(String): 传入参数名
- defaultValue(String): 默认值
example:
@RequestMapping(value = "/users", method = RequestMethod.GET)
public String getUser(
@RequestParam(value = "id",
defaultValue="AMX1948_Châtillon") String id) {
return "user";
}
这个处理器方法将会处理形如
/users?id=1948
的请求
通过路径参数接受输入
通过注解@PathVariable实现
example:
@RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
public String getUser(
@PathVariable("id"") String id) {
return "user";
}
这个处理器方法将会处理形如
/users/1948
的请求, 这种请求的优先级高于上一种
处理表单
传入POJO对象,或者请求体,通过@RequestBody注解实现
example:
@RequestMapping(value = "/users/list", method = RequestMethod.POST)
public List<User> listUser(@RequestBody ListUserReq listReq) throws Exception {
……
return userList;
表单的校验可以通过JSR303
或JSR305
的相关API实现