SSM整合
版本说明
名称 | 版本 |
---|---|
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