JavaEE之MVC框架组合(SpringMVC+Spring4.0+Mybatis3.2)搭建过程详解
2017-01-02 17:01
525 查看
很久之前就想写的教程,因为忙着找实习的原因,没有整理出来,首先SSM框架组合(SpringMVC+Spring+Mybatis)和SSH(Spring4.0+Struts2+Hibernate4.0)组合是外面企业里很常用的两种MVC架构,本博客介绍SSM框架组合,这种MVC架构的搭建过程
jar准备的话,可以用maven或者网上下载
SpringMVC需要的jar
jar作用详解(网上收集):
aopaliance.jar
包含了针对面向切面的接口,通常Spring等其它具备动态织入功能的框架依赖此包
spring-aop.jar
这个jar 文件包含在应用中使用Spring 的AOP 特性时所需的类和源码级元数据支持。使用基于AOP 的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。
外部依赖spring-core, (spring-beans,AOP Alliance, CGLIB,Commons Attributes)。
spring-aspects.jar
提供对AspectJ的支持,以便可以方便的将面向方面的功能集成进IDE中,比如Eclipse AJDT。
外部依赖。
spring-beans.jar
这个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了。
外部依赖spring-core,(CGLIB)。
spring-context.jar
这个jar 文件为Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。
外部依赖spring-beans, (spring-aop)。
spring-core.jar
这个jar 文件包含Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。
外部依赖Commons Logging, (Log4J)。
spring-expression.jar
Spring表达式语言需要的jar
spring-jdbc.jar
这个jar 文件包含对Spring 对JDBC 数据访问进行封装的所有类。
外部依赖spring-beans,spring-dao。
spring-test.jar
spring框架对junit框架简单封装的jar
spring-tx.jar
提供对事务的支持,事务的相关处理以及实现类就在这个jar包中
spring-context-support.jar
这个jar 文件包含支持UI模版(Velocity,FreeMarker,JasperReports),邮件服务,脚本服务(JRuby),缓存Cache(EHCache),任务计划Scheduling(uartz)方面的类。
外部依赖spring-context, (spring-jdbc, Velocity, FreeMarker, JasperReports, BSH, Groovy, JRuby, Quartz, EHCache)
spring-web.jar
这个jar 文件包含Web 应用开发时,用到Spring 框架时所需的核心类,包括自动载入Web Application Context 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。
外部依赖spring-context, Servlet API, (JSP API, JSTL, Commons FileUpload, COS)。
spring-webmvc.jar
这个jar 文件包含Spring MVC 框架相关的所有类。包括框架的Servlets,Web MVC框架,控制器和视图支持。当然,如果你的应用使用了独立的MVC 框架,则无需这个JAR 文件里的任何类。
外部依赖spring-web, (spring-support,Tiles,iText,POI)。
Mybatis需要的jar,mybatis-spring1.2.1.jar用于spring整合mybatis框架
jstl需要的jar,主要开发中,SSH框架习惯用Struts2提供的标签,SSM框架习惯用JSTL
Log4j需要的jar:
另外加入:aspectjweaver.jar:
aspectjweaver.jar是spring集成AspectJ LTW织入器所需包
需要AOP动态代理的需要加入:
cglib-nodep.jar
阿里连接池框架加入:druid.jar
权限安全框架Shiro加入:shiro.jar
Json解析需要加入的jar有:
新建一个resource的资源文件
配置mybatis和spring
ok,现在配置XML
mybatis.xml:
SpringMVC的配置:
Spring的配置:
jsbc和log4j的配置
log4j配置
web.xml
现在以Dao代理的方式实习数据获取
DaoSupport.java
写个实体信息类:
其Mapper代码:
写个BaseController:
业务层代码Service:
Controller层代码:
为了代码安全性,将jsp全部放在WEB-INF下面:
jsp页面代码,用cstl获取数据
jar准备的话,可以用maven或者网上下载
SpringMVC需要的jar
jar作用详解(网上收集):
aopaliance.jar
包含了针对面向切面的接口,通常Spring等其它具备动态织入功能的框架依赖此包
spring-aop.jar
这个jar 文件包含在应用中使用Spring 的AOP 特性时所需的类和源码级元数据支持。使用基于AOP 的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。
外部依赖spring-core, (spring-beans,AOP Alliance, CGLIB,Commons Attributes)。
spring-aspects.jar
提供对AspectJ的支持,以便可以方便的将面向方面的功能集成进IDE中,比如Eclipse AJDT。
外部依赖。
spring-beans.jar
这个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了。
外部依赖spring-core,(CGLIB)。
spring-context.jar
这个jar 文件为Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。
外部依赖spring-beans, (spring-aop)。
spring-core.jar
这个jar 文件包含Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。
外部依赖Commons Logging, (Log4J)。
spring-expression.jar
Spring表达式语言需要的jar
spring-jdbc.jar
这个jar 文件包含对Spring 对JDBC 数据访问进行封装的所有类。
外部依赖spring-beans,spring-dao。
spring-test.jar
spring框架对junit框架简单封装的jar
spring-tx.jar
提供对事务的支持,事务的相关处理以及实现类就在这个jar包中
spring-context-support.jar
这个jar 文件包含支持UI模版(Velocity,FreeMarker,JasperReports),邮件服务,脚本服务(JRuby),缓存Cache(EHCache),任务计划Scheduling(uartz)方面的类。
外部依赖spring-context, (spring-jdbc, Velocity, FreeMarker, JasperReports, BSH, Groovy, JRuby, Quartz, EHCache)
spring-web.jar
这个jar 文件包含Web 应用开发时,用到Spring 框架时所需的核心类,包括自动载入Web Application Context 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。
外部依赖spring-context, Servlet API, (JSP API, JSTL, Commons FileUpload, COS)。
spring-webmvc.jar
这个jar 文件包含Spring MVC 框架相关的所有类。包括框架的Servlets,Web MVC框架,控制器和视图支持。当然,如果你的应用使用了独立的MVC 框架,则无需这个JAR 文件里的任何类。
外部依赖spring-web, (spring-support,Tiles,iText,POI)。
Mybatis需要的jar,mybatis-spring1.2.1.jar用于spring整合mybatis框架
jstl需要的jar,主要开发中,SSH框架习惯用Struts2提供的标签,SSM框架习惯用JSTL
Log4j需要的jar:
另外加入:aspectjweaver.jar:
aspectjweaver.jar是spring集成AspectJ LTW织入器所需包
需要AOP动态代理的需要加入:
cglib-nodep.jar
阿里连接池框架加入:druid.jar
权限安全框架Shiro加入:shiro.jar
Json解析需要加入的jar有:
新建一个resource的资源文件
配置mybatis和spring
ok,现在配置XML
mybatis.xml:
<?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"> <!-- MyBatis的配置文件 --> <configuration> <settings> <setting name="cacheEnabled" value="true" /><!-- 全局映射器启用缓存 --> <setting name="useGeneratedKeys" value="true" /> <setting name="defaultExecutorType" value="REUSE" /> </settings> <!-- 这些根据项目需要进行配置 --> <typeAliases> <typeAlias type="com.appms.entity.User" alias="User"/> <typeAlias type="com.appms.entity.Role" alias="Role"/> <typeAlias type="com.appms.entity.Menu" alias="Menu"/> <typeAlias type="com.appms.entity.Member" alias="Member"/> <typeAlias type="com.appms.entity.Knowledge" alias="Knowledge"/> <typeAlias type="com.appms.entity.Produce" alias="Produce"/> <typeAlias type="com.appms.entity.News" alias="News" /> <typeAlias type="com.appms.entity.GroupClassify" alias="GroupClassify"/> <typeAlias type="com.appms.entity.GroupPost" alias="GroupPost"/> <typeAlias type="com.appms.entity.Period" alias="Period"/> <typeAlias type="com.appms.entity.KLClassify" alias="KLClassify"/> <typeAlias type="com.appms.entity.Knowledge" alias="Knowledge"/> <typeAlias type="com.appms.entity.Video" alias="Video"/> <typeAlias type="com.appms.entity.VideoClassify" alias="VideoClassify"/> <typeAlias type="com.appms.entity.Retroaction" alias="Retroaction"/> <typeAlias type="com.appms.entity.PageData" alias="pd"/> <typeAlias type="com.appms.entity.Page" alias="Page"/> </typeAliases> <!-- --> <plugins> <plugin interceptor="com.appms.plugin.PagePlugin"> <property name="dialect" value="mysql"/> <property name="pageSqlId" value=".*listPage.*"/> </plugin> </plugins> </configuration>
SpringMVC的配置:
<?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: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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <mvc:annotation-driven/> <mvc:default-servlet-handler/> <context:component-scan base-package="com.appms.controller" /> <!-- 对静态资源文件的访问 restful--> <mvc:resources mapping="/assets/**" location="/,/assets/" /> <mvc:resources mapping="/admin/**" location="/,/admin/" /> <mvc:resources mapping="/source/**" location="/,/source/" /> <mvc:resources mapping="/images/**" location="/,/images/" /> <mvc:resources mapping="/music/**" location="/,/music/" /> <mvc:resources mapping="/uploadFile/**" location="/,/uploadFile/" /> <mvc:resources mapping="/plugins/**" location="/,/plugins/" /> <mvc:resources mapping="/uploadFiles/**" location="/,/uploadFiles/" /> <!-- 访问拦截 <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**/**"/> <bean class="com.appweb.interceptor.LoginHandlerInterceptor"/> </mvc:interceptor> </mvc:interceptors> --> <!-- 配置SpringMVC的视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" /> </beans>
Spring的配置:
<?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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 启用注解 --> <context:annotation-config /> <!-- 启动组件扫描,排除@Controller组件,该组件由SpringMVC配置文件扫描 --> <context:component-scan base-package="com.appms"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>/WEB-INF/classes/dbconfig.properties</value> </list> </property> </bean> <!-- 阿里 druid数据库连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <!-- 数据库基本信息配置 --> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <property name="driverClassName" value="${driverClassName}" /> <property name="filters" value="${filters}" /> <!-- 最大并发连接数 --> <property name="maxActive" value="${maxActive}" /> <!-- 初始化连接数量 --> <property name="initialSize" value="${initialSize}" /> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="${maxWait}" /> <!-- 最小空闲连接数 --> <property name="minIdle" value="${minIdle}" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" /> <property name="validationQuery" value="${validationQuery}" /> <property name="testWhileIdle" value="${testWhileIdle}" /> <property name="testOnBorrow" value="${testOnBorrow}" /> <property name="testOnReturn" value="${testOnReturn}" /> <property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}" /> <!-- 打开removeAbandoned功能 --> <property name="removeAbandoned" value="${removeAbandoned}" /> <!-- 1800秒,也就是30分钟 --> <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" /> <!-- 关闭abanded连接时输出错误日志 --> <property name="logAbandoned" value="${logAbandoned}" /> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/> <tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> <tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" /> </tx:attributes> </tx:advice> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 事物处理 --> <aop:config> <aop:pointcut id="pc" expression="execution(* com.appms.service..*(..))" /> <aop:advisor pointcut-ref="pc" advice-ref="txAdvice" /> </aop:config> <!-- 配置mybatis --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property> <!-- mapper扫描 --> <property name="mapperLocations" value="classpath:mybatis/*/*.xml"></property> </bean> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory" /> </bean> <!-- Shiro start --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="ShiroRealm" /> </bean> <!-- 項目自定义的Realm --> <bean id="ShiroRealm" class="com.appms.shiro.ShiroRealm" ></bean> <!-- Shiro Filter --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <property name="loginUrl" value="/" /> <property name="successUrl" value="/main/index" /> <property name="unauthorizedUrl" value="/login_toLogin" /> <property name="filterChainDefinitions"> <value> /source/** = anon /images/** = anon /music/** = anon /uploadFiles/** = anon /plugins/** = anon /uploadFiles/** = anon /code.do = anon /login_login = anon /** = authc </value> </property> </bean> <!-- Shiro end --> </beans>
jsbc和log4j的配置
url:jdbc:mysql://127.0.0.1:3306/db_app?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8 driverClassName:com.mysql.jdbc.Driver username:root password:root filters:stat maxActive:20 initialSize:1 maxWait:60000 minIdle:10 maxIdle:15 timeBetweenEvictionRunsMillis:60000 minEvictableIdleTimeMillis:300000 validationQuery:SELECT 'x' testWhileIdle:true testOnBorrow:false testOnReturn:false maxOpenPreparedStatements:20 removeAbandoned:true removeAbandonedTimeout:1800 logAbandoned:true
log4j配置
### set log levels ### log4j.rootLogger = info , Console , D #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.java.sql.ResultSet=INFO log4j.logger.org.apache=INFO log4j.logger.java.sql.Connection=INFO log4j.logger.java.sql.Statement=INFO log4j.logger.java.sql.PreparedStatement=INFO #output2file log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = D\:/logs/log.log log4j.appender.D.Append = true log4j.appender.D.Threshold = INFO \#\# \u8F93\u51FAinfo\u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7 log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>AppManagerSystem</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/ApplicationContext.xml</param-value> </context-param> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.properties</param-value> </context-param> <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> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 连接池 启用Web监控统计功能 --> <filter> <filter-name>DruidWebStatFilter</filter-name> <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> <init-param> <param-name>exclusions</param-name> <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value> </init-param> </filter> <filter-mapping> <filter-name>DruidWebStatFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>DruidStatView</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping> <!-- --> <filter> <filter-name>loginFilter</filter-name> <filter-class>com.appms.filter.LoginFilter</filter-class> </filter> <filter> <filter-name>startFilter</filter-name> <filter-class>com.appms.filter.StartFilter</filter-class> </filter> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <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:spring/ApplicationContext-mvc.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> <filter> <filter-name>shiroFilter</filter-name> <filter-class> org.springframework.web.filter.DelegatingFilterProxy </filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <session-config> <session-timeout>600</session-timeout> </session-config> </web-app>
现在以Dao代理的方式实习数据获取
package com.appms.dao; public interface DAO { /** * 保存对象 * @param str * @param obj * @return * @throws Exception */ public Object save(String str, Object obj) throws Exception; /** * 修改对象 * @param str * @param obj * @return * @throws Exception */ public Object update(String str, Object obj) throws Exception; /** * 删除对象 * @param str * @param obj * @return * @throws Exception */ public Object delete(String str, Object obj) throws Exception; /** * 查找对象 * @param str * @param obj * @return * @throws Exception */ public Object findForObject(String str, Object obj) throws Exception; /** * 查找对象 * @param str * @param obj * @return * @throws Exception */ public Object findForList(String str, Object obj) throws Exception; /** * 查找对象封装成Map * @param s * @param obj * @return * @throws Exception */ public Object findForMap(String sql, Object obj, String key , String value) throws Exception; }
DaoSupport.java
package com.appms.dao; import java.util.List; import javax.annotation.Resource; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.stereotype.Repository; @Repository("daoSupport") public class DaoSupport implements DAO { @Resource(name = "sqlSessionTemplate") private SqlSessionTemplate sqlSessionTemplate; /** * 保存对象 * @param str * @param obj * @return * @throws Exception */ public Object save(String str, Object obj) throws Exception { return sqlSessionTemplate.insert(str, obj); } /** * 批量更新 * @param str * @param obj * @return * @throws Exception */ public Object batchSave(String str, List objs )throws Exception{ return sqlSessionTemplate.insert(str, objs); } /** * 修改对象 * @param str * @param obj * @return * @throws Exception */ public Object update(String str, Object obj) throws Exception { return sqlSessionTemplate.update(str, obj); } /** * 批量更新 * @param str * @param obj * @return * @throws Exception */ public void batchUpdate(String str, List objs )throws Exception{ SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory(); //批量执行器 SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false); try{ if(objs!=null){ for(int i=0,size=objs.size();i<size;i++){ sqlSession.update(str, objs.get(i)); } sqlSession.flushStatements(); sqlSession.commit(); sqlSession.clearCache(); } }finally{ sqlSession.close(); } } /** * 批量更新 * @param str * @param obj * @return * @throws Exception */ public Object batchDelete(String str, List objs )throws Exception{ return sqlSessionTemplate.delete(str, objs); } /** * 删除对象 * @param str * @param obj * @return * @throws Exception */ public Object delete(String str, Object obj) throws Exception { return sqlSessionTemplate.delete(str, obj); } /** * 查找对象 * @param str * @param obj * @return * @throws Exception */ public Object findForObject(String str, Object obj) throws Exception { return sqlSessionTemplate.selectOne(str, obj); } /** * 查找对象 * @param str * @param obj * @return * @throws Exception */ public Object findForList(String str, Object obj) throws Exception { return sqlSessionTemplate.selectList(str, obj); } public Object findForMap(String str, Object obj, String key, String value) throws Exception { return sqlSessionTemplate.selectMap(str, obj, key); } }
写个实体信息类:
package com.appms.entity; import java.util.List; public class Member { /** * 会员账号 */ private String memberID; /** * 会员密码 */ private String password; /** * 会员级别 */ private String rank; /** * 会员积分 */ private int credit; /** * 会员手机号 */ private String phone; /** * 会员皮肤 */ private String imgPath; /** * 邮箱 */ private String email; private List<GroupPost> postes; private List<Retroaction> retroaction; public String getMemberID() { return memberID; } public void setMemberID(String memberID) { this.memberID = memberID; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRank() { return rank; } public void setRank(String rank) { this.rank = rank; } public int getCredit() { return credit; } public void setCredit(int credit) { this.credit = credit; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getImgPath() { return imgPath; } public void setImgPath(String imgPath) { this.imgPath = imgPath; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public List<GroupPost> getPostes() { return postes; } public void setPostes(List<GroupPost> postes) { this.postes = postes; } public List<Retroaction> getRetroaction() { return retroaction; } public void setRetroaction(List<Retroaction> retroaction) { this.retroaction = retroaction; } }
其Mapper代码:
<?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="MemberMapper"> <resultMap type="Member" id="memberResultMap"> <id column="memberID" property="memberID"/> <result column="password" property="password"/> <result column="rank" property="rank"/> <result column ="credit" property="credit"/> <result column="phone" property="phone"/> <result column="imgPath" property="imgPath"/> <result column="email" property="email"/> <collection property="postes" ofType="GroupPost"> <id column="postID" property="postID"/> <result column="postTitle" property="postTitle"/> <result column="postContent" property="postContent"/> <result column="likeAmount" property="likeAmount"/> <result column="commentAmount" property="commentAmount"/> <result column="commitTime" property="commitTime"/> </collection> <collection property="retroaction" ofType="Retroaction"> <id column="rID" property="rID" /> <result column="content" property="content" /> <result column="commitTime" property="commitTime" /> </collection> </resultMap> <!-- 修改 --> <update id="editM" parameterType="pd" flushCache="false"> update tb_members set memberID = #{memberID}, password = #{password}, rank = #{rank}, credit = #{credit}, phone = #{phone} where memberID = #{memberID} </update> <!-- 通过会员账号获取数据 --> <select id="findByMId" parameterType="pd" resultType="pd" useCache="false"> select p.memberID, p.password, p.rank, p.credit, p.phone, p.imgPath from tb_members p where memberID = #{memberID} </select> <!-- 删除会员信息 --> <delete id="deleteM" parameterType="String" flushCache="false"> delete from tb_members where memberID = #{memberID} </delete> <!-- 批量删除会员信息 --> <delete id="deleteAllM" parameterType="String" flushCache="false"> delete from tb_members where memberID in <foreach item="item" index="index" collection="array" open="(" separator="," close=")"> #{item} </foreach> </delete> <!-- 用户信息列表(全部) --> <select id="memberListPage" parameterType="page" resultType="pd" useCache="false"> select m.memberID, m.password, m.rank, m.credit, m.phone, m.imgPath from tb_members m </select> <!-- 用户信息列表 --> <select id="memberList" parameterType="pd" resultType="pd" useCache="false"> select m.memberID, m.password, m.rank, m.credit, m.phone from tb_members m </select> <!-- 按月统计注册用户数量 --> <select id="queryCount" parameterType="String" resultType="Long"> select year(regTime), count(*) from tb_member group by year(regTime) </select> <!-- 搜索会员信息 --> <select id="queryMemberInfo" parameterType="pd" resultType="pd" useCache="false"> select m.memberID, m.password, m.rank, m.phone, m.imgPath from tb_members m where m.memberID like "%"#{keyword}"%" </select> </mapper>
写个BaseController:
package com.appms.base; import javax.servlet.http.HttpServletRequest; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.servlet.ModelAndView; import com.appms.entity.Page; import com.appms.entity.PageData; import com.appms.logger.Logger; import com.appms.utils.UuidUtil; public class BaseController { protected Logger logger = Logger.getLogger(this.getClass()); private static final long serialVersionUID = 6357869213649815390L; /** * 得到PageData */ public PageData getPageData(){ return new PageData(this.getRequest()); } /** * 得到ModelAndView */ public ModelAndView getModelAndView(){ return new ModelAndView(); } /** * 得到request对象 */ public HttpServletRequest getRequest() { HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); return request; } /** * 得到32位的uuid * @return */ public String get32UUID(){ return UuidUtil.get32UUID(); } /** * 得到分页列表的信息 */ public Page getPage(){ return new Page(); } public static void logBefore(Logger logger, String interfaceName){ logger.info(""); logger.info("start"); logger.info(interfaceName); } public static void logAfter(Logger logger){ logger.info("end"); logger.info(""); } }
业务层代码Service:
package com.appms.service.member; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.appms.dao.DaoSupport; import com.appms.entity.Member; import com.appms.entity.Page; import com.appms.entity.PageData; @Service("memberService") public class MemberService { @Resource(name="daoSupport") DaoSupport dao; /** * 通过会员账号获取信息 */ public PageData findByUId(PageData pd) throws Exception{ return (PageData)dao.findForObject("MemberMapper.findByMId", pd); } /** * 修改会员信息 */ public void editM(PageData pd)throws Exception{ dao.update("MemberMapper.editM", pd); } /** * 删除会员信息 */ public void deleteM(PageData pd)throws Exception{ dao.delete("MemberMapper.deleteM", pd); } /** * 批量删除会员信息 */ public void deleteAllM(String[] mids)throws Exception{ dao.delete("MemberMapper.deleteAllM",mids); } /** * 会员信息列表 */ public List<PageData> listPdPageM(Page page)throws Exception{ return (List<PageData>)dao.findForList("MemberMapper.memberListPage", page); } /** * 会员信息列表 * @param pd * @return * @throws Exception */ public List<PageData> listM(PageData pd)throws Exception{ return (List<PageData>)dao.findForList("MemberMapper.memberList", pd); } public List<Long> getCount()throws Exception{ return (List<Long>)dao.findForObject("MemberMapper.queryCount", null); } /** * 模糊查询 * @param pd * @return * @throws Exception */ public List<PageData> queryM(PageData pd)throws Exception{ return (List<PageData>)dao.findForList("MemberMapper.queryMemberInfo", pd); } }
Controller层代码:
package com.appms.controller.member; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.appms.base.BaseController; import com.appms.entity.Page; import com.appms.entity.PageData; import com.appms.service.member.MemberService; import com.appms.utils.AppUtil; import com.appms.view.ObjectExcelView; @Controller @RequestMapping(value="/member") public class MemberController extends BaseController{ @Resource(name="memberService") private MemberService memberService; /** * 编辑会员信息 */ @RequestMapping(value="/editM",produces="application/json;charset=UTF-8") @ResponseBody public Object editM()throws Exception{ Map<String,String> map = new HashMap<String, String>(); PageData pd = new PageData(); pd = this.getPageData(); String KEYDATA[] = pd.get("KEYDATA").toString().split(","); pd.put("memberID", KEYDATA[0]); pd.put("password", KEYDATA[1]); pd.put("rank", KEYDATA[2]); pd.put("credit", KEYDATA[3]); pd.put("phone", KEYDATA[4]); memberService.editM(pd); map.put("result", "success"); return AppUtil.returnObject(new PageData(), map); } /** * 跳转到编辑页面 * @return * @throws Exception */ @RequestMapping(value="/goEditM") public ModelAndView goEditM()throws Exception{ ModelAndView mv = this.getModelAndView(); PageData pd = new PageData(); pd = this.getPageData(); String ID = pd.getString("memberID"); if(null != ID&& !"".equals(ID)){ ID = ID.trim(); pd.put("memberID", ID); pd = memberService.findByUId(pd); mv.setViewName("/member/member_edit"); mv.addObject("pd",pd); } return mv; } /** * 是否存在会员信息 */ @RequestMapping(value="/hasM") @ResponseBody public Object hasM() throws Exception{ return null; } /** * 获取所有的会员信息 */ @RequestMapping(value="/listMember") public ModelAndView listMemberInfo(Page page)throws Exception{ ModelAndView mv = this.getModelAndView(); PageData pd = new PageData(); pd = this.getPageData(); String memberID = pd.getString("memberID"); if(null != memberID && !"".equals(memberID)){ memberID = memberID.trim(); pd.put("memberID", memberID); } page.setShowCount(5); page.setPd(pd); mv.addObject("page",page); List<PageData> infoList = memberService.listPdPageM(page); mv.setViewName("/member/member_list"); mv.addObject("memberInfoList",infoList); mv.addObject("pd", pd); return mv; } /** * 模糊查询 * @return * @throws Exception */ @RequestMapping("/queryM") public ModelAndView queryM()throws Exception{ ModelAndView mv = this.getModelAndView(); PageData pd = new PageData(); pd = this.getPageData(); String keyword = pd.getString("keyword"); keyword = new String(keyword.getBytes("iso-8859-1"),"UTF-8"); if(keyword!=null&&!"".equals(keyword)){ keyword = keyword.trim(); pd.put("keyword", keyword); List<PageData> memberInfo = memberService.queryM(pd); mv.setViewName("member/member_list"); mv.addObject("memberInfoList", memberInfo); } return mv; } /** * 导出Excel * @return * @throws Exception */ @RequestMapping("/exportExcel") public ModelAndView exportExcel()throws Exception{ ModelAndView mv = this.getModelAndView(); PageData pd = new PageData(); pd = this.getPageData(); //检索条件 Map<String,Object> dataMap = new HashMap<String,Object>(); List<String> titles = new ArrayList<String>(); titles.add("用户名"); titles.add("密码"); titles.add("级别"); titles.add("积分"); titles.add("手机号"); dataMap.put("titles", titles); List<PageData> memberList = memberService.listM(pd); List<PageData> varList = new ArrayList<PageData>(); for(int i=0;i<memberList.size();i++){ PageData vpd = new PageData(); vpd.put("var1", memberList.get(i).getString("memberID")); vpd.put("var2", memberList.get(i).getString("password")); vpd.put("var3", memberList.get(i).getString("rank")); vpd.put("var4", memberList.get(i).get("credit").toString()); vpd.put("var5", memberList.get(i).getString("phone")); varList.add(vpd); } dataMap.put("varList", varList); ObjectExcelView erv = new ObjectExcelView(); mv = new ModelAndView(erv,dataMap); return mv; } }
为了代码安全性,将jsp全部放在WEB-INF下面:
jsp页面代码,用cstl获取数据
<%@page import="com.appms.base.Const"%> <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <!doctype html> <html> <head> <base href="<%=basePath %>"> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>${pd.SYSNAME}</title> <meta name="description" content="这是一个 index 页面"> <meta name="keywords" content="index"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta name="renderer" content="webkit"> <meta http-equiv="Cache-Control" content="no-siteapp" /> <link rel="icon" type="image/png" href="assets/i/favicon.png"> <link rel="apple-touch-icon-precomposed" href="assets/i/app-icon72x72@2x.png"> <meta name="apple-mobile-web-app-title" content="Amaze UI" /> <link rel="stylesheet" href="assets/css/amazeui.min.css"/> <link rel="stylesheet" href="assets/css/admin.css"> <script type="text/javascript">window.jQuery || document.write("<script src='source/js/jquery-1.9.1.min.js'>\x3C/script>");</script> <script type="text/javascript" src="source/js/jquery.tips.js"></script><!--提示框--> </head> <body> <!--[if lte IE 9]> <p class="browsehappy">你正在使用<strong>过时</strong>的浏览器,Amaze UI 暂不支持。 请 <a href="http://browsehappy.com/" target="_blank">升级浏览器</a> 以获得更好的体验!</p> <![endif]--> <!-- 页面顶部¨ --> <%@ include file="../admin/head.jsp"%> <div class="am-cf admin-main"> <!-- 左侧菜单• --> <%@ include file="../admin/left.jsp"%> <!-- content start --> <div class="admin-content"> <div class="am-cf am-padding"> <div class="am-fl am-cf"><strong class="am-text-primary am-text-lg"><a href="main/index">首页</a></strong> / <small>会员管理</small></div> </div> <div class="am-g"> <div class="am-u-md-6 am-cf"> <div class="am-fl am-cf"> <div class="am-btn-toolbar am-fl"> <div class="am-btn-group am-btn-group-xs"> <a class="am-btn am-btn-default" href="member/exportExcel.do" style="background-color: white;"><span class="am-icon-save"></span>导出Excel</a> </div> </div> </div> </div> <div class="am-u-md-3 am-cf"> <div class="am-fr"> <div class="am-input-group am-input-group-sm"> <input type="text" class="am-form-field" id="keyword"/> <span class="am-input-group-btn"> <input type="button" class="am-btn am-btn-default" onclick="queryInfo();" value="搜索" /> </span> </div> </div> </div> </div> <div class="am-g"> <div class="am-u-sm-12"> <form class="am-form"> <table class="am-table am-table-striped am-table-hover table-main"> <thead> <tr> <th>图片</th> <th>账号</th> <th>密码</th> <th>级别</th> <th>积分</th> <th>手机</th> <th>操作</th> </tr> </thead> <tbody> <c:choose> <c:when test="${not empty memberInfoList}"> <c:forEach items="${memberInfoList}" var="u" varStatus="vs"> <tr> <td><img src="${pageContext.request.contextPath}${u.imgPath}" width="30px" height="30px" /></td> <td>${u.memberID}</td> <td>${u.password}</td> <td>${u.rank}</td> <td>${u.credit}</td> <td>${u.phone}</td> <td> <div class="am-btn-toolbar"> <div class="am-btn-group am-btn-group-xs"> <a href="member/goEditM.do?memberID=${u.memberID}" style="background-color: white;" class="am-btn am-btn-default am-btn-xs am-text-secondary"><span class="am-icon-pencil-square-o"></span> 编辑</a> </div> </div> </td> </tr> </c:forEach> </c:when> <c:otherwise> <tr class="main_info"> <td colspan="10">没有相关数据</td> </tr> </c:otherwise> </c:choose> </tbody> </table> <div class="am-cf"> 共 15 条记录 <div class="am-fr"> <ul class="am-pagination"> <li class="am-disabled"><a href="#">«</a></li> <li><a href="#">1</a></li> <li><a href="#">2</a></li> <li><a href="#">3</a></li> <li><a href="#">4</a></li> <li><a href="#">5</a></li> <li><a href="#">»</a></li> </ul> </div> </div> <hr /> <p>注:.....</p> </form> </div> </div> </div> <!-- content end --> </div> <footer> <hr> <p class="am-padding-left">© 2017 E创工作室开发. <a href="http://www.mianfeimoban.com/" target="_blank">网站模板</a></p> </footer> <script type="text/javascript"> function queryInfo(){ var keyword = $("#keyword").val(); window.location.href="member/queryM.do?keyword="+keyword; } </script> <!--[if lt IE 9]> <script src="assets/js/jquery1.11.1.min.js"></script> <script src="assets/js/modernizr.js"></script> <script src="assets/js/polyfill/rem.min.js"></script> <script src="assets/js/polyfill/respond.min.js"></script> <script src="assets/js/amazeui.legacy.js"></script> <![endif]--> <!--[if (gte IE 9)|!(IE)]><!--> <script src="assets/js/jquery.min.js"></script> <script src="assets/js/amazeui.min.js"></script> <!--<![endif]--> <script src="assets/js/app.js"></script> </body> </html>
相关文章推荐
- Mybatis搭建过程详解
- java极速mvc框架jfinal项目框架搭建过程(图文详解)
- Linux系统下SVN服务器的搭建过程详解 ZT
- RedHat系统下SVN服务器的搭建过程详解
- maven+springMVC+mybatis+junit详细搭建过程
- maven+springMVC+mybatis+junit详细搭建过程 ***
- Spring3.2 MVC框架搭建
- Linux系统下SVN服务器的搭建过程详解
- maven+springMVC+mybatis+junit详细搭建过程
- mybatis自带常用操作数据库方法详解以及如何搭建简单的mybatis环境
- [JavaEE] SSH框架笔记_eclipse搭建SSH框架详解
- Myeclipse7.0+JBoss5.0测试EJB3.0环境搭建过程详解
- RedHat AS系统下SVN服务器的搭建过程详解
- linux下javaEE环境搭建(java6 mysql5 tomcat6 myeclipse8.0 安装过程及常见问题)
- maven+springMVC+mybatis+junit详细搭建过程
- RHEL6.3 NFS服务搭建过程详解
- 【10.2.3】ArcGIS Runtime for Android搭建开发环境过程中问题详解