美文网首页
二、SpringMVC

二、SpringMVC

作者: cqzhangjian | 来源:发表于2018-01-09 08:57 被阅读0次

1.处理JSON

  • Json : 是一种数据交换格式, { key: value } JSON 对象, [ ] JSON 数组。
    因为Json这种数据格式在页面方便解析

  • xml : 是一种数据交换格式 ,xml 数据交换格式很强大,但是页面不方便解析, 需要DOM编程基础,所有往往xml用于配置文件来使用

  • JSON工具 :使用第三的JSON 工具来处理: fastjson 、 gson 、 jackson 等都是常用的一些json处理工具

  • Springmvc 处理 json : Springmvc 默认支持 jackson 工具,在处理json数据的时候,不需要显示的调用jackson工具提供的API,只需要学习两个注解方可完成 json 转换

  • @ResponseBody : 可以把java 对象转换成json格式的字符串
    @RequestBody :可以把json格式的字符串 转换成java 对象

  • 导入 jackson 的依赖

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.1.0</version>
        </dependency>

2.文件上传

文件上传 : apache 提供的 File-upload.jar 、 commons-io.jar Springmvc 框架要做文件上传,也需要以上的两个包
准备工作 :
1.导入File-upload.jar 、 commons-io.jar包
2.配置一个多部件表单处理解析器(springmvc的配置文件中配置)

<!--该组件的id 必须是 multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

3.编写文件上传的页面,注意问题的是,文件上传要 通过form 标签来完成,还要修改表单中的 enctype="multipart/form-data",还要注意提交方式一 定要为POST

  1. Controller 组件使用 MultipartFile 类型来接收文件数据

3.SpringMVC 拦截器

  • 拦截器:凡是表现层的框架(struts2 、 springmvc)都定义了属于自己规范的拦截器。只能拦截Action (Controller,Handler)动作请求。
  • 过滤器:Filter它是sun公司定义的一套规范,可以拦截所有的资源请求的。
  • 方便用于自定义拦截器,各个框架都提供了接口规范:
    Struts2 提供了(Interceptor) abstractInterceptor 抽象类,定义拦截器。
    Springmvc 提供了HandlerInterceptor 接口, 定义拦截器。

3.1 自定义拦截器

  • 自定义拦截器类
/**
 *  1.自定义了一个拦截器类
 *  2.自定义拦截器放入容器中 (告诉框架配了一个拦截器)
 *  3.定义拦截的资源
 *
 */
@Component(value="my1")
public class MyInterceptor implements HandlerInterceptor {

    //处理请求的方法,preHandle,如果返回false 表示不放行,返回true 放行 ,handler 该参数拦截的方法(HandlerMethod)
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("springmvc 拦截器拦截了...");
        if(handler instanceof HandlerMethod) {
            HandlerMethod hm = (HandlerMethod)handler;
            System.out.println(hm.getMethod().getName());
        }
        return true;
    }
    
    //在拦截方法执行完毕后,才执行,视图还没有被解析,可以获得modelandveiw
    public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle....执行了");
        System.out.println(modelAndView);
        modelAndView.setViewName("main");
    }
    //在视图解析完毕后,执行的
    public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("afterCompletion");
    }

}
  • 放入 容器
@Component(value="my1")
public class MyInterceptor implements HandlerInterceptor {
  • 配置拦截规则
    <!-- 定义拦截器拦截的规则 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 定义拦截的资源 -->
            <mvc:mapping path="/**"/>
            <!-- 定义不拦截的资源 -->
            <mvc:exclude-mapping path="/m3"/>
            <!-- 定义拦截的拦截器 -->
            <ref bean="my1"/>
        </mvc:interceptor>
    </mvc:interceptors>

4.SpringMVC 全局异常处理器

4.1 分析SpringMVC内部异常处理流程:

图片.png

4.2 编写全局异常处理器步骤

  • 编写自定义异常处理类,实现HandlerExceptionResolver

  • 告诉springmvc自定义的异常处理器:很简单只需要把自定义的异常处理器在springmvc容器中配置下

  • 编写自定义异常处理类,实现HandlerExceptionResolver

public class GlobleExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex) {
        
        String error = "";
        
        if(ex instanceof DaoException) {
            error = "数据持久化操作失败,请检查再试下";
        }else {
            error = "系统未知异常,请联系管理员";
        }
        ModelAndView modelAndView = new ModelAndView();
           //保存错误信息
        modelAndView.addObject("error", error);
        modelAndView.setViewName("error"); //指定错误页面
        
        
        return modelAndView;
    }
}

5. SSM (springmvc spring mybatis)整合

  • 配置 pom 文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.xingxue.ssm</groupId>
  <artifactId>ssm</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <dependencies>
        <!-- spring 相关的依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <!-- spring web 模块提供了启动 spring 容器的 监听器 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>

        <!-- mybatis相关的依赖 start -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.3</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!-- mybatis 整合 spring的依赖插件 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!-- mybatis相关的依赖 end -->


        <!-- spring end -->
        <!-- ======================以下是可选的依赖================================ -->
        <!-- 导入mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
        </dependency>
        <!-- servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>
        <!-- jsp-api -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.29</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <target>1.7</target>
                    <source>1.7</source>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  • 配置 web.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
                         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
                         
      <!-- 配置 spring 提供的 POST 提交方式的 中文乱码过滤器 CharacterEncodingFilter-->
     <filter>
        <filter-name>cef</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>cef</filter-name>
        <url-pattern>/*</url-pattern>
     </filter-mapping>
                         
    <!-- springmvc 的中央控制器 -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <!-- 会创建 子 容器 -->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
     
             
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <!-- 该监听器创建一个 父容器 -->
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>               
                         
</web-app>
  • 父容器的 xml 配置
<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<!--  读取外部的 properties 文件,到内存 -->
<context:property-placeholder location="classpath:jdbc.properties"/>

<context:component-scan base-package="com.xingxue" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!-- SqlSessionFactory 工厂交给容器管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="mapperLocations" value="classpath:com/xingxue/ssm/mapper/*Mapper.xml"></property>
</bean>
<!-- 配置 druid 数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="username" value="${jdbc.user}"></property>
    <property name="password" value="${jdbc.password}"></property>
    <property name="url" value="${jdbc.url}"></property>
    <property name="driverClassName" value="${jdbc.driver}"></property>
</bean>
<!-- 配置 mapper 接口的代理实现类 -->
<mybatis-spring:scan base-package="com.xingxue.ssm.mapper"/>

<!--  =============以下是配置事务管理=============== -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

  • 子容器 xml 配置
<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <mvc:default-servlet-handler />
    <context:component-scan base-package="com.xingxue" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan>
    <mvc:annotation-driven />
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

相关文章

网友评论

      本文标题:二、SpringMVC

      本文链接:https://www.haomeiwen.com/subject/zqqwnxtx.html