更多参考 http://www.jiajiajia.club/blog/artical/135
spring+springmvc+springDataJpa+maven
1.maven环境配置https://blog.csdn.net/qq_36489998/article/details/80525010
2.创建maven项目
项目目录如下:
发现jsp报错,接下来配置tomcat服务器
3.配置tomcat服务器
将项目加入服务器中
配置path
添加library
再选择source选项卡,将带差号的文件夹remove掉
再点击add folder
点击apply and close完成!!!
4.开始配置sssj
1. 在父项目的pom文件中加入必须的jar依赖
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.sssj.test</groupId>
<artifactId>sssj</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.12</junit.version>
<spring.version>4.2.5.RELEASE</spring.version>
<hibernate.version>4.3.5.Final</hibernate.version>
<hibernate.annotations.version>4.0.4.Final</hibernate.annotations.version>
<mysql.driver.version>5.1.22</mysql.driver.version>
<jackson.version>1.9.2</jackson.version>
<fastjson.version>1.2.20</fastjson.version>
<log4j2.version>2.7</log4j2.version>
<slf4j.version>1.7.21</slf4j.version>
<commons-io.version>2.4</commons-io.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>
<servlet.version>4.0.0-b01</servlet.version>
<jstl.version>1.2</jstl.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils -->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId><!-- 包含Spring框架基本的核心工具类 -->
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId><!-- springIoC(依赖注入)的基础工具类-->
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId><!-- spring 提供在基于IoC 功能上的扩展服务 -->
<version>${spring.version}</version>
</dependency>
<!-- Spring核心依赖 end -->
<!-- spring 持久层依赖start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId><!-- 封装了spring对于事物的控制 -->
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId><!-- 包含对Spring对JDBC数据访问进行封装的所有类 -->
<version>${spring.version}</version>
</dependency>
<!-- spring 持久层依赖end -->
<!-- Spring web相关依赖 start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId><!-- Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架 -->
<version>${spring.version}</version>
</dependency>
<!-- Spring web相关依赖 end -->
<!-- Spring 其它依赖 -->
<dependency>
<groupId>org.springframework</groupId><!-- spring面向切面编程,提供AOP(面向切面编程) -->
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
<!-- spring end -->
<!-- hibernate begin -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>${hibernate.annotations.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<!-- hibernate相关项目依赖 end -->
<!-- mysql数据库相关依赖start -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId><!-- 导入Mysql数据库驱动包 -->
<version>${mysql.driver.version}</version>
</dependency>
<!-- mysql数据库相关依赖end -->
<!-- log日志相关依赖 start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId><!-- slf4j -->
<version>${slf4j.version}</version>
</dependency>
<!-- jackson start -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.5</version>
</dependency>
<!-- jackson end -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<modules>
<module>webapp</module>
</modules>
</project>
2.在resources文件夹下加入 spring的配置文件,以及springmvc的配置文件
在这里把springdatajpa的配置文件放在了applicationContxt中了
applicationContext.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="com.sssj.test"></context:component-scan>
<!-- 1.配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root"></property>
<property name="password" value="19960215"></property>
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
</bean>
<!-- 配置jdbcTemplate -->
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 2.配置jpa的EntityMangaerFactory -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 配置 JPA 提供商的适配器. 可以通过内部 bean 的方式来配置 -->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
</property>
<!-- 配置实体类所在的包 -->
<property name="packagesToScan" value="com.sssj.test.entity">
</property>
<!-- 配置 JPA 的基本属性. 例如 JPA 实现产品的属性 -->
<property name="jpaProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!-- 3.配置是事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<!-- 4.配置支持注解的事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 5.配置spring Data -->
<!-- base-package: 扫描 Repository Bean 所在的 package -->
<jpa:repositories base-package="com.sssj.test.dao"
entity-manager-factory-ref="entityManagerFactory"></jpa:repositories>
</beans>
spring-mvc。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:p="http://www.springframework.org/schema/p"
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-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"
default-lazy-init="true">
<!-- <context:component-scan base-package="club.jiajiajia.weblog" /> -->
<!-- 配置自动扫描的包
不能用上面的那种方式,因为在applicationContext.xml有的已经配置,所以为了防止冲突,使用下面的方式
-->
<context:component-scan base-package="com.sssj.test.controller" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<mvc:annotation-driven/>
<mvc:view-controller path="/404" view-name="404"/>
<!-- 配置不过滤静态资源文件 -->
<mvc:resources mapping="/resources/**" location="/resources/"/>
<!-- 配置视图管理器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
修改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">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置web.xml,使其具有springmvc特性,主要配置两处,一个是ContextLoaderListener,一个是DispatcherServlet -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置ContextLoaderListener表示,该工程要以spring的方式启动。启动时会默认在/WEB-INF目录下查找applicationContext.xml
作为spring容器的配置文件,该文件里可以初始化一些bean -->
<!-- 字符集过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- spring mvc 配置 -->
<!-- 配置DispatcherServlet表示,该工程将采用springmvc的方式。启动时也会默认在/WEB-INF目录下查找XXX-servlet.xml作为配置文件,
XXX就是DispatcherServlet的名字,该文件中将配置两项重要的mvc特性:HandlerMapping,负责为DispatcherServlet这个前端控制器的请求查找Controller;
ViewResolver,负责为DispatcherServlet查找ModelAndView的视图解析器。
此处使用指定的配置文件spring-mvc.xml -->
<servlet>
<servlet-name>contacts</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--<param-value>/WEB-INF/classes/spring-mvc-servlet.xml</param-value>-->
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>contacts</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置发生异常跳转页面 -->
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/WEB-INF/views/error/404.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/views/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/views/error/500.jsp</location>
</error-page>
</web-app>
因为spring-mvc.xml中视图管理器的配置
所以要在 web-inf文件夹下创建views文件夹,再创建一个index.jsp文件测试
到目前为止,启动tomcat已经没问题
5.集中测试
测试springmvc配置
首先再java文件夹下,创建如下文件夹
在controller文件夹下创建IndexController.java文件,内容如下
package com.sssj.test.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/index")
public class IndexController {
@RequestMapping("/index")
public ModelAndView index() {
System.out.println("loading");
ModelAndView modelAndView=new ModelAndView("index");
return modelAndView;
}
}
修改web-inf下 index.jsp文件,取访问/index/index路径,上面的图片指错了,不是views文件夹下的
<html>
<body>
<h2><a href="<%=request.getContextPath()%>/index/index">Hello World!</a></h2>
</body>
</html>
重新启动项目,在浏览器上点击hello world,跳转到了 views文件下的index.jsp
spring mvc配置成功
接下来测试springdatajpa测配置,,
在entity文件夹下新建 SssjEntity 类如下
sssjEntity.java
package com.sssj.test.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="testEntity")
public class SssjEntity {
@Id
@GeneratedValue
private Integer id;
private String name;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public SssjEntity() {
super();
// TODO Auto-generated constructor stub
}
public SssjEntity(String name, String password) {
super();
this.name = name;
this.password = password;
}
@Override
public String toString() {
return "SssjEntity [id=" + id + ", name=" + name + ", password=" + password + "]";
}
public SssjEntity(Integer id, String name, String password) {
super();
this.id = id;
this.name = name;
this.password = password;
}
}
重新启动tomcat服务器,发现 数据库中已经建立了一个 testEntity数据表
说明springdatajpa已经配置完成了
接下来进行添加一条数据,测试
在dao层,和service层添加如下文件
MyRepository.java
package com.sssj.test.dao;
import org.springframework.data.repository.CrudRepository;
import com.sssj.test.entity.SssjEntity;
public interface MyRepository extends CrudRepository<SssjEntity,Integer>{
}
TestService.java
package com.sssj.test.service;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.sssj.test.dao.MyRepository;
import com.sssj.test.entity.SssjEntity;
@Service
public class TestService {
@Autowired
private MyRepository myRepository;
@Transactional
public void addTest(SssjEntity sssj,SssjEntity sssj2) {
myRepository.save(sssj);
myRepository.save(sssj2);
}
}
修改IndexController.java如下
package com.sssj.test.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.sssj.test.entity.SssjEntity;
import com.sssj.test.service.TestService;
@Controller
@RequestMapping("/index")
public class IndexController {
@Autowired
private TestService TestService;
@RequestMapping("/index")
public ModelAndView index() {
System.out.println("loading");
TestService.addTest(new SssjEntity(1,"123","123"), new SssjEntity(2,"456","789"));
ModelAndView modelAndView=new ModelAndView("index");
return modelAndView;
}
}
向数据库中添加两条数据
new SssjEntity(1,"123","123"), new SssjEntity(2,"456","789")
在次访问index/index路径
http://localhost:8080/webapp/index/index
添加成功
测试成功
接下来测试 事务管理器 是否配置成功
先把原数据库中的数据删除
在testService.java中添加如下代码 int a=1/0; 我们手动制造异常
package com.sssj.test.service;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.sssj.test.dao.MyRepository;
import com.sssj.test.entity.SssjEntity;
@Service
public class TestService {
@Autowired
private MyRepository myRepository;
@Transactional
public void addTest(SssjEntity sssj,SssjEntity sssj2) {
myRepository.save(sssj);
int a=1/0;
myRepository.save(sssj2);
}
}
再次访问 index/index路径
http://localhost:8080/webapp/index/index
发现 服务器执行了 第一条插入语句
在第二次插入之间报错
但是数据表里并没有数据
说明事务管理器配置成功,@Transactional注解起了作用
到此应该是大功告成
接下来就开始开发吧
也可以建立更多的 子项目 来满足我们的开发需求
只需要配置一下依赖就可以了