Java Study!! - SpringMVC
type: channel
link: https://www.kaijavademo.top/category/SpringMVC/
description: 微服务核心，表述层核心技术，JAVAEE核心
items: SpringMVC笔记：报文信息转换|拦截器|异常处理器|全注解配置MVC
items: SpringMVC笔记：域对象共享数据|架构风格RESTFul
items: SpringMVC笔记：框架搭建|请求映射注解|获取请求参数注解

SpringMVC笔记：报文信息转换|拦截器|异常处理器|全注解配置MVC
type: item
date: 2023-08-17T16:58:00+00:00
description: springMVC笔记包括报文信息转换器，拦截器源码分析，异常处理器，通过注解配置springMVC代替web.xml和springMVC.xmlHttpMessageConverter报文信息转换器，报文包含有两个方面，请求报文和响应报文。请求报文就是从浏览器发送到服务器，属于request对象，把请求报文转换成java中的一个对象。响应报文是由服务器响应给浏览器的 ，服务器中使用java语言，将java对象转换成响应报文。@RequestBodyRequestEntity@ResponseBody(☆)ResponseEntity@RequestBody在控制器方法中设置形参，并用@RequestBody进行标识，形参所表示的就是当前请求的请求体 //在控制器中处理该请求 @RequestMapping("/testRequestBody") //@RequestBody表示当前的请求参数 public String testRequestBody(@RequestBody String requestBody) throws UnsupportedEncodingException { System.out.println("requestBody : " + URLDecoder.decode(requestBody,"UTF-8")); return "success"; } RequestEntity将所有的浏览器请求信息封装成一个对象，在形参中可以添加，获取请求信息。 @RequestMapping("/testRequestEntity") public String testRequestEntity(RequestEntity<String> requestEntity){ //当前requestEntity表示整个请求报文的信息 System.out.println("获取请求头信息:" + requestEntity.getHeaders()); System.out.println("获取请求体信息:" + requestEntity.getBody()); return "success"; }要想对浏览器进行响应，可以实现一个页面跳转，然后响应浏览器一个完整的页面(转发或重定向)；或者是使用HttpServletResponse中的 response.getWriter().print("); 。回顾原生方法 @RequestMapping("/testResponse") public void testResponse(HttpServletResponse response) throws IOException { /*不需要返回值，不需要返回视图名称实现页面跳转，要么return null 要么设置为void 将print直接作为响应报文的响应体响应到浏览器 响应体是什么我们在浏览器中看到的就是什么 */ response.getWriter().print("hello,response"); }@ResponseBody(☆)在springMVC中实现响应浏览器的功能,为我们提供了一个注解@ResponseBody @RequestMapping("/testResponseBody") @ResponseBody /*@RequestBody用来标识当前的控制器方法，添加注解之后， 返回值不再是视图名称了，而是当前响应的响应体*/ public String testResponseBody(){ return "success"; } 通过注解明显发现比原生API要简单一些。现在我需要响应回去一个对象，而不是一个字符串或文本之类的，就需要使用到JSON，那么就需要导入jackson的依赖pom.xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.1</version> </dependency> json有两种格式，一种叫对象，一种叫数组。最外层是大括号就是json对象，如果最外层是[]是json数组。要想实现自动将 [label color="red"]java对象转换为json[/label] ，需要以下步骤：导入jackson的依赖springMVC.xml中开启mvc注解驱动 <mvc:annotation-driven/>处理器方法上添加@ResponseBody标识将java对象直接作为控制器方法返回值返回，就会自动转换为json格式的字符串 [label color="red"]不是…

SpringMVC笔记：域对象共享数据|架构风格RESTFul
type: item
date: 2023-08-15T19:16:00+00:00
description: springMVC中间阶段学习笔记，包括域对象中共享数据，通过RESTFul实现不同的增删改查，还要过滤器源码解析域对象共享数据之前笔记中有提及会话处理请求的时候，设置编码SpringMVC为我们提供了编码过滤器，注册在web.xml里面就行。获取请求参数，能够获取请求参数，下一步就是将请求参数作为条件，调用Service层处理业务逻辑，Service调用Dao访问数据库。将最终的结果返回给Service最后到控制层。如果我们有数据往页面中去发送的，需要将数据在域对象中进行共享。域对象：Request一次请求,Serssion一次会话(浏览器开启到浏览器关闭),ServletContext(Application服务器开启到服务器关闭)。[note type="primary flat"]session中的数据和服务器是否关闭没有关系，只和浏览器是否关闭有关系。因为session中有钝化和活化。钝化指的是服务器关闭了，但是浏览器没有关闭，表名会话仍然在继续，我们存储在session中的数据就会序列化,序列化到磁盘上。如果浏览器仍然没有关闭，但是服务器又重新开启了，会将我们钝化之后文件中的内容，重新读取到Session中，这就是活化。所以说session中的数据只和浏览器是否关闭有关系。ServletContext只和服务器的关闭有关系，表示上下文对象，只在我们服务器启动时创建，在服务器关闭时候销毁，从头到尾之创建一次，这就是为什么能在域对象中共享数据，就是因为使用的对象都是同一个，所以说才能在同一个对象中获取数据。[/note]选择域对象应该选择能实现功能的，范围最小的域对象。Session经常用来保存用户的登陆状态，登录之后只要浏览器不关闭，在当前的会话就一直是登陆成功， [label color="red"]除非超过30分钟没有访问session中的数据，那session会自动失效(默认最大时效)[/label] 。原生的Servlet里面往域对象中共享数据，我们需要有request,session,servletcontext才能向对应域中共享数据。原生Servlet向request域对象共享数据ScopeController类/*Scope域属性*/ @Controller//要想让SpringMVC找到我们的控制器，那么我们的控制器必须是IoC容器中的组件 public class ScopeController { @RequestMapping("/testRequestByServletAPI") public String testRequestByServletAPI(HttpServletRequest request){ /* 测试当前的域对象， 通过原生ServletAPI往request域对象创建共享数据setAttribute("键","值"); getAttribute("");获取共享数据 removeAttribute("")删除共享数据 转发到success.html,在success.html中可以获取域对象的数据 */ request.setAttribute("testRequestScope","hello,servletAPI"); //属于转发，WEB-INF下面的资源重定向访问不了，只能使用转发访问success.html return "success"; } } success.html Title success 上面使用原生方式过于过时，在springMVC中提供了其他许多的方式。ModelAndView向request域对象获取数据Model模型指的是往域对象中共享数据的功能View视图指的是我们最终所设置的视图名称，经过视图解析器解析，跳转到我们指定页面的过程。 [label color="red"]需要注意的是，使用ModelAndView，书写方法的时候，返回值传递的是一个封装的ModelAndView对象。[/label] @RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ /*方法的返回值必须是ModelAndView 因为ModelAndView是两个功能，模型功能和视图，作为方法的返回值， 返回给DispatcherServlet，DispatcherServlet才能去解析他。 两个功能： model 往请求域中共享功能 view 视图功能 */ ModelAndView mav = new ModelAndView(); //处理模型数据，即向请求域request中共享数据 mav.addObject("testRequestScope","Hel…

SpringMVC笔记：框架搭建|请求映射注解|获取请求参数注解
type: item
date: 2023-08-08T09:14:00+00:00
description: 基于SpingMVC的学习笔记，包括框架的基本搭建，请求于请求映射，还有请求参数的注解，以及通过过滤器解决了乱码问题。2023/11/29 更新@RequestParam解释配置web.xml手动创建maven工程的操作在基于SpringMVC手动添加web工程中添加之后我们需要配置SpringMVC的web.xml有关servlet配置可以查看让请求对应类的配置如果使用JDK17+Tomcat8要注意导入mvc为5.3.17(之前我使用5.3.1报错，我在这里找了好久问题，还换了一个模块重写。。) <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.17</version> </dependency>采用默认的配置方式需要放在WEBINF下，位置默认，名称默认，这样不好，学完maven工程应该统一将文件放在resources文件下.web.xml<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--<servlet>里面<servlet-name>和<servlet-mapping>里面的<servlet-name>保持一致--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>扩展配置方式对web.xml进行扩展配置<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--<servlet>里面<servlet-name>和<servlet-mapping>里面的<servlet-name>保持一致--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--添加<init-param>标签，初始化参数，伴随当前servlet的初始化来初始化的--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springMVC.xml</param-value> </init-param> <!--servlet第一次访问会初始化,初始化中会执行很多内容，都放在第一次访问.会严重影响第一次访问的速度, 添加标签<load-on-startup>将SpringMVC的前端控制器DispatcherServlet初始化时间提前到服务器启动时 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> …