【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/*");
}

猜你喜欢

转载自www.cnblogs.com/dayAndnight2019/p/11310431.html