Spring MVC入门学习(五)

1
Spring MVC入门学习之(五)

配置拦截器

   springmvc的拦截器只能拦截控制器, 不能拦截jsp. 当我们不想让别人访问的jsp文件的时候, 可以把jsp界面放在WEB-INF文件夹中, 这个目录称为安全目录, 不能被外界直接访问.

当然我们可以通过设置过滤器拦截jsp界面.

编写自定义拦截器

   编写的类需要实现HandlerInterceptor接口, 其中有三个方法(preHandle、postHandler、afterCompletion). 其实生命周期和servlet中的过滤器一致. preHandle方法是在执行控制方法之前执行, 如果返回为true, 放行, 即执行Controller, 如果返回false, 即不放行, 不执行Controller. postHandler为Controller方法执行之后 执行此方法. afterCompletion为最后执行, 即返回视图后才执行

xml配置

1
2
3
4
5
6
7
8
9
10
11
	 <mvc:interceptors>
<!--配置一个全局的拦截器, 拦截所有请求-->
<!-- <bean class="cn.lacknb.interceptor.SessonInterceptor"/>-->
<mvc:interceptor>
<!--配置拦截器作用的路径-->
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/user/login.do"/>
<mvc:exclude-mapping path="/user/register.do"/>
<bean class="cn.lacknb.interceptor.SessonInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

多个拦截器的执行流程

现在有拦截器111和拦截器222, 执行分别输出111和222.

1
2


上述的配置顺序, 当执行完成之后, 输出顺序为:

​ preHandler——1111

​ preHandler——2222

​ postHandler——2222

​ postHandler——1111

​ afterCompletion——2222

​ afterCompletion——1111

JSON数据交互

需要准备的jar包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!--自动封装json为实体类对象, 并返回给前台-->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.8</version>
</dependency>

在使用注解开发时需要用到两个重要的JSON格式转换注解, 分别是@RequestBody和@ResponseBody

  • @RequestBody: 用于将请求体中的数据绑定到方法的形参中, 改注解应用在方法的形参上(其实就是将前台传来的json数据转成实体类对象)
  • @ResponseBody: 用于直接返回return对象, 该注解应用在方法上.

前端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script>

$(function () {
$('#btn').click(function () {
alert("hello")
$.ajax({
/*这里一定要表明contentType为json类型, 否则后台接收不到数据, 会报415错误*/
contentType: "application/json; charset=UTF-8",
url: "${pageContext.request.contextPath}/test/ajax.do",
dataType: "json",
method: "post",
data: JSON.stringify({"name": "张三", "sex": "女", "age": 13 }),
success: function (data) {
console.log(data)
}
})
})
})
</script>
</head>
<body>
<button id="btn">ajax模拟请求</button>

后端代码

实体类user

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package cn.lacknb.bean;

public class User {

private String name;
private String sex;
private Integer age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}
}

控制器controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package cn.lacknb.controller;

import cn.lacknb.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/test")
public class AjaxTest {

/*
*
* 这里的:
* RequestBody : 接收json数据 并封装成对象
* ResponseBody: 将对象封装成json数据 并返回
*
*
* */

@RequestMapping(value = "/ajax.do", method = RequestMethod.POST)
@ResponseBody
public User ajaxTest(@RequestBody User user){
System.out.println(user);
user.setAge(77);
user.setName("李四");
user.setSex("男");
return user;
}
}
-------------------本文结束 感谢您的阅读-------------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%