在Springweb搭建中,引入创建了Controller控制类,可以编写自己的代码,实现前后端交互,那么如何使用呢?
搭建控制器类
● @RestController ,表示此类是控制层类,并创建对象;
● @RequestMapping ,处理请求地址映射,可用于类或方法上;
该标签中的属性:
path/value:可设置请求的路径,映射地址,为类设置地址时必须是唯一的,为方法设置时,同一个类中的地址也必须是唯一的;
method:可设置请求的方式(post/get) ,如果注解标签中未设置该属性说明post或get请求都可以访问;
● @GetMapping,相当于 @RequestMapping (method =RequestMethod.GET) ,也可以设置映射地址与@RequestMapping相同;
● @PostMapping,相当于 @RequestMapping (method =RequestMethod.POST),也可以设置映射地址与@RequestMapping相同;
@RestController
@RequestMapping(path = "/loginCtl")
public class LoginController {
@GetMapping(path = "/login")
//相当于@RequestMapping(path = "login",method = RequestMethod.GET)
public void login(){
......
}
}
接收请求中的数据
1.在学习Servlet,获取前端返回的参数时,使用的是 req.getParameter() 方法,在Spring框架中,也可以使用该方法获取参数。在使用前需要导入jar包即可:
<!--javax.servlet-api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
2.可以在参数列表中定义形参接收;
如果请求中的名字与形参名字一致时,直接就可以定义参数,从参数列表中获取到,如果不一致时,可以使用@RequestParam注解标签来标注:
//名字一致时:请求和参数的名字都为num
public void login(Integer num){
System.out.println(num);
}
//名字不一致时:请求中的名字为:user-name 参数名字为:userName
public void login1(@RequestParam("user-name") String userName){
System.out.println(userName);
}
也可通过@RequestHeader注解标签来获取请求头中的数据;
public void login2(@RequestHeader("User-Agent") String userAgent){
System.out.println(userAgent);
}
3.请求中的数据过多时,可以使用对象接收;
这种方式通常就是将参数放在一个实体中,然后只需要在控制器方法上定义这个实体为参数即可;
public void test(Admin admin){
System.out.println(admin);
}
注意:
如果请求中有关于日期的数据时,需要在日期上添加一个@DateTimeFormat注解标签,指定了 Date 类型的格式。
@DateTimeFormat(pattern="yyy-MM-dd")
private Date birthday;
中文乱码处理
当前端发送的请求为post请求时,如果输入中文,会产生中文乱码;处理的方法就是设置一个过滤器,为 request 对象设置编码集。Spring框架中已经提供了这个过滤器,只需要在web.xml中配置即可。
<!--配置Spring框架提供的一个编码过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<!--设置字符集编码-->
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Ajax 返回 JSON
在创建控制器类时,使用了@RestController注解标签,该标签中包含了@ResponseBody标签,所以方法返回的结果默认是JSON格式,并将json字符串写入到响应体中返回一个对象时,必须加入转json的jar包。
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
跨域处理
1.导入相关的jar包;
<!--跨域-->
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>2.5</version>
</dependency>
2.配置跨域过滤器;
<!--配置跨域处理过滤器-->
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
拦截器
1.概念
提到拦截器,就会想到与它相似的过滤器,过滤器时java Servlet规范中定义的,是当请求进入到servlet之前,可以对请求进行拦截,可以加入一些逻辑处理。
但拦截器是Spring框架自己定义的功能,它与过滤器是有区别的,两者存在的位置不同,过滤器是在请求进入到servlet之前,而拦截器是只拦截进入到控制器中的请求,其余的不拦截,可以说是拦截器在过滤器之后。
2.搭建
①创建一个类,实现HandlerInterceptor接口;
②重写接口中的preHandle方法;
public class TokenInterceptor implements HandlerInterceptor {
/*
预处理
当请求经过映射处理器并检测到对应的控制器是存在的
判断该请求可以进入到该拦截器,执行调用
返回true-->请求继续向下执行
返回false-->请求不在继续向下执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
/*
在mvc架构中使用的
当控制器执行完成后,调用
@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 {
}*/
}
③在spring-mvc.xml中配置拦截器;
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="..."/><!--配置哪些请求进入到拦截器-->
<mvc:exclude-mapping path="..."/><!--配置哪些请求不进入拦截器-->
<bean class="拦截器全类名"></bean><!--配置拦截器实现类-->
</mvc:interceptor>
</mvc:interceptors>