【JAVAEE系列之Spring】004使用MVC
【常见的MVC架构】
外部的http请求首先到达Controller,经过数据CURD操作后,返回一个View,View渲染成html展现给客户端。
【如何绑定路由到控制器方法上?】
1. 创建控制器
@Controller public class UserController { ... }
2. 创建控制器方法,并使用@RequestMapping注解进行标注
@RequestMapping("/user/list") public void userList() { ... }
3. 这样,你就将UserController的userList方法绑定到了/projectname/user/list路径
【使用JSP】
1. 添加JSP依赖
<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
2. 添加配置类
@Bean public ViewResolver jspViewResolver(){ InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setViewClass(JstlView.class); resolver.setPrefix("/WEB-INF/jsp/"); resolver.setSuffix(".jsp"); return resolver; }
3. 在WEN-INF/jsp/下创建jsp文件
<html> <body> There are many users. </body> </html>
4. 在控制器中使用
@RequestMapping("/user/list")
public String userList() {
return "my_friends";
}
【从控制器向View传参】
1. 为控制器方法加入Model 参数
@RequestMapping("/user/list") public void userList(Model model) { ...
2. 使用model.addAttribute(String key, String value)
model.addAttribute("nbUsers", 13);
3. 在JSP中使用Attribute,使用$获取Attribute
<p>There are ${nbUsers} users</p>
【获取路径参数】
对于/user/5/name中的5和name怎么获取呢?
使用{}可以实现路由地址的匹配:
@RequestMapping("/user/{id}/{field}") public void showUserField(@PathVariable("id") Long userId, @PathVariable("field") String field) { ... }
在@RequestMapping中使用{}匹配相关的路由参数,使用@PathVariable("fieldName")来匹配真实参数
【对本控制器内的所有方法映射相同的路由前缀】
1. 对Controller类本身进行注解
@Controller @RequestMapping("/user") public class UserController { ... }
2. action方法会自带前缀/user
@RequestMapping("/list") public void userList() { ... }
实际路由为/user/list
@RequestMapping("/add") public void addUser() { ... }
实际路由为/user/add
【使用拦截器在控制其方法执行前后执行操作】
完整的拦截过程:
1. 创建一个拦截器,继承HandlerInterceptorAdapter:
public class PerformanceInterceptor extends HandlerInterceptorAdapter {
2. 重写相关方法
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { … return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { ... } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { ... }
3. 创建配置类
@Configuration @EnableWebMvc public class AppConfig extends WebMvcConfigurerAdapter{ ...
4. 创建Bean
@Bean public HandlerInterceptor performanceInterceptor() { PerformanceInterceptor interceptor; interceptor = new PerformanceInterceptor(); return interceptor; }
5. 注册拦截器
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(performanceInterceptor()); }
也可以在注册拦截器的时候配置拦截器适用的路由(对于局部拦截器而言):
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(performanceInterceptor()).addPathPatterns("/home", "/user/*"); }