在这篇文章中,我们将为您详细介绍[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非注解配置)
- 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非注解配置)
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
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=DEBUGlog4j.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
添加 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字符串
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 配置)
以下源码连接: 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 配置)等更多相关知识的信息可以在本站进行查询。
本文标签: