SpringMVC:接收请求,响应请求
1、创建web项目,web以来,tomcat插件,
2、自定义实现了servlet的Controller接口的Controller类,
3、Springmvc.xml配置文件处理器映射器,处理器适配器,controller接口实现类;
4、web.xml文件dispatcherServlet注册,springmvc文件读取;
5、启动tomcat插件,访问controller类
补充:处理器适配器和处理器映射器
处理器映射器:
非注解方式:
1、org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
2、org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
注解方式:必须配合注解才可以使用,spring3.1之前版本使用第一个之后使用第二个
1、org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
2、org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
处理器适配器:
非注解方式:第一个要求实现Controller,第二个要求实现HttpRequestHandler接口
1、org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
2、org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
注解方式:spring3.1之前版本使用第一个之后使用第二个
1、org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
2、org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
注意:非注解的方式弊端是一个类中只能有一个方法,注解不存在这个限制
常用配置:注解方式配置处理器适配器和处理器映射器
配置方式:<mvc:annotation-driven/>
注意:要求自定义类使用@Controller标注,处理方法使用@RequestMapping标注
SpringWeb项目基本依赖:
<!--Spring容器依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.8</version>
</dependency>
<!--SpringWeb依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency>
<!--Servlet依赖:web项目必须依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
Tomcat插件依赖
如果插件下载不下来,就先使用dependency依赖进来,然后就可以了;
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
SpringMVC中的DispatcherServlet.properties配置文件中配置了九大组件默认的实现类,如果我们不指定就使用默认的组件,如默认的处理器映射器,处理器适配器,试图解析器等;
SpringMC
DispatcherServlet中
init方法:初始化IOC容器
初始化SpringMVC的九大组件:处理器映射器,处理器适配器,视图解析器,视图名称翻译器,全局异常处理器,参数传递管理器,文件上传处理器,主题处理器,当前环境处理器;
SpringMVC请求的响应:
1、通过String返回到指定jsp页面:要以/开头,
2、如果没有返回数据方法使用void并且并且方法上使用@ReponseBody注解标识
3、重定向,使用要使用redirect:其他controller路径,来进行路径的跳转
4、如果想提高效率,可以直接返回ModelAndView,这样可以提高一些效率;
5、使用原生的response返回数据,在方法的形参中直接传入HttpServletRequest和HttpServletResponse,然后通过Response返回数据即可
SpringMVC接收请求数据
1、基本数据类型接收,在形参中直接接收,参数名称要一致;
2、可以使用@RequestParam,指定形参参数是否必传,参数名称转换,默认参数值等
3、当多个同名参数传递时,形参中使用数据接收;
4、形参中不可以使用集合直接接收数据;
5、形参过多时,可以使用自定义对象承接数据;属性名称要和web名称要一一对应;这时候不能使用@RequestParam
6、自定义类中可以使用数据接收web端传递的数据;
7、也可以使用HttpServletRequest中直接获取参数
SpringMVC返回请求数据:
1、通过ModelAndView的中通过setObject(key,value)返回数据
2、通过Map<String,Object>返回数据,Map要在controller形参中传入才可以使用
3、通过Model返回数据,Model要在方法的形参中传入;
4、通过ModelMap返回数据,要在形参中传入ModelMap
5、参数的中中文乱码问题,通过CharacterEncodingFilter来设置编码,避免中午中文乱码问题;
SpringMVC中JSON数据
1、返回json数据:
controller方法返回JSON数据:在方法上加上@ResponseBody,然后返回的Java对象类就会被SpringMVC框架转成json字符串发给前端;
注意:前提是要引入json依赖,springmvc中默认使用的是jackson
2、接收json数据:post提交的数据是json格式数据,controller方法中形参上必须用@RequestBody注解标识要接收的参数;
注意:提交数据方式必须是post方式提交:且提交数据必须是json格式;
注意:put提交数据方式数据格式是而且只能是key=value&key=value的格式,post方式默认的数据格式也是key=value格式,但是post可以指定数据格式为json,并且后端接收方法的形参上必须使用@ResponseBody来标注转换
Restful风格使用
1、什么是Restful:
不是技术,是一个规范,就如同Http请求规定了数据提交的方式有get、post、put、delete等;Restful风格是指方法的Controller接口的url路径名称是一样的,但是路径的访问方式是不一样的;另外,Restful风格的方法提交数据可以直接在url上拼接,当然也可以使用常规方式提交;返回的数据都是json格式数据,所以要在方法上加@ResponseBody
注意:因为所有方法都需要加@ResponseBody,所以可以把它加在controller类上;@RestController就是@Controller+@RespnoseBody的组合,就是Restful风格的
2、Restful风格使用:
添加用户id为1的接口:post方式提交:http://localhost:8080/user/1
获取用户id为1的接口:get方式提交:http://localhost:8080/user/1
修改用户id为1的接口:put方式提交:http://localhost:8080/user/1
删除用户id为1的接口:delete方式提交:http://localhost:8080/user/1
controller方法定义:
@GetMapping("/user/{userId}")
public User get(@PathVariable String userId){
return new User();
}
注意:传递的参数在url上直接拼接;接收数据需要在方法形参前通过@PathVariable表示是url中的哪个参数
SpringMVC-拦截器
1、拦截器使用:
自定义类实现HandlerIntercepter接口,并重写preHandler,postHandler或afterHandle接口;然后注册拦截器;
xml注册拦截器的方式:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**">
<bean class="java.xx.aa.MyInterceptor">
</mvc:interceptors>
</mvc:interceptors>
2、拦截器方法:
preHandler方法:在controller方法前执行
postHandler方法:在controller方法后,在ModelAndView返回前执行;这个方法里主要是可以对ModelAndView返回的数据进行统一的修改;
afterHandler方法:在参数ModelAndView返回后执行,这里只能做一些资源回收的工作了;
注意:在postHandler方法的形参中有ModelAndView,所以可以直接对其内容进行修改;还有,我们返回的所有数据无论是json还是其他数据都是通过ModelAndView对象返回的;只不过如果有试图解析器的话,试图解析器会把数据从ModelAndView中获取出来,渲染jsp等视图;如果没有试图解析器则直接返回ModelAndView中的数据?