一、springboot+springmvc+springdata jpa+mybatis+freemarker+druid項目配置

一、首先要新建一個springboot項目,如何創建項目,請看https://blog.csdn.net/IT_CREATE/article/details/86681538

 

二、導入相關聯的包,即使你在創建springboot的時候沒有選擇相關聯的包那些,也不要緊,只需要porm.xml引入下面這些就可以了

porm.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.19.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.ge</groupId>
	<artifactId>telecom</artifactId>
	<version>1.0</version>
	<name>telecomproject</name>
	<description>這是一個電信計費項目</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>

		<!-- 引入alibaba的druid數據源 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.11</version>
		</dependency>

		<!-- 引入druid連接池的Jar包 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.0</version>
		</dependency>
 
		<!-- 引入JDBC的Jar包 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<!-- 引入spring-boot支持註解配置的Jar包 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
		<!-- 引入aop切面的Jar包 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

		<!-- 引入springdata jpa的Jar包 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<!-- 引入freemarker的Jar包 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-freemarker</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 引入mybatis的Jar包 -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.3</version>
		</dependency>
		<!-- 引入test測試的Jar包 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

<!-- 里程碑的Boot版本,需要如下配置 -->
	<repositories>
		<repository>
			<id>spring-snapshots</id>
			<name>Spring Snapshots</name>
			<url>https://repo.spring.io/snapshot</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>

	<pluginRepositories>
		<pluginRepository>
			<id>spring-snapshots</id>
			<name>Spring Snapshots</name>
			<url>https://repo.spring.io/snapshot</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</pluginRepository>
		<pluginRepository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</pluginRepository>
	</pluginRepositories>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

 

三、配置src/main/resources下的application.properties文件

server.context-path=/boots,表示用boots取代項目名,這個我們以後訪問的路徑就是http://localhost/boots/頁面別名,後面要配置頁面

#tomcat configure
server.port=80
server.session.timeout=1800
server.context-path=/boots
server.tomcat.uri-encoding=UTF-8

#springmvc configure
spring.mvc.view.prefix=/templates/
spring.mvc.view.suffix=.ftl
spring.freemarker.cache=true
spring.freemarker.charset=utf-8
spring.freemarker.allow-request-override=true
spring.freemarker.request-context-attribute=request

#logback configure
logging.config=classpath:logback.xml
logging.path=/logs

#datasource configure
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/crebas?useUnicode=true&characterEncoding=UTF8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=123456
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 now() from dual
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.filters=stat,wall,log4j
spring.datasource.logSlowSql=true

#mybatis configure
mybatis.type-aliases-package=com.ge.telecom.bean
mybatis.mapper-locations=classpath:mybatis/mapper/*mag/*sys/*Mapper.xml

########################################################
### Java Persistence Api
########################################################
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
#[org.hibernate.cfg.ImprovedNamingStrategy              #org.hibernate.cfg.DefaultNamingStrategy]
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

 

四、在src/main/resources下新建logback.xml日誌記錄文件進行配置

<!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
<configuration scan="true" scanPeriod="10 seconds">
    <include resource="org/springframework/boot/logging/logback/base.xml" />

	
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>  
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n
            </Pattern>
        </encoder>  
    </appender>  

	<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH}/debug.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/debug-%d{yyyyMMdd}.log.%i</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>5</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        	<level>DEBUG</level>
        </filter>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n
            </Pattern>
        </layout>
    </appender>

    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH}/info.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/info-%d{yyyyMMdd}.log.%i</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>5</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        	<level>INFO</level>
        </filter>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n
            </Pattern>
        </layout>
    </appender>
    
	<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH}/warn.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/warn-%d{yyyyMMdd}.log.%i</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>5</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        	<level>WARN</level>
        </filter>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n
            </Pattern>
        </layout>
    </appender>
	
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH}/error.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/error-%d{yyyyMMdd}.log.%i
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>5</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        	<level>ERROR</level>
        </filter>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n

            </Pattern>
        </layout>
    </appender>
    
    <root level="INFO">
		    
		<appender-ref ref="STDOUT" />
    	<appender-ref ref="DEBUG_FILE" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>
    
</configuration>

 

五、在src/main/resources下的包com.xxx.xxxx下創建configure包,在該包下寫一些配置類

5.1 新建ApplicationContextConfig.java配置類(主要用於配置業務層及以下,過濾掉controller層)

package com.ge.telecom.configure;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
//import org.springframework.context.annotation.ImportResource;
import org.springframework.stereotype.Controller;

/**
 * @Configuration 將該類聲明爲一個配置類,用來替代applicationContext.xml
 * @ComponentScan 開啓容器的自動掃描, 並使用Filter排除一些不必要的組件
 * @author Administrator
 * 
 * 假如寫了一些xml的配置文件,還可以使用@ImportResource({"classpath*:XXX.xml"})
 * 導入配置文件的內容
 */


@Configuration
@ComponentScan(basePackages= {"com.ge.telecom"},excludeFilters= {
		@ComponentScan.Filter(
				type=FilterType.ANNOTATION,value={Controller.class})})
public class ApplicationContextConfig {

	
	
}

5.2 新建DruidDataSourceConfig.java配置類(主要用於配置連接池)

package com.ge.telecom.configure;

import java.sql.SQLException;
import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;

/**
 * @Configuration 該註解的作用:描述該JAVA類是一個配置類
 * @author Administrator
 *
 */
@Configuration
public class DruidDataSourceConfig {

	private Logger logger = LoggerFactory.getLogger(DruidDataSourceConfig.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.driver-class-name}")
    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.filters}")
    private String filters;

    @Value("${spring.datasource.logSlowSql}")
    private String logSlowSql;

    @Bean
    public ServletRegistrationBean druidServlet() {
        ServletRegistrationBean reg = new ServletRegistrationBean();
        reg.setServlet(new StatViewServlet());
        reg.addUrlMappings("/druid/*");
        reg.addInitParameter("loginUsername", username);
        reg.addInitParameter("loginPassword", password);
        reg.addInitParameter("logSlowSql", logSlowSql);
        return reg;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        filterRegistrationBean.addInitParameter("profileEnable", "true");
        return filterRegistrationBean;
    }

    @Bean
    public DataSource druidDataSource() {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        datasource.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);
        try {
            datasource.setFilters(filters);
        } catch (SQLException e) {
            logger.error("druid configuration initialization filter", e);
        }
        return datasource;
    }
	
	
	
}

5.3 新建SpringMVCConfig.java配置類(主要用於配置表現層,過濾掉業務層及以下,及一些視圖。靜態資源的配置或者攔截器、監聽器、過濾器、轉換器等)

package com.ge.telecom.configure;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
//import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
//import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;

import com.ge.telecom.converter.StringToDateConverter;
import com.ge.telecom.interceptor.LoginInterceptor;
import com.ge.telecom.listener.SsesionListener;

/**
 * SpringMVCConfig 配置類,用來替代springmvc-servlet.xml
 * @author Administrator
 * 
 * @EnableWebMvc 將該類定義爲一個WEB層的配置類,需要extends WebMvcConfigurationSupport
 * 取代springboot框架針對WEBMVC的默認配置
 * 
 * 
 * WebMvcConfigurerAdapter 可以替代 @EnableWebMvc + WebMvcConfigurationSupport
 * 並且還支持我們自定義一些配置
 * 
 */
@Configuration
@ComponentScan(basePackages= {"com.ge.telecom"},excludeFilters= {
		@ComponentScan.Filter(
				type=FilterType.ANNOTATION,value={Service.class,Repository.class})})
public class SpringMVCConfig extends WebMvcConfigurerAdapter{
	
    @Resource
    private RequestMappingHandlerAdapter handlerAdapter;

	
	/**
	 * 註冊url -- 頁面之間的跳轉關係
	 * 比較適合於:從登陸頁面上,跳轉到"忘記密碼","如無賬號,請註冊"
	 * 從註冊頁面上,跳轉到"已有賬號,馬上登錄",
	 * 這個必須配置,把所有的頁面都添加進去,才能訪問這些頁面,用registry.addViewController("/index").setViewName("main/index");
	 * setViewName()是頁面在templates文件夾下的路徑,addViewControlle()是給這個路徑起了一個別名,及這個頁面路徑的別名
	 */
	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
		// TODO Auto-generated method stub
		//配置系統首頁http://ip:port/項目名/
		
		//系統頁面
		registry.addViewController("/index").setViewName("main/index");
		registry.addViewController("/404").setViewName("main/404");
		registry.addViewController("/login.action").setViewName("main/login");
		

	}
	
	/**
	 * 指定靜態資源文件目錄,必須配置
	 * 
	 * 還可以在application.properties使用
	 * spring.mvc.static-path-pattern=/static/**
	 * spring.resources.static-locations=classpath:/static/
	 * 
	 */
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		// TODO Auto-generated method stub
		registry.addResourceHandler(new String[]{"/static/**","/resource/**"}).addResourceLocations("classpath:/static/");
	}
	
	/**
	 * 配置字符串轉日期轉換器,用到就配置,StringToDateConverter我自己寫的,string也可直接插入數據庫作爲數據庫的date、datetime
	 */
    @PostConstruct
    public void initEditableAvlidation() {

        ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer)handlerAdapter.getWebBindingInitializer();
        if(initializer.getConversionService()!=null) {
            GenericConversionService genericConversionService = (GenericConversionService)initializer.getConversionService();           
            genericConversionService.addConverter(new StringToDateConverter());
        }
    }
    
    //配置攔截器,用到就配,LoginInterceptor日誌攔截器我自己寫的
    @Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new LoginInterceptor());//配置攔截路徑
		super.addInterceptors(registry);
	}

    //配置監聽器,用到就配,SsesionListener是我自己寫的
    @SuppressWarnings({ "rawtypes", "unchecked" })
	@Bean
    public ServletListenerRegistrationBean listenerRegist() {
        ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean();
        srb.setListener(new SsesionListener());
        return srb;
    }
	
		
}

轉換器、攔截器。監聽器,這裏就不貼出來了,這個不是這個基本配置主要的,這些東西你根據自己項目的要求自己寫,自己配置。那麼配置類視圖路徑後,訪問地址就是http://localhost/boots/頁面別名,比如:訪問登錄頁面,就是http://localhost/boots/login.action

 

六、在src/main/resources下的包com.xxx.xxxx下創建filter包,在該包下寫一些過濾器類,配置過濾器

新建CharacterEncodingFilter.java類,這個是個字符亂碼過濾器,我認爲還是很有必要的

package com.ge.telecom.filter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

import org.springframework.core.annotation.Order;
/**
 * 中文亂碼過濾器
 * 既可以處理POST亂碼,又可以處理GET亂碼、delete、update
 * @author 
 * @Order(1) 過濾器的執行順序,值越小,越在前
 * 例外,過濾器需要在啓動類,或者配置類身上 ,使用@ServletComponentScan完成過濾器的掃描
 */
@Order(1)
@WebFilter(urlPatterns="/*",filterName="encodingFilter",initParams= {
		@WebInitParam(name="encoding",value="utf-8"),
		@WebInitParam(name="forceEncoding",value="true")
})
public class CharacterEncodingFilter implements Filter {

	private String encoding;
	private boolean forceEncoding = false;

	public CharacterEncodingFilter() {
		// TODO Auto-generated constructor stub
	}

	public void destroy() {
		// TODO Auto-generated method stub
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		String method = req.getMethod();
		if (forceEncoding) {
			res.setCharacterEncoding(encoding);
		}
		
		if ("GET".equals(method.toUpperCase())) {
			HttpServletRequest wrapper = new EncodingHttpServletRequestWrapper(req, encoding);
			chain.doFilter(wrapper, res);
		} else {
			req.setCharacterEncoding(encoding);
			chain.doFilter(req, res);
		}
	}

	public void init(FilterConfig config) throws ServletException {
		// TODO Auto-generated method stub
		encoding = config.getInitParameter("encoding");
		forceEncoding = Boolean.valueOf(config.getInitParameter("forceEncoding"));
	}

	private static class EncodingHttpServletRequestWrapper extends HttpServletRequestWrapper {

		private HttpServletRequest request;
		private String encoding;

		public EncodingHttpServletRequestWrapper(HttpServletRequest request, String encoding) {
			super(request);
			// TODO Auto-generated constructor stub
			this.request = request;
			this.encoding = encoding;
		}

		@Override
		public String getQueryString() {
			// TODO Auto-generated method stub
			String content = request.getQueryString();

			if (content != null) {
				try {
					content = URLDecoder.decode(content, encoding);
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			return content;
		}
		
		@Override
		public Map<String, String[]> getParameterMap() {
			// TODO Auto-generated method stub
			String content = getQueryString();
			//userName=阿斯蒂芬&loginName=1223&pwd=&gender=0&income=2342342342&marry=true&birthday=&hobby=0&hobby=1
			Map<String, String[]> params = new HashMap<String, String[]>();
			// 處理多值的情況
			Map<String, List<String>> multiValues = new HashMap<String, List<String>>();
			if (content != null) {
				String[] tem = content.split("&");
				for (String str : tem) {
					String[] kvs = str.split("=");// userName=撒旦法
					// 需要處理一個提交項有多個值的情況發生
					if (params.containsKey(kvs[0])) {
						// 需要處理checkbox的多值情況,例如:ck=111&ck=222&ck=333
						List<String> valuesList;
						if (multiValues.containsKey(kvs[0])) {// 如果多值集合中已經包含某個鍵
							valuesList = multiValues.get(kvs[0]);
							if (kvs.length >= 2) {// ck=111
								valuesList.add(kvs[1]);
							} else {
								valuesList.add("");// ck=
							}
						} else {// 如果多值集合中尚未包含某個鍵
							valuesList = new ArrayList<String>();
							valuesList.add(params.get(kvs[0])[0]);// 初始加入
							if (kvs.length >= 2) {// ck=111
								valuesList.add(kvs[1]);
							} else {// ck=
								valuesList.add("");
							}
							multiValues.put(kvs[0], valuesList);
						}
					} else {
						if (kvs.length >= 2) {// userName=撒旦法
							params.put(kvs[0], new String[] { kvs[1] });
						} else {// userName=
							params.put(kvs[0], new String[] { "" });
						}
					}
				} // for循環結束

				// --------------將多值情況,同樣添加到params集合中去-------------
				if (multiValues != null && !multiValues.isEmpty()) {
					Iterator<String> its = multiValues.keySet().iterator();
					while (its.hasNext()) {
						String key = (String) its.next();
						List<String> strs = multiValues.get(key);
						int size = strs.size();// 獲得值的個數
						String[] arrays = new String[size];
						for (int i = 0; i < size; i++) {
							arrays[i] = strs.get(i);
						}
						params.put(key, arrays);// 將多值的情況也處理到Map集合中去
					}
				}
			}
			return params;
		}

		@Override
		public String getParameter(String name) {
			// TODO Auto-generated method stub
			Map<String, String[]> params = getParameterMap();
			String val = "";
			if (params != null && params.containsKey(name)) {
				val = params.get(name)[0];
			}
			return val;
		}

		@Override
		public Enumeration<String> getParameterNames() {
			// TODO Auto-generated method stub
			return Collections.enumeration(getParameterMap().keySet());
		}

		@Override
		public String[] getParameterValues(String name) {
			// TODO Auto-generated method stub
			return (String[]) getParameterMap().get(name);
		}
	}

}

 

七、啓動類TelecomprojectApplication的配置

package com.ge.telecom;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

import com.ge.telecom.configure.ApplicationContextConfig;


@SpringBootApplication
@MapperScan({"com.ge.telecom.*.*.mapper"})
@ServletComponentScan
public class TelecomprojectApplication {

	public static void main(String[] args) {
		SpringApplication.run(ApplicationContextConfig.class, args);
		
	}

}

因爲springdata jpa不需要掃麪包,但是mybatis需要去掃描相應的映射的包,所以要加上@MapperScan註解

 

基本配置也就是這樣,作爲項目,這個就可以啓動和使用springdata jpa和mybatis了,也可以做前後端交互了。如何使用我在下一章節介紹,因爲使用有一點小規範。

 

下面幾章節我會介紹一些操作日誌和登錄日誌如何書寫,涉及到一些切面,攔截器、監聽器等。

 

二、配置了雙持久層框架(springdata jpa+mybatis)後包結構及遵循的一些規範

https://blog.csdn.net/IT_CREATE/article/details/88117298

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章