一、SpringWeb概述
以前的ssm spring strust2 mybatis
ssh spring strust2 hibernate
现在 ssm spring springweb mybatis
springweb 是spring框架中,对java后端web层进行了封装,和spring框架可以无缝对接,是基于servlet API的实现。
SpringWeb特点
- SpringWEB 是 spring 家族原生产品,与 IOC 容器等基础设施无缝对接.
- 基于原生的 Servlet,提供了一个前端控制器 DispatcherServlet ,开发者无须额外开发控制器对象.
- 可以自动绑定用户输入,并正确地转换数据类型.
- 代码清新简洁,大幅度提升开发效率.
- 内部组件化程度高,可插拔式组件即插即用.
- 性能卓著,尤其适合现代大型、超大型互联网项目要求.
SpringWeb运行流程
前端控制器:DispatcherServlet(不需要程序员开发),由框架提供,在
web.xml 中配置。
**作用:**统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理
用户的请求.
处理器映射器:HandlerMapping(不需要程序员开发),由框架提供。
作用:根据请求的 url 查找 Handler(处理器/Controller)
**处理器适配器:**HandlerAdapter(不需要程序员开发),由框架提供。
作用:按照特定规则(HandlerAdapter 要求的规则)去执行 Handler。
**处理器:**Handler(也称之为 Controller,需要工程师开发)。
注意:编写 Handler 时按照 HandlerAdapter 的要求去做,这样适配器才可
以去正确执行 Handler。
作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。
得死派克servlet 接收所有前端发送请求
二、SpringWeb搭建
1.导入 jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
2.配置 DispatcherServlet
<!--配置spring核心请求 分发servlet 由他接收所有请求,进行分配调度-->
<servlet>
<servlet-name>spring</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>spring</servlet-name>
<url-pattern>/</url-pattern><!--表示任何请求都可以进入到DispatcherServlet-->
</servlet-mapping>
3.开启 springMVC注解
spring.xml
<mvc:annotation-driven></mvc:annotation-driven>
4.处理器类搭建
@RestController用于标记在一个类上,使用它标记的类就是一个 SpringWEB控制器类。
spirng中配置了指定扫描的 basepackage后,spring会自动扫描 这些包以及子包中使用了@RestController标识的类, 然后将类加到spring IOC容器中,注入依赖。
@RequestMapping 注解是一个用来处理请求地址映射的注解,可用于类或方法上。
@RestController
@RequestMapping(path = "/loginCtl")
public class LoginControler {
三、接收请求
1.@RequestMapping
@RestController 用来标注web层的类,它的作用就是与请求相匹配,如果匹配上了,所修饰的方法才会被执行.
@RequestMapping(path = “/loginCtl”) 可以使用在类上,也可以使用在方法上 不能重复,请求的路径为 “http://localhost:8080/ssm/loginCtl, 请求方式没有限制,即可以是GET也可以是 POST,还能是其它的几个。
@RequestMapping 使用value path定义映射地址
@RequestMapping(path = “/loginCtl”,method = RequestMethod.POST)
method 指定访问此方法的请求方式
@PostMapping @GetMapping,指定请求方式为get或者post
2.获取请求数据
2.1spring 自动封装
框架会自动把请求参数名为account和password的值封装到方法参数account和password中去
/*
自动封装, 要求形参的名字与请求中类型的名字一致, 请求数据类型与形参类型相匹配
*/
@GetMapping(path = "/login")
public String login(String account,String pssword){
System.out.println("account");
return "success";
}
2.2.使用 request 对象接收
在处理中如果需要使用到 HttpServletRequest 对象只需要定义即可
@GetMapping(path = "/login")
public String login(HttpServletRequest request, HttpSession httpSession) {
System.out.println(request.getParameter("account"));
//使用request和httpSession中的方法获得请求的参数
}
2.3@RequestParam参数绑定
使用@RequestParam(“”)进行参数绑定,@RequestHeader(“”)
@PostMapping(path = "/login2")
public String login2(@RequestParam("acc") String account){
System.out.println(122);
return "success2";
}
@RequestParam 注解还有两个属性:
- required:参数是否必须。代表页面是否必须传递该参数。如果该值为
true,但没有传递参数,会报错。
- defaultValue:默认值。代表如果页面没有传递该参数,使用 defaultValue
的值代替。
@PostMapping(path = "/login2")
public String login2(
@RequestParam(value = "acc",required = true,defaultValue = "tom")
String account){
System.out.println(122);
return "success2";
}
2.4使用实体对象类接收
@RequestBody如果前端传递内容为 json 格式 使用@RequestBody 将 Json 字符串转换为后端 Java 对象, 导入关于json的jar包
@PostMapping(path = "/login")
public String login(@RequestBody Admin admin){
System.out.println(1);
System.out.println(admin.getAccount());
System.out.println(admin.getPassword());
Admin a=new Admin();
CommonResult commonResult=new CommonResult(200,a,"登陆成功");
return "success";
}
HandlerAdapter 会将这个对象的实例创建出来,然后从请求参数中取出这些参数然后放到实体对象中(数据封装)
注意:请求参数的名称要和实体类的属性名相同,且实体类中最好要添加属性的get和set方法
四、拦截器
SpringWeb中的拦截器,类似Servlet中的过滤器,拦截用户请求并做出响应处理
Spring 中的拦截器与过滤器有着本质的区别,过滤器是 servlet 规范中定义并实现的,在进入到 servlet 之前截获请求.而拦截器是 spring 中定义的一种拦截机制, 是对进入到处理器的请求进行拦截。
1.定义拦截器
SpringWeb中定义了拦截器接口,HandlerInterceptor,该接口中定义了三个方法,这三个方法的调用时在 SpringMVC 框架内部完成的, 调用这个三个方法的时候,其参数的值也是从框架内部传递进来的。
public class DemoInterceptor implements HandlerInterceptor {
/*
当请求到达处理器之前 进行拦截处理
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("我是 拦截器");
// true 离开拦截器 继续向后执行
// false 不想后执行
return false;
}
}
2.注册拦截器
<!--拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--哪些请求进入拦截器-->
<mvc:mapping path="/**"/>
<!--哪些请求不进入拦截器-->
<mvc:exclude-mapping path="/loginCtl/login"/>
<mvc:exclude-mapping path="/loginCtl/login1"/>
<!--拦截器地址-->
<bean class="com.ffyc.ssm.util.DemoInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!--拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--哪些请求进入拦截器-->
<mvc:mapping path="/**"/>
<!--哪些请求不进入拦截器-->
<mvc:exclude-mapping path="/loginCtl/login"/>
<mvc:exclude-mapping path="/loginCtl/login1"/>
<!--拦截器地址-->
<bean class="com.ffyc.ssm.util.DemoInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>