2021-08-22 springMVC拦截器,文件上传,SSM框架集成与测试,RestFul风格

springMVC-拦截器

  1. 基本概念
    拦截用户的请求并 进行相应的处理。
  2. 拦截器配置
    拦截器xml配置:
<!-- 拦截器配置:方式一 -->
<mvc:interceptors>
    <!--
        使用bean定义一个Interceptor
        直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求
    -->
    <bean class="com.yjxxt.springmvc.interceptor.MyInterceptor01"/>
</mvc:interceptors>
<!-- 拦截器配置:方式二 (推荐使用) -->
<mvc:interceptors>
	<!--
	定义在 mvc:interceptor 下面,可以自定义需要拦截的请求如果有多个拦截器满足拦截处理的要求,则依据配置的先后顺序来执行
	-->
	<mvc:interceptor>
		<!-- 通过 mvc:mapping 配置需要拦截的资源。支持通配符。可配置多个。 -->
		<mvc:mapping path="/**"/> <!-- "/**"表示拦截所有的请求。 -->
		<!-- 通过 mvc:mapping 配置不需要被拦截的资源。支持通配符。可配置多个。 -->
		<mvc:exclude-mapping path="/url/*"/> <!-- "/url/*"表示放行url路径下的请求。-->
		<bean class="com.yjxxt.springmvc.interceptor.MyInterceptor01"/>
	</mvc:interceptor>
</mvc:interceptors>
	 多个拦截器实现
	 SpringMVC 框架支持多个拦截器配置,从而构成拦截器链,对客户端请求进行多次拦截操作。
<mvc:interceptors>
	<!--
	拦截器链(多个拦截器)
	如果有多个拦截器满足拦截处理的要求,则依据配置的先后顺序来执行
	先配置的拦截器的 preHandle 方法先执行
	先配置的拦截器的 postHandle、afterCompletion 方法后执行
	-->
	<mvc:interceptor>
		<!-- 拦截所有请求 -->
		<mvc:mapping path="/**" />
		<bean class="拦截器1路径" />
		</mvc:interceptor>
	<mvc:interceptor>
		<!-- 拦截所有请求 -->
		<mvc:mapping path="/**" />
		<bean class="拦截器2路径" />
		</mvc:interceptor>
</mvc:interceptors>
  1. 拦截器的定义方式有两种
    实现接口:org.springframework.web.servlet.HandlerInterceptor
    ```java
    public class Interceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    return false;
    }

         @Override
         public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
             
         }
     
         @Override
         public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
             
         }
     }
     
     ```
    

    继承适配器:org.springframework.web.servlet.handler.HandlerInterceptorAdapte

     ```java
     public class Interceptor extends HandlerInterceptorAdapter {
         @Override
         public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
             return super.preHandle(request, response, handler);
         }
     
         @Override
         public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
             super.postHandle(request, response, handler, modelAndView);
         }
     
         @Override
         public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
             super.afterCompletion(request, response, handler, ex);
         }
     }
     
     ```
    

springMVC文件上传

  1. 环境配置
    pom.xml配置文件添加依赖坐标
    <!-- 添加 commons-fileupload 依赖 -->
    <dependency>
    	<groupId>commons-fileupload</groupId>
    	<artifactId>commons-fileupload</artifactId>
    	<version>1.3.2</version>
    </dependency>
    
    springmvc.xml修改
<!-- 文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<!-- 允许文件上传的最大尺寸 -->
	<property name="maxUploadSize">
	<value>104857600</value>
	</property>
	<!--
	设置文件放入临时文件夹的最大大小限制。
	此值是阈值,低于此值,则保存在内存中,如高于此值,则生成硬盘上的临时文件。
	-->
	<property name="maxInMemorySize">
	<value>4096</value>
	</property>
</bean>

全局异常

全局异常概念
在 JavaEE
项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。
SpringMVC 对于异常处理这块提供了支持,通过 SpringMVC
提供的全局异常处理机制,能够将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。

全局异常实现方式 Spring MVC 处理异常有 3 种方式:

  1. 使用 Spring MVC 提供的简单异常处理器 SimpleMappingExceptionResolver

  2. 实现 Spring 的异常处理接口 HandlerExceptionResolver 自定义自己的异常处理器

  3. 使用 @ExceptionHandler 注解实现异常处理
    1、配置简单异常处理器
    配置 SimpleMappingExceptionResolver 对象
    html <!-- 配置全局异常统一处理的 Bean (简单异常处理器) --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 页面在转发时出现异常,设置默认的错误页面 (error代表的是一个视图) --> <property name="defaultErrorView" value="error"></property> <!-- 异常发生时,设置异常的变量名 --> <property name="exceptionAttribute" value="ex"></property> </bean>
    可以在处理异常的页面获取异常信息
    html ${ex}
    2、使用自定义异常

    3、 设置自定义异常与页面的映射

<!-- 设置自定义异常与页面的映射 -->
<property name="exceptionMappings">
	<props>
		<!-- key:自定义异常对象的路径; 标签中设置具体的处理页面的视图名-->
		<prop key="com.xxxx.ssm.exception.BusinessException">buss_error</prop>
		<prop key="com.xxxx.ssm.exception.ParamsException">params_error</prop>
	</props>
</property>

RestFul风格

URL 映射地址配置

  1. Get 请求配置

    /**
    * restful --> get 请求,执行查询操作
    * @param id
    * @return
    */
    @GetMapping("account/{id}")
    @ResponseBody
    public Account queryAccountById(@PathVariable Integer id){
    	return accountService.selectById(id);
    }
    
  2. Delete 请求配置

    /* restful-->delete 请求 执行删除操作
    * @param id
    * @return
    */
    @DeleteMapping("account/{id}")
    @ResponseBody
    public Map<String,Object> deleteAccount(@PathVariable Integer id){
    	int result = accountService.delAccount(id);
    	Map<String,Object> map=new HashMap<String,Object>();
    	if(result == 1 ){
    		map.put("msg","success");
    		map.put("code",200);
    	} else {
    		map.put("msg","error");
    		map.put("code",500);
    	}
    	return map;
    }
    
  3. Post 请求配置

    /* restful --> post 请求,执行添加操作
    * @return
    */
    @PostMapping("account")
    @ResponseBody
    public Map<String,Object> saveAccount(@RequestBody Account account){
    	int result = accountService.saveAccount(account);
    	Map<String,Object> map=new HashMap<String,Object>();
    	if(result == 1 ){
    		map.put("msg","success");
    		map.put("code",200);
    	} else {
    		map.put("msg","error");
    		map.put("code",500);
    	}
    	return map;
    }
    
  4. Put 请求配置

    /* restful-->put 请求执行更新操作
    * @param id
    * @param account
    * @return
    */
    @PutMapping("account")
    @ResponseBody
    public Map<String,Object> updateAccount(@RequestBody Account account){
    	int result = accountService.updateAccount(account);
    	Map<String,Object> map=new HashMap<String,Object>();
    	if(result == 1 ){
    		map.put("msg","success");
    		map.put("code",200);
    	} else {
    		map.put("msg","error");
    		map.put("code",500);
    	}
    	return map;
    }
    
    

SSM框架整合

​1. 环境配置
IDEA 下创建项目
创建Maven对应的Web项目
配置 pom.xml

<dependencies>
	<!-- junit 测试 -->
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
	<scope>test</scope>
	</dependency>
	<!-- spring 核心jar -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>5.2.4.RELEASE</version>
	</dependency>
	<!-- spring 测试jar -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-test</artifactId>
		<version>5.2.4.RELEASE</version>
	</dependency>
	<!-- spring jdbc -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jdbc</artifactId>
		<version>5.2.4.RELEASE</version>
	</dependency>
	<!-- spring事务 -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-tx</artifactId>
		<version>5.2.4.RELEASE</version>
	</dependency>
	<!-- aspectj切面编程的jar -->
	<dependency>
		<groupId>org.aspectj</groupId>
		<artifactId>aspectjweaver</artifactId>
		<version>1.9.5</version>
	</dependency>
	<!-- c3p0 连接池 -->
	<dependency>
		<groupId>com.mchange</groupId>
		<artifactId>c3p0</artifactId>
		<version>0.9.5.2</version>
	</dependency>
	<!-- mybatis -->
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.5.3</version>
	</dependency>
	<!-- 添加mybatis与Spring整合的核心包 -->
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis-spring</artifactId>
		<version>2.0.3</version>
	</dependency>
	<!-- mysql 驱动包 -->
		<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>8.0.19</version>
	</dependency>
	<!-- 日志打印相关的jar -->
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
		<version>1.7.2</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-api</artifactId>
		<version>1.7.2</version>
	</dependency>
	<!-- 分页插件 -->
	<dependency>
		<groupId>com.github.pagehelper</groupId>
		<artifactId>pagehelper</artifactId>
		<version>5.1.10</version>
	</dependency>
	<!-- spring web -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>5.2.4.RELEASE</version>
	</dependency>
	<!-- spring mvc -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>5.2.4.RELEASE</version>
	</dependency>
	<!-- web servlet -->
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>javax.servlet-api</artifactId>
		<version>3.0.1</version>
	<scope>provided</scope>
	</dependency>
	<!-- 添加json 依赖jar包(注意版本问题) -->
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-core</artifactId>
		<version>2.10.0</version>
	</dependency>
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
		<version>2.10.0</version>
	</dependency>
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-annotations</artifactId>
		<version>2.10.0</version>
	</dependency>
	<!-- commons-fileupload -->
	<dependency>
		<groupId>commons-fileupload</groupId>
		<artifactId>commons-fileupload</artifactId>
		<version>1.3.2</version>
	</dependency>
</dependencies>

设置资源目录和插件

<build>
	<finalName>ssm</finalName>
	<!--
	Maven 项目:如果源代码(src/main/java)存在xml、properties、tld 等文件
	Maven 默认不会自动编译该文件到输出目录,如果要编译源代码中xml properties tld 等文件
	需要显式配置 resources 标签
	-->
	<resources>
		<resource>
			<directory>src/main/resources</directory>
		</resource>
		<resource>
			<directory>src/main/java</directory>
			<includes>
				<include>**/*.xml</include>
				<include>**/*.properties</include>
				<include>**/*.tld</include>
			</includes>
			<filtering>false</filtering>
		</resource>
	</resources>
	<plugins>
		<!-- 编译环境插件 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>2.3.2</version>
			<configuration>
				<source>11</source>
				<target>11</target>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
	</plugins>
</build>

配置 web.xml

<?xml version="1.0" encoding="UTF-8"?>
	<web-app id="WebApp_ID" 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容器-->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:spring.xml</param-value>
</context-param>
<!-- 设置监听器 -->
<listener>
	<listenerclass>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 编码过滤 utf-8 -->
<filter>
	<description>char encoding filter</description>
	<filter-name>encodingFilter</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>encodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- servlet请求分发器 -->
<servlet>
	<servlet-name>springMvc</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servletclass>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:servlet-context.xml</param-value>
	</init-param>
<!-- 表示启动容器时初始化该Servlet -->
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>springMvc</servlet-name>
	<!-- 这是拦截请求, "/"代表拦截所有请求,"*.do"拦截所有.do请求 -->
	<url-pattern>/</url-pattern>
	<!--<url-pattern>*.do</url-pattern>-->
</servlet-mapping>
</web-app>

配置 servlet-context.xml
在项目的 src/main/resources 下创建 servlet-context.xml 文件, 内容如下

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
	http://www.springframework.org/schema/mvc
	http://www.springframework.org/schema/mvc/spring-mvc.xsd
	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">
	<!-- 开启扫描器 -->
	<context:component-scan base-package="com.xxxx.ssm.controller" />
	<!-- mvc 注解驱动 并添加json 支持 -->
	<mvc:annotation-driven>
	<mvc:message-converters>
	<!-- 返回信息为字符串时 处理 -->
	<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
	<!-- 将对象转换为json 对象 -->
	<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
	</mvc:message-converters>
	</mvc:annotation-driven>
	<!-- 使用默认的 Servlet 来响应静态文件 -->
	<mvc:default-servlet-handler/>
	<!-- 配置视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
		<!-- 前缀:在WEB-INF目录下的jsp目录下 -->
		<property name="prefix" value="/WEB-INF/jsp/"/>
		<!-- 后缀:以.jsp结尾的资源 -->
		<property name="suffix" value=".jsp"/>
	</bean>
	<!-- 文件上传 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 允许文件上传的最大尺寸 -->
		<property name="maxUploadSize">
		<value>104857600</value>
		</property>
			<!--
			设置文件放入临时文件夹的最大大小限制。
			此值是阈值,低于此值,则保存在内存中,如高于此值,则生成硬盘上的临时文件。
			-->
			<property name="maxInMemorySize">
			<value>4096</value>
		</property>
	</bean>
</beans>

配置 spring.xml
在项目的 src/main/resources 下创建 spring.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:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	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/aop
	http://www.springframework.org/schema/aop/spring-aop.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx.xsd">
	<!-- 扫描基本包 -->
	<context:component-scan base-package="com.yjxxt.ssm" >
	<!-- context:exclude-filter标签:排除对某个注解的扫描 (过滤controller层) -->
	<context:exclude-filter type="annotation"
	expression="org.springframework.stereotype.Controller" />
	</context:component-scan>
	<!-- 加载properties 配置文件 -->
	<context:property-placeholder location="classpath:db.properties" />
	<!-- aop -->
	<aop:aspectj-autoproxy />
	<!-- 配置c3p0 数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driver}"></property>
		<property name="jdbcUrl" value="${jdbc.url}"></property>
		<property name="user" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>
	<!-- 配置事务管理器 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 设置事物增强 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="insert*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>
	<!-- aop 切面配置 -->
	<aop:config>
		<aop:pointcut id="servicePointcut" expression="execution(* com.yjxxt.ssm.service..*.*(..))"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut" />
	</aop:config>
	<!-- 配置 sqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="configLocation" value="classpath:mybatis.xml" />
		<property name="mapperLocations" value="classpath:com/yjxxt/ssm/mapper/*.xml" />
	</bean>
	<!-- 配置扫描器 -->
	<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 扫描com.xxxx.ssm.dao这个包以及它的子包下的所有映射接口类 -->
		<property name="basePackage" value="com.xxxx.ssm.dao" />
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
	</bean>
</beans>

配置 mybatis.xml
在项目的 src/main/resources 下创建 mybatis.xml 文件, 内容如下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
	PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<package name="com.yjxxt.ssm.po"/>
	</typeAliases>
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
	</plugins>
</configuration>

配置 db.properties
在项目的 src/main/resources 下创建 db.properties 文件,内容如下(mysql 创建数据库ssm)

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?
useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
jdbc.username=root
jdbc.password=root

添加 log4j.properties
在项目的 src/main/resources 下创建 log4j.properties 文件,内容如下

log4j.rootLogger=DEBUG, Console
# Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值