初始化
idea中新建SpringInitializr项目,选择集成web、freemarker
1.SpringBoot目录用处
resources目录:static目录用来放js文件
templates目录:放如html文件的模板文件
2.简单测试-过滤请求
添加如下依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
新建LogFilter文件,只是一个原始的filter,没有实例。
package com.mooc.house.filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import java.io.IOException;
public class LogFilter implements javax.servlet.Filter {
private Logger logger = LoggerFactory.getLogger(LogFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("log filter init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
logger.info("log do filter");
filterChain.doFilter(servletRequest,servletResponse);//转发请求
}
@Override
public void destroy() {
}
}
下面使用springBoot的ConfigureBean配置一个filter的bean。FilterBeanConfig.java
package com.mooc.house.config;
import com.mooc.house.filter.LogFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class FilterBeanConfig {
//FilterRegistrationBean将原始的filter包装成一个bean
//配置三个步骤
/*
* 1.构造filter
* 2.配置拦截urlPattern
* 3.利用FilterRegistrationBean进行包装
* */
@Bean
public FilterRegistrationBean logFilter(){
FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
filterFilterRegistrationBean.setFilter(new LogFilter());
List<String> urlList = new ArrayList<>();
urlList.add("*");//转发所有请求
filterFilterRegistrationBean.setUrlPatterns(urlList);
return filterFilterRegistrationBean;
}
}
3.配置mybatis
添加依赖:
<!--mybatis 相关-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
配置application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/study01?serverTimezone=UTC+8&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=zxcvbnm
mybatis.config-location=classpath:/mybatis/mybatis-config.xml
resources下创建mybatis-config.xml,配置与在ssm框架o2o中一样,复制一下,稍微增加了几项配置。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置全局属性 -->
<settings>
<!--配置关闭缓存-->
<setting name="cacheEnabled" value="false"/>
<!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 使用列别名替换列名 默认:true -->
<setting name="useColumnLabel" value="true" />
<!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
<setting name="mapUnderscoreToCamelCase" value="true" />
<!--默认执行类型,缓存...提高性能-->
<setting name="defaultExecutorType" value="REUSE"/>
<!--配置事务的超时时间-->
<setting name="defaultStatementTimeOut" value="600"/>
</settings>
<!--设置一些常用别名-->
<typeAliases>
<typeAlias type="com.mooc.house.common.model.User" alias="user"/>
</typeAliases>
<!--配置mapper的位置-->
<mappers>
<mapper resource="mapper/user.xml"/>
</mappers>
</configuration>
这样做需要在dao层中的接口UserMapper.java上面添加@Mapper注释,mybatis会扫描这个接口。
UserMapper.java
package com.mooc.house.dao;
import com.mooc.house.common.model.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
public List<User> userList();
}
4.引入druid
修改application.properties,注释掉原来关于数据库的配置,转到config类中去配置。
(1)、引入依赖
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.14</version>
</dependency>
原taotao项目中的spring-dao.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置整合mybatis过程 -->
<!-- 1.配置数据库相关参数properties的属性:${url} -->
<context:property-placeholder location="classpath:*.properties"/>
<context:property-placeholder location="classpath:resources.properties"/>
<!-- 2.数据库连接池 -->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" init-method="init">
<!-- 配置连接池属性 -->
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- c3p0连接池的私有属性 -->
<property name="maxActive" value="${jdbc.maxActive}"/>
<property name="minIdle" value="${jdbc.minIdle}"/>
<!--<!– 关闭连接后不自动commit –>
<property name="autoCommitOnClose" value="false"/>
<!– 获取连接超时时间 –>
<property name="checkoutTimeout" value="10000"/>
<!– 当获取连接失败重试次数 –>
<property name="acquireRetryAttempts" value="2"/>-->
<!-- 配置获取连接等待超时的时间,单位是毫秒 -->
<property name="maxWait" value="600000"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="600000"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="20"/>
<property name="proxyFilters">
<list>
<ref bean="wall-filter"/>
</list>
</property>
</bean>
<bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter"/>
<!-- 3.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="druidDataSource"/>
<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 扫描entity包 使用别名 -->
<property name="typeAliasesPackage" value="com.taotao.taotaomanager.taotaomanagerdto"/>
<!-- 扫描sql配置文件:mapper需要的xml文件 -->
<property name="mapperLocations" value="classpath:com/taotao/taotaomanager/taotaomanagerdao/**/*.xml"/>
</bean>
<!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.taotao.taotaomanager.taotaomanagerdao"/>
</bean>
</beans>
将这个配置文件的内容用springBoot的配置类来实现:
其中引入依赖,工具类,方便配置config
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.1-jre</version>
</dependency>
import com.google.common.collect.Lists;
。。。
druidDataSource.setProxyFilters(Lists.newArrayList(statFilter()));//配置下面的慢日志bean。
。。。
package com.mooc.house.config;
import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.google.common.collect.Lists;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.druid")//从配置文件中将此开头的属性值设置到配置对象的属性值。
@Bean(initMethod = "init", destroyMethod = "close")//配置初始化方法和销毁方法
public DruidDataSource druidDataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setProxyFilters(Lists.newArrayList(statFilter()));//配置下面的慢日志bean。
return druidDataSource;
}
//慢sql日志
@Bean
public Filter statFilter(){
StatFilter statFilter = new StatFilter();
statFilter.setSlowSqlMillis(1);//设置超过5秒的sql为慢sql
statFilter.setLogSlowSql(true);//设置打印出慢sql日志
statFilter.setMergeSql(true);
return statFilter;//是否将这些日志合并起来
}
//监控配置
@Bean
public ServletRegistrationBean servletRegistrationBean(){
return new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
}
}
通过访问localhost:8080/druid/index.html访问监控日志
5.配置freeMarker
依赖:
<!--freeMarker-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
application.properties
#freemarker相关
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html;charset=UTF-8
#将请求暴露成变量,可以直接使用
spring.freemarker.expose-request-attributes=true
#将会话暴露,可以像变量那样使用
spring.freemarker.expose-session-attributes=true
spring.freemarker.expose-spring-macro-helpers=true
#配置后缀是.ftl
spring.freemarker.suffix=.ftl
spring.freemarker.settings.datetime_format=yyyy-MM-dd HH:mm:ss
#有问题待解决
#spring.freemarker.settings.default_coding=UTF-8
ControllerTest.java
第一种使用方式是采用ssm框架中的传统方式,体现了对模板的渲染过程;第二种方式利用mvc方式自动渲染,利用springBoot自动配置freeMarker,自动设置模板资源位置,更方便的获取模板资源和自动渲染模板并返回。
第一种使用方式:
package com.mooc.house.controller;
import com.mooc.house.common.model.User;
import com.mooc.house.service.UserService;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class ControllerTest {
@Autowired
private UserService userService;
@RequestMapping("/hello")
public void hello(HttpServletRequest request, HttpServletResponse response) throws IOException, TemplateException {
List<User> users = userService.userList();
//获取configuration对象
Configuration configuration = new Configuration(Configuration.VERSION_2_3_22);
configuration.setClassForTemplateLoading(ControllerTest.class.getClassLoader().getClass(),"\\templates");//可以读取到template中的模板文件
//设置默认字符集
configuration.setDefaultEncoding("UTF-8");
//设置模板异常处理模式,rethrow_handler
configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
//获取模板对象,传入已经定义好的基本模板文件user.ftl
Template template = configuration.getTemplate("hello.ftl");
//创建用户root的map集合,用来存放用户的用户名和密码
Map<String,Object> root = new HashMap<String,Object>();
root.put("name",users.get(0).getName());
root.put("password",users.get(0).getId());
//创建Writer对象,用来设定,最终模板在哪显示
PrintWriter writer = response.getWriter();
response.setCharacterEncoding("UTF-8");
//渲染模板
template.process(root,writer );
}
}
第二种使用方式:
package com.mooc.house.controller;
import com.mooc.house.common.model.User;
import com.mooc.house.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
public class ControllerTest {
@Autowired
private UserService userService;
@RequestMapping("/hello")
public String hello(ModelMap modelMap){
List<User> users = userService.userList();
//设置模板中的变量
modelMap.put("name",users.get(1).getName());
modelMap.put("password",users.get(0).getId());
return "hello";
}
}