文章目录
一、SpringWeb概述
二、SpringWeb特点
三、搭建SpringWeb(在web项目中)
1、导包
2、在web.xml文件中配置统一拦截分发器 DispatcherServlet
3、开启 SpringWEB 注解
4、处理器搭建
四、SpringWeb运行流程
五、SpringWeb组件
1、前端控制器:
2、处理器映射器:
3、处理器适配器:
4、处理器:
六、接收请求
1、@RequestMapping注解
2、使用method定义请求方式
七、获取请求数据
1、使用 request 对象接收
2、使用Spring中的自动封装
3、使用@RequestParam("")绑定参数,用于接收请求中的数据
4、使用@RequestHeader("")绑定参数,用于接收请求头中的数据
5、使用@RequestBody接收前端提交的json 格式数据并将其封装到实体类对象中
6、使用@DateTimeFormat(pattern = "yyyy-MM-dd")为Date类型属性指定转换格式
八、SpringWeb的优点
九、中文乱码处理、返回Json处理、跨域访问处理
1、中文乱码处理
2、 返回Json处理(将响应对象转为json数据格式)
3、跨域访问处理
十、SpringWeb中的拦截器
1、定义
2、作用
3、拦截器与过滤器的区别
4、定义拦截器
5、配置拦截器
一、SpringWeb概述
1、SpringWeb是Spring框架中的一个模块,是基于ServletAPI构建的web框架,是Spring为web层开发提供的一套完备的解决方案。
2、在web层框架经历了Strust1,、WebWork、Struct2等诸多产品的历代更迭之后,业界普遍选择SpringWeb作为JavaEE项目web层开发的首选方案。
二、SpringWeb特点
1、SpringWeb是Spring家族的原生产品,与IOC容器等基础设施可以实现无缝对接。
2、基于原生的Servlet,StringWeb提供了一个前端控制器DispatcherServlet,开发人员不再需要额外开发控制器对象。
3、SpringWeb可以自动绑定用户输入,并正确地转换数据类型。
4、StringWeb的使用代码清新简洁
5、StringWeb内部组件化程度高,可插拔式组件即插即用。
6、StringWeb性能卓著,特别符合现代大型、超大型互联网项目的要求。
三、搭建SpringWeb(在web项目中)
1、导包
<!--springweb层-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
2、在web.xml文件中配置统一拦截分发器 DispatcherServlet
<!--配置统一拦截分发器DispatcherServlet-->
<servlet>
<servlet-name>application</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<!-- 请求映射 -->
<servlet-mapping>
<servlet-name>application</servlet-name>
<url-pattern>/</url-pattern><!--可以让所有的请求都被DispatcherServlet拦截,然后对这些请求统一进行分发处理-->
</servlet-mapping>
3、开启 SpringWEB 注解
<!-- 开启spring的web层注解-->
<mvc:annotation-driven></mvc:annotation-driven>
4、处理器搭建
(1)@RestController注解: 标记在一个类上,标记的类就是一个 SpringWeb控制类。 Spring 配置中指定了自动扫描的 basepackage 后,Spring 会扫描这些包以及子包中的使用了@RestController 标识的类,然后将类加入到 Spring IOC 容器 中,注入依赖。
(2)@RequestMapping注解:是一个用来处理请求地址映射的注解,可用于类或方法上。
@RestController
@RequestMapping(path = "/loginCtl")// 使用web层注解,为类定义地址
public class LoginController {
@RequestMapping(path = "/login")// 使用web层注解,为方法定义地址
public String login(){
System.out.println("hello springweb");
return "success";
}
}
四、SpringWeb运行流程
用户发送一次请求到后端,先进入DispatcherServlet统一拦截,再调用HanderMapping解析请求中的处理器地址和方法地址,判断地址是否存在,不存在返回404,如果存在,判断该地址是否有对应的拦截器,如果有,进入到拦截器。之后回到DispatcherServlet,再调用HanderAdapter,最终由处理器适配器调用我们自己的处理器,如:LoginController。
五、SpringWeb组件
1、前端控制器:
(1)定义:DispatcherServlet,由框架提供,在 web.xml 中配置。
(2)作用:统一处理请求和响应,是整个流程控制的中心,由它调用其它组件处理 用户的请求。
2、处理器映射器:
(1)定义:HandlerMapping,由框架提供。
(2)作用:根据请求的 url 查找 Handler(处理器/Controller)。
3、处理器适配器:
(1)定义:HandlerAdapter,由框架提供。
(2)作用:按照特定规则(HandlerAdapter 要求的规则)去执行 Handler。
4、处理器:
(1)定义:Handler(也称之为 Controller,需要工程师开发)。
(2)注意:编写 Handler 时必须按照HandlerAdapter 的要求去做,这样处理器适配器才可以去正确执行Handler。
(3)作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。
六、接收请求
1、@RequestMapping注解
(1)作用:为处理器进行地址映射,添加在类或者方法的上方。且如果添加在类的上方,其path属性在整个项目中都不能重复。如果添加在方法的上方,其path属性在整个类中不能重复。
(2)常用属性:
- path/vale:定义地址
- method:定义请求方式,其默认值是所有请求方式
2、使用method定义请求方式
@RequestMapping(path = "/login",method = RequestMethod.POST)
@RequestMapping(value = "/login",method = RequestMethod.GET)
七、获取请求数据
1、使用 request 对象接收
// method = RequestMethod.POST - 指定允许哪些请求方式可以访问此方法
@RequestMapping(path = "/login",method = RequestMethod.POST)// 使用web层注解,为方法定义地址
public String login(HttpServletRequest request){
System.out.println(request.getParameter("name"));
System.out.println(request.getParameter("age"));
System.out.println("hello springweb");
return "success";
}
2、使用Spring中的自动封装
// method = RequestMethod.POST - 指定允许哪些请求方式可以访问此方法
@RequestMapping(path = "/login",method = RequestMethod.POST)// 使用web层注解,为方法定义地址
public String login(String name,Integer age){
System.out.println(name);
System.out.println(age);
System.out.println("hello springweb");
return "success";
}
// method = RequestMethod.POST - 指定允许哪些请求方式可以访问此方法
@RequestMapping(value = "/login",method = RequestMethod.GET)// 使用web层注解,为方法定义地址
public String login(Admin admin){
Admin admin1 = loginService.login(admin);
System.out.println(admin1);
System.out.println("hello springweb");
return "success";
}
Spring 在对数据进行封装时,必须保证处理器接收参数的形参名称和表单的name 属性保持一致,否则会接收失败!
3、使用@RequestParam("")绑定参数,用于接收请求中的数据
当请求参数名与形参名不一致时,必须使用@RequestParam注解进行参数绑定,即让@RequestParam 注解的 value 值和表单的 name 保持一致
/*@RequestParam("password") String pwd,@RequestParam(value = "account") String ac 绑定请求中的参数与方法中的形参*/
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(@RequestParam("password") String pwd,@RequestParam(value = "account") String ac){
System.out.println(pwd);
System.out.println(ac);
return "success";
}
4、使用@RequestHeader("")绑定参数,用于接收请求头中的数据
/*@RequestHeader("User-Agent") String userAgent 绑定请求头中的参数与方法中的形参*/
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(@RequestHeader("User-Agent") String userAgent){
System.out.println(userAgent);
return "success";
}
5、使用@RequestBody接收前端提交的json 格式数据并将其封装到实体类对象中
/*@RequestBody Admin admin 接收前端提交的json格式的数据并将其封装到admin对象中*/
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(@RequestBody Admin admin){
System.out.println(admin);
return "success";
}
注意:必须导入jar包让后端项目支持json格式数据
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.2</version>
</dependency>
6、使用@DateTimeFormat(pattern = "yyyy-MM-dd")为Date类型属性指定转换格式
// 指定从前端接收来的日期格式的json数据的转换
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@RequestBody Admin admin) {
Admin admin1 = loginService.login(admin);
System.out.println(admin1);
return "success";
}
八、SpringWeb的优点
对web层进行了封装,让我们可以快速搭建自己的后端处理程序
比如:LoginController
@RestController // 将此类交给spring管理
@RequestMapping(path = "/loginCtl")// 使用web层注解,为类定义映射地址
public class LoginController {
@Autowired
LoginService loginService;// 注入其他对象
// 为方法定义映射地址,设置该方法允许哪些请求进行访问
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@RequestBody Admin admin) {// 可以方便的接收请求中的参数
Admin admin1 = loginService.login(admin);
System.out.println(admin1);
return "success";// 可以直接将返回的对象转换为json字符串
}
}
九、中文乱码处理、返回Json处理、跨域访问处理
1、中文乱码处理
目标:前端数据传到后端时不会出现乱码
在web.xml中添加配置,启用SpringWeb提供的过滤器
<!--中文乱码处理-->
<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>
2、返回Json处理(将响应对象转为json数据格式)
目标:将响应对象转为json数据格式
(1)在Springweb中如果想要向前端返回的数据格式为json时,只需要在方法上添加 @ResponseBody 注解即可,而@RestController注解中包含了 @ResponseBody 注解
(2)在项目中必须导入转json组件
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
3、跨域访问处理
目标:允许异步访问(一个服务器向另一个服务器发送请求和接收响应)
(1)添加依赖
<!--spring中提供的解决跨域问题的过滤器-->
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>2.5</version>
</dependency>
(2)在web.xml文件中添加配置
<!--跨域访问处理-->
<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>
十、SpringWeb中的拦截器
1、定义
SpringWeb中的拦截器(Interceptor)类似于 Servlet 中的过滤器(Filter)
2、作用
拦截用户请求并作出相应的处理
3、拦截器与过滤器的区别
过滤器时servlet规范中定义并实现的,是在进入到servlet之前截获请求,而拦截器是spring中定义的拦截机制,是在进入到处理器之前拦截请求。
4、定义拦截器
// 定义拦截器
public class AdminTokenInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入拦截器了");
// 从请求头中获取token
String token = request.getHeader("token");
if (token.equals("123456")) {
return true;// 请求出了拦截器继续向后执行,进入处理器
} else {
response.setContentType("test/html;charset=utf-8");// 防止响应字符串乱码
// 向前端做出响应
PrintWriter writer = response.getWriter();
writer.print("token验证失败");
return false;// 请求出了拦截器不再向后执行
}
}
}
5、配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/><!--允许进入拦截器的请求地址-->
<mvc:exclude-mapping path="/loginCtl/login"/><!--不允许进入拦截器的请求地址-->
<bean id="admintoken" class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean><!--拦截器实现类地址-->
</mvc:interceptor>
</mvc:interceptors>