GVKun编程网logo

[Spring4.x]基于spring4.x纯注解的非Web工程搭建(springmvc非注解配置)

16

在这篇文章中,我们将为您详细介绍[Spring4.x]基于spring4.x纯注解的非Web工程搭建的内容,并且讨论关于springmvc非注解配置的相关问题。此外,我们还会涉及一些关于6、sprin

在这篇文章中,我们将为您详细介绍[Spring4.x]基于spring4.x纯注解的非Web工程搭建的内容,并且讨论关于springmvc非注解配置的相关问题。此外,我们还会涉及一些关于6、spring注解+springMVC注解+Mybatis注解+log4j+idea+maven、Maven 工程搭建 spring boot+spring mvc+JPA、Maven工程搭建spring boot+spring mvc+JPA的示例、Spring 4 学习笔记 - Spring4 MVC 项目搭建(Java Config 配置)的知识,以帮助您更全面地了解这个主题。

本文目录一览:

[Spring4.x]基于spring4.x纯注解的非Web工程搭建(springmvc非注解配置)

[Spring4.x]基于spring4.x纯注解的非Web工程搭建(springmvc非注解配置)

Spring框架一直以来是Java开发中的耀眼明星,其IOC/AOP可以大大降低代码的耦合度,但低版本中的xml配置繁杂也让很多人诟病;

Spring4.x以上已经提倡基于注解的开发模式,在非Web项目中,"基于spring纯注解方式如何开发?"就是本文要说明的内容,且看下文:

下面基于Eclipse Oxygen版本,开发一个普通的Java工程,演示如下:

1. 基于 maven-archetype-quickstart 骨架 创建一个普通的Maven工程:

2. 在pom.xml中加入spring、logback及常用jar包的依赖:

3. 在src/main/resources下创建 application.properties、logback.xml、assembly.xml 等配置文件

4. 在Java 代码中创建 @Configuration、@PropertySource 类用于加载配置

package com.morpheus.cmdline.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource(value = "classpath:application.properties", ignoreResourceNotFound = false, encoding = "UTF-8")
public class AppConfiguration {
	@Value("${cmd.decrypt.key}")
	private String decryptKey = null;
	@Value("${cmd.encrypt.key}")
	private String encryptKey = null;

	public AppConfiguration() {
	}

	public String getDecryptKey() {
		return decryptKey;
	}

	public String getEncryptKey() {
		return encryptKey;
	}
}

5. 在Java 代码中编写 @Component、@Service 等基本组件类

6. 在Java 代码中使用 @Autowired、@Resource 等注入依赖Bean

7. 在Java 代码中使用 @Value 等注入配置值

8. 在主入口类中使用 AnnotationConfigApplicationContext 类启动 spring容器,并通过 getBean() 方法获取需要执行的Bean

package com.morpheus.cmdline;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.alibaba.fastjson.JSONObject;
import com.morpheus.cmdline.cmd.CmdInvoker;

/**
 * 普通Java应用(非web)入口类
 */
public class Application {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.morpheus.cmdline");
		try {
			CmdInvoker cmdInvoker = (CmdInvoker) applicationContext.getBean("cmdInvoker");
			JSONObject resJSON = cmdInvoker.invoke(args);
			System.out.println(resJSON);
		} catch (Throwable th) {
			th.printStackTrace();
		} finally {
			applicationContext.close();
		}
	}
}

9. 使用 maven-jar-plugin、 maven-dependency-plugin 打包项目为可执行的jar包

java %JVM_OPTS% -jar  CmdLine.jar

就可以执行咯

10. 使用 maven-assembly-plugin 打包项目为可部署的zip包

然后就万事大吉了,可以看到在本项目中不使用任何一个 spring 的xml配置,全部基于注解方式;

在以上步骤开发中,除了第 8 步骤之外,其他步骤同样适用于 springboot 项目的开发。。。

截图后面再补充,准备睡觉咯。。。

 

6、spring注解+springMVC注解+Mybatis注解+log4j+idea+maven

6、spring注解+springMVC注解+Mybatis注解+log4j+idea+maven

1、项目结构如下

 2、编辑pom.xml文件配置依赖

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 
  3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5   <modelVersion>4.0.0</modelVersion>
  6 
  7   <groupId>com</groupId>
  8   <artifactId>ssm_day46</artifactId>
  9   <version>1.0-SNAPSHOT</version>
 10   <packaging>war</packaging>
 11 
 12   <name>ssm_day46 Maven Webapp</name>
 13   <!-- FIXME change it to the project's website -->
 14   <url>http://www.example.com</url>
 15 
 16   <properties>
 17     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 18     <maven.compiler.source>1.7</maven.compiler.source>
 19     <maven.compiler.target>1.7</maven.compiler.target>
 20   </properties>
 21 
 22   <dependencies>
 23     <dependency>
 24       <groupId>junit</groupId>
 25       <artifactId>junit</artifactId>
 26       <version>4.12</version>
 27     </dependency>
 28 
 29 
 30     <!--1 https://mvnrepository.com/artifact/org.springframework/spring-beans -->
 31     <dependency>
 32       <groupId>org.springframework</groupId>
 33       <artifactId>spring-beans</artifactId>
 34       <version>4.3.6.RELEASE</version>
 35     </dependency>
 36 
 37 
 38     <!--2 https://mvnrepository.com/artifact/org.springframework/spring-context -->
 39     <dependency>
 40       <groupId>org.springframework</groupId>
 41       <artifactId>spring-context</artifactId>
 42       <version>4.3.6.RELEASE</version>
 43     </dependency>
 44 
 45 
 46     <!-- 3https://mvnrepository.com/artifact/org.springframework/spring-core -->
 47     <dependency>
 48       <groupId>org.springframework</groupId>
 49       <artifactId>spring-core</artifactId>
 50       <version>4.3.6.RELEASE</version>
 51     </dependency>
 52 
 53 
 54     <!--4 https://mvnrepository.com/artifact/org.springframework/spring-expression -->
 55     <dependency>
 56       <groupId>org.springframework</groupId>
 57       <artifactId>spring-expression</artifactId>
 58       <version>4.3.6.RELEASE</version>
 59     </dependency>
 60 
 61 
 62     <!--5 https://mvnrepository.com/artifact/org.springframework/spring-aop -->
 63     <dependency>
 64       <groupId>org.springframework</groupId>
 65       <artifactId>spring-aop</artifactId>
 66       <version>4.3.6.RELEASE</version>
 67     </dependency>
 68 
 69 
 70     <!--6 https://mvnrepository.com/artifact/aopalliance/aopalliance -->
 71     <dependency>
 72       <groupId>aopalliance</groupId>
 73       <artifactId>aopalliance</artifactId>
 74       <version>1.0</version>
 75     </dependency>
 76 
 77 
 78     <!--7 https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
 79     <dependency>
 80       <groupId>org.aspectj</groupId>
 81       <artifactId>aspectjweaver</artifactId>
 82       <version>1.8.10</version>
 83     </dependency>
 84 
 85 
 86     <!--8 https://mvnrepository.com/artifact/log4j/log4j -->
 87     <dependency>
 88       <groupId>log4j</groupId>
 89       <artifactId>log4j</artifactId>
 90       <version>1.2.17</version>
 91     </dependency>
 92 
 93 
 94     <!--9 https://mvnrepository.com/artifact/commons-logging/commons-logging -->
 95     <dependency>
 96       <groupId>commons-logging</groupId>
 97       <artifactId>commons-logging</artifactId>
 98       <version>1.2</version>
 99     </dependency>
100 
101 
102     <!--10 https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
103     <dependency>
104       <groupId>org.springframework</groupId>
105       <artifactId>spring-jdbc</artifactId>
106       <version>4.3.6.RELEASE</version>
107     </dependency>
108 
109 
110     <!--11 https://mvnrepository.com/artifact/org.springframework/spring-orm -->
111     <dependency>
112       <groupId>org.springframework</groupId>
113       <artifactId>spring-orm</artifactId>
114       <version>4.3.6.RELEASE</version>
115     </dependency>
116 
117 
118     <!--12 https://mvnrepository.com/artifact/org.springframework/spring-tx -->
119     <dependency>
120       <groupId>org.springframework</groupId>
121       <artifactId>spring-tx</artifactId>
122       <version>4.3.6.RELEASE</version>
123     </dependency>
124 
125 
126     <!--13 https://mvnrepository.com/artifact/org.springframework/spring-web -->
127     <dependency>
128       <groupId>org.springframework</groupId>
129       <artifactId>spring-web</artifactId>
130       <version>4.3.6.RELEASE</version>
131     </dependency>
132 
133 
134     <!--14 https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
135     <dependency>
136       <groupId>org.springframework</groupId>
137       <artifactId>spring-webmvc</artifactId>
138       <version>4.3.6.RELEASE</version>
139     </dependency>
140 
141 
142     <!--15 https://mvnrepository.com/artifact/org.mybatis/mybatis -->
143     <dependency>
144       <groupId>org.mybatis</groupId>
145       <artifactId>mybatis</artifactId>
146       <version>3.4.6</version>
147     </dependency>
148 
149 
150     <!--16 https://mvnrepository.com/artifact/MysqL/mysql-connector-java -->
151     <dependency>
152       <groupId>MysqL</groupId>
153       <artifactId>mysql-connector-java</artifactId>
154       <version>5.1.38</version>
155     </dependency>
156 
157 
158     <!--17 https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
159     <dependency>
160       <groupId>org.mybatis</groupId>
161       <artifactId>mybatis-spring</artifactId>
162       <version>1.3.2</version>
163     </dependency>
164 
165     <!--18 https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
166     <dependency>
167       <groupId>javax.servlet</groupId>
168       <artifactId>javax.servlet-api</artifactId>
169       <version>3.1.0</version>
170     </dependency>
171 
172     <!--19 https://mvnrepository.com/artifact/javax.servlet/jstl -->
173     <dependency>
174       <groupId>javax.servlet</groupId>
175       <artifactId>jstl</artifactId>
176       <version>1.2</version>
177     </dependency>
178 
179 
180     <!--20 https://mvnrepository.com/artifact/taglibs/standard -->
181     <dependency>
182       <groupId>taglibs</groupId>
183       <artifactId>standard</artifactId>
184       <version>1.1.2</version>
185     </dependency>
186 
187     <!--文件上传使用的jar-->
188     <!--21 https://mvnrepository.com/artifact/commons-io/commons-io -->
189     <dependency>
190       <groupId>commons-io</groupId>
191       <artifactId>commons-io</artifactId>
192       <version>2.4</version>
193     </dependency>
194     <!--22-->
195     <dependency>
196       <groupId>commons-fileupload</groupId>
197       <artifactId>commons-fileupload</artifactId>
198       <version>1.3.3</version>
199     </dependency>
200 
201     <!--23 下载ajax封装数据json格式交互的jar-->
202     <dependency>
203       <groupId>com.fasterxml.jackson.core</groupId>
204       <artifactId>jackson-databind</artifactId>
205       <version>2.9.6</version>
206     </dependency>
207 
208     <dependency>
209       <groupId>com.fasterxml.jackson.core</groupId>
210       <artifactId>jackson-core</artifactId>
211       <version>2.9.6</version>
212     </dependency>
213 
214     <dependency>
215       <groupId>com.fasterxml.jackson.core</groupId>
216       <artifactId>jackson-annotations</artifactId>
217       <version>2.9.6</version>
218     </dependency>
219 
220     <!--使用4的版本否则springmvc的xml-->
221     <dependency>
222       <groupId>com.github.pageHelper</groupId>
223       <artifactId>pageHelper</artifactId>
224       <version>4.1.6</version>
225     </dependency>
226   </dependencies>
227 
228 
229 </project>
pom.xml

3、在java目录下的com.pojo包下创建Scott.java持久化类

 1 package com.pojo;
 2 
 3 import org.springframework.stereotype.Component;
 4 
 5 import java.io.Serializable;
 6 
 7 /**
 8  * 多方引用一方对象
 9  */
10 @Component
11 public class Scott implements Serializable{
12   //多方所需字段
13   private Integer empno             ;
14   private String  ename           ;
15   private Double  sal         ;
16   private Integer deptno;
17   //一方所需字段
18   private String dname;
19 
20   public Scott() {
21   }
22 
23   public Scott(Integer empno, String ename, Double sal, Integer deptno, String dname) {
24     this.empno = empno;
25     this.ename = ename;
26     this.sal = sal;
27     this.deptno = deptno;
28     this.dname = dname;
29   }
30 
31   public Integer getEmpno() {
32     return empno;
33   }
34 
35   public void setEmpno(Integer empno) {
36     this.empno = empno;
37   }
38 
39   public String getEname() {
40     return ename;
41   }
42 
43   public void setEname(String ename) {
44     this.ename = ename;
45   }
46 
47   public Double getSal() {
48     return sal;
49   }
50 
51   public void setSal(Double sal) {
52     this.sal = sal;
53   }
54 
55   public Integer getDeptno() {
56     return deptno;
57   }
58 
59   public void setDeptno(Integer deptno) {
60     this.deptno = deptno;
61   }
62 
63   public String getDname() {
64     return dname;
65   }
66 
67   public void setDname(String dname) {
68     this.dname = dname;
69   }
70 
71   @Override
72   public String toString() {
73     return "Scott{" +
74             "empno=" + empno +
75             ", ename='" + ename + '\'' +
76             ", sal=" + sal +
77             ", deptno=" + deptno +
78             ", dname='" + dname + '\'' +
79             '}';
80   }
81 }
Scott.java

4、在java目录下的com.mapper包下创建ScottMapper.java映射接口

 1 package com.mapper;
 2 import com.pojo.Scott;
 3 import org.apache.ibatis.annotations.Delete;
 4 import org.apache.ibatis.annotations.Insert;
 5 import org.apache.ibatis.annotations.Select;
 6 import org.apache.ibatis.annotations.Update;
 7 import org.springframework.stereotype.Repository;
 8 
 9 import java.util.List;
10 @Repository
11 public interface ScottMapper {
12     @Select("select * from dept")
13     List<Scott> selectOneList();
14 
15     @Select("select d.dname,e.* from dept d,emp e where e.deptno=d.deptno")
16     List<Scott> selectAll();
17 
18     @Select("select d.dname,e.* from dept d,emp e where e.deptno=d.deptno and e.empno=#{primaryKey}")
19     Scott selectPrimaryKey(Integer primaryKey);
20 
21     @Select("select d.dname,e.* from dept d,emp e where e.deptno=d.deptno and e.deptno=#{foreignKey}")
22     List<Scott> selectForeign(Integer foreignKey);
23 
24     @Insert("insert into emp(empno,ename,sal,deptno) values(#{empno},#{ename},#{sal},#{deptno})")
25     int insertScott(Scott scott);
26 
27     @Update("update  emp set ename=#{ename},sal=#{sal},deptno=#{deptno} where  empno=#{empno}")
28     int updateScott(Scott scott);
29 
30     @Delete("delete from emp where empno=#{primaryKey}")
31     int deleteScott(Integer primaryKey);
32 }
ScottMapper.java

 

5、在java目录下的com.service包下创建业务层接口和实现类

 1 package com.service;
 2 
 3 import com.pojo.Scott;
 4 
 5 import java.util.List;
 6 
 7 public interface ScottService {
 8     List<Scott> downoption();
 9     List<Scott> show();
10     Scott info(Integer primaryKey);
11     List<Scott> optionCondition(Integer foreignKey);
12     int add(Scott emp);
13     int edit(Scott emp);
14     int del(Integer primaryKey);
15 }
ScottService.java

 1 package com.service;
 2 import com.mapper.ScottMapper;
 3 import com.pojo.Scott;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.stereotype.Service;
 6 
 7 import java.util.List;
 8 /*
 9 @Service的功能等同于代理对象在spring的xml文件中动态添加bean节点,
10 如果不指定名称,则底层代理在构建bean节点的时候id是类的第一个首字母小写
11 <bean id="empServiceImpl"/>
12 @Service(value = "empse")的功能等同于代理对象在spring的xml文件中动态添加id值为empse的bean节点
13 <bean id="empse"/>
14 */
15 @Service
16 public class ScottServiceImpl implements ScottService {
17     /*
18     @Autowired是spring的资源包下注解,按照对象的类型进行自动注入,
19     和对象名称无关,只要类型是匹配的,代理就会在你需要的时候给你注入对象值
20     @Resource是javax包下的注解,按照对象属性名进行注入,
21     和对象名称关系密切,如果对象名称不匹配,则不能完成注入,会报错
22     总结:相比而言,使用@Resource的出错记录更大,因此我们常规选择使用@Autowired
23      */
24     @Autowired
25     private ScottMapper scottMapper;
26 
27     @Override
28     public List<Scott> downoption() {
29         return scottMapper.selectOneList();
30     }
31 
32     @Override
33     public List<Scott> show() {
34         return scottMapper.selectAll();
35     }
36 
37     @Override
38     public Scott info(Integer primaryKey) {
39         return scottMapper.selectPrimaryKey(primaryKey);
40     }
41 
42     @Override
43     public List<Scott> optionCondition(Integer foreignKey) {
44         return scottMapper.selectForeign(foreignKey);
45     }
46 
47     @Override
48     public int del(Integer primaryKey) {
49         return scottMapper.deleteScott(primaryKey);
50     }
51 
52     @Override
53     public int add(Scott scott) {
54         return scottMapper.insertScott(scott);
55     }
56 
57     @Override
58     public int edit(Scott scott) {
59         return scottMapper.updateScott(scott);
60     }
61 }
ScottServiceImpl.java

6、在java目录下的com.controller包下创建控制类CenterController.java

 1 package com.controller;
 2 import com.pojo.Scott;
 3 import com.service.ScottService;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.stereotype.Controller;
 6 import org.springframework.ui.Model;
 7 import org.springframework.web.bind.annotation.RequestMapping;
 8 import org.springframework.web.bind.annotation.ResponseBody;
 9 
10 import javax.servlet.http.HttpSession;
11 import java.util.HashMap;
12 import java.util.List;
13 import java.util.Map;
14 @Controller
15 public class CenterController {
16     @Autowired
17     private ScottService scottService;
18 
19     @RequestMapping("/option.do")
20     public String optionData(HttpSession session){
21         List<Scott> deptlist=scottService.downoption();
22         session.setAttribute("deptlist",deptlist);
23         return "redirect:/main.jsp";
24     }
25 
26     @RequestMapping("/show.do")
27     @ResponseBody
28     public Map<String,Object> showData(Integer foreignKey){
29         Map<String,Object> map=new HashMap<String,Object>();
30         List<Scott> emplist=null;
31         //根据部门编号条件查询
32         if(foreignKey!=-1){
33             emplist=scottService.optionCondition(foreignKey);
34         }else{  //查询所有
35             emplist=scottService.show();
36         }
37         map.put("emplist",emplist);
38         return map;
39     }
40 
41 
42     @RequestMapping("/info.do")
43     public String info(Integer primaryKey, Model model){
44         Scott emp=scottService.info(primaryKey);
45         model.addAttribute("emp2",emp);
46         return "/edit.jsp";
47     }
48 
49 
50     @RequestMapping("/edit.do")
51     public String edit(Scott emp){
52         //根据主键编号查询只有一条数据
53         System.out.println(scottService.edit(emp)>0?"edit success":"edit fail");;
54         //使用重定向跳转
55         return "redirect:/main.jsp";
56     }
57 
58     @RequestMapping("/add.do")
59     public String add(Scott emp){
60         //根据主键编号查询只有一条数据
61         System.out.println(scottService.add(emp)>0?"add success":"add fail");;
62         //使用重定向跳转
63         return "redirect:/main.jsp";
64     }
65 
66     @RequestMapping("/del.do")
67     public String del(Integer primaryKey){
68         //根据主键编号查询只有一条数据
69         System.out.println(scottService.del(primaryKey)>0?"del success":"del fail");;
70         //使用重定向跳转
71         return "redirect:/main.jsp";
72     }
73 }
CenterController.java

7、在resouces目录下创建log4j.properties日志文件

 1 log4j.rootLogger=DEBUG, Console  
 2 #Console  
 3 log4j.appender.Console=org.apache.log4j.ConsoleAppender  
 4 log4j.appender.Console.layout=org.apache.log4j.PatternLayout  
 5 log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n  
 6 
 7 log4j.logger.org.apache=INFO  
 8 log4j.logger.java.sql.ResultSet=INFO  
 9 log4j.logger.java.sql.Connection=DEBUG  
10 log4j.logger.java.sql.Statement=DEBUG  
11 log4j.logger.java.sql.PreparedStatement=DEBUG   
log4j.properties

8、在webapp目录下的WEB-INF文件夹下创建springmvc-servlet.xml核心配置文件,和web.xml文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:aop="http://www.springframework.org/schema/aop"
 5        xmlns:context="http://www.springframework.org/schema/context"
 6        xmlns:tx="http://www.springframework.org/schema/tx"
 7        xmlns:mvc="http://www.springframework.org/schema/mvc"
 8        xsi:schemaLocation="http://www.springframework.org/schema/beans
 9        http://www.springframework.org/schema/beans/spring-beans.xsd
10        http://www.springframework.org/schema/aop
11        http://www.springframework.org/schema/aop/spring-aop.xsd
12        http://www.springframework.org/schema/context
13        http://www.springframework.org/schema/context/spring-context.xsd
14        http://www.springframework.org/schema/tx
15        http://www.springframework.org/schema/tx/spring-tx.xsd
16        http://www.springframework.org/schema/mvc
17        http://www.springframework.org/schema/mvc/spring-mvc.xsd
18 ">
19    <!--1.mvc注解驱动-->
20     <mvc:annotation-driven/>
21     <!--2.全局扫描包-->
22     <context:component-scan base-package="com"/>
23     <!--3.驱动管理数据源-->
24     <bean id="dataSource">
25         <property name="driverClassName" value="com.MysqL.jdbc.Driver"/>
26         <property name="url" value="jdbc:MysqL://localhost:3306/ar"/>
27         <property name="username" value="root"/>
28         <property name="password" value="123456"/>
29     </bean>
30     <!--4.数据源事务管理-->
31     <bean id="transactionManager">
32          <property name="dataSource" ref="dataSource"/>
33     </bean>
34     <!--5.事务注解驱动-->
35     <tx:annotation-driven transaction-manager="transactionManager"/>
36     <!--6.sqlsessionfacotrybean-->
37     <bean id="sqlSessionFactory"https://www.jb51.cc/tag/sql/" target="_blank">sqlSessionfactorybean">
38         <property name="dataSource" ref="dataSource"/>
39     </bean>
40     <!--7.映射扫描参数-->
41     <beanhttps://www.jb51.cc/tag/fig/" target="_blank">figurer">
42         <property name="basePackage" value="com.mapper"/>
43     </bean>
44 </beans>
springmvc-servlet.xml

 1 <!DOCTYPE web-app PUBLIC
 2  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 3  "http://java.sun.com/dtd/web-app_2_3.dtd" >
 4 
 5 <web-app>
 6    <filter>
 7      <filter-name>Character</filter-name>
 8      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
 9      <init-param>
10        <param-name>encoding</param-name>
11        <param-value>UTF-8</param-value>
12      </init-param>
13    </filter>
14   <filter-mapping>
15     <filter-name>Character</filter-name>
16     <url-pattern>/*</url-pattern>
17   </filter-mapping>
18   <servlet>
19     <servlet-name>springmvc</servlet-name>
20     <servlet-class>org.springframework.web.servlet.dispatcherServlet</servlet-class>
21   </servlet>
22   <servlet-mapping>
23     <servlet-name>springmvc</servlet-name>
24     <url-pattern>*.do</url-pattern>
25   </servlet-mapping>
26   <welcome-file-list>
27     <welcome-file>option.do</welcome-file>
28   </welcome-file-list>
29 </web-app>
web.xml

10、在webapp目录下创建js目录,且将jquery的库文件jquery-1.8.3.js拷贝进去

11、在webapp目录下创建main.jsp文件

 1 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 2 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 3 <%@ page isELIgnored="false" %>
 4 <html>
 5 <head>
 6     <title>首页</title>
 7     <script type="text/javascript" src="js/jquery-1.8.3.js"></script>
 8     <script type="text/javascript" src="js/show.js"></script>
 9 </head>
10 <body>
11    <a href="add.jsp">添加</a>
12     <p>
13          <span>部门:</span>
14         <select name="foreignKey">
15             <option value="-1">--请选择--</option>
16             <c:forEach var="i" items="${deptlist}">
17                   <option value="${i.deptno}">${i.dname}</option>
18             </c:forEach>
19         </select>
20         <input type="button" value="查询">
21     </p>
22     <table></table>
23 </body>
24 </html>
main.jsp

12、在webapp目录的js目录下创建show.js文件

 1 $(function () {
 2     //初始化查询所有
 3     initData(-1);
 4     //下拉列表条件查
 5     $("[type=button]").click(function () {
 6         var foreignKey=$("[name=foreignKey]").val();
 7         initData(foreignKey)
 8     });
 9 
10 });
11 
12 function initData(foreignKey) {
13    $.ajax({
14        url:"show.do",
15        type:"post",
16        dataType:"json",
17        data:{"foreignKey":foreignKey},
18        async:true,
19        success:function (obj) {
20            //将值打印在控制台
21            console.log(obj);
22            //为了防止频繁发送请求重复拼接问题,因此在拼接数据之前,先清楚原有的数据内容
23            $("table").html(" ");
24            var str=" <tr>";
25               str+="     <th>员工编号</th>";
26               str+="     <th>员工姓名</th>";
27               str+="     <th>员工工资</th>";
28               str+="     <th>部门名称</th>";
29               str+="     <th>操作</th>";
30               str+=" </tr>";
31            for(var i=0;i<obj.emplist.length;i++){
32                str+="<tr>";
33                str+="<td>"+obj.emplist[i].empno     +"</td>";
34                str+="<td>"+obj.emplist[i].ename     +"</td>";
35                str+="<td>"+obj.emplist[i].sal       +"</td>";
36                str+="<td>"+obj.emplist[i].dname+"</td>";
37                str+="<td>" +
38                    "<a href='info.do?primaryKey="+obj.emplist[i].empno+"'>修改</a>" +
39                    "|" +
40                    "<a href='del.do?primaryKey="+obj.emplist[i].empno+"'>删除</a>" +
41                    "</td>";
42                str+="</tr>";
43            }
44            $("table").append(str);
45        },
46        error:function () {
47            alert("get data error");
48        }
49    });
50 }
show.js

13、在webapp目录下创建add.jsp文件

 1 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 2 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 3 <%@ page isELIgnored="false" %>
 4 <html>
 5 <head>
 6     <title>添加信息</title>
 7 </head>
 8 <body>
 9    <fieldset>
10        <legend>添加员工信息</legend>
11        <form action="add.do" method="post">
12            <table>
13                <tr>
14                    <th>部门名称:</th>
15                    <td>
16                        <select name="dept.deptno">
17                            <option value="-1">--请选择--</option>
18                            <c:forEach var="i" items="${deptlist}">
19                                <option value="${i.deptno}">${i.dname}</option>
20                            </c:forEach>
21                        </select>
22                    </td>
23                </tr>
24                <tr>
25                    <th>员工编号:</th>
26                    <td><input type="text" name="empno"/></td>
27                </tr>
28                <tr>
29                    <th>员工姓名:</th>
30                    <td><input type="text" name="ename" /></td>
31                </tr>
32                <tr>
33                    <th>员工薪资:</th>
34                    <td><input type="text" name="sal" /></td>
35                </tr>
36                <tr>
37                    <td colspan="2" align="center">
38                        <input type="submit" value="提交"/>
39                        <input type="reset" value="重置"/>
40                    </td>
41                </tr>
42            </table>
43        </form>
44    </fieldset>
45 </body>
46 </html>
add.jsp

14、在webapp目录下创建edit.jsp文件

 1 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 2 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 3 <%@ page isELIgnored="false" %>
 4 <html>
 5 <head>
 6     <title>编辑信息</title>
 7 </head>
 8 <body>
 9    <fieldset>
10        <legend>编辑员工信息</legend>
11        <form action="edit.do?empno=${emp2.empno}" method="post">
12            <table>
13                <tr>
14                    <th>部门名称:</th>
15                    <td>
16                        <select name="dept.deptno">
17                            <option value="-1">--请选择--</option>
18                            <c:forEach var="i" items="${deptlist}">
19                                <c:choose>
20                                    <c:when test="${emp2.dept.deptno eq i.deptno}">
21                                        <option value="${i.deptno}" selected="selected">${i.dname}</option>
22                                    </c:when>
23                                    <c:otherwise>
24                                        <option value="${i.deptno}">${i.dname}</option>
25                                    </c:otherwise>
26                                </c:choose>
27                            </c:forEach>
28                        </select>
29                    </td>
30                </tr>
31                <tr>
32                    <th>员工姓名:</th>
33                    <td><input type="text" name="ename" value="${emp2.ename}"/></td>
34                </tr>
35                <tr>
36                    <th>员工薪资:</th>
37                    <td><input type="text" name="sal" value="${emp2.sal}"/></td>
38                </tr>
39                <tr>
40                    <td colspan="2" align="center">
41                        <input type="submit" value="提交"/>
42                        <input type="reset" value="重置"/>
43                    </td>
44                </tr>
45            </table>
46        </form>
47    </fieldset>
48 
49 </body>
50 </html>
edit.jsp

15、部署启动运行

 此文章为原创,转载请注明出处!需要本案例源码,理论讲解视频,代码操作视频的,请私信联系作者!

 

Maven 工程搭建 spring boot+spring mvc+JPA

Maven 工程搭建 spring boot+spring mvc+JPA

添加 Spring boot 支持,引入相关包:

1、maven 工程,少不了 pom.xml,spring boot 的引入可参考官网:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
   </parent>
  
  <dependencies>
  
     <dependency>  
        <groupId>javax.servlet</groupId>  
        <artifactId>javax.servlet-api</artifactId>  
        <scope>provided</scope><!-- 编译需要而发布不需要的jar包 -->  
    </dependency>  
    
     <dependency>  
      <groupId>org.springframework</groupId>  
      <artifactId>spring-webmvc</artifactId>  
    </dependency>  
    
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

            <!--jpa的jar包 ,操作数据库的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
         <dependency>  
            <groupId>org.apache.shiro</groupId>  
            <artifactId>shiro-core</artifactId>  
            <version>1.2.2</version>  
        </dependency> 
       <dependency>
           <groupId>org.apache.shiro</groupId>
           <artifactId>shiro-spring</artifactId>
           <version>1.2.2</version>
       </dependency>
        <!-- shiro ehcache -->
       <dependency>
           <groupId>org.apache.shiro</groupId>
           <artifactId>shiro-ehcache</artifactId>
           <version>1.2.2</version>
       </dependency>
  </dependencies>
  <build>
  
    <plugins>
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <executions>
            <execution>
              <goals>
                <goal>repackage</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
     </plugins>
    <finalName>name</finalName>
  </build>

2、以上代码引入了 spring boot。spring mvc 和 jpa,以及 mysql 数据库的驱动 jar;

编写启动类,并加装配置文件:

1、启动类如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import java.io.IOException;
import com.my.config.CommonProperties;

@SpringBootApplication
@EnableAutoConfiguration
@EnableJpaAuditing
public class Application {

    public static void main(String[] args) throws IOException{
        
        String loc = CommonProperties.loadProperties2System(System.getProperty("spring.config.location"));
        System.getProperties().setProperty("application.version", CommonProperties.getVersion(Application.class));
        System.getProperties().setProperty("app.home", loc + "/..");
        SpringApplication.run(Application.class, args);
        
    }
    
}

2、配置文件的位置放到 classpath 外边,方便在不重新打包的情况下修改,spring boot 工程一般都打成 jar 包:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import org.springframework.util.StringUtils;

public final class CommonProperties {
    
    public static final String PPT_KEY_APP_HOME = "app.home";
    public static final String DEFAULT_APP_HOME = "./";

    public static final String getAppHome() {
        return System.getProperty("./", "./");
    }

    public static String loadProperties2System(String location) throws IOException {
        String configLocation = location;
        File cnf;
        if (!StringUtils.hasLength(location)) {
            configLocation = "./config";
            cnf = new File(configLocation);
            if (!cnf.exists() || !cnf.isDirectory()) {
                configLocation = "../config";
                cnf = new File(configLocation);
            }
        } else {
            cnf = new File(location);
        }

        File[] arg2 = cnf.listFiles();
        int arg3 = arg2.length;

        for (int arg4 = 0; arg4 < arg3; ++arg4) {
            File file = arg2[arg4];
            if (file.isFile() && file.getName().endsWith(".properties")) {
                Properties ppt = new Properties();
                FileInputStream fi = new FileInputStream(file);
                Throwable arg8 = null;

                try {
                    ppt.load(fi);
                    System.getProperties().putAll(ppt);
                } catch (Throwable arg17) {
                    arg8 = arg17;
                    throw arg17;
                } finally {
                    if (fi != null) {
                        if (arg8 != null) {
                            try {
                                fi.close();
                            } catch (Throwable arg16) {
                                arg8.addSuppressed(arg16);
                            }
                        } else {
                            fi.close();
                        }
                    }

                }
            }
        }

        return configLocation;
    }

    public static String getVersion(Class<?> clazz) {
        Package pkg = clazz.getPackage();
        String ver = pkg != null ? pkg.getImplementationVersion() : "undefined";
        return ver == null ? "undefined" : ver;
    }
CommonProperties.java

将配置文件放到 jar 包同级目录的 config 文件夹下,包括日志配置,application.yml 文件,其他配置文件等

编写自动配置类

用于扫描 compan* , 代替 spring mvc 的 spring.xml 配置文件:

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = {
        "com.my.rs",
        "com.my.service",
        "com.my.repository"})
public class AppAutoConfiguration {

}


import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * 预配置
 * */
@Configuration
public class MyConfiguration extends WebMvcConfigurerAdapter{

    @Bean
    public HttpMessageConverters customConverters() {
        return new HttpMessageConverters();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //registry.addResourceHandler("/**")
         //       .addResourceLocations("classpath:/META-INF/resources/**");
    }
    

编写 rs,service,repository

package com.my.rs;

import java.util.List;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.my.entity.User;

@RequestMapping({"/api/user"})
public interface UserRS {
    
    @RequestMapping(value="/add",method={RequestMethod.POST})
    @ResponseBody
    public User saveUser(@RequestBody User user);
    
    @RequestMapping(value="/update",method={RequestMethod.POST})
    @ResponseBody
    public User updateUser(@RequestBody User user);
    
    @RequestMapping(value="/delete",method={RequestMethod.POST,RequestMethod.DELETE})
    public void deleteUser(@RequestParam String[] userIds);
    
    @RequestMapping(value="/get",method={RequestMethod.GET})
    @ResponseBody
    public User getUser(@RequestParam String userId);
    
    @RequestMapping(value="/query/all",method={RequestMethod.GET})
    public List<User> queryAll();
    
    @RequestMapping(value="/query/byName",method={RequestMethod.GET})
    public List<User> queryByName(@RequestParam String name);
    
    @RequestMapping(value="/query/byParentId",method={RequestMethod.GET})
    public List<User> queryChildren(@RequestParam String parentId);
    
    //无参数分页查询
    @RequestMapping(value="/query/page",method={RequestMethod.GET})
    public List<User> queryByPage(@RequestParam int pageNo,
            @RequestParam int pageSize,
            @RequestBody(required=false) User user);
}
UserRS.java
package com.my.rs.impl;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.my.entity.User;
import com.my.rs.UserRS;
import com.my.service.UserService;

@RestController
public class UserRSImpl implements UserRS{

    public static Logger logger = LoggerFactory.getLogger(UserRSImpl.class);
    
    @Autowired
    UserService _userService;
    
    @Override
    public User saveUser(@RequestBody User user){
        try {
            return _userService.save(user);
        } catch (Throwable e) {
            logger.error(e.getMessage(),e);
            throw e;
        }
    }

    @Override
    public User updateUser(@RequestBody User user) {
        return _userService.update(user);
    }

    @Override
    public void deleteUser(String[] userIds) {
        for (String userId : userIds) {
            _userService.deleteById(userId);
        }
    }

    @Override
    public List<User> queryAll() {
        return _userService.queryAll();
    }

    @Override
    public List<User> queryByName(String name) {
        return _userService.findByName(name);
    }

    @Override
    public List<User> queryChildren(String parentId) {
        return _userService.findByParentId(parentId);
    }

    @Override
    public User getUser(String userId) {
        return _userService.findById(userId);
    }

    @Override
    public List<User> queryByPage(int pageNo, int pageSize, User user) {
        
        return null;
    }
    
}
UserRSImpl .java
package com.my.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.my.entity.User;
import com.my.repository.UserRepository;

@Service
public class UserService extends BaseService<User>{

    @Autowired
    UserRepository _userRepository;
    
    public List<User> findByName(String name){
        return _userRepository.findByName(name);
    }
    
    public List<User> findByParentId(String parentId){
        return _userRepository.findByParentId(parentId);
    }
    
}
UserService.java
package com.my.repository;

import java.util.List;

import com.my.entity.User;

public interface UserRepository extends BaseRepository<User>{
    
    List<User> findByName(String name);

    List<User> findByParentId(String parentId);
}

 

以上采用了分层模式,有点繁琐,但是对之后修改每层的业务逻辑比较方便

JPA 相关的类如下:

package com.my.service;

import java.io.Serializable;

import javax.persistence.EntityManager;
import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;

import com.my.repository.BaseRepository;


/**
 * 一些共有的方法放这里
 * */
@Transactional
public class BaseService<E extends Serializable> {

    @Autowired
    BaseRepository<E> _baseRepository;
    
    @Autowired
    EntityManager em;

    public E save(E baseUnit){
        return _baseRepository.saveAndFlush(baseUnit);
    }
    
    public E update(E baseUnit){
        return _baseRepository.saveAndFlush(baseUnit);
    }
    
    public void deleteById(String id) {
        _baseRepository.delete(id);
    }
    
    public java.util.List<E> queryAll(){
        return _baseRepository.findAll();
    }
    
    public E findById(String id){
        return _baseRepository.getOne(id);
    }
}
package com.my.repository;

import java.io.Serializable;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;

@NoRepositoryBean
public interface BaseRepository<E> extends JpaRepository<E, Serializable>{

}

实体类:与数据库字段相关,需要注意下父类中的注解 @MappedSuperclass

package com.my.entity;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.ManyToMany;

import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.validator.constraints.Email;

@Entity(name = "db_user")
@DynamicInsert
@DynamicUpdate
public class User extends BaseUnit {

    /**
     * 账户状态
     */
    public static enum AccountStatus {
        /**
         * 正常
         */
        Enable, //
        /**
         * 停用
         */
        Disable
    }

    private static final long serialVersionUID = -3101319619397064425L;

    private String password;

    private String salt;

    /** 账户状态 */
    private AccountStatus status;

    /** 认证邮箱 */
    @Email(message = "User.email属性必须符合邮箱格式")
    private String email;

    /** 移动电话号码 */
    private String mobileNo;


    /** 身份证号码 */
    private String cardId;
    
    @ManyToMany(targetEntity=Role.class)
    private List<String> roleIds;

    /** 昵称。可选。 */
    private String nickName;

    public String getCardId() {
        return cardId;
    }

    public String getEmail() {
        return email;
    }


    public String getMobileNo() {
        return mobileNo;
    }

    public String getNickName() {
        return nickName;
    }

    public String getPassword() {
        return password;
    }

    public List<String> getRoleIds() {
        if (roleIds == null) {
            roleIds = new ArrayList<>();
        }
        return roleIds;
    }

    public String getSalt() {
        return salt;
    }

    public AccountStatus getStatus() {
        return status;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setMobileNo(String mobileNo) {
        this.mobileNo = mobileNo;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setRoleIds(List<String> roleIds) {
        this.roleIds = roleIds;
    }

    public void setSalt(String salt) {
        this.salt = salt;
    }

    public void setStatus(AccountStatus status) {
        this.status = status;
    }

}
User.java
package com.my.entity;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;

@MappedSuperclass
public class BaseUnit implements Serializable {



    @Id
    @NotNull
    public String id;
    /**
     * 父单元ID
     */
    @Size(max = 32, message = "BaseUnit.parentId属性长度不能大于32")
    public String parentId;

    /** 父单元的类型 */
    public ParentType parentType;

    /**
     * 单元的名称
     */
    @NotNull(message = "BaseUnit.name属性不能为空")
    public String name;

    @CreatedBy
    public String createBy;
    
    @CreatedDate
    public Date createDate;
    
    @LastModifiedBy
    public String lastModifiedBy;        
    
    /**
     * 最后更新日期
     */
    @LastModifiedDate
    public Date lastModifiedDate;
    
    

    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }

    /**
     * 获取单元的名称
     * 
     * @return 必填
     */
    public String getName() {
        return name;
    }

    /**
     * 
     * 
     * @return UUID,不含{}和-
     */
    public String getParentId() {
        return parentId;
    }

    public ParentType getParentType() {
        return parentType;
    }

    public String getStationId() {
        return stationId;
    }

    public String getThumbnailId() {
        return thumbnailId;
    }

    public String getCreateBy() {
        return createBy;
    }

    public void setCreateBy(String createBy) {
        this.createBy = createBy;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
    /**
     * 设置单元的名称
     * 
     * @param name
     *            必填
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 设置父单元ID
     * 
     * @param parentId
     *            UUID,不含{}和-
     */
    public void setParentId(String parentId) {
        this.parentId = parentId;
    }

    public String getLastModifiedBy() {
        return lastModifiedBy;
    }

    public void setLastModifiedBy(String lastModifiedBy) {
        this.lastModifiedBy = lastModifiedBy;
    }

    public Date getLastModifiedDate() {
        return lastModifiedDate;
    }

    public void setLastModifiedDate(Date lastModifiedDate) {
        this.lastModifiedDate = lastModifiedDate;
    }
}

配置文件:

server:
  port: 16800
  contextPath: /
  
logging:
  config: ./config/logback.xml
  
spring:
  http:
    multipart:
      enabled: false
  datasource:  
    url : jdbc:mysql://127.0.0.1:3306/db?useUnicode=true&characterEncoding=utf-8 
    username : root  
    password : 123456  
    driverClassName : com.mysql.jdbc.Driver  
  jpa:  
    database : MYSQL  
    show-sql : true  
    hibernate:  
      ddl-auto : update
  jackson:
    serialization:
      INDENT_OUTPUT : true
#hibernate:配置了实体类维护数据库表结构的具体行为,update表示当实体类的属性发生变化时,表结构跟着更新,
这里我们也可以取值create,这个create表示启动的时候删除上一次生成的表,并根据实体类重新生成表,
这个时候之前表中的数据就会被清空;还可以取值create-drop,这个表示启动时根据实体类生成表,但是当sessionFactory关闭的时候表会被删除;
validate表示启动时验证实体类和数据表是否一致;none表示啥都不做。 #show
-sql表示hibernate在操作的时候在控制台打印真实的sql语句 #jackson表示格式化输出的json字符串

 

Maven工程搭建spring boot+spring mvc+JPA的示例

Maven工程搭建spring boot+spring mvc+JPA的示例

本文介绍了Maven工程搭建spring boot+spring mvc+JPA的示例,分享给大家,具体如下:

添加Spring boot支持,引入相关包:

1、maven工程,少不了pom.xml,spring boot的引入可参考官网:

 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>1.5.9.RELEASE</version>
 </parent>
 
 <dependencies>
 
 <dependency> 
 <groupId>javax.servlet</groupId> 
 <artifactId>javax.servlet-api</artifactId> 
 <scope>provided</scope><!-- 编译需要而发布不需要的jar包 --> 
 </dependency> 
 
 <dependency> 
 <groupId>org.springframework</groupId> 
 <artifactId>spring-webmvc</artifactId> 
 </dependency> 
 
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>

 <!--jpa的jar包 ,操作数据库的-->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-jpa</artifactId>
 </dependency>
 
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>
 
 <!--MysqL驱动-->
 <dependency>
 <groupId>MysqL</groupId>
 <artifactId>mysql-connector-java</artifactId>
 </dependency>
 <dependency> 
 <groupId>org.apache.shiro</groupId> 
 <artifactId>shiro-core</artifactId> 
 <version>1.2.2</version> 
 </dependency> 
 <dependency>
 <groupId>org.apache.shiro</groupId>
 <artifactId>shiro-spring</artifactId>
 <version>1.2.2</version>
 </dependency>
 <!-- shiro ehcache -->
 <dependency>
 <groupId>org.apache.shiro</groupId>
 <artifactId>shiro-ehcache</artifactId>
 <version>1.2.2</version>
 </dependency>
 </dependencies>
 <build>
 
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 <executions>
 <execution>
 <goals>
 <goal>repackage</goal>
 </goals>
 </execution>
 </executions>
 </plugin>
 </plugins>
 <finalName>name</finalName>
 </build>

2、以上代码引入了spring boot。spring mvc 和jpa,以及MysqL数据库的驱动jar;

编写启动类,并加装配置文件:

1、启动类如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import java.io.IOException;
import com.my.config.CommonProperties;
@SpringBootApplication
@EnableAutoConfiguration
@EnableJpaAuditing
public class Application {
 public static void main(String[] args) throws IOException{ 
 String loc = CommonProperties.loadProperties2System(System.getProperty("spring.config.location"));
 System.getProperties().setProperty("application.version",CommonProperties.getVersion(Application.class));
 System.getProperties().setProperty("app.home",loc + "/..");
 SpringApplication.run(Application.class,args); 
 } 
}

2、配置文件的位置放到classpath外边,方便在不重新打包的情况下修改,spring boot工程一般都打成jar包:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import org.springframework.util.StringUtils;

public final class CommonProperties {
 
 public static final String PPT_KEY_APP_HOME = "app.home";
 public static final String DEFAULT_APP_HOME = "./";

 public static final String getAppHome() {
 return System.getProperty("./","./");
 }

 public static String loadProperties2System(String location) throws IOException {
 String configLocation = location;
 File cnf;
 if (!StringUtils.hasLength(location)) {
 configLocation = "./config";
 cnf = new File(configLocation);
 if (!cnf.exists() || !cnf.isDirectory()) {
 configLocation = "../config";
 cnf = new File(configLocation);
 }
 } else {
 cnf = new File(location);
 }

 File[] arg2 = cnf.listFiles();
 int arg3 = arg2.length;

 for (int arg4 = 0; arg4 < arg3; ++arg4) {
 File file = arg2[arg4];
 if (file.isFile() && file.getName().endsWith(".properties")) {
 Properties ppt = new Properties();
 FileInputStream fi = new FileInputStream(file);
 Throwable arg8 = null;

 try {
  ppt.load(fi);
  System.getProperties().putAll(ppt);
 } catch (Throwable arg17) {
  arg8 = arg17;
  throw arg17;
 } finally {
  if (fi != null) {
  if (arg8 != null) {
  try {
  fi.close();
  } catch (Throwable arg16) {
  arg8.addSuppressed(arg16);
  }
  } else {
  fi.close();
  }
  }

 }
 }
 }

 return configLocation;
 }

 public static String getVersion(Class<?> clazz) {
 Package pkg = clazz.getPackage();
 String ver = pkg != null ? pkg.getImplementationVersion() : "undefined";
 return ver == null ? "undefined" : ver;
 }

将配置文件放到jar包同级目录的config文件夹下,包括日志配置,application.yml文件,其他配置文件等;

编写自动配置类

用于扫描compan*,代替spring mvc的spring.xml配置文件:

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = {
 "com.my.rs","com.my.service","com.my.repository"})
public class AppAutoConfiguration {

}

import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * 预配置
 * */
@Configuration
public class MyConfiguration extends WebMvcConfigurerAdapter{

 @Bean
 public HttpMessageConverters customConverters() {
 return new HttpMessageConverters();
 }

 @Override
 public void addResourceHandlers(ResourceHandlerRegistry registry) {
 //registry.addResourceHandler("/**")
 // .addResourceLocations("classpath:/meta-inf/resources/**");
 }

编写rs,service,repository

package com.my.rs;
import java.util.List;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.my.entity.User;

@RequestMapping({"/api/user"})
public interface UserRS {
 
 @RequestMapping(value="/add",method={RequestMethod.POST})
 @ResponseBody
 public User saveUser(@RequestBody User user);
 
 @RequestMapping(value="/update",method={RequestMethod.POST})
 @ResponseBody
 public User updateUser(@RequestBody User user);
 
 @RequestMapping(value="/delete",method={RequestMethod.POST,RequestMethod.DELETE})
 public void deleteUser(@RequestParam String[] userIds);
 
 @RequestMapping(value="/get",method={RequestMethod.GET})
 @ResponseBody
 public User getUser(@RequestParam String userId);
 
 @RequestMapping(value="/query/all",method={RequestMethod.GET})
 public List<User> queryAll();
 
 @RequestMapping(value="/query/byName",method={RequestMethod.GET})
 public List<User> queryByName(@RequestParam String name);
 
 @RequestMapping(value="/query/byParentId",method={RequestMethod.GET})
 public List<User> queryChildren(@RequestParam String parentId);
 //无参数分页查询
 @RequestMapping(value="/query/page",method={RequestMethod.GET})
 public List<User> queryByPage(@RequestParam int pageNo,@RequestParam int pageSize,@RequestBody(required=false) User user);
}
package com.my.rs.impl;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.my.entity.User;
import com.my.rs.UserRS;
import com.my.service.UserService;

@RestController
public class UserRSImpl implements UserRS{

 public static Logger logger = LoggerFactory.getLogger(UserRSImpl.class);
 
 @Autowired
 UserService _userService;
 
 @Override
 public User saveUser(@RequestBody User user){
 try {
 return _userService.save(user);
 } catch (Throwable e) {
 logger.error(e.getMessage(),e);
 throw e;
 }
 }

 @Override
 public User updateUser(@RequestBody User user) {
 return _userService.update(user);
 }

 @Override
 public void deleteUser(String[] userIds) {
 for (String userId : userIds) {
 _userService.deleteById(userId);
 }
 }

 @Override
 public List<User> queryAll() {
 return _userService.queryAll();
 }

 @Override
 public List<User> queryByName(String name) {
 return _userService.findByName(name);
 }

 @Override
 public List<User> queryChildren(String parentId) {
 return _userService.findByParentId(parentId);
 }

 @Override
 public User getUser(String userId) {
 return _userService.findById(userId);
 }

 @Override
 public List<User> queryByPage(int pageNo,int pageSize,User user) {
 
 return null;
 }
 
}

package com.my.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.my.entity.User;
import com.my.repository.UserRepository;

@Service
public class UserService extends BaseService<User>{

 @Autowired
 UserRepository _userRepository;
 public List<User> findByName(String name){
 return _userRepository.findByName(name);
 }
 
 public List<User> findByParentId(String parentId){
 return _userRepository.findByParentId(parentId);
 } 
}

package com.my.repository;
import java.util.List;
import com.my.entity.User;
public interface UserRepository extends BaseRepository<User>{ 
 List<User> findByName(String name);
 List<User> findByParentId(String parentId);
}

以上采用了分层模式,有点繁琐,但是对之后修改每层的业务逻辑比较方便

JPA相关的类如下:

package com.my.service;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import com.my.repository.BaseRepository;


/**
 * 一些共有的方法放这里
 * */
@Transactional
public class BaseService<E extends Serializable> {

 @Autowired
 BaseRepository<E> _baseRepository;
 
 @Autowired
 EntityManager em;

 public E save(E baseUnit){
 return _baseRepository.saveAndFlush(baseUnit);
 }
 
 public E update(E baseUnit){
 return _baseRepository.saveAndFlush(baseUnit);
 }
 
 public void deleteById(String id) {
 _baseRepository.delete(id);
 }
 
 public java.util.List<E> queryAll(){
 return _baseRepository.findAll();
 }
 
 public E findById(String id){
 return _baseRepository.getone(id);
 }
}

package com.my.repository;
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.norepositoryBean;
@norepositoryBean
public interface BaseRepository<E> extends JpaRepository<E,Serializable>{
}

实体类:与数据库字段相关,需要注意下父类中的注解@MappedSuperclass

package com.my.entity;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.ManyToMany;

import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.validator.constraints.Email;

@Entity(name = "db_user")
@DynamicInsert
@DynamicUpdate
public class User extends BaseUnit {

 /**
 * 账户状态
 */
 public static enum AccountStatus {
 /**
 * 正常
 */
 Enable,//
 /**
 * 停用
 */
 disable
 }

 private static final long serialVersionUID = -3101319619397064425L;
 private String password;
 private String salt;
 /** 账户状态 */
 private AccountStatus status;

 /** 认证邮箱 */
 @Email(message = "User.email属性必须符合邮箱格式")
 private String email;

 /** 移动电话号码 */
 private String mobileNo;


 /** 身份证号码 */
 private String cardId;
 
 @ManyToMany(targetEntity=Role.class)
 private List<String> roleIds;

 /** 昵称。可选。 */
 private String nickName;

 public String getCardId() {
 return cardId;
 }

 public String getEmail() {
 return email;
 }


 public String getMobileNo() {
 return mobileNo;
 }

 public String getNickName() {
 return nickName;
 }

 public String getpassword() {
 return password;
 }

 public List<String> getRoleIds() {
 if (roleIds == null) {
 roleIds = new ArrayList<>();
 }
 return roleIds;
 }

 public String getSalt() {
 return salt;
 }

 public AccountStatus getStatus() {
 return status;
 }

 public void setCardId(String cardId) {
 this.cardId = cardId;
 }

 public void setEmail(String email) {
 this.email = email;
 }

 public void setMobileNo(String mobileNo) {
 this.mobileNo = mobileNo;
 }

 public void setNickName(String nickName) {
 this.nickName = nickName;
 }

 public void setPassword(String password) {
 this.password = password;
 }

 public void setRoleIds(List<String> roleIds) {
 this.roleIds = roleIds;
 }

 public void setSalt(String salt) {
 this.salt = salt;
 }

 public void setStatus(AccountStatus status) {
 this.status = status;
 }
}

package com.my.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;

@MappedSuperclass
public class BaseUnit implements Serializable {

 @Id
 @NotNull
 public String id;
 /**
  * 父单元ID
  */
 @Size(max = 32,message = "BaseUnit.parentId属性长度不能大于32")
 public String parentId;

 /** 父单元的类型 */
 public ParentType parentType;

 /**
  * 单元的名称
  */
 @NotNull(message = "BaseUnit.name属性不能为空")
 public String name;

 @CreatedBy
 public String createBy;
 
 @CreatedDate
 public Date createDate;
 
 @LastModifiedBy
 public String lastModifiedBy;  
 
 /**
  * 最后更新日期
  */
 @LastModifiedDate
 public Date lastModifiedDate;

 public String getId() {
  return id;
 }
 
 public void setId(String id) {
  this.id = id;
 }

 /**
  * 获取单元的名称
  * 
  * @return 必填
  */
 public String getName() {
  return name;
 }

 /**
  * 
  * 
  * @return UUID,不含{}和-
  */
 public String getParentId() {
  return parentId;
 }

 public ParentType getParentType() {
  return parentType;
 }

 public String getStationId() {
  return stationId;
 }

 public String getThumbnailId() {
  return thumbnailId;
 }

 public String getCreateBy() {
  return createBy;
 }

 public void setCreateBy(String createBy) {
  this.createBy = createBy;
 }

 public Date getCreateDate() {
  return createDate;
 }

 public void setCreateDate(Date createDate) {
  this.createDate = createDate;
 }
 /**
  * 设置单元的名称
  * 
  * @param name
  *   必填
  */
 public void setName(String name) {
  this.name = name;
 }

 /**
  * 设置父单元ID
  * 
  * @param parentId
  *   UUID,不含{}和-
  */
 public void setParentId(String parentId) {
  this.parentId = parentId;
 }

 public String getLastModifiedBy() {
  return lastModifiedBy;
 }

 public void setLastModifiedBy(String lastModifiedBy) {
  this.lastModifiedBy = lastModifiedBy;
 }

 public Date getLastModifiedDate() {
  return lastModifiedDate;
 }

 public void setLastModifiedDate(Date lastModifiedDate) {
  this.lastModifiedDate = lastModifiedDate;
 }
}

配置文件:

server:
 port: 16800
 contextpath: /
 
logging:
 config: ./config/logback.xml
 
spring:
 http:
 multipart:
  enabled: false
 datasource: 
 url : jdbc:MysqL://127.0.0.1:3306/db?useUnicode=true&characterEncoding=utf-8 
 username : root 
 password : 123456 
 driverClassName : com.MysqL.jdbc.Driver 
 jpa: 
 database : MysqL 
 show-sql : true 
 hibernate: 
  ddl-auto : update
 jackson:
 serialization:
  INDENT_OUTPUT : true
 #hibernate:配置了实体类维护数据库表结构的具体行为,update表示当实体类的属性发生变化时,表结构跟着更新,
这里我们也可以取值create,这个create表示启动的时候删除上一次生成的表,并根据实体类重新生成表,
这个时候之前表中的数据就会被清空;还可以取值create-drop,这个表示启动时根据实体类生成表,但是当sessionFactory关闭的时候表会被删除;
validate表示启动时验证实体类和数据表是否一致;none表示啥都不做。 
#show-sql表示hibernate在操作的时候在控制台打印真实的sql语句 
#jackson表示格式化输出的json字符串

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

您可能感兴趣的文章:

  • 从SpringMVC迁移到Springboot的方法步骤
  • springboot springmvc抛出全局异常的解决方法
  • 基于SpringBoot与Mybatis实现SpringMVC Web项目

Spring 4 学习笔记 - Spring4 MVC 项目搭建(Java Config 配置)

Spring 4 学习笔记 - Spring4 MVC 项目搭建(Java Config 配置)

以下源码连接:  https://git.oschina.net/jerryxiao/Spring.git

1. 使用 Eclipse 创建 Maven Web 项目。 如下配置 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>Spring</groupId>
	<artifactId>Spring</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>Spring Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
    </dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.3.1.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.2.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.6</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp.jstl</groupId>
			<artifactId>jstl-api</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp.jstl</groupId>
			<artifactId>javax.servlet.jsp.jstl-api</artifactId>
			<version>1.2.1</version>
		</dependency>
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>1.1.2</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<version>4.1.1.RELEASE</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>Spring</finalName>
	</build>
</project>

 2.  添加 Web APP 初始化启动类,主要采用集成 WebMvcConfigurerAdapter 类即可。 该类会创建 org.springframework.web.context.ContextLoaderListener 对象和 org.springframework.web.servlet.DispatcherServlet 对象。 代码如下所示:

/**
* @Project Spring 
* @author Xiaowentao
* @Time 2016年7月17日
*/

package tom.spring.init;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import tom.spring.config.RootConfig;
import tom.spring.config.WebConfig;


public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

	@Override
	protected Class<?>[] getRootConfigClasses() {
 		return  new Class<?>[] {RootConfig.class};
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
 		return  new Class<?>[] {WebConfig.class};
	}

	@Override
	protected String[] getServletMappings() {
 		return new String[] {"/"};
	}


}

该类相当于在 web.xml 文件中添加如下配置:

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath*:/servlet/*.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

 

3. 添加 Web App 配置类, 主要是给 JSP 文件配置一个 ViewResolvet , 代码如下所示:

/**
* @Project Spring 
* @author Xiaowentao
* @Time 2016年7月17日
*/
package tom.spring.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

/**
 * @author Xiaowentao
 *
 */
@Configuration
@EnableWebMvc
@ComponentScan(value="tom.spring.controller")
public class WebConfig extends WebMvcConfigurerAdapter {
	
	@Bean
	public ViewResolver viewResolver(){
		
		InternalResourceViewResolver resolver =  new InternalResourceViewResolver();
		
		resolver.setPrefix("/WEB-INF/views/");
		resolver.setSuffix(".jsp");
		resolver.setExposeContextBeansAsAttributes(true);		
		return resolver;	
	}
	
	@Override
	public void configureDefaultServletHandling(
			DefaultServletHandlerConfigurer configure){
		configure.enable();
	}
}

以上代码相当于在 XML 中配置 一个 名叫 “viewResolver” 类型为 InternalResourceViewResolvet 的 Bean.  和在 Servlet 配置文件中添加     <mvc:default-servlet-handler/> 

4. 添加 Servlet 配置,开启 Spring Web MVC 功能。如下所示代码, 无需任何实现,添加注解即可:

package tom.spring.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
 import org.springframework.web.servlet.config.annotation.EnableWebMvc;

 
@Configuration
@ComponentScan(basePackages={"tom.spring"}, 
    excludeFilters={
        @Filter(type=FilterType.ANNOTATION, value=EnableWebMvc.class)
    })
public class RootConfig {
}

5. 添加控制器,该控制器仅返回一个视图的名称, 比如代码中返回 “home” 字符串。DispatcherServlet 会根据返回的字符串去查找对象的视图文件即:.jsp 文件。本例为: home.jsp . 根据之前的配置,视图文件在目录 /WEB-INF/views/ 下。 

/**
* @Project Spring 
* @author Xiaowentao
* @Time 2016年7月17日
*/
package tom.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
/**
 * @author Xiaowentao
 *
 */
@Controller
@RequestMapping("/")
public class HomeController {
	
	@RequestMapping({"/"})
	public String home(){
		return "home";
	}
}

7. 在目录  /WEB-INF/views/ 创建 home.jsp 文件。 随便写一点内容。 我们已经把首页隐射到 home.jsp 视图上了。 

注: 去掉项目创建是生成的 index.jsp . 系统默认会渲染 index.jsp 文件。 

今天关于[Spring4.x]基于spring4.x纯注解的非Web工程搭建springmvc非注解配置的介绍到此结束,谢谢您的阅读,有关6、spring注解+springMVC注解+Mybatis注解+log4j+idea+maven、Maven 工程搭建 spring boot+spring mvc+JPA、Maven工程搭建spring boot+spring mvc+JPA的示例、Spring 4 学习笔记 - Spring4 MVC 项目搭建(Java Config 配置)等更多相关知识的信息可以在本站进行查询。

本文标签: