spring+freemarker+redis
1./pom.xml文件内容:
<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>
<groupId>SpringMavenStudy</groupId>
<artifactId>SpringMavenStudy</artifactId>
<name>SpringMavenStudy</name>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<!-- jdk版本号 -->
<jdk.version>1.7</jdk.version>
<!-- spring版本号 -->
<spring.version>4.2.5.RELEASE</spring.version>
<!-- <spring.version>3.2.16.RELEASE</spring.version> -->
<!-- mybatis版本号 -->
<mybatis.version>3.3.1</mybatis.version>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.7.12</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- 表示开发的时候引入,发布的时候不会加载此包 -->
<scope>test</scope>
</dependency>
<!-- 支持servlet的jar包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- spring jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- <dependency> -->
<!-- <groupId>org.springframework</groupId> -->
<!-- <artifactId>spring-aspects</artifactId> -->
<!-- <version>${spring.version}</version> -->
<!-- </dependency> -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- <dependency> -->
<!-- <groupId>org.springframework</groupId> -->
<!-- <artifactId>spring-mock</artifactId> -->
<!-- <version>2.0.8</version> -->
<!-- <scope>test</scope> -->
<!-- </dependency> -->
<!-- <dependency> -->
<!-- <groupId>org.springframework</groupId> -->
<!-- <artifactId>spring-oxm</artifactId> -->
<!-- <version>${spring.version}</version> -->
<!-- </dependency> -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency> <!-- spring-remoting包含支持EJB、JMS、远程调用Remoting(RMI、Hessian、Burlap、Http Invoker、JAX-RPC)方面的类 -->
<!-- <dependency> -->
<!-- <groupId>org.springframework</groupId> -->
<!-- <artifactId>spring-remoting</artifactId> -->
<!-- <version>${spring.version}</version> -->
<!-- </dependency> -->
<!-- spring-support包含支持缓存Cache(ehcache)、JCA、JMX、邮件服务(Java Mail、COS Mail)、任务计划Scheduling(Timer、Quartz)方面的类 -->
<!-- <dependency> -->
<!-- <groupId>org.springframework</groupId> -->
<!-- <artifactId>spring-support</artifactId> -->
<!-- <version>${spring.version}</version> -->
<!-- </dependency> --> <!-- spring mvc jar -->
<!-- 包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- webmvc包含国际化、标签、Theme、视图展现FreeMarker、JasperReports、Tiles、Velocity、
XSLT相关类 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
<!-- <type>jar</type> -->
<!-- <scope>compile</scope> -->
</dependency>
<!-- mybatis spring 插件 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
<!-- <type>jar</type> -->
<!-- <scope>compile</scope> -->
</dependency>
<!-- json转换 ,springmvc 返回json格式必须加入 -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<!-- 集成redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.6.4.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
<!-- freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<!-- excel报表文件处理 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!-- 支持xlsx格式的excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<!-- BeanUtils主要提供对JavaBean进行各种操作,提供对Java反射和自省API的包装,Spring的AOP用到 -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
</dependency>
<!-- Digester基于规则的XML文档解析,主要用于XML到Java对象的映射. -->
<dependency>
<groupId>commons-digester</groupId>
<artifactId>commons-digester</artifactId>
<version>2.0</version>
</dependency>
<!-- AspectJ使用Java的注解,将切面AOP声明为普通的Java类 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.9</version>
</dependency>
<!-- aspectjweaver用于在Spring中集成AspectJ LTW织入器 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.9</version>
</dependency>
<!-- cglib代理 实现AOP的一种方式 ,和它对应的是DynaProxy(java动态代理) -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2</version>
</dependency> <!-- 导入java ee jar 包 -->
<!-- <dependency> -->
<!-- <groupId>javax</groupId> -->
<!-- <artifactId>javaee-api</artifactId> -->
<!-- <version>7.0</version> -->
<!-- </dependency> --> <!--sqlserver驱动包 -->
<!-- <dependency> -->
<!-- <groupId>com.microsoft.sqlserver</groupId> -->
<!-- <artifactId>sqljdbc4</artifactId> -->
<!-- <version>3.0</version> -->
<!-- </dependency> --> <!-- 导入Mysql数据库驱动jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- 导入sqlite数据库驱动jar包 -->
<!-- <dependency> -->
<!-- <groupId>org.xerial</groupId> -->
<!-- <artifactId>sqlite-jdbc</artifactId> -->
<!-- <version>3.8.11.2</version> -->
<!-- </dependency> --> <!-- 用于dbcp配置的数据库连接池 -->
<!-- <dependency> -->
<!-- <groupId>commons-dbcp</groupId> -->
<!-- <artifactId>commons-dbcp</artifactId> -->
<!-- <version>1.4</version> -->
<!-- </dependency> -->
<!-- <dependency> -->
<!-- <groupId>org.apache.commons</groupId> -->
<!-- <artifactId>commons-dbcp2</artifactId> -->
<!-- <version>2.1.1</version> -->
<!-- </dependency> -->
<!-- <dependency> -->
<!-- <groupId>commons-pool</groupId> -->
<!-- <artifactId>commons-pool</artifactId> -->
<!-- <version>1.6</version> -->
<!-- </dependency> -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency> <!-- 用于c3p0配置的数据库连接池-->
<!-- <dependency> -->
<!-- <groupId>com.mchange</groupId> -->
<!-- <artifactId>c3p0</artifactId> -->
<!-- <version>0.9.5.2</version> -->
<!-- </dependency> --> <!-- 用于Tomcat jdbc配置的数据库连接池 -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>8.0.32</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency> <!-- JSTL标签类 -->
<!-- <dependency> -->
<!-- <groupId>jstl</groupId> -->
<!-- <artifactId>jstl</artifactId> -->
<!-- <version>1.2</version> -->
<!-- </dependency> --> <!-- 日志文件管理包 -->
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency> <!-- 格式化对象,方便输出日志 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<!-- Commons Configuration是一个java应用程序的配置管理工具,可以从properties或者xml文件中加载软件的配置信息,用来构建支撑软件运行的基础环境。在一些配置文件较多较的复杂的情况下,使用该配置工具比较可以简化配置文件的解析和管理。 -->
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.6</version>
</dependency>
<!-- commons-lang包含了一些数据类型工具类,是java.lang.*的扩展,必须使用的jar包。 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<!-- 上传组件包 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency> <!-- commons-httpclient是一个遗留版本,现在官方已经不推荐使用了。https站点中需要加载SSLContext的类。httpclient是官方现在还在开发的,还在维护的,功能也比较强大的组件,提供更好的性能和更大的灵活性。 -->
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>3.6.0</version>
</dependency>
<!-- 定时调度 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
</dependencies>
<!-- 配置文件 -->
<profiles>
<!-- <profile> -->
<!-- <id>dev</id> -->
<!-- <properties> -->
<!-- <package.environment>dev</package.environment> -->
<!-- </properties> -->
<!-- <activation> -->
<!-- <activeByDefault>true</activeByDefault> -->
<!-- </activation> -->
<!-- <build> -->
<!-- <resources> -->
<!-- <resource> -->
<!-- <directory>src/main/config</directory> -->
<!-- </resource> -->
<!-- </resources> -->
<!-- </build> -->
<!-- </profile> --> <!-- <profile> -->
<!-- <id>test</id> -->
<!-- <properties> -->
<!-- <package.environment>test</package.environment> -->
<!-- </properties> -->
<!-- <build> -->
<!-- <resources> -->
<!-- <resource> -->
<!-- <directory>src/main/testConfig</directory> -->
<!-- </resource> -->
<!-- </resources> -->
<!-- </build> -->
<!-- </profile> -->
</profiles>
<!-- 打包部署 -->
<build>
<finalName>SpringMavenStudy</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources> <plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>nexus</id>
<name>nexus</name>
<url>http://maven.oschina.net/content/groups/public</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://maven.oschina.net/content/groups/public</url>
</pluginRepository>
</pluginRepositories>
</project>
2./src/main/webapp/WEB-INF/web.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>SpringMavenStudy</display-name>
<!-- 设置由Sprng载入的Log4j配置文件位置 -->
<!-- <context-param> -->
<!-- <param-name>log4jConfigLocation</param-name> -->
<!-- <param-value>classpath:config/log4j.properties</param-value> -->
<!-- </context-param> -->
<!-- Spring刷新Log4j配置文件变动的间隔,单位为毫秒 -->
<!-- <context-param> -->
<!-- <param-name>log4jRefreshInterval</param-name> -->
<!-- <param-value>100000</param-value> -->
<!-- </context-param> -->
<!-- 加载其他配置文件至Spring应用上下文中 -->
<!-- Spring 配置文件路径,此处可将Spring MVC的相关配置内容配置到Spring的配置文件applicationContext.xml中,共享同一个配置文件即可 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/applicationContext.xml</param-value>
</context-param>
<!-- Spring 容器监听器 配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- <listener> -->
<!-- <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> -->
<!-- </listener> -->
<!-- <listener> -->
<!-- <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> -->
<!-- </listener> -->
<!-- <listener> -->
<!-- <listener-class>org.springframework.web.util.WebAppRootListener</listener-class> -->
<!-- </listener> -->
<!-- <listener> -->
<!-- <listener-class>com.test.service.cache.CacheListener</listener-class> -->
<!-- </listener> --> <!-- 字符集 过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- tomcat关闭前先关闭quartz -->
<!-- <listener> -->
<!-- <listener-class>com.test.web.listener.ShutdownQuartzListener</listener-class> -->
<!-- </listener> --> <!-- Spring view分发器 -->
<!-- Spring mvc 配置,配置文件名称默认为{servlet-name}-servlet.xml,路径默认在/WEB-INF/下 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- <servlet-mapping> -->
<!-- <servlet-name>dispatcher</servlet-name> -->
<!-- <url-pattern>*.xls</url-pattern> -->
<!-- </servlet-mapping> -->
<!-- 配置session超时时间,单位分钟 -->
<session-config>
<session-timeout>15</session-timeout>
</session-config> <welcome-file-list>
<welcome-file>index</welcome-file>
</welcome-file-list>
<error-page>
<error-code>400</error-code>
<location>/error/400.jsp</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/error/403.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>405</error-code>
<location>/error/405.jsp</location>
</error-page>
<error-page>
<error-code>406</error-code>
<location>/error/406.jsp</location>
</error-page>
<error-page>
<error-code>412</error-code>
<location>/error/412.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
<error-page>
<error-code>501</error-code>
<location>/error/501.jsp</location>
</error-page>
<error-page>
<error-code>502</error-code>
<location>/error/502.jsp</location>
</error-page>
<error-page>
<error-code>503</error-code>
<location>/error/503.jsp</location>
</error-page>
</web-app>
3./src/main/resources/config/applicationContext.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:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.2.xsd">
<description>Spring-web MVC配置</description>
<context:component-scan base-package="com.test.service" />
<context:annotation-config />
<!-- 用于持有ApplicationContext,可以使用SpringContextHolder.getBean('xxxx')的静态方法得到spring bean对象 -->
<!-- <bean class="com.xxl.app.base.SpringContextHolder" lazy-init="false" /> --> <!-- 引入配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:config/jdbc.properties</value>
<!-- <value>classpath*:config/redis.properties</value> -->
<value>classpath*:config/quartz.properties</value>
<value>classpath*:config/log4j.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>
<!-- <bean class="com.test.util.WebAppContextUtil" /> -->
<!-- <import resource="classpath*:config/spring-applicationContext-quartz.xml" /> -->
<!-- redis -->
<!-- <import resource="classpath*:config/spring-redis.xml" /> --> <!--创建tomcat jdbc pool数据源 -->
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxIdle" value="${jdbc.maxIdle}" />
<property name="minIdle" value="${jdbc.minIdle}" />
<property name="maxActive" value="${jdbc.maxActive}" />
<property name="maxWait" value="${jdbc.maxWait}" />
<property name="initialSize" value="${jdbc.initialSize}" />
<property name="removeAbandoned" value="${jdbc.removeAbandoned}" />
<property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />
<property name="validationQuery" value="select 1" />
<property name="validationInterval" value="30000" />
<property name="defaultAutoCommit" value="true" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="1200000" />
<property name="minEvictableIdleTimeMillis" value="1800000" />
<property name="numTestsPerEvictionRun" value="5" />
</bean>
<!-- 创建SqlSessionFactory,并指定数据源 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 自动扫描mapping.xml文件,不需要mybatis的配置映射文件,扫描所有mapper文件,configLocation为mybatis属性,mapperLocations为所有mapper -->
<property name="mapperLocations">
<list>
<!-- 表示在包或以下所有目录中,以-mapper.xml结尾所有文件 -->
<value>classpath:com/test/mappers/*-mapper.xml</value>
</list>
</property>
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.test.model" />
</bean>
<!-- Mapper文件扫描配置工具,Spring会自动扫描basePackage下所有dao接口,创建的代理类实现了IUserDAO接口,并且注入到应用程序中,这样不用写实现类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 自动扫描 mybatis的接口 -->
<property name="basePackage" value="com.test.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- 配置事务管理 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" />
<!-- 事务注解驱动,标注@Transactional的类和方法将具有事务性 -->
<tx:annotation-driven transaction-manager="txManager" />
</beans>
4./src/main/resources/config/springmvc-servlet.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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
<!-- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter"
/> JSON转换器 </list> </property> </bean> -->
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射,请求映射 -->
<!-- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters"> <list> <bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value>
</list> </property> </bean> </list> </property> </bean> -->
<!-- 对所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<context:component-scan base-package="com.test.action" />
<!-- 启动基于Spring MVC的注解功能,激活@Controller,将控制器与方法映射加入到容器中 -->
<mvc:annotation-driven />
<!-- 如果是根目录,重定向到WEB-INF/views/index -->
<mvc:view-controller path="/" view-name="forward:/index" />
<!--避免IE执行AJAX时,返回JSON出现下载文件 -->
<!-- <bean id="mappingJacksonHttpMessageConverter" -->
<!-- class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> -->
<!-- <property name="supportedMediaTypes"> -->
<!-- <list> -->
<!-- <value>text/html;charset=UTF-8</value> -->
<!-- </list> -->
<!-- </property> -->
<!-- </bean> -->
<!-- 定义跳转的文件的前后缀 ,视图模式配置 -->
<!-- HandlerMapping -->
<!-- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> -->
<!-- <bean id="byteArray_hmc" class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />处理..
<bean id="string_hmc" class="org.springframework.http.converter.StringHttpMessageConverter" />处理.. -->
<!--<bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
只会拦截@RequestMapping的URL
<property name="interceptors">
<list>
<bean class="com.mvc.MyInteceptor"></bean>
</list>
</property>
</bean> --> <!-- HandlerAdapter -->
<!-- <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> -->
<!--<bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" >
<property name="messageConverters">
<list>
<ref bean="byteArray_hmc" />
<ref bean="string_hmc" />
</list>
</property>
</bean>--> <!-- 配置试图解析器 -->
<!-- <bean id="viewResolver" -->
<!-- class="org.springframework.web.servlet.view.InternalResourceViewResolver"> -->
<!-- <property name="prefix" value="/WEB-INF/views/" /> -->
<!-- <property name="suffix" value=".jsp" /> -->
<!-- </bean> --> <!-- <bean id="viewResolverExcel" -->
<!-- class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> -->
<!-- <property name="order" value="1" /> -->
<!-- <property name="basename" value="views" /> -->
<!-- </bean> --> <!-- ViewResolver For FreeMarker -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<!-- 模板后缀,指定html页面为模板 -->
<property name="prefix" value="" />
<property name="suffix" value=".ftl" />
<property name="order" value="0" />
<property name="cache" value="true" />
<!-- 使用这个模板类来解析视图 -->
<!-- <property name="viewClass" value="com.pingan.haofang.util.CommonFreeMarkerView" /> -->
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
<property name="exposeSpringMacroHelpers" value="true" />
<!-- 允许访问请求属性,默认为false -->
<property name="exposeRequestAttributes" value="true" />
<!-- 允许访问会话属性,默认为false -->
<property name="exposeSessionAttributes" value="true" />
<!-- 页面上下文,类似于request.contextPath -->
<property name="requestContextAttribute" value="rc" />
<!-- 模板输出内容编码,此处应与defaultEncoding保持一致 -->
<property name="contentType" value="text/html;charset=UTF-8"></property>
</bean>
<!-- freemarker的配置 -->
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!-- 模板文件所在目录 -->
<property name="templateLoaderPath" value="/WEB-INF/views/" />
<!-- FreeMarker环境属性配置 -->
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">20</prop><!--刷新模板的周期,单位为秒,每隔20秒检查模板是否更新,单位为秒如果不经常更新模板可将更新的延迟时间设定长一点 -->
<prop key="default_encoding">UTF-8</prop><!--指定FreeMarker模板文件的编码格式 -->
<prop key="output_encoding">UTF-8</prop>
<prop key="locale">zh-CN</prop><!-- 本地化设置,指定地区语言环境,我们的语言是中文 -->
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">#.##########</prop>
<prop key="boolean_format">true,false</prop>
<prop key="whitespace_stripping">true</prop>
<prop key="tag_syntax">auto_detect</prop>
<prop key="url_escaping_charset">UTF-8</prop>
<prop key="classic_compatible">true</prop>
<prop key="template_exception_handler">ignore</prop>
</props>
</property>
</bean>
<!-- 对某些静态资源,如css,js,图片等进行过滤 ,有引用 "/res/**" 的路径引用转到工程的/res/目录取资源,cache-period启用浏览器缓存,上传的图片缓存1个月,其他js,css,img资源缓存一年 -->
<mvc:resources mapping="/res/**" location="/WEB-INF/res/,/META-INF/res/" cache-period="31536000" />
<!-- <mvc:interceptors> -->
<!-- <mvc:mapping path="/**" /> -->
<!-- <mvc:exclude-mapping path="/user/*" /> -->
<!-- <bean class="com.test.web.interceptor.PermissionInterceptor" /> -->
<!-- </mvc:interceptor> -->
<!-- </mvc:interceptors> -->
<!-- 文件上传解析器 id 必须为multipartResolver,SpringMVC在超出上传文件限制时, 会抛出org.springframework.web.multipart.MaxUploadSizeExceededException,
该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中, 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 文件大小最大值 -->
<property name="maxUploadSize" value="10485760000" />
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="40960" />
</bean>
<!-- <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"
p:basename="i18n/messages" /> --> <!-- HttpMessageConverter用于将对象输出到客户端 -->
<!-- <bean id="jsonmessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> -->
<!-- </bean> -->
<!-- 全局异常处理器 -->
<!-- <bean id="handlerExceptionResolver" -->
<!-- class="com.pingan.haofang.process.exception.ExceptionResolverCustom"> -->
<!-- <property name="jsonmessageConverter" ref="jsonmessageConverter" /> -->
<!-- </bean> -->
<!--定义异常处理页面 -->
<!-- <bean id="exceptionResolver" -->
<!-- class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> -->
<!-- <property name="exceptionMappings"> -->
<!-- <props> -->
<!-- <prop key="java.sql.SQLException">exception</prop> -->
<!-- <prop key="java.io.IOException">exception</prop> -->
<!-- <prop key="java.lang.IOException">exception</prop> -->
<!-- <prop key="java.lang.NullPointerException">exception</prop> -->
<!-- </props> -->
<!-- </property> -->
<!-- </bean> -->
</beans>
5./src/main/resources/config/jdbc.properties文件内容:
jdbc.driver=com.mysql.jdbc.Driver
#jdbc.driver=org.sqlite.JDBC
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
#jdbc.url=jdbc:sqlite:D:/test.db
jdbc.username=root
jdbc.password=123456
#\u5B9A\u4E49\u521D\u59CB\u8FDE\u63A5\u6570
jdbc.initialSize=10
#\u5B9A\u4E49\u6700\u5927\u8FDE\u63A5\u6570
jdbc.maxActive=20
#\u5B9A\u4E49\u6700\u5927\u7A7A\u95F2
jdbc.maxIdle=20
#\u5B9A\u4E49\u6700\u5C0F\u7A7A\u95F2
jdbc.minIdle=3
#\u5B9A\u4E49\u6700\u957F\u7B49\u5F85\u65F6\u95F4
jdbc.maxWait=60000
#\u81EA\u52A8\u6E05\u9664\u65E0\u7528\u8FDE\u63A5
jdbc.removeAbandoned=true
#\u6E05\u9664\u65E0\u7528\u8FDE\u63A5\u7684\u7B49\u5F85\u65F6\u95F4
jdbc.removeAbandonedTimeout=180
#\u8FDE\u63A5\u5C5E\u6027
jdbc.connectionProperties="clientEncoding\=utf-8"
6./src/main/resources/config/log4j.properties文件内容:
#root directory for log files
dir=..//Logs
#log file for online
file00=error.log
#log file for batch
file01=debug.log
#log file size
fileSize=10000KB
#back up numbers for log file
backup=10
###########################default log level and log appender###########################
log4j.rootLogger=console
#log4j.logger.platform_debug=DEBUG,DEBUGFILE
#log4j.logger.platform_error=ERROR,ERRORFILE
#log4j.logger.platform_info=INFO,INFOFILE
########################################################################################
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%-5p][%t] method\:%l%n %m%n
########################################################################################
#log4j.appender.DEBUGFILE=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.DEBUGFILE.file=\\temp_space\\logs\\platform-debug.log
#log4j.appender.DEBUGFILE.file=${dir}/debug.log
#log4j.appender.DEBUGFILE.DatePattern='_'yyyy-MM-dd'.log'
#log4j.appender.DEBUGFILE.layout=org.apache.log4j.PatternLayout
#log4j.appender.DEBUGFILE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%-5p][%t] method\:%l%n %m%n
########################################################################################
log4j.appender.ERRORFILE=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.ERRORFILE.file=\\temp_space\\logs\\platform-error.log
log4j.appender.ERRORFILE.file=/data/logs/platform-error.log
log4j.appender.ERRORFILE.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.ERRORFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ERRORFILE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%-5p][%t] method\:%l%n %m%n
########################################################################################
#log4j.appender.SYSFILE=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.SYSFILE.file=\\temp_space\\logs\\platform-sys.log
#log4j.appender.SYSFILE.file=/data/logs/platform-sys.log
#log4j.appender.SYSFILE.DatePattern='_'yyyy-MM-dd'.log'
#log4j.appender.SYSFILE.layout=org.apache.log4j.PatternLayout
#log4j.appender.SYSFILE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%-5p][%t] method\:%l%n %m%n
########################################################################################
#log4j.appender.INFOFILE=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.INFOFILE.file=\\temp_space\\logs\\platform-info.log
#log4j.appender.INFOFILE.file=/data/logs/platform-info.log
#log4j.appender.INFOFILE.DatePattern='_'yyyy-MM-dd'.log'
#log4j.appender.INFOFILE.layout=org.apache.log4j.PatternLayout
#log4j.appender.INFOFILE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%-5p][%t] method\:%l%n %m%n
########################################################################################
7./src/main/resources/config/quartz.properties文件内容:
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
# org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true org.quartz.jobStore.misfireThreshold: 60000 org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
8./src/main/resources/config/redis.properties文件内容:
# Redis settings
# server IP
redis.host=127.0.0.1
# server port
redis.port=6379
# server password
redis.password=myredis
# use dbIndex
redis.pool.database=0
# \u63A7\u5236\u4E00\u4E2Apool\u6700\u591A\u6709\u591A\u5C11\u4E2A\u72B6\u6001\u4E3Aidle(\u7A7A\u95F2\u7684)\u7684jedis\u5B9E\u4F8B
redis.pool.maxIdle=300
# \u8868\u793A\u5F53borrow(\u5F15\u5165)\u4E00\u4E2Ajedis\u5B9E\u4F8B\u65F6\uFF0C\u6700\u5927\u7684\u7B49\u5F85\u65F6\u95F4\uFF0C\u5982\u679C\u8D85\u8FC7\u7B49\u5F85\u65F6\u95F4(\u6BEB\u79D2)\uFF0C\u5219\u76F4\u63A5\u629B\u51FAJedisConnectionException\uFF1B
redis.pool.maxWait=3000
redis.pool.maxTotal=600
# \u5728borrow\u4E00\u4E2Ajedis\u5B9E\u4F8B\u65F6\uFF0C\u662F\u5426\u63D0\u524D\u8FDB\u884Cvalidate\u64CD\u4F5C\uFF1B\u5982\u679C\u4E3Atrue\uFF0C\u5219\u5F97\u5230\u7684jedis\u5B9E\u4F8B\u5747\u662F\u53EF\u7528\u7684
redis.pool.testOnBorrow=true
#\u6700\u5927\u5206\u914d\u7684\u5bf9\u8c61\u6570
redis.pool.maxActive=1024
#\u5f53\u8c03\u7528return Object\u65b9\u6cd5\u65f6\uff0c\u662f\u5426\u8fdb\u884c\u6709\u6548\u6027\u68c0\u67e5
redis.pool.testOnReturn=true
9./src/main/resources/config/spring-redis.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<!-- 引入配置文件 -->
<context:property-placeholder location="classpath*:config/redis.properties" />
<!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 -->
<!-- <cache:annotation-driven cache-manager="cacheManager" /> -->
<!-- spring自己的缓存管理器,这里定义了两个缓存位置名称 ,既注解中的value -->
<!-- <bean id="redisManager" class="org.springframework.cache.support.SimpleCacheManager"> -->
<!-- <property name="caches"> -->
<!-- <set> -->
<!-- <bean class="org.cpframework.cache.redis.RedisCache"> -->
<!-- <property name="redisTemplate" ref="redisTemplate" /> -->
<!-- <property name="name" value="default"/> -->
<!-- </bean> -->
<!-- <bean class="org.cpframework.cache.redis.RedisCache"> -->
<!-- <property name="redisTemplate" ref="redisTemplate02" /> -->
<!-- <property name="name" value="commonCache"/> -->
<!-- </bean> -->
<!-- </set> -->
<!-- </property> -->
<!-- </bean> --> <!-- <bean id="redisCacheManager" class="com.pingan.haofang.service.impl.RedisCacheManger"> -->
<!-- <property name="pool" ref="shardedJedisPool" /> -->
<!-- </bean> -->
<!-- jedis 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- <property name="maxActive" value="${redis.pool.maxActive}" /> -->
<!-- <property name="maxWait" value="${redis.pool.maxWait}" /> -->
<property name="maxTotal" value="${redis.pool.maxTotal}" />
<property name="maxIdle" value="${redis.pool.maxIdle}" />
<property name="maxWaitMillis" value="${redis.pool.maxWait}" />
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
</bean>
<!-- jedis 多个服务器配置 -->
<bean id="jedisShardInfo" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="${redis.host}" />
<constructor-arg index="1" value="${redis.port}" type="int" />
</bean>
<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<ref bean="jedisShardInfo" />
</list>
</constructor-arg>
</bean> <bean id="connectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}" />
<property name="port" value="${redis.port}" />
<property name="password" value="${redis.password}" />
<property name="poolConfig" ref="jedisPoolConfig" />
<property name="shardInfo" ref="shardedJedisPool"></property>
</bean>
<!-- redis template definition -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
p:connectionFactory-ref="connectionFactory"
p:keySerializer-ref="redisTemplateKeySerializer"
p:valueSerializer-ref="redisTemplateValueSerializer"
p:hashKeySerializer-ref="redisTemplateHashKeySerializer"
p:hashValueSerializer-ref="redisTemplateHashValueSerializer"/>
<bean id="redisTemplateKeySerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<bean id="redisTemplateValueSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
<bean id="redisTemplateHashKeySerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<bean id="redisTemplateHashValueSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</beans>
10./src/main/java/com/test/model/User.java文件内容:
package com.test.model; import java.io.Serializable; public class User implements Serializable{
private static final long serialVersionUID = 585953615014678681L;
private int id;
private String account;
private String passwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
} }
11./src/main/java/com/test/dao/IUserDao.java文件内容:
/src/main/java/com/test/service/IUserService.java文件内容:
package com.test.dao; import java.util.List;
import java.util.HashMap;
import org.apache.ibatis.annotations.Param;
import com.test.model.User; public interface IUserDao {
public boolean add(User user);
public boolean adds(@Param("users")List<User> users);
public boolean update(User user);
public boolean delete(int id);
public boolean deletes(@Param("users")List<Integer> users);
public User findById(int id);
public User login(HashMap<String, String> map);
public List<User> findAllUser();
}
package com.test.service; import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.test.model.User; public interface IUserService {
public boolean add(User user);
public boolean adds(@Param("users")List<User> users);
public boolean update(User user);
public boolean delete(int id);
public boolean deletes(@Param("users")List<Integer> users);
public User findById(int id);
public User login(HashMap<String, String> map);
public List<User> findAllUser();
}
12./src/main/java/com/test/mappers/User-mapper.xml文件内容:
<?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.test.dao.IUserDao">
<resultMap type="User" id="UserResults">
<result property="id" column="uid" jdbcType="INTEGER" />
<result property="account" column="uname" jdbcType="VARCHAR" />
<result property="passwd" column="upasswd" jdbcType="VARCHAR" />
</resultMap>
<sql id="Base_Column_List">
uid, uname, upasswd
</sql>
<select id="findAllUser" resultMap="UserResults">
select
<include refid="Base_Column_List" />
from users
</select>
<select id="findById" resultMap="UserResults" parameterType="java.lang.Integer">
select
<include refid="Base_Column_List" />
from users where uid = #{id,jdbcType=INTEGER}
</select>
<select id="login" resultMap="UserResults" parameterType="User">
select
<include refid="Base_Column_List" />
from users where uname = #{account,jdbcType=VARCHAR} and upasswd =
#{passwd,jdbcType=VARCHAR}
</select> <insert id="add" parameterType="User">
insert into users(uname, upasswd)
values(#{account,jdbcType=VARCHAR},#{passwd,jdbcType=VARCHAR})
</insert>
<insert id="adds" parameterType="java.util.List">
insert into users(uname, upasswd) values
<foreach collection="users" item="user" index="index" separator=",">
(#{user.account,jdbcType=VARCHAR},#{user.passwd,jdbcType=VARCHAR})
</foreach>
</insert>
<update id="update" parameterType="User">
update users
<set>
<!-- 这里要注意后面的 逗号“,” 因为有多个参数需要用逗号隔开 否则会报错 -->
<if test="account != null"> uname = #{account,jdbcType=VARCHAR},</if>
<if test="passwd != null"> upasswd = #{passwd,jdbcType=VARCHAR}</if>
</set>
where uid = #{id,jdbcType=INTEGER}
</update>
<delete id="delete" parameterType="java.lang.Integer">
delete from users where uid = #{id,jdbcType=INTEGER}
</delete>
<delete id="deletes" parameterType="java.util.List">
delete from users where uid in
<foreach collection="users" item="id" index="index" open="(" separator="," close=")">
#{id,jdbcType=INTEGER}
</foreach>
</delete>
</mapper>
13./src/main/java/com/test/action/HomeController.java文件内容:
package com.test.action; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView; @Controller
@RequestMapping(value = "/")
public class HomeController {
@RequestMapping(value = "/index", method = RequestMethod.GET)
public ModelAndView getFirstPage(HttpServletRequest request) {
// index就是视图的名称(index.ftl)
ModelAndView mv = new ModelAndView();
HttpSession session = request.getSession();
mv.setViewName("index");
session.setAttribute("title", "This is a freemaker test!");
return mv;
}
}
14./src/main/java/com/test/service/impl/UserServiceImpl.java文件内容:
package com.test.service.impl; import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.test.dao.IUserDao;
import com.test.service.IUserService;
import com.test.model.User; @Service("userService")
public class UserServiceImpl implements IUserService { @Autowired
private IUserDao userDao; @Override
public List<User> findAllUser() {
return userDao.findAllUser();
} @Override
public boolean add(User user) {
return userDao.add(user);
} @Override
public boolean update(User user) {
return userDao.update(user);
} @Override
public boolean delete(int id) {
return userDao.delete(id);
} @Override
public User findById(int id) {
return userDao.findById(id);
} @Override
public User login(HashMap<String, String> map) {
return userDao.login(map);
} @Override
public boolean adds(@Param("users") List<User> users) {
return userDao.adds(users);
} @Override
public boolean deletes(@Param("users") List<Integer> users) {
return userDao.deletes(users);
} }
15./src/main/java/com/test/action/UserController.java文件内容:
package com.test.action; import java.util.HashMap;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
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.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView; import com.test.model.User;
import com.test.service.IUserService; @Controller
@RequestMapping(value = "/user")
public class UserController {
@Autowired
private IUserService userService; // 用户登录
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(
HttpServletRequest request,
@RequestParam(value = "account", required = true, defaultValue = "test") String uname, @RequestParam(value = "passwd", required = true, defaultValue = "test") String upasswd) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("account", uname);
map.put("passwd", upasswd);
HttpSession session = request.getSession();
User user = userService.login(map);
if (user != null) {
session.setAttribute("loginStatus","OK");
return "redirect:/user/userList";
} else {
session.setAttribute("loginStatus", "用户名或密码错误");
return "/index";
}
} // 用户列表
@RequestMapping(value = "/userList")
public ModelAndView listAll() {
ModelAndView MV = new ModelAndView("user/user_list");
List<User> userList = userService.findAllUser();
MV.addObject("users", userList);
return MV;
} // 新增用户
@RequestMapping(value = "/insertuser", method = RequestMethod.POST)
public String insert(HttpServletRequest request, User user) {
HttpSession session = request.getSession();
session.removeAttribute("loginError");
session.removeAttribute("delStatus");
session.removeAttribute("updateStatus");
if (user != null && user.getAccount().trim().length() > 0
&& user.getPasswd().trim().length() > 0) {
boolean result = userService.add(user);
if (result) {
session.setAttribute("insertStatus", "添加成功!");
} else {
session.setAttribute("insertStatus", "添加失败!");
}
} else {
session.setAttribute("insertStatus", "添加失败,用户名或密码为空!");
}
return "redirect:/user/userList";
} // 查找用户
@RequestMapping(value = "/findUser")
public ModelAndView find(@RequestParam(value = "id") int id) {
ModelAndView mv = new ModelAndView("user/update");
User user = userService.findById(id);
mv.addObject("user", user);
return mv;
} // 更新用户信息
@RequestMapping(value = "/updateUser", method = RequestMethod.POST)
public String updateUser(HttpServletRequest request, User userInfo) {
boolean result = userService.update(userInfo);
HttpSession session = request.getSession();
if (result) {
session.removeAttribute("insertStatus");
session.removeAttribute("delStatus");
session.setAttribute("updateStatus", "修改成功!");
}
return "redirect:/user/userList";
} // 删除用户
@RequestMapping(value = "/deleteUser")
public String deleteuser(HttpServletRequest request,
@RequestParam(value = "id") int id) {
boolean result = userService.delete(id);
HttpSession session = request.getSession();
if (result) {
session.removeAttribute("insertStatus");
session.removeAttribute("updateStatus");
session.setAttribute("delStatus", "删除成功!");
}
return "redirect:/user/userList";
} // 注销
@RequestMapping(value = "/clear")
public String clear(HttpServletRequest request) {
HttpSession session = request.getSession();
session.invalidate();
return "redirect:/";
}
}
16.Junit测试文件内容:
package RedisTest; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
import com.test.model.User;
import com.test.service.IUserService; @ContextConfiguration(locations={"classpath:config/applicationContext.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
//如果是true不会改变数据库数据,如果是false会改变数据
@TransactionConfiguration(transactionManager="txManager",defaultRollback=false)
public class MyBatisTest { @Autowired
private IUserService userService;
/**
* 登录
*/
@Test
public void login() {
HashMap<String, String> map=new HashMap<String, String>();
map.put("account", "root");
map.put("passwd", "root");
User user = userService.login(map);
System.out.println("用户名:"+user.getAccount()+"\n密码:"+user.getPasswd());
}
/**
* 新增
* 运行时间0.542秒
*/
@Test
public void testAddUser() {
User user = new User();
user.setAccount("user1");
user.setPasswd("test1");
boolean result = userService.add(user);
Assert.assertTrue(result);
}
/**
* 批量新增 普通方式
* 开始时间:1459563108708 结束时间:1459563117616 时间差:8908毫秒
* 运行时间10.010秒
*/
@Test
public void testAddUsers1() {
List<User> list = new ArrayList<User>();
for (int i = 10; i < 50010; i++) {
User user = new User();
user.setAccount("user"+ i);
user.setPasswd("test"+ i);
list.add(user);
}
long begin = System.currentTimeMillis();
for (User user : list) {
userService.add(user);
}
long end = System.currentTimeMillis();
System.out.println("开始时间:"+begin+" 结束时间:"+end +" 时间差:" +(end - begin));
}
/**
* 批量新增 数据库批量方式
* 开始时间:1459563210579 结束时间:1459563213050 时间差:2471毫秒
* 运行时间3.265秒
*/
@Test
public void testAddUsers2() {
List<User> list = new ArrayList<User>();
for (int i = 10; i < 50010; i++) {
User user = new User();
user.setAccount("user"+ i);
user.setPasswd("test"+ i);
list.add(user);
}
long begin = System.currentTimeMillis();
boolean result = userService.adds(list);
long end = System.currentTimeMillis();
System.out.println("开始时间:"+begin+" 结束时间:"+end +" 时间差:" +(end - begin));
Assert.assertTrue(result);
}
/**
* 修改
* 运行时间0.645秒
*/
@Test
public void testUpdate() {
User user = userService.findById(4);
user.setPasswd("new_password");
boolean result = userService.update(user);
Assert.assertTrue(result);
}
/**
* 根据id查找
* 运行时间0.361秒
*/
@Test
public void testGetUserById() {
int id = 4;
User user = userService.findById(id);
Assert.assertNotNull(user);
Assert.assertEquals(user.getPasswd(), "new_password");
}
/**
* 通过id删除单个
* 运行时间0.633秒
*/
@Test
public void testDelete() {
int id = 981;
boolean result = userService.delete(id);
Assert.assertTrue(result);
} /**
* 批量删除 普通方式
* 开始时间:1459563760155 结束时间:1459563768336 时间差:8181毫秒
* 运行时间8.958秒
*/
@Test
public void testDeletes1() {
List<Integer> list = new ArrayList<Integer>();
for (int i = 10; i < 50010; i++) {
list.add(i);
}
long begin = System.currentTimeMillis();
for (Integer id : list) {
userService.delete(id);
}
long end = System.currentTimeMillis();
System.out.println("开始时间:"+begin+" 结束时间:"+end +" 时间差:" +(end - begin));
}
/**
* 批量删除 数据库批量方式
* 开始时间:1459563867103 结束时间:1459563868846 时间差:1743毫秒
* 运行时间2.404秒
*/
@Test
public void testDeletes2() {
List<Integer> list = new ArrayList<Integer>();
for (int i = 10; i < 50010; i++) {
list.add(i);
}
long begin = System.currentTimeMillis();
boolean result = userService.deletes(list);
long end = System.currentTimeMillis();
System.out.println("开始时间:"+begin+" 结束时间:"+end +" 时间差:" +(end - begin));
Assert.assertTrue(result);
}
}
17./src/main/webapp/WEB-INF/views/index.ftl文件内容:
<!DOCTYPE html>
<#import "spring.ftl" as s />
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首页</title>
<script type="text/javascript" src="<@s.url '/res/jquery-1.11.3.js'/>"></script>
<script type="text/javascript">
$(function() {
$("#btn").on("click",function() {
htmlobj = $.ajax({url : "<@s.url '/res/demo_test.txt'/>",async : false});
$("#results").append(htmlobj.responseText + "<br />");
params = $("#loginForm").serializeArray();
//var stack =JSON.stringify(params);
$.each(params, function(i, field) {
$("#results").append(field.name + ":" + field.value + "<br />");
if (isEmpty(field.value)) {
return;//验证是否为空
}
});
//$.ajax({type: "POST",url:"user/login",async:false,data: params});
/* $.post("user/login", params,function(data,status){
var loginStatus="";
<#if loginStatus??>
loginStatus+='${loginStatus}';
</#if>
if(status == "success" && !isEmpty(loginStatus) && loginStatus !="用户名或密码错误"){
document.write(data);
window.location.href="user/userList";
}
},"text"); */
$("#loginForm").attr("action", "user/login");
$("#loginForm").submit();
});
})
//非空判断
function isEmpty(strIn) {
if (strIn === undefined) {
return true;
} else if (strIn == null) {
return true;
} else if (strIn == "") {
return true;
} else {
return false;
}
} function check(obj) {
var content = obj.val();
var attribute = obj.attr("name");
if (attribute == "account" && !content) {//验证用户名是否为空
$("#msg1").val("用户名不能为空!");
$("#account").focus();
} else {
$("#msg1").val("");
}
if (attribute == "passwd" && !content) {//验证密码是否为空
$("#msg2").val("密码不能为空!");
$("#passwd").focus();
} else {
$("#msg2").val("");
}
}
</script>
<style type="text/css">
.textStyle{font-size: 20px;color: red;}
</style>
</head> <body>
<p class="textStyle">Hello!${title}</p>
<div align="center"><img src = "<@s.url '/res/images/img1.jpg'/>" height="200px" width="400px"/></div>
<!-- action="user/login" -->
<form method="post" id="loginForm" action="">
<br>用户名:
<input type="text" id="account" maxlength="16" name="account" value="" onblur="check($(this))" /> <span id="msg1" class="textStyle"></span>
<br>密码:
<input type="password" id="passwd" maxlength="16" name="passwd" value="" onblur="check($(this))"/> <span id="msg2" class="textStyle"></span>
<br><input type="reset" value="重置" /> <input id="btn" type="button" value="登录" />
</form>
<br />
<div class="textStyle">
<p id="results" ></p><br />
<#if loginStatus??>
${loginStatus}
</#if>
</div>
</body>
</html>
18./src/main/webapp/WEB-INF/views/user/user_list.ftl文件内容;
<#setting classic_compatible=true>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>用户列表</title>
<style type="text/css">
<!--
.STYLE1 {
font-family: Arial, Helvetica, sans-serif,新宋体;
font-weight: bold;
font-size: 26px;
color: #FF0000;
} .STYLE13 {
font-size: 22
} .STYLE15 {
font-family: Arial, Helvetica, sans-serif;
font-size: 20px;
}
-->
</style>
</head> <body>
<form action="insertuser" method="post">
<table>
<tr>
<th>账号</th>
<td><input type="text" name="account" /></td>
</tr>
<tr>
<th>密码</th>
<td><input type="text" name="passwd" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="添加"></td>
</tr>
</table>
</form>
<table width="900" height="500" border="2" cellpadding="0"
cellspacing="1" align="center">
<tr>
<td colspan="4" height="40" align="center" valign="middle"><span
class="STYLE1">用户列表</span></td>
</tr>
<tr>
<td width="150" height="30" align="center" valign="middle"><span
class="STYLE15">账号</span></td>
<td width="150" height="30" align="center" valign="middle"><span
class="STYLE15">密码</span></td>
<td colspan="2" width="120" height="30" align="center"
valign="middle"><span class="STYLE15">功能</span></td>
</tr>
<#list users as user>
<tr>
<td width="150" height="30" align="center" valign="middle"><span
class="STYLE15">${user.account}</span></td>
<td width="150" height="30" align="center" valign="middle"><span
class="STYLE15">${user.passwd}</span></td>
<td width="60" height="30" align="center" valign="middle"><a
href="findUser?id=${user.id}">修改</a></td>
<td width="60" height="30" align="center" valign="middle"><a
href="deleteUser?id=${user.id}">删除</a></td>
</tr>
</#list>
</table>
<br />
<div align="center">
<a href="clear">注销</a>
</div>
<br />
<#if updateStatus??>
<div align="center">
<font color="red">${updateStatus}</font>
</div>
</#if> <#if insertStatus??>
<div align="center">
<font color="red">${insertStatus}</font>
</div>
</#if> <#if delStatus??>
<div align="center">
<font color="red">${delStatus}</font>
</div>
</#if>
</body>
</html>
19./src/main/webapp/WEB-INF/views/user/update.ftl文件内容:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>更新用户信息</title>
</head>
<body>
<form action="updateUser" method="post">
<input type="hidden" name="id" value="${user.id}" />
<table>
<tr>
<th>账号</th>
<td><input type="text" name="account" value="${user.account}" /></td>
</tr>
<tr>
<th>密码</th>
<td><input type="text" name="passwd" value="${user.passwd}" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="修改"></td>
</tr>
</table>
</form>
</body>
</html>
20./src/main/webapp/WEB-INF/res/jquery-1.11.3.js
spring+freemarker+redis的更多相关文章
- springMVC 缓存(入门 spring+mybaties+redis一)
使用redis之前需要咋电脑上安装redis: 使用spring+mybaties+redis的本质是扩展类 org.apache.ibatis.cache.Cache:在我们自己扩展的Cache ...
- spring boot redis缓存JedisPool使用
spring boot redis缓存JedisPool使用 添加依赖pom.xml中添加如下依赖 <!-- Spring Boot Redis --> <dependency> ...
- spring和redis的整合-超越昨天的自己系列(7)
超越昨天的自己系列(7) 扯淡: 最近一直在慢慢多学习各个组件,自己搭建出一些想法.是一个涉猎的过程,慢慢意识到知识是可以融汇贯通,举一反三的,不过前提好像是研究的比较深,有了自己的见解.自认为学习 ...
- spring data redis RedisTemplate操作redis相关用法
http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...
- Spring boot配合Spring session(redis)遇到的错误
背景:本MUEAS项目,一开始的时候,是没有引入redis的,考虑到后期性能的问题而引入.之前没有引用redis的时候,用户登录是正常的.但是,在加入redis支持后,登录就出错!错误如下: . __ ...
- 【Spring】Redis的两个典型应用场景--good
原创 BOOT Redis简介 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化. ...
- spring mvc Spring Data Redis RedisTemplate [转]
http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...
- Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解
一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...
- Spring Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
随机推荐
- elasticsearch RestHighLevelClient 使用方法及封装工具
目录 EsClientRHL 更新日志 开发原因: 使用前你应该具有哪些技能 工具功能范围介绍 工具源码结构介绍 开始使用 未来规划 git地址:https://gitee.com/zxporz/ES ...
- sqlldr将txt导入oracle数据库
注意事项: 1.userid 和 control关键字不要缺少: 2.注意数据库格式:test/test@数据库IP:1521/Oracle8,最后一个是tnsnames中的service_name, ...
- idea右侧的工具栏不见,包括maven以及其他
通用,设置后右侧工具栏可见 可以通过view-->windows tool看到maven的
- MySQL - UNION 和 UNION ALL 操作符
UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SE ...
- http 高级配置 虚拟主机,https 编译安装
目录 http 高级配置 虚拟主机,https 编译安装 http 重定向 https HSTS HSTS preload list http 自带的工具程序 httpd的压力测试工具 实现状态页 反 ...
- 《TensorFlow实战》中AlexNet卷积神经网络的训练中
TensorFlow实战中AlexNet卷积神经网络的训练 01 出错 TypeError: as_default() missing 1 required positional argument: ...
- 三 python并发编程之多线程-重点
一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 二 开启线程的两种方式 #方式一 from th ...
- 面试前赶紧看了5道Python Web面试题,Python面试题No17
目录 本面试题题库,由公号:非本科程序员 整理发布 第1题: Flask中的请求上下文和应用上下文是什么? 第2题:django中间件的使用? 第3题: django开发中数据做过什么优化? 第4题: ...
- python模块汇总练习
模块练习 1.random模块 # print(random.random()) # print(random.randint(1,3)) #模拟随机验证码 def make_code(n=5): r ...
- Insertion Sort Gym - 101955C 思路+推公式
题目:题目链接 题意:对长为n的1到n的数列的前k个数排序后数列的最长上升子序列长度不小于n-1的数列的种数,训练赛时怎么都读不明白这个题意,最后还是赛后问了旁队才算看懂,英语水平急需拯救55555 ...