house笔记1-项目初始化-druid配置-freemarker

初始化

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}"/>
        <!--&lt;!&ndash; 关闭连接后不自动commit &ndash;&gt;
        <property name="autoCommitOnClose" value="false"/>
        &lt;!&ndash; 获取连接超时时间 &ndash;&gt;
        <property name="checkoutTimeout" value="10000"/>
        &lt;!&ndash; 当获取连接失败重试次数 &ndash;&gt;
        <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";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值