SSM框架整合 Spring + SpringMVC + Mybatis

版权声明:大家好,我是笨笨,笨笨的笨,笨笨的笨,转载请注明出处,谢谢! https://blog.csdn.net/jx520/article/details/87789995

版本说明

名称 版本
JDK 7.0
Servlet 3.0
Tomcat 7.0.90
Mysql 5.7
Eclipse Java EE IDE for Web Developers Version: Neon.1a Release (4.6.1)
Maven apache-maven-3.6.0
Spring 及相关套件 4.3.9.RELEASE

创建 Maven Web 项目

Maven 学习笔记《Eclipse 创建 Maven Web 项目》

修复报错

Eclipse 创建的 Maven 项目报错 Cannot change version of project facet Dynamic Web Module to 3.0

配置文件

pom.xml

/springmvc/pom.xml

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.jerry</groupId>
  <artifactId>springmvc</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>springmvc Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
  	<properties>
		<junit.version>4.12</junit.version>
		<spring.version>4.3.9.RELEASE</spring.version>
		<mysql.version>5.1.47</mysql.version>
		<c3p0.version>0.9.5.3</c3p0.version>
		<druid.version>1.1.13</druid.version>
		<mybatis.version>3.4.6</mybatis.version>
		<mybatis-spring.version>1.3.2</mybatis-spring.version>
		<!-- log4j日志文件管理包版本 -->
   		<slf4j.version>1.7.7</slf4j.version>
		<log4j.version>1.2.17</log4j.version>
		
		<jspapi.version>2.3.3</jspapi.version>
		<jstl.version>1.2</jstl.version>
		
		<jackson.version>2.9.8</jackson.version>
		<fastjson.version>1.1.41</fastjson.version>
	</properties>
	
	<dependencies>
		<!-- 测试 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope> 
		</dependency>
		
		<!-- ================================= spring ================================= -->
		<!-- 事务控制 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<!-- Object XML Mapper 由Spring提供的一个oxm的统一接口 -->
	    <dependency> 
	        <groupId>org.springframework</groupId> 
	        <artifactId>spring-oxm</artifactId> 
	        <version>${spring.version}</version> 
	    </dependency> 
	    <!-- Spring context的扩展支持,用于MVC方面 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<!-- 提供对AspectJ的支持,以便可以方便的将面向方面的功能集成进IDE中, 比如Eclipse AJDT -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-aspects</artifactId>
		    <version>${spring.version}</version>
		</dependency>
		<!-- 包含对Spring 对JDBC 数据访问进行封装的所有类。 外部依赖spring-beans,spring-dao -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>${spring.version}</version>
		</dependency>
		<!--spring测试框架,需要配合 junit 创建单元测试。 spring测试所需包:sring的相关组件,spring test ,junit-->
<!--         <dependency> -->
<!--             <groupId>org.springframework</groupId> -->
<!--             <artifactId>spring-test</artifactId> -->
<!--             <version>${spring.version}</version> -->
<!--             <scope>test</scope> -->
<!--         </dependency> -->
		<!-- springMVC -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
			<scope>compile</scope>
		</dependency>
		
		<!-- ================================= 数据库 ================================= -->
		<!-- mysql 驱动包 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>
		<!-- 数据库连接池 -->
		<dependency>
		    <groupId>com.alibaba</groupId>
		    <artifactId>druid</artifactId>
		    <version>${druid.version}</version>
		</dependency>
<!-- 		<dependency> -->
<!-- 		    <groupId>com.mchange</groupId> -->
<!-- 		    <artifactId>c3p0</artifactId> -->
<!-- 		    <version>${c3p0.version}</version> -->
<!-- 		</dependency> -->
		
		<!-- mybatis核心包 -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis</artifactId>
		    <version>${mybatis.version}</version>
		</dependency>
		<!-- mybatis-spring 包 -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>${mybatis-spring.version}</version>
		</dependency>
		
		<!-- ================================= servlet ================================= -->
		<!-- 添加servlet3.0核心包 -->
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>${jspapi.version}</version>
		</dependency>
		<!-- jstl -->
		<dependency>
		    <groupId>javax.servlet</groupId>
		    <artifactId>jstl</artifactId>
		    <version>${jstl.version}</version>
		</dependency>
		
		<!-- ================================= 数据转换工具 ================================= -->
		<!-- JSON 转换 : Spring MVC 用 @ResponseBody 返回 JSON 需要此依赖 -->
		<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-databind</artifactId>
		    <version>${jackson.version}</version>
		</dependency>
		
		<!-- fastjson --> 
	    <dependency> 
	        <groupId>com.alibaba</groupId> 
	        <artifactId>fastjson</artifactId> 
	        <version>${fastjson.version}</version> 
	    </dependency> 
		
		<!-- XML 转换  : Spring MVC 用 @ResponseBody 返回 XML 需要此依赖-->
		<dependency>
		    <groupId>com.fasterxml.jackson.dataformat</groupId>
		    <artifactId>jackson-dataformat-xml</artifactId>
		    <version>${jackson.version}</version>
		</dependency>

	    <!-- ================================= 日志工具 ================================= -->
	    <!-- log start --> 
	    <dependency> 
	        <groupId>log4j</groupId> 
	        <artifactId>log4j</artifactId> 
	        <version>${log4j.version}</version> 
	    </dependency> 
		<dependency> 
	        <groupId>org.slf4j</groupId> 
	        <artifactId>slf4j-api</artifactId> 
	        <version>${slf4j.version}</version> 
	    </dependency> 
	    <dependency> 
	        <groupId>org.slf4j</groupId> 
	        <artifactId>slf4j-log4j12</artifactId> 
	        <version>${slf4j.version}</version> 
	    </dependency> 
	    
		<!-- 上传组件包 --> 
<!-- 	    <dependency>  -->
<!-- 	        <groupId>commons-fileupload</groupId>  -->
<!-- 	        <artifactId>commons-fileupload</artifactId>  -->
<!-- 	        <version>1.3.1</version>  -->
<!-- 	    </dependency>  -->
<!-- 	    <dependency>  -->
<!-- 	        <groupId>commons-io</groupId>  -->
<!-- 	        <artifactId>commons-io</artifactId>  -->
<!-- 	        <version>2.4</version>  -->
<!-- 	    </dependency>  -->
<!-- 	    <dependency>  -->
<!-- 	        <groupId>commons-codec</groupId>  -->
<!-- 	        <artifactId>commons-codec</artifactId>  -->
<!-- 	        <version>1.9</version>  -->
<!-- 	    </dependency> -->
	</dependencies>
  
  <build>
    <finalName>springmvc</finalName>
    <!-- 指定maven编译方式为jdk1.7版本 -->
   	<plugins>  
		<plugin>  
	        <groupId>org.apache.maven.plugins</groupId>  
	        <artifactId>maven-compiler-plugin</artifactId>  
	        <version>3.1</version>  
	        <configuration>  
	            <source>1.7</source>  
	            <target>1.7</target>  
	        </configuration>  
	    </plugin>  
	</plugins> 
  </build>
</project>

web.xml

/springmvc/src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
	id="WebApp_ID" version="3.0">
	
	<!-- WebName -->
  	<display-name>springmvc</display-name>
	
	<!-- ============================= 过滤器 开始 ============================= -->
    <!-- Spring 字符集过滤器 -->
    <!-- encoding 设置 request 的编码为 UTF-8。 forceEncoding 同时设置 response 编码 
    	这个只对POST有效。GET请求要去Tomcat的 servel.xml 中添加  URIEncoding="UTF-8"
    	<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>
    -->
    <filter>
        <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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- ============================= 过滤器 结束 ============================= -->
	
	<!-- =============================== 配置 Spring 开始 =============================== -->
    <!-- Spring 配置文件路径 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!-- Spring 监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 防止Spring内存溢出监听器 -->
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>
    <!-- =============================== 配置 Spring 结束 =============================== -->
    
	<!-- ============================= 配置 Spring MVC 开始 ============================= -->
	<servlet>
        <servlet-name>dispatcherServlet</servlet-name><!-- 定义 servlet 名字 -->
        <!-- springMVC 定义的公共 servlet -->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!-- classpath: 对应 src/main/java 和 src/main/resources -->
            <!-- <param-value>classpath:spring/spring-*.xml</param-value> -->
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- /* :拦截所有请求(jsp,css,js,img,servlet...), /:拦截除 jsp 外所有请求 -->
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!-- ============================= 配置 Spring MVC 结束 ============================= -->

	<!-- =================== 配置DruidWebStatFilter完成网络url统计 开始 =================== -->
	<!-- 经常需要排除一些不必要的url,比如.js,/jslib/等等。配置在init-param中。比如 -->
	<filter>
		<filter-name>DruidWebStatFilter</filter-name>
		<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
		<init-param>
			<param-name>exclusions</param-name>
			<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>DruidWebStatFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
 
	<!-- druid的Servlet -->
	<servlet>
		<servlet-name>DruidStatView</servlet-name>
		<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>DruidStatView</servlet-name>
		<url-pattern>/druid/*</url-pattern>
	</servlet-mapping>
	<!-- =================== 配置DruidWebStatFilter完成网络url统计 结束 =================== -->
	
	<!-- favicon.ico 请求直接放行 -->
	<servlet-mapping>
	    <servlet-name>default</servlet-name>
	    <url-pattern>/favicon.ico</url-pattern>
	</servlet-mapping>
    
</web-app>

applicationContext.xml

/springmvc/src/main/resources/applicationContext.xml
复制此配置内容,注意修改包名 com.jerry

<?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:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.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
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context.xsd"
	default-autowire="byName"
	>
	
	<!-- =========================== 加载 jdbc配置参数  =========================== -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations" value="classpath:jdbc.properties"/>
    </bean>

	<!-- =========================== 配置要扫描的包:排除 @Controller注解的类  =========================== -->
	<context:component-scan base-package="com.jerry">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
<!--         <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" /> -->
	</context:component-scan>

    <!-- 导入 /springmvc/src/main/resources/spring-mybatis.xml -->
    <import resource="classpath:spring-mybatis.xml" />

</beans>

spring-mybatis.xml

/springmvc/src/main/resources/spring-mybatis.xml
复制此配置内容,注意修改包名 com.jerry.springmvc com/jerry/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:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.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
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!-- =========================== 数据库连接池 =========================== -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 
	init-method="init" destroy-method="close">
		<!-- Druid会自动跟url识别驱动类名,如果连接冷门数据库,请自己配置driverClassName -->
        <!-- <property name="driverClassName" value="${jdbc_driver}"/> -->
        
		<!-- 基本属性 url、user、password -->        
		<property name="url" value="${jdbc_url}" />
		<property name="username" value="${jdbc_user}" />
		<property name="password" value="${jdbc_password}" />
     
        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="2"/>
        <property name="minIdle" value="10"/>
        <property name="maxActive" value="20"/>
        
        <!-- 配置获取连接等待超时的时间 -->
		<property name="maxWait" value="60000" />
		
		<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
		<property name="timeBetweenEvictionRunsMillis" value="60000" />
		
		<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
		<property name="minEvictableIdleTimeMillis" value="600000" />
		<!-- 验证最大存活时间,无视最小连接数强制回收 -->
		<property name="maxEvictableIdleTimeMillis" value="900000" />
		
		<!-- validationQuery 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。
			如果空 testOnBorrow、testOnReturn、testWhileIdle 都不会起作用。 -->
		<property name="validationQuery" value="select 'x'" />
		<property name="testWhileIdle" value="true" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
		
		<!-- 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作 -->
		<property name="keepAlive" value="true" />
		<property name="phyMaxUseCount" value="100000" />
		
		<!-- 配置监控统计拦截的filters 监控统计用的 stat 日志用的 log4j 防御sql注入的 wall -->
        <property name="filters" value="wall,stat" /> 

    </bean>
	
    <!-- =========================== mapper =========================== -->
    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->  
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <!-- 实体类别名 -->
        <property name="typeAliasesPackage" value="com.jerry.springmvc.entity;" />  
        <!-- 自动扫描 *Mapping.xml文件 -->   
        <property name="mapperLocations" value="classpath:com/jerry/springmvc/mapper/*Mapper.xml"></property>
    </bean>   
    
	<!-- DAO接口所在包名,Spring会自动查找其下的类 ,自动扫描了所有的XxxxMapper.xml对应的mapper接口文件,只要Mapper接口类和Mapper映射文件对应起来就可以了-->  
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
        <property name="basePackage" value="com.jerry.springmvc.mapper" />  
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>  
    </bean>  
    
    <!-- =========================== 事务 =========================== -->
	<!-- 配置事务管理器 -->
    <bean id="transactionManager"  
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean> 

    <!-- 配置基于注解的声明式事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

    
</beans>

jdbc.properties

/springmvc/src/main/resources/jdbc.properties
请修改成你自己的【数据库连接地址、用户名、密码】

jdbc_driver=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://localhost:3306/jerry?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false
jdbc_user=root
jdbc_password=root

spring-mvc.xml

/springmvc/src/main/resources/spring-mvc.xml
复制此配置内容,注意修改包名 com.jerry.springmvc

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:p="http://www.springframework.org/schema/p"
  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(controller层注入) -->
	<context:component-scan base-package="com.jerry.springmvc.controller" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <!-- 必须要包括ControllerAdvice才能处理全局异常。 -->
        <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
        <!-- 排除 Service 层,避免事务失效的问题。 -->
		<!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> -->
    </context:component-scan>
   
	<!-- 扩充注解驱动,可以将请求参数绑定到控制器参数 -->
	<mvc:annotation-driven />

    <!-- 内容协商管理器 这个还没学。先贴上。。  -->
    <!-- 首先检查路径扩展名(如my.pdf);2、其次检查Parameter(如my?format=pdf);3、检查Accept Header-->
    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <!-- 扩展名至mimeType的映射,即 /user.json => application/json -->
        <property name="favorPathExtension" value="true"/>
        <!-- 用于开启 /userinfo/123?format=json 的支持 -->
        <property name="favorParameter" value="true"/>
        <property name="parameterName" value="format"/>
        <!-- 是否忽略Accept Header -->
        <property name="ignoreAcceptHeader" value="false"/>

        <!--扩展名到MIME的映射;favorPathExtension, favorParameter是true时起作用  -->
        <property name="mediaTypes">
            <value>
                json=application/json
                xml=application/xml
                html=text/html
            </value>
        </property>
        <!-- 默认的content type -->
        <property name="defaultContentType" value="text/html"/>
    </bean>

	<!-- ~~~~~~~~~~~~~~~~~~~~ 静态资源 ~~~~~~~~~~~~~~~~~~~~ -->
    <!-- 配置静态资源放行 : 资源可以放任何位置,比如 resources 下面 -->
<!-- 	<mvc:resources location="classpath:static/js/" mapping="/js/**" /> -->
<!-- 	<mvc:resources location="classpath:static/css/" mapping="/css/**" /> -->
<!-- 	<mvc:resources location="classpath:static/images/" mapping="/images/**" /> -->
	<mvc:resources location="/static/js/" mapping="/js/**" />
	<mvc:resources location="/static/css/" mapping="/css/**" />
	<mvc:resources location="/static/images/" mapping="/images/**" />
    <!-- 静态资源自动放行 : 资源位置只能放在 /src/main/webapp 下。 如果服务器默认 servlet 不叫 "default" 要自行设置 default-servlet-name 属性-->
    <!-- <mvc:default-servlet-handler /> -->
	
	<!-- 自定义视图解析器 :prefix + 控制器返回的字段串 + suffix 拼接出视图位置
		配了自定义视图解析器后,如果想走默认解析器,可以写 "forward:/WEB-INF/jsp/index.jsp"
	-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

测试文件

PoemController.java

http://localhost/1 //查看诗文
http://localhost/add //添加诗文(控制层方法中写死的数据)

package com.jerry.springmvc.controller;

import java.util.Map;

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import com.jerry.springmvc.entity.Poem;
import com.jerry.springmvc.service.IPoemService;

@Controller
@Scope("prototype")
public class PoemController {
	@Resource
	private IPoemService poemService;
	
	@RequestMapping("/")
	public String index( Map<String, Object> model) {
		model.put("name", "笨笨");
		return "index";
	}
	
	@RequestMapping("/{id}")
	public String helloJerry(@PathVariable("id")long id, Map<String, Object> model) {
		Poem poem = poemService.getById(id);
		model.put("name", "笨笨");
		model.put("poem", poem);
		return "poem";
	}
	
	/**
	 * 测试事务回滚
	 * @param model
	 * @return
	 */
	@RequestMapping("/add")
	public String add( Map<String, Object> model) {
		// 懒得从前端传了,这个直接写测试数据
		Poem poem = new Poem();
		poem.setAuthor("笨笨");
		poem.setContent("<p>天使只是别处的凡人,神仙不过他山的妖怪。</p><p>大家好,我是笨笨,笨笨的笨,笨笨的笨,谢谢!</p>");
		poem.setTitle("他山的妖怪");
		
		try {
			//poemService.errorSave(poem);// 这个方法内手动抛出异常,插入数据操作会被回滚。
			poemService.save(poem);//这个能正常插入
		} catch (Exception e) {
			model.put("msg", "添加失败!");
			return "result";
		}
		
		model.put("msg", "添加成功! id: " + poem.getId());
		return "result";
	}
}

IPoemService.java

/springmvc/src/main/java/com/jerry/springmvc/service/IPoemService.java

package com.jerry.springmvc.service;
import com.jerry.springmvc.entity.Poem;
public interface IPoemService {
	Poem getById(Long id);
	Long save(Poem record) throws Exception;
	Long errorSave(Poem record) throws Exception;
}

PoemService.java

/springmvc/src/main/java/com/jerry/springmvc/service/impl/PoemService.java

package com.jerry.springmvc.service.impl;

import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jerry.springmvc.entity.Poem;
import com.jerry.springmvc.mapper.PoemMapper;
import com.jerry.springmvc.service.IPoemService;

@Service  
@Transactional(readOnly = true)
public class PoemService implements IPoemService {
	@Resource
	private PoemMapper poemMapper;
	
	@Override
	public Poem getById(Long id) {
		return poemMapper.selectByPrimaryKey(id);
	}
	
	@Override
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED,rollbackFor=Exception.class,timeout=10)
	public Long save(Poem record) {
		if(record.getId() == null){
			poemMapper.insertSelective(record);
		}else{
			poemMapper.updateByPrimaryKeySelective(record);
		}
		return record.getId();
	}

	@Override
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED,rollbackFor=Exception.class,timeout=10)
	public Long errorSave(Poem record) throws Exception {
		if(record.getId() == null){
			poemMapper.insertSelective(record);
		}else{
			poemMapper.updateByPrimaryKeySelective(record);
		}
		throw new Exception("保存完毕后,手抛异常,测试回滚");
	}
}

PoemMapper.java

/springmvc/src/main/java/com/jerry/springmvc/mapper/PoemMapper.java

package com.jerry.springmvc.mapper;

import com.jerry.springmvc.entity.Poem;

public interface PoemMapper {
    int deleteByPrimaryKey(Long id);
    int insert(Poem record);
    int insertSelective(Poem record);
    Poem selectByPrimaryKey(Long id);
    int updateByPrimaryKeySelective(Poem record);
    int updateByPrimaryKey(Poem record);
}

PoemMapper.xml

/springmvc/src/main/java/com/jerry/springmvc/mapper/PoemMapper.xml
复制此配置内容,注意修改包名 com.jerry.springmvc

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jerry.springmvc.mapper.PoemMapper">
  <resultMap id="BaseResultMap" type="com.jerry.springmvc.entity.Poem">
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="title" jdbcType="VARCHAR" property="title" />
    <result column="content" jdbcType="VARCHAR" property="content" />
    <result column="author" jdbcType="VARCHAR" property="author" />
  </resultMap>
  <sql id="Base_Column_List">
    id, title, content, author
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultType="poem">
    select <include refid="Base_Column_List" />
    from poem
    where id = #{id,jdbcType=BIGINT}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
    delete from poem
    where id = #{id,jdbcType=BIGINT}
  </delete>
  <insert id="insert" parameterType="com.jerry.springmvc.entity.Poem">
	<selectKey resultType="java.lang.Long" order="AFTER" keyProperty="id"> SELECT @@IDENTITY </selectKey>
    insert into poem (id, title, content, author)
    values (#{id,jdbcType=BIGINT}, #{title,jdbcType=VARCHAR}, #{content,jdbcType=VARCHAR}, #{author,jdbcType=VARCHAR})
  </insert>
  <insert id="insertSelective" parameterType="com.jerry.springmvc.entity.Poem">
	<selectKey resultType="java.lang.Long" order="AFTER" keyProperty="id"> SELECT @@IDENTITY </selectKey>
    insert into poem
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="title != null">
        title,
      </if>
      <if test="content != null">
        content,
      </if>
      <if test="author != null">
        author,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=BIGINT},
      </if>
      <if test="title != null">
        #{title,jdbcType=VARCHAR},
      </if>
      <if test="content != null">
        #{content,jdbcType=VARCHAR},
      </if>
      <if test="author != null">
        #{author,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.jerry.springmvc.entity.Poem">
    update poem
    <set>
      <if test="title != null">
        title = #{title,jdbcType=VARCHAR},
      </if>
      <if test="content != null">
        content = #{content,jdbcType=VARCHAR},
      </if>
      <if test="author != null">
        author = #{author,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.jerry.springmvc.entity.Poem">
    update poem
    set title = #{title,jdbcType=VARCHAR},
      content = #{content,jdbcType=VARCHAR},
      author = #{author,jdbcType=VARCHAR}
    where id = #{id,jdbcType=BIGINT}
  </update>
</mapper>

Poem.java

/springmvc/src/main/java/com/jerry/springmvc/entity/Poem.java

package com.jerry.springmvc.entity;

/**
 * poem 表实体类 
 * @author jerryjin 2019-01-24
 */
public class Poem {
    /** 主键 */
    private Long id;

    /** 诗词标题 */
    private String title;

    /** 诗词内容 */
    private String content;

    private String author;

    /**
     * 获取:主键
     * @return id 主键
     */
    public Long getId() {
        return id;
    }

    /**
     * 设置:主键
     * @param id 主键
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * 获取:诗词标题
     * @return title 诗词标题
     */
    public String getTitle() {
        return title;
    }

    /**
     * 设置:诗词标题
     * @param title 诗词标题
     */
    public void setTitle(String title) {
        this.title = title == null ? null : title.trim();
    }

    /**
     * 获取:诗词内容
     * @return content 诗词内容
     */
    public String getContent() {
        return content;
    }

    /**
     * 设置:诗词内容
     * @param content 诗词内容
     */
    public void setContent(String content) {
        this.content = content == null ? null : content.trim();
    }

    /**
     * 获取:
     * @return author 
     */
    public String getAuthor() {
        return author;
    }

    /**
     * 设置:
     * @param author 
     */
    public void setAuthor(String author) {
        this.author = author == null ? null : author.trim();
    }
}

index.jsp

/springmvc/src/main/webapp/WEB-INF/jsp/index.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<link href="/css/main.css" rel="stylesheet" />
	</head>
	<body>
		<div class="container">
			<div class="starter-template">
				<h1>大家好,我是${name},${name}的${name},${name}的${name},谢谢!</h1>
			</div>
		</div>
	</body>
</html>

poem.jsp

/springmvc/src/main/webapp/WEB-INF/jsp/poem.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<link href="/css/main.css" rel="stylesheet" />
	</head>
	<body>
		<div class="container">
			<div class="starter-template">
				<h1>大家好,我是${name},${name}的笨,${name}的笨,谢谢!</h1>
				<div class="poem">
					<p><span class="title">${poem.title}</span><span class="author"> —— ${poem.author}</span></p>
					<div class="content">${poem.content} </div>
				</div>
			</div>
		</div>
	</body>
</html>

result.jsp

/springmvc/src/main/webapp/WEB-INF/jsp/result.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head> <link href="/css/main.css" rel="stylesheet" /> </head>
	<body>
		<div class="container"> <div class="starter-template"> <h1>${msg}</h1> </div> </div>
	</body>
</html>

main.css

/springmvc/src/main/webapp/static/css/main.css

h1 {
	color: #03a9f4;
}

.poem {
    color: #607D8B;
}

.poem .title {
    font-size: 2.5em;
}

.poem .author {
    font-size: 1.0em;
}

.poem .content p {
    font-size: 1.5em;
}

测试表

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for poem
-- ----------------------------
DROP TABLE IF EXISTS `poem`;
CREATE TABLE `poem` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `title` varchar(16) NOT NULL COMMENT '诗词标题',
  `content` varchar(255) NOT NULL COMMENT '诗词内容',
  `author` varchar(16) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of poem
-- ----------------------------
INSERT INTO `poem` VALUES ('1', '痴情癫', '<p>多情黯叹痴情癫,痴情苦笑多情难。</p><p>相思自古无良药,从来独步赴黄泉。</p', '笑虾');
INSERT INTO `poem` VALUES ('2', '爱云说', '<p>一壶泪,暗淡醇香味。</p><p>化作万樽与谁对?</p><p>忧举杯,乐举杯,地老天荒只一醉。</p><p>欲哭时,男儿无泪。</p><p>千般相思苦。</p><p>杯中汇...</p>', '笑虾');

log4j.properties

打印了SQL 语句和结果
普通日志只有 WARN 级别才输出
(还不知道怎么分别设置“普通日志” 和“SQL”的样式)
/springmvc/src/main/resources/log4j.properties
复制此配置内容,注意修改包名 com.jerry.springmvc

# 全局设置: 级别[ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF], 显示  
log4j.rootLogger=WARN , console, file, M

# ----------------------- 控制台 -----------------------------
# 普通日志
#log4j.appender.console=org.apache.log4j.ConsoleAppender
#log4j.appender.console.layout=org.apache.log4j.PatternLayout
#log4j.appender.console.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %-5p %t %-17c{2} (%13F:%L) %3x - %m%n

# 单独设置 SQL日志的规则,指定要打印日志的包
log4j.logger.com.jerry.springmvc.mapper =TRACE
log4j.appender.M=org.apache.log4j.ConsoleAppender
log4j.appender.M.layout=org.apache.log4j.PatternLayout
log4j.appender.M.layout.ConversionPattern=[%p]%d{HH:mm:ss}[%c{2}] %m%n

# ----------------------- 日志文件 -----------------------------
#log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.file.File=d:/logs/jerryLog.log
#log4j.appender.file.DatePattern='.'yyyy-MM-dd'.txt'
#log4j.appender.file.Append=true
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss}] %-5p %t %c{2} - %m%n

目录结构

在这里插入图片描述

辅助脚本

\springmvc\创建默认的文件夹和文件.bat
看到上面的目录结构,文件夹还不少吧。测试搭建SSM的过程中,曾反复删除和创建项目,为了避免重复劳动,写个辅助的批处理。用于创建上面提到的文件夹和文件,大可根据自己的需要随便改。放到项目根目录下运行,填写一下自己的包名,回车OK。

@echo off
TITLE  创建项目默认的【文件】和【夹】
@echo  请将此文件放到项目根目录下运行
@echo  默认包名: com\jerry\ssmdemo

set/p package_name= 请输入你的包名,按回车:

if "%package_name%"=="" (set package_name=com\jerry\ssmdemo) 

md %cd%\src\main\java\%package_name%\controller
md %cd%\src\main\java\%package_name%\entity
md %cd%\src\main\java\%package_name%\mapper
md %cd%\src\main\java\%package_name%\service
md %cd%\src\main\java\%package_name%\service\impl

md %cd%\src\main\resources\

md %cd%\src\main\webapp\static\css
md %cd%\src\main\webapp\static\images
md %cd%\src\main\webapp\static\js

md %cd%\src\main\webapp\WEB-INF\jsp

md %cd%\src\test\java\com\jerry\%project_name%\controller
md %cd%\src\test\java\com\jerry\%project_name%\mapper
md %cd%\src\test\java\com\jerry\%project_name%\service\impl


:: 创建数据库配置文件
echo jdbc_driver=com.mysql.jdbc.Driver> %cd%\src\main\resources\jdbc.properties
echo jdbc_url=>> %cd%\src\main\resources\jdbc.properties
echo jdbc_user=>> %cd%\src\main\resources\jdbc.properties
echo jdbc_password=>> %cd%\src\main\resources\jdbc.properties

:: 设置活动代码页编号【UTF-8】
@Chcp 65001

echo 请删除此占位符,替换为 log4j 配置内容> %cd%\src\main\resources\log4j.properties
@echo 请删除此占位符,替换为 Spring 配置内容> %cd%\src\main\resources\applicationContext.xml
@echo 请删除此占位符,替换为 Spring-mybatis 配置内容> %cd%\src\main\resources\spring-mybatis.xml
@echo 请删除此占位符,替换为 Spring-mvc 配置内容> %cd%\src\main\resources\spring-mvc.xml

@echo=> %cd%\src\main\webapp\static\css\main.css

:: index 文件移动到我们设置好的 jsp 目录去
move %cd%\src\main\webapp\index.jsp %cd%\src\main\webapp\WEB-INF\jsp\index.jsp

:: 设置活动代码页编号【gbk】
@Chcp 936
cls

tree %cd%\src /f

echo 默认的【文件夹】和【文件】,创建完成!
pause

解决的疑难杂症

1、favicon.ico 请求直接放行。浏览器会自动请求这个。本想陪在 spring-mvc.xml 搞来搞去丢没满意,直接放web.xml里解决的。
2、Eclipse 创建的 Maven 项目报错 Cannot change version of project facet Dynamic Web Module to 3.0

源文件

https://download.csdn.net/download/jx520/10973316

猜你喜欢

转载自blog.csdn.net/jx520/article/details/87789995
今日推荐