很久之前就想写的教程,因为忙着找实习的原因,没有整理出来,首先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:
<?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>