ssm框架复习巩固

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";
    }

今日学习感受:其实学习有时候是有一定套路的,有一套固定的学习套路,当然需要你学习一段时间后会慢慢发现其中的规律。写博客是让自己对当日学习的东西做一总结,并且对当日学的中学到的东西可以温习一遍并且可以巩固,对在学习中遇到的一些问题,可以自己先去尝试着去解决,这样可以加深自己的印象,促进自己的学习效率。最后一句话:学习是人类发展进程中最有力的技能!

上一篇:java项目-第71期基于ssm的化妆品商城系统


下一篇:LeetCode 31 下一个排列