使用Spring boot ,可以轻松的创建独立运行的程序,非常容易构建独立的服务组件,是实现分布式架构、微服务架构利器。

Spring boot简化了第三方包的引用,通过提供的starter,简化了依赖包的配置

Spring boot的优点

轻松创建独立的Spring应用程序。

内嵌Tomcat、jetty等web容器,不需要部署WAR文件。

提供一系列的“starter” 来简化的Maven配置,不需要添加很多依赖

开箱即用,尽可能自动配置Spring。

创建一个 maven war项目(test1)

创建一个 maven jar项目(test2)

在pom.xml添加spring-boot-starter-web依赖

        <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.9.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

写一个控制器如下,然后写一个main方法,把程序跑起来:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;@RestController//相当于声明Controller - 提共restful 风格
@EnableAutoConfiguration//自动配置,不需要写spring的配置文件
class HelloController {@RequestMapping("/hello")//映射路径@ResponseBody//响应体public String hello() {return "Hello World";}public static void main(String[] args) {//启动程序SpringApplication.run(HelloController.class, args);}
}

在浏览器中访问http://localhost:8080/hello

SpringBoot的启动方式

第一种:

在控制器配置EnableAutoConfiguration并使用SpringApplication启动程序

第二种【常用】

创建一个App类,在App类中配置EnableAutoConfiguration和组件扫描ComponentScan,

然后使用SpringApplication启动程序,这样就可以访问多个Controller了.

创建一个User控制器

创建App类

使用 Maven 命令“mvn dependency:tree”来查看项目实际的依赖

web开发

静态资源的访问

在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。

Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:

/static

/public

/resources

/META-INF/resources

自动返回json格式数据

全局捕获异常

@ExceptionHandler 表示拦截异常

@ControllerAdvice

controller 的一个辅助类,最常用的就是作为全局异常处理的切面类可以指定扫描范围

约定了几种可行的返回值,如果是直接返回 model 类的话,需要使用

@ResponseBody 进行 json 转换

在com.gyf.web.exception包中定义一个全局异常类

@ControllerAdvice

在启动spring中,配置扫描包为com.gyf.web

在某个映射的方法中添加个int i = 10/0的算术异常

访问上的个路径结果为

渲染Web页面

Freemarker的使用

在pom.xml中添加依赖

<!-- 引入freeMarker的依赖包. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

写个控制器,并返回些数据

创建list.ftl文件

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title></title>
</head>
<body>欢迎${loginname}<#if age <= 17>小哥<#elseif age <= 30>先生<#else>大叔</#if>登录<table border="1"><tr><td>ID</td><td>名字</td><td>性别</td></tr><#list stuList?sort_by("id")?reverse as stu><tr><td> ${stu.id}</td><td> ${stu.name}</td><td> ${stu.gender}</td></tr></#list></table>
</body>
</html>

SpringBoot 使用jsp

pom文件引入以下依赖

        <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.3.3.RELEASE</version></parent><dependencies><!-- SpringBoot 核心组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId></dependency></dependencies>

application.properties创建以下配置

spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp

控制器代码

jsp

数据库访问

SpringBoot使用JDBC

添加依赖

<!-- JDBC --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

application.properties新增配置

#视图配置
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
#数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/day12
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Service

Controller

App

使用Mybatis

pom导入

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.3.2.RELEASE</version><relativePath /> <!-- lookup parent from repository --></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- 单元测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- mybaties --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.1.1</version></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency></dependencies>

数据库配置文件

Mapper

如果不使用注释则换成xml形式,将这个放入Maper包中

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.gyf.mapper.UserMapper" ><insert id="save">insert into t_user (username,password) VALUES(#{0},#{1})</insert><select id="findByUsername" resultType="com.gyf.model.User" parameterType="string">select * from t_user where username = #{username,jdbcType=VARCHAR}</select>
</mapper>

并在pom中添加下面代码

<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources>
</build>

Controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.gyf.mapper.UserMapper;
import com.gyf.model.User;@Controller
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserMapper userMapper;@RequestMapping("/find")@ResponseBodypublic User find(String name){return userMapper.findByName(name);}@ResponseBody@RequestMapping("/add")public int add(String name){return userMapper.insert(name,"e10adc3949ba59abbe56e057f20f883e");}
}

APP

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;@ComponentScan(basePackages={"com.gyf.controller"})
@MapperScan(basePackages={"com.gyf.mapper"})//扫描Mapper
@EnableAutoConfiguration
public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);}
}

spring中使用的事务

只需要加个Transactional注解即可

配置多数据源

配置文件中新增两个数据源

spring.datasource.test1.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test1.url=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username=root
spring.datasource.test1.password=123456spring.datasource.test2.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test2.url=jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username=root
spring.datasource.test2.password=123456

建表语句

use test1;
CREATE table user(id  int PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50),password VARCHAR(50),email VARCHAR(50),birthday TIMESTAMP
);use test2;
CREATE table customer(id  int PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),tel VARCHAR(50)
);

写两个数据源配置(注意:Primary注释只能配给一个数据源)

DataSource01

@Configuration

DataSource02

@Configuration

test1 Mapper&service

test2 mapper & service

Controller

App

多数据源问题(customer表会插入数据)

Transactoinal的事务只针对userMapper有效

springboot中的多事务管理(解决多数据源事务问题)

添加jta事务依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jta-atomikos</artifactId></dependency>

修改数据库连接配置数据

# Mysql 1
mysql.datasource.test1.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
mysql.datasource.test1.username = root
mysql.datasource.test1.password = 123456mysql.datasource.test1.minPoolSize = 3
mysql.datasource.test1.maxPoolSize = 25
mysql.datasource.test1.maxLifetime = 20000
mysql.datasource.test1.borrowConnectionTimeout = 30
mysql.datasource.test1.loginTimeout = 30
mysql.datasource.test1.maintenanceInterval = 60
mysql.datasource.test1.maxIdleTime = 60mysql.datasource.test1.testQuery = select 1
# Mysql 2
mysql.datasource.test2.url =jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8
mysql.datasource.test2.username =root
mysql.datasource.test2.password =123456
mysql.datasource.test2.minPoolSize = 3
mysql.datasource.test2.maxPoolSize = 25
mysql.datasource.test2.maxLifetime = 20000
mysql.datasource.test2.borrowConnectionTimeout = 30
mysql.datasource.test2.loginTimeout = 30
mysql.datasource.test2.maintenanceInterval = 60
mysql.datasource.test2.maxIdleTime = 60
mysql.datasource.test2.testQuery = select 1

添加2个配置模型

模型放在com.gyf.dbconfig包(并添加get,set方法)

@ConfigurationProperties

两个数据源配置

DataSource01

import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.gyf.dbconfig.DBConfig1;
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;@Configuration//注解到springboot容器中
@MapperScan(basePackages="com.gyf.test1.mapper",sqlSessionFactoryRef="test1SqlSessionFactory")
public class DataSource01 {// 配置数据源@Primary@Bean(name = "test1DataSource")public DataSource testDataSource(DBConfig1 testConfig) throws SQLException {MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();mysqlXaDataSource.setUrl(testConfig.getUrl());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);mysqlXaDataSource.setPassword(testConfig.getPassword());mysqlXaDataSource.setUser(testConfig.getUsername());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();xaDataSource.setXaDataSource(mysqlXaDataSource);xaDataSource.setUniqueResourceName("test1DataSource");xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());xaDataSource.setTestQuery(testConfig.getTestQuery());return xaDataSource;}@Bean(name = "test1SqlSessionFactory")public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource)throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);return bean.getObject();}@Bean(name = "test1SqlSessionTemplate")public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}
}

DataSource02

import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.gyf.dbconfig.DBConfig2;
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;@Configuration//注解到springboot容器中
@MapperScan(basePackages="com.gyf.test2.mapper",sqlSessionFactoryRef="test2SqlSessionFactory")
public class DataSource02 {// 配置数据源@Bean(name = "test2DataSource")public DataSource testDataSource(DBConfig2 testConfig) throws SQLException {MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();mysqlXaDataSource.setUrl(testConfig.getUrl());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);mysqlXaDataSource.setPassword(testConfig.getPassword());mysqlXaDataSource.setUser(testConfig.getUsername());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();xaDataSource.setXaDataSource(mysqlXaDataSource);xaDataSource.setUniqueResourceName("test2DataSource");xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());xaDataSource.setTestQuery(testConfig.getTestQuery());return xaDataSource;}@Bean(name = "test2SqlSessionFactory")public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource)throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);return bean.getObject();}@Bean(name = "test2SqlSessionTemplate")public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}
}

App

整合Log4j(日志)

log4j.properties

注意,复制时要把每一行后面的空格去除

log4j.rootLogger=INFO,Console,File
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c - %L]%m%nlog4j.appender.File = org.apache.log4j.RollingFileAppender
log4j.appender.File.File = C:/Users/10301/Desktop/test/logs/info/info.log
log4j.appender.File.MaxFileSize = 10MB  log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c - %L]%m%n 

pom.xml

去除springboot的logging,添加log4j,因为自带的logging不启效果

springboot下的Log4j的版本最新1.3.8,如果你的springboot的parent版本过高,那在在添加log4j自己版本

测试

使用AOP统一处理Web请求日志

pom

<!-- AOP --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

写个切面类

import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@Aspect
@Component
public class WebLogAspect {private Logger logger = Logger.getLogger(getClass());@Pointcut("execution(public * com.gyf.controller..*.*(..))")public void webLog() {}@Before("webLog()")public void doBefore(JoinPoint joinPoint) throws Throwable {// 接收到请求,记录请求内容ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 记录下请求内容logger.info("---------------request----------------");logger.info("URL : " + request.getRequestURL().toString());logger.info("HTTP_METHOD : " + request.getMethod());logger.info("IP : " + request.getRemoteAddr());Enumeration<String> enu = request.getParameterNames();while (enu.hasMoreElements()) {String name = (String) enu.nextElement();logger.info("name:" + name + "value" + request.getParameter(name));}}@AfterReturning(returning = "ret", pointcut = "webLog()")public void doAfterReturning(Object ret) throws Throwable {logger.info("---------------response----------------");// 处理完请求,返回内容logger.info("RESPONSE : " + ret);}
}

App配置注解

修改端口号

在application.properties中

server.port=8888

server.context-path=/test

在application.yml中

注意冒号后的只能用空格,不能用tab

server:port:  8090context-path: /test-yml

Springboot 打包部署

打包时添加下面依赖代码

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>com.gyf.app.App</mainClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>

cmd使用 mvn clean install 打成war包或者jar包

使用java -jar test3-0.0.1-SNAPSHOT.jar 运行即可

在终端要停止服务器时,使用Ctrl + C,直接点x,会端口没有关掉

使用连接池

添加druid的连接池

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.25</version>
</dependency>

添加application.properties

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:mysql://localhost:3306/edu1?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driverClassName = com.mysql.jdbc.Driver#连接池的配置信息
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.filters=stat,wall,log4j
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

使用注解来配置数据源

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.log4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
import java.sql.SQLException;@Configuration
public class DruidDBConfig {private Logger logger = Logger.getLogger(DruidDBConfig.class);@Value("${spring.datasource.url}")private String dbUrl;@Value("${spring.datasource.username}")private String username;@Value("${spring.datasource.password}")private String password;@Value("${spring.datasource.driverClassName}")private String driverClassName;@Value("${spring.datasource.initialSize}")private int initialSize;@Value("${spring.datasource.minIdle}")private int minIdle;@Value("${spring.datasource.maxActive}")private int maxActive;@Value("${spring.datasource.maxWait}")private int maxWait;@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")private int timeBetweenEvictionRunsMillis;@Value("${spring.datasource.minEvictableIdleTimeMillis}")private int minEvictableIdleTimeMillis;@Value("${spring.datasource.validationQuery}")private String validationQuery;@Value("${spring.datasource.testWhileIdle}")private boolean testWhileIdle;@Value("${spring.datasource.testOnBorrow}")private boolean testOnBorrow;@Value("${spring.datasource.testOnReturn}")private boolean testOnReturn;@Value("${spring.datasource.poolPreparedStatements}")private boolean poolPreparedStatements;@Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")private int maxPoolPreparedStatementPerConnectionSize;@Value("${spring.datasource.filters}")private String filters;@Value("{spring.datasource.connectionProperties}")private String connectionProperties;@Bean     //声明其为Bean实例@Primary  //在同样的DataSource中,首先使用被标注的DataSourcepublic DataSource dataSource(){DruidDataSource datasource = new DruidDataSource();datasource.setUrl(this.dbUrl);datasource.setUsername(username);datasource.setPassword(password);datasource.setDriverClassName(driverClassName);//configurationdatasource.setInitialSize(initialSize);datasource.setMinIdle(minIdle);datasource.setMaxActive(maxActive);datasource.setMaxWait(maxWait);datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);datasource.setValidationQuery(validationQuery);datasource.setTestWhileIdle(testWhileIdle);datasource.setTestOnBorrow(testOnBorrow);datasource.setTestOnReturn(testOnReturn);datasource.setPoolPreparedStatements(poolPreparedStatements);datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);try {datasource.setFilters(filters);} catch (SQLException e) {logger.error("druid configuration initialization filter", e);}datasource.setConnectionProperties(connectionProperties);return datasource;}
}

在Application.properties添加

#spring.freemarker.suffix=.ftl
#spring.freemarker.templateEncoding=UTF-8
#spring.freemarker.templateLoaderPath=classpath:/templates/
#spring.freemarker.content-type=text/html
spring.freemarker.request-context-attribute=request

页面引用js/jpg/css

打包添加

<resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource>
</resources>

java mvc返回js_Java的学习(39)springboot相关推荐

  1. java mvc返回js_技术趋势:是什么让MVC悄然消失的?

    投身IT江湖,就像打王者荣耀一样,好不容易练会了一个硬性,结果天美把它削弱了,你不得不再去练习一个. MVC这门技术伴随着我的成长,感情和Java一样深厚,但是,最近两年却不得不和MVC说再见了.是的 ...

  2. java 内部类 返回值_Java学习笔记:形参和返回值、内部类、常用API

    形参和返回值 类名作形参 public void useCat(Cat c){ c.eat(); } CatOperator co=new CatOperator(); Cat c=new Cat() ...

  3. 深圳Java培训学习:SpringBoot的yml配置及多环境切换【千锋】

    深圳Java培训学习:SpringBoot的yml配置及多环境切换[千锋] 1,配置风格 从application.properties转换到application.yml 并不改变功能效果,只是改变 ...

  4. java去除json 转移,Spring MVC返回的json去除根节点名称的方法

    这篇文章主要介绍了Spring MVC返回的json去除根节点名称的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 spring xml中配置视图如果是如下 那么返回结果会是: {" ...

  5. java json 返回null,[] Spring4 MVC 返回json格式时候 设置不返回null值属性的有关问题...

    [求助] Spring4 MVC 返回json格式时候 设置不返回null值属性的问题 本帖最后由 bighong0404 于 2015-10-06 12:45:38 编辑 背景: 使用@respon ...

  6. knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案

    knife4j knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量, ...

  7. JAVA计算机毕业设计中国古诗词学习平台Mybatis+源码+数据库+lw文档+系统+调试部署

    JAVA计算机毕业设计中国古诗词学习平台Mybatis+源码+数据库+lw文档+系统+调试部署 JAVA计算机毕业设计中国古诗词学习平台Mybatis+源码+数据库+lw文档+系统+调试部署 本源码技 ...

  8. Java MVC框架性能比较

    Java MVC框架性能比较 - by zvane 现在各种MVC框架很多,各框架的优缺点网络上也有很多的参考文章,但介绍各框架性能方面差别的文章却不多,本人在项目开发中,感觉到采用了struts2框 ...

  9. 基于Java毕业设计智友少儿编程学习平台源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计智友少儿编程学习平台源码+系统+mysql+lw文档+部署软件 基于Java毕业设计智友少儿编程学习平台源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S ...

最新文章

  1. linux 检查 文件末尾 是否有空行
  2. java对象 Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念
  3. 公共基础知识计算机,公共基础知识计算机基础知识试题
  4. Android USB Gadget复合设备驱动(打印机)测试方法
  5. easyGUI 用法介绍
  6. FC-SAN和IP-SAN以及NAS两者的优缺点分别是什么?
  7. 写给萌新,聊聊你初入职场的那些疑惑~
  8. Python SQLAlchemy --3
  9. 通过shell访问hive_【HIVE】SHELL调用Hive查询
  10. IDEA2020的中文插件_IDEA2020个性化设置(装逼且实用)
  11. Windows请求连接 Vmware+Ubuntu14被拒绝 的幽怨诉说
  12. 数组模拟加法(每日一练 11.30)
  13. iOS导航控制器和Segues
  14. 剖析WordPress模板文件【转】
  15. 为socket的recv/send设置超时
  16. 如何在腾讯云搭建自己的网站
  17. Electron 屏幕锁定 快捷键锁定 屏蔽快捷键
  18. 物联网应用技术和计算机应用技术哪个更好,2020物联网应用技术专业选什么大学好?...
  19. 在日本的软件工程师之路
  20. 计算机图形学【GAMES-101】10、材质(BRDF)(折射、菲涅尔项、微表面模型、各向异性材质)

热门文章

  1. MongoDB学习笔记(三)使用Spring Data操作MongoDB
  2. mysql数据库latin1转utf8_三种转换Mysql数据库数据编码的窍门-latin1转utf8
  3. PAT甲级 -- 1050 String Subtraction (20 分)
  4. 极简代码:害死人不偿命的(3n+1)猜想 (15分)
  5. java 日期是否合法_java 中 Date 类型快判断日期是否合法.
  6. oracle 换行符_python实现自动化报表(Oracle/plsql/Excel/多线程)
  7. linux如何分析系统的堆栈,Linux内核分析:操作系统是如何工作的?
  8. mysql安装1335_Mysql 安装问题。提示MySQL Server 5.1 -- Error 1335.
  9. KEY键盘映射_手焊键盘,使用Python编写,一键放连招,还有什么你不会
  10. python list 查找find_List 泛型 集合中 Find 的用法