SSM框架复习第九天:SpringMVC类型转换服务 异常处理 拦截器 restfu编程l风格
1.类型转换服务
例如:前端传过来的日期格式是2021-12-30,正常是帮你转换不了的,需要你自己去写一个日期格式转换器才可以,它只可以帮你去转换2021/12/30这种格式,因为SpringMVC里面内置了很多类型转换器
1.1实现步骤
第一步:导入依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <!--jackon相关的依赖--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency>
2.web.xml配置文件
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--配置Springmvc DispatcherServlet(Springmvc核心前端控制器)--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--是让spring的前端控制器在创建的时候就加载springmvc.xml配置文件创建各种controller对象--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <!--可以让Servlet的服务器启动的时候创建--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--配置解决中文乱码的过滤器 POST请求乱码--> <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> </web-app>
3.在SpringMV配置文件中配置相关组件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置包扫描 创建所有得Controller对象 --> <context:component-scan base-package="com.bianyiit.web"></context:component-scan> <!--配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--指定逻辑视图 到 物理视图转换的前缀 --> <property name="prefix" value="/WEB-INF/views/"></property> <!--指定逻辑视图 到 物理视图转换的后缀 --> <property name="suffix" value=".jsp"></property> </bean> <!--指定springmvc不拦截js目录的资源--> <mvc:resources mapping="/js/**" location="/js/"></mvc:resources> <!--要配置类型转换服务--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.bianyiit.resolver.String2DateConverter"></bean> </set> </property> </bean> <!--自动的加载SpringMVC另外两个组件 处理器映射器 处理器适配器 --> <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> </beans>
4.写一个字符串换行指定日期格式的转换类,需要实现Converter接口
public class String2DateConverter implements Converter<String,Date> { @Override /** * 方法参数 需要被转换的源数据 2021-12-30 * 方法返回值 转换之后的对象 */ public Date convert(String source) { System.out.println(source); Date date = null; try { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); date = dateFormat.parse(source); } catch (ParseException e) { e.printStackTrace(); } return date; } }
2.异常处理
在日常开发中难免会出现一些困难出现的异常情况,这时需要我们对这些可能出现的异常情况做一些相关处理,可以提升用户的体验。
2.1.实现步骤
1.导入依赖(同上)
2.在web.xml中配置相关信息(同上)
3.在springMVC配置文件中配置相关组件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置包扫描 创建所有得Controller对象 --> <context:component-scan base-package="com.bianyiit.web"></context:component-scan> <!--配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--指定逻辑视图 到 物理视图转换的前缀 --> <property name="prefix" value="/WEB-INF/views/"></property> <!--指定逻辑视图 到 物理视图转换的后缀 --> <property name="suffix" value=".jsp"></property> </bean> <!--注册异常处理组件--> <bean class="com.bianyiit.resolver.CustomExceptionResolver"></bean> <!--指定springmvc不拦截js目录的资源--> <mvc:resources mapping="/js/**" location="/js/"></mvc:resources> <!--自动的加载SpringMVC另外两个组件 处理器映射器 处理器适配器 --> <mvc:annotation-driven></mvc:annotation-driven> </beans>
4.定义相关异常类实现HandlerExceptionResolver接口
/** * 异常处理组件 */ public class CustomExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView modelAndView = new ModelAndView(); //日志记录 modelAndView.addObject("msg",ex.getMessage()); modelAndView.setViewName("error"); return modelAndView; } }
3.拦截器(Intecepter)
springMVC中有一个根JavaWeb中过滤器很相似的东西就是拦截器。
拦截器:拦截器是springMVC提供的一套类似于过滤器的机制 拦截器是SpringMVC框架提供的和Servlet规范没有关系 拦截器只能在SpringMVC的环境下运行 拦截器只能拦截SpringMVC的Controller(控制器)方法的请求html css js servlet 过滤器(Filter) Servlet规范的一部分 · 拦截器所有请求 html css js servlet 只要是web项目,都可以使用3.1.实现步骤
1.导入依赖(同上)
2.web.xml配置(同上)
3.SpringMVC配置文件配置相关组件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置包扫描 创建所有得Controller对象 --> <context:component-scan base-package="com.bianyiit.web"></context:component-scan> <!--配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--指定逻辑视图 到 物理视图转换的前缀 --> <property name="prefix" value="/WEB-INF/views/"></property> <!--指定逻辑视图 到 物理视图转换的后缀 --> <property name="suffix" value=".jsp"></property> </bean> <!--springmvc拦截器配置--> <mvc:interceptors> <!--拦截器谁先配置谁先执行--> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.bianyiit.intecepter.CustomIntecepter2"></bean> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.bianyiit.intecepter.CustomIntecepter1"></bean> </mvc:interceptor> </mvc:interceptors> <!--指定springmvc不拦截js目录的资源--> <mvc:resources mapping="/js/**" location="/js/"></mvc:resources> <!--自动的加载SpringMVC另外两个组件 处理器映射器 处理器适配器 --> <mvc:annotation-driven></mvc:annotation-driven> </beans>
4.定义拦截器相关的类
public class CustomIntecepter1 implements HandlerInterceptor { /** * 请求到达目标资源之前先执行 * @param request * @param response * @param handler * @return * @throws Exception */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("CustomIntecepter1 preHandle...."); // request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request,response); // response.sendRedirect("/WEB-INF/views/error.jsp"); /* 如果返回true放行请求 如果返回false 拦截请求(不放行请求) */ return false; } /** * 目标资源执行完毕之后执行 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { System.out.println("CustomIntecepter1 postHandle ....."); // modelAndView.setViewName("error"); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { System.out.println("CustomIntecepter1 afterCompletion........"); } }
4.restful编程风格
restful风格可以URL唯一确定服务器中的一个资源
http请求的方式有七种
但是常用的有四种:get post put delete
这四种请求方式分别对应一个操作:
get:查询数据操作
post:添加数据操作
put:修改数据操作
delete:删除数据操作
///user/id是多少,例如:1,2,3... @RequestMapping("/user/{id}") public String helloWorld4(@PathVariable("id") String id){ System.out.println("查询第:" + id + "个用户"); return "hello"; }
今日学习感受:其实学习有时候是有一定套路的,有一套固定的学习套路,当然需要你学习一段时间后会慢慢发现其中的规律。写博客是让自己对当日学习的东西做一总结,并且对当日学的中学到的东西可以温习一遍并且可以巩固,对在学习中遇到的一些问题,可以自己先去尝试着去解决,这样可以加深自己的印象,促进自己的学习效率。最后一句话:学习是人类发展进程中最有力的技能!