此文基于:使用IDEA创建一个简单的SpringBoot项目(一)
静态模板FreeMarker
新建一个项目或者module,名称FreeMarker
修改build.gradle:
group 'lckiss.com'
version '1.0-SNAPSHOT'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.RELEASE")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
//war
apply plugin: 'war'
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile("org.springframework.boot:spring-boot-starter-web")
//freemarker模板引擎jar包
compile("org.springframework.boot:spring-boot-starter-freemarker")
}
bootJar {
baseName = 'gs-spring-boot'
version = '0.1.0'
}一个启动入口:
package com.lckiss.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
/**
* 启动方式一 ComponentScan扫描Controller位置
*/@EnableAutoConfiguration
@ComponentScan(basePackages = "com/lckiss/controller")
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}一个访问路由:
package com.lckiss.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
@Controller
public class HelloController {
@RequestMapping("/")
@ResponseBody
public String index() {
return "Greetings from Spring Boot!";
}
//默认模板引擎
@RequestMapping("/home")
public String home() {
return "index";
}
//模板引擎-数据渲染
@RequestMapping("/data")
public String data(HttpServletRequest request) {
request.setAttribute("name","lckiss");
List<String> userList=new ArrayList<String>();
userList.add("张三");
userList.add("李四");
userList.add("王二");
userList.add("麻子");
request.setAttribute("userList",userList);
return "data";
}
}在resources目录下创建application.properties,内容(其实这些都是默认值):
spring.freemarker.template-loader-path=classpath:/templates spring.freemarker.suffix=.ftl spring.freemarker.allow-request-override=false spring.freemarker.cache=true spring.freemarker.charset=UTF-8 spring.freemarker.check-template-location=true spring.freemarker.content-type=text/html spring.freemarker.expose-request-attributes=false spring.freemarker.expose-session-attributes=false spring.freemarker.expose-spring-macro-helpers=false
可以看到,该模板的后缀结尾为.ftl,文件夹为templates,所以在resources新建一个templates文件夹,里面放两个.ftl文件,分别对应访问路由中的index与data。一个是字符串,一个是列表对象。
data.ftl:
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
this is a freemarker page!!!
get data : ${name}
<br>
List data:
<#list userList as user>
${user} <br>
</#list>
</body>
</html>index.ftl:
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
this is a freemarker page!!!
</body>
</html>试着去访问http://localhost:8080/data与http://localhost:8080/
你会得到你想要的结果。
访问静态资源
将1.jpg(不提供)按传统的方式放到webapp/image下面是可以通过http://localhost:8080/image/1.jpg正常访问的。但是对于新东西,肯定有新做法:
默认spring-boot的静态资源都是放在resources目录下的。并且给定了4个文件夹,分别为
/META-INF/resources
/resources
/static
/public
你可以尝试新建这些文件夹,然后通过链接去访问(链接访问时,不需要加上文件夹名,比如图片在/resources/static/1.jpg,只需要输入http://localhost:8080/1.jpg即可)。
如果每个文件夹中都有同一个文件,那么就会按优先级去读取META-INF/resources>resources>static>public
当然你可以选择覆盖默认的配置,在application.properties中加入即可
#基于默认大于配置的原则,不建议开启自定义的静态访问路径 spring.mvc.static-path-pattern=/resources/**
集成log4j2
先集成依赖:
//去除logging 添加部分
configurations {
all*.exclude module : 'spring-boot-starter-logging'
}
dependencies {
...
//log4j2
compile("org.springframework.boot:spring-boot-starter-log4j2")
...在application.properties中添加:
#log logging.config= classpath:log4j2.properties
并在application.properties同目录下创建log4j2.properties:
status = error
name = PropertiesConfig
property.filename = target/rolling/rollingtest.log
filters = threshold
filter.threshold.type = ThresholdFilter
filter.threshold.level = debug
rootLogger.level = info
#尽量不要输出到console,要养成看日志文件的习惯
#使用其中一个方案时 另一个需要注释
#不使用控制台输出 方案一
rootLogger.appenderRefs =I,E
appenders =I, E
#使用控制台输出 方案二
#rootLogger.appenderRefs = stdout,I,E
#rootLogger.appenderRef.stdout.ref = STDOUT
#appenders = console, I, E
#appender.console.type = Console
#appender.console.name = STDOUT
#appender.console.target = SYSTEM_OUT
#appender.console.layout.type = PatternLayout
#appender.console.layout.pattern = %-d{yyyy-MM-dd HH:mm:ss} [ %p ] [ %c ] %m%n
#记录的info文件
rootLogger.appenderRef.I.ref = InfoRollingFile
rootLogger.appenderRef.I.level = info
#记录的error文件
rootLogger.appenderRef.E.ref = ErrorRollingFile
rootLogger.appenderRef.E.level = error
#对应appenderRef.I.ref = InfoRollingFile
appender.I.type = RollingFile
appender.I.name = InfoRollingFile
appender.I.fileName = ./logs/info.log
appender.I.filePattern = ./logs/info_%d{yyyy-MM-dd}_%i.log
appender.I.layout.type = PatternLayout
appender.I.layout.pattern = %-d{yyyy-MM-dd HH:mm:ss} [ %p ] [ %c ] %m%n
appender.I.policies.type = Policies
appender.I.policies.time.type = TimeBasedTriggeringPolicy
appender.I.policies.time.interval = 1
appender.I.policies.time.modulate = true
appender.I.policies.size.type = SizeBasedTriggeringPolicy
appender.I.policies.size.size=20M
appender.I.strategy.type = DefaultRolloverStrategy
appender.I.strategy.max = 100
#对应appenderRef.E.ref = ErrorRollingFile
appender.E.type = RollingFile
appender.E.name = ErrorRollingFile
appender.E.fileName = ./logs/error.log
appender.E.filePattern = ./logs/error_%d{yyyy-MM-dd}_i.log
appender.E.layout.type = PatternLayout
appender.E.layout.pattern = %-d{yyyy-MM-dd HH:mm:ss} [ %p ] [ %c ] %m%n
appender.E.policies.type = Policies
appender.E.policies.time.type = TimeBasedTriggeringPolicy
appender.E.policies.time.interval = 1
appender.E.policies.time.modulate = true
appender.E.policies.size.type = SizeBasedTriggeringPolicy
appender.E.policies.size.size=20M
appender.E.strategy.type = DefaultRolloverStrategy
appender.E.strategy.max = 100在controller中添加路由:
private final static Logger logger=org.slf4j.LoggerFactory.getLogger(HelloController.class);
//log演示
@RequestMapping("/log")
@ResponseBody
public String log(String name) {
logger.info("----this is a log4j2 log-----");
logger.info("----name is "+name+"--------");
return name;
}重启服务器,在地址栏输入http://localhost:8080/log?name=test,你将会在此处看到你的log文件与内容

Spring-boot多数据源
PS:对于SB2.0,这里大把坑,值得注意下,基本上 我的一下午就没了。多数据源,一定要区分主从,主用@Primary标记,从不要标记。jdbc的url改用jdbc-url
根据上面的项目继续,添加依赖:
//配置mybatis
compile("org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2")
compile("org.mybatis.spring.boot:mybatis-spring-boot-starter-test:1.3.2")
//mysql驱动
compile 'mysql:mysql-connector-java'在HelloController中添加下面两个路由 Autowired是自动注入
//访问多数据源中的第一个数据源
@Autowired
private MasterMapper masterMapper;
@RequestMapping("/master")
@ResponseBody
public String master(int id) {
User user= masterMapper.selectUserById(id);
return user.getName();
}
//访问多数据源中的第二个数据源
@Autowired
private SlaveAlphaMapper slaveAlphaMapper;
@RequestMapping("/slaveAlpha")
@ResponseBody
public String slaveAlpha(int id) {
User user= slaveAlphaMapper.selectUserById(id);
return user.getName();
}主数据源:
package com.lckiss.datasource;
import ...
@Configuration
//扫描指定包下的mapper
@MapperScan(basePackages = "com.lckiss.mapper.master",sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class DatasourceFirstConfig {
//第一步:声明一个数据源master @Primary优先使用该注解的bean
@Bean(name = "master")
@ConfigurationProperties(prefix = "spring.datasource.master")
@Primary
public DataSource masterDataSource(){
return DataSourceBuilder.create().build();
}
//第二步:设置SqlSessionFactory @Qualifier是用于指定bean,需要时会查找该bean然后返回需要的对象
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("master")DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean=new SqlSessionFactoryBean();
//设置数据源
sessionFactoryBean.setDataSource(dataSource);
return sessionFactoryBean.getObject();
}
//第三步:创建事务管理
@Bean(name = "masterDataSourceTransactionManager")
@Primary
public DataSourceTransactionManager masterDataSourceTransactionManager(@Qualifier("master")DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
//第四步:创建masterSqlSessionTemplate
@Bean(name = "masterSqlSessionTemplate")
@Primary
public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory")SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}从数据源:
package com.lckiss.datasource;
import ...
//扫描指定包下的mapper
@Configuration
@MapperScan(basePackages = "com.lckiss.mapper.slave",sqlSessionTemplateRef = "slaveAlphaSqlSessionTemplate")
public class DatasourceSecondConfig {
//第一步:声明一个数据源slaveAlpha
@Bean(name = "slaveAlpha")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveAlphaDataSource(){
return DataSourceBuilder.create().build();
}
//第二步:设置SqlSessionFactory @Qualifier是用于指定bean,需要时会查找该bean然后返回需要的对象
@Bean(name = "slaveAlphaSqlSessionFactory")
public SqlSessionFactory slaveAlphaSqlSessionFactory(@Qualifier("slaveAlpha")DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean=new SqlSessionFactoryBean();
//设置数据源
sessionFactoryBean.setDataSource(dataSource);
return sessionFactoryBean.getObject();
}
//第三步:创建事务管理
@Bean(name = "slaveAlphaDataSourceTransactionManager")
public DataSourceTransactionManager slaveAlphaDataSourceTransactionManager(@Qualifier("slaveAlpha")DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
//第四步:创建slaveAlphaSqlSessionTemplate
@Bean(name = "slaveAlphaSqlSessionTemplate")
public SqlSessionTemplate slaveAlphaSqlSessionTemplate(@Qualifier("slaveAlphaSqlSessionFactory")SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}来两个mapper,分别对应主从数据源:
package com.lckiss.mapper.master;
import ...
public interface MasterMapper {
@Insert("insert into user(name) values(#{name})")
void insertUser(@Param("name") String name);
@Select("select * from user where id=#{id}")
User selectUserById(@Param("id") Integer id);
}从:
package com.lckiss.mapper.slave;
import ...
public interface SlaveAlphaMapper {
@Insert("insert into user(name) values(#{name})")
void insertUser(@Param("name") String name);
@Select("select * from user where id=#{id}")
User selectUserById(@Param("id") Integer id);
}实体:
package com.lckiss.model;
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}启动入口改为:
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}application.properties中添加:
#第一个数据源 spring.datasource.master.jdbc-url = jdbc:mysql://localhost:3306/SpringBoot?useUnicode=true&characterEncoding=utf-8 spring.datasource.master.username = root spring.datasource.master.password = mysql spring.datasource.master.driverClassName = com.mysql.jdbc.Driver #第二个数据源 spring.datasource.slave.jdbc-url = jdbc:mysql://localhost:3306/SpringBoot?useUnicode=true&characterEncoding=utf-8 spring.datasource.slave.username = root spring.datasource.slave.password = mysql spring.datasource.slave.driverClassName = com.mysql.jdbc.Driver
好了,去跑吧,应该是没问题的,半夜了才找到原因,我也是醉了,对于一个新手,课程是eclipse+maven,我用idea+gradle,资料少得可怜,好在,折腾折腾就慢慢理解了。
本站广告由 Google AdSense 提供
0条评论