通过学习SSH的框架,便做了一个小项目,是一个简单的CRM项目,包括的功能主要有用户的crud和部门的crud
在部门中又有对用户的多对一的关联关系,还包括了一个系统日志的功能,即为当哪个用户做了什么功能都能够在系统日志中
显示出来。
这次的项目也还是分为3层架构去实现,DAO层、SERVICE层、ACTION层
大致的分包情况:
首先是SSH的配置文件:
Struts.xml:
hibernate.cfg.xml:
applicationContext.xml:
然后就是实体类(USER、ADMINS、DEPT、SYSTEMLOG):
use.hbm.xml:
dept.hbm.xml:
dao层,dao层采用了一个父类来统一规范,让所有的dao都来继承父类即可,BASEDAO:
baseDao:
采用了父类的好处就是全部dao层的方法,大多数都能够交给baseDao来完成,而相对的dao层可以简洁
service层:
UserService:
DeptService:
SystemLogService:
action层:
UserAction:
DeptAction:
SystemLogAction:
在util层中,定义了一个切面类,也就是系统日志类,在applicationContext.xml文件中,采用aop切面的方法对其进行配置
SystemLogUtil:
还有一件很重要的事,便是使用SSH的时候需要在web.xml中进行配置,除了配置核心配置的过滤器和拦截器外,需要解决的懒加载问题,也可以在web.xml中进行配置
web.xml:
在部门中又有对用户的多对一的关联关系,还包括了一个系统日志的功能,即为当哪个用户做了什么功能都能够在系统日志中
显示出来。
这次的项目也还是分为3层架构去实现,DAO层、SERVICE层、ACTION层
大致的分包情况:
首先是SSH的配置文件:
Struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 配置为开发模式 -->
<constant name="struts.devMode" value="true" />
<constant name="struts.ui.theme" value="simple"></constant>
<package name="default" namespace="/" extends="struts-default">
<!-- 拦截器 -->
<interceptors>
<interceptor name="myinterceptor" class="gz.itcast.crm.inter.Interecptor">
<param name="excludeMethods">login</param>
</interceptor>
<interceptor-stack name="mystack">
<interceptor-ref name="myinterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置全局的拦截器 -->
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<!-- 系统主页 -->
<action name="main_*" class="mainAction" method="{1}">
<result>/WEB-INF/views/main.jsp</result>
<result name="{1}">/WEB-INF/views/{1}.jsp</result>
<result name="input">/WEB-INF/login.jsp</result>
</action>
<!-- 用户模块 -->
<action name="user_*" class="userAction" method="{1}">
<result>/WEB-INF/views/user/list.jsp</result>
<result name="input">/WEB-INF/views/user/input.jsp</result>
<result name="save" type="chain">user_pageList</result>
</action>
<!-- 部门模块 -->
<action name="dept_*" class="deptAction" method="{1}">
<result>/WEB-INF/views/dept/list.jsp</result>
<result name="input">/WEB-INF/views/dept/input.jsp</result>
<result name="save" type="redirectAction">dept_pageList</result>
</action>
<!-- 系统模块 -->
<action name="system_*" class="systemLogAction" method="{1}">
<result>/WEB-INF/views/sys/list.jsp</result>
</action>
</package>
</struts>
hibernate.cfg.xml:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- hibernate对数据库的连接参数,注册的驱动,url,用户名和密码
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/shopsys
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
hibernate对不同的数据库用不同的数据库的方言,hibernate能够为各个数据库进行一个orm映射
主要是因为拥有了不同的数据库方言支持
-->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQL5InnoDBDialect
</property>
<!-- hibernate的其他配置 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- hibernate中对实体映射文件的加载,需要在hibernate中使用映射就要把映射文件加上 -->
<mapping resource="gz/itcast/crm/entity/User.hbm.xml" />
<mapping resource="gz/itcast/crm/entity/Admins.hbm.xml" />
<mapping resource="gz/itcast/crm/entity/Dept.hbm.xml" />
<mapping resource="gz/itcast/crm/entity/SystemLog.hbm.xml" />
</session-factory>
</hibernate-configuration>
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:tx="http://www.springframework.org/schema/tx"
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.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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!-- 导入数据库的properties文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置数据库连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${c3p0jdbcurl}"></property>
<property name="driverClass" value="${c3p0driver}"></property>
<property name="user" value="${c3p0user}"></property>
<property name="password" value="${c3p0password}"></property>
<property name="initialPoolSize" value="${c3p0minpool}"></property>
<property name="maxPoolSize" value="${c3p0maxpool}"></property>
</bean>
<!-- 配置sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
<!-- 配置HibernateTemplate -->
<bean id="htID" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 事务管理的配置 -->
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 采用切面来定义事务 -->
<tx:advice id="txID" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="query*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="get*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="load*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice>
<!-- 事务的切面 -->
<aop:config>
<aop:pointcut expression="execution(* gz.itcast.crm.service.impl.*.*(..))" id="txpt"/>
<aop:advisor advice-ref="txID" pointcut-ref="txpt"/>
</aop:config>
<!-- 加入其它applicationContext.xml的配置文件 -->
<import resource="classpath:applicationContext-*.xml"/>
<bean id="systemlog" class="gz.itcast.crm.util.SystemLogUtil">
<property name="systemLogService" ref="systemLogService"></property>
</bean>
<aop:config>
<aop:aspect ref="systemlog">
<aop:pointcut expression="execution(* gz.itcast.crm.service.impl.*.*(..))" id="syspt"/>
<aop:before method="log" pointcut-ref="syspt"/>
</aop:aspect>
</aop:config>
</beans>
然后就是实体类(USER、ADMINS、DEPT、SYSTEMLOG):
use.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="gz.itcast.crm.entity">
<class name="User" table="t_user">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<property name="password"></property>
<property name="realName"></property>
<property name="phone"></property>
<property name="email"></property>
<property name="inputTime"></property>
</class>
</hibernate-mapping>
dept.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="gz.itcast.crm.entity">
<class name="Dept" table="t_dept">
<id name="id">
<generator class="native"></generator>
</id>
<property name="deptName" />
<property name="descr" />
<!-- leader属性,表示本类与User的多对一的关系 -->
<many-to-one name="leader" class="User" column="uid" />
<property name="inputTime" type="timestamp" />
</class>
</hibernate-mapping>
dao层,dao层采用了一个父类来统一规范,让所有的dao都来继承父类即可,BASEDAO:
baseDao:
package gz.itcast.crm.dao.base;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate4.HibernateCallback;
import org.springframework.orm.hibernate4.HibernateTemplate;
public abstract class BaseDaoImpl<T> implements IBaseDao<T> {
private HibernateTemplate ht;
public void setHt(HibernateTemplate ht) {
this.ht = ht;
}
Class targerClass;
public BaseDaoImpl(){
Class clazz = this.getClass();
Type type = clazz.getGenericSuperclass();
ParameterizedType pt = (ParameterizedType)type;
targerClass = (Class) pt.getActualTypeArguments()[0];
}
public List<T> queryAll() {
return ht.loadAll(targerClass);
}
public void save(T t) {
ht.saveOrUpdate(t);
}
public List<T> queryByHQL(String hql, Object... values) {
return (List<T>) ht.find(hql, values);
}
public T get(int id) {
return (T) ht.get(targerClass, id);
}
public void delete(int id) {
T t = get(id);
ht.delete(t);
}
public List<T> queryByPage(final String condition,final int curPage,final int pageSize,
final Object... values) {
return ht.execute(new HibernateCallback<List<T>>() {
public List<T> doInHibernate(Session session) throws HibernateException {
Query query = session.createQuery("from "
+ targerClass.getSimpleName() + " o where 1=1 "
+ condition);
if(values !=null){
for(int i=0;i<values.length;i++){
query.setParameter(i, values[i]);
}
}
query.setFirstResult((curPage-1)*pageSize);
query.setMaxResults(pageSize);
return query.list();
}
});
}
public int queryByCount(final String condition,final Object... values) {
return ht.execute(new HibernateCallback<Long>() {
public Long doInHibernate(Session session) throws HibernateException {
Query query = session.createQuery("select count(o) from "+
targerClass.getSimpleName() + " o where 1=1 " + condition
);
// 赋值
if (values != null) {
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
return (Long) query.uniqueResult();
}
}).intValue();
}
}
采用了父类的好处就是全部dao层的方法,大多数都能够交给baseDao来完成,而相对的dao层可以简洁
service层:
UserService:
package gz.itcast.crm.service.impl;
import gz.itcast.crm.dao.IUserDao;
import gz.itcast.crm.entity.PageBean;
import gz.itcast.crm.entity.User;
import gz.itcast.crm.service.IUserService;
import gz.itcast.crm.web.query.UserQuery;
import java.util.ArrayList;
import java.util.List;
import org.springframework.util.StringUtils;
public class UserServiceImpl implements IUserService{
//注入UserDao
private IUserDao userDao;
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
public PageBean<User> queryByPage(UserQuery userquery) {
PageBean pb = new PageBean();
//1.设置当前页码
pb.setCurPage(userquery.getCurPage());
//添加查询条件
String condition = "";
List param = new ArrayList();
if(userquery!=null){
//StringUtils: 既能判断null,也能判断空字符串
//关键词
if(!StringUtils.isEmpty(userquery.getKeyword())){
condition+=" and o.name like ? or o.realName like ? or o.phone like ? or o.email like ? ";
param.add("%"+userquery.getKeyword()+"%");
param.add("%"+userquery.getKeyword()+"%");
param.add("%"+userquery.getKeyword()+"%");
param.add("%"+userquery.getKeyword()+"%");
}
//录入时间
if(!StringUtils.isEmpty(userquery.getBeginTime())){
condition+=" and o.inputTime>=?";
param.add(userquery.getBeginTime());
}
if(!StringUtils.isEmpty(userquery.getEndTime())){
condition+=" and o.inputTime<=?";
param.add(userquery.getEndTime());
}
}
//2.设置当前页数
pb.setData(userDao.queryByPage( condition , pb.getCurPage(), pb.getPageSize(), param.toArray() ) );
//3.设置总记录数
pb.setTotalCount(userDao.queryByCount(condition,param.toArray()));
return pb;
}
public boolean checkName(String name,int id) {
//如果是添加,则全部数据进行检查;如果是修改,则排除当前修改的用户
List param = new ArrayList();
String hql = "from User where name=?";
param.add(name);
//修改操作
if(id!=0){
hql += " and id<>?";
param.add(id);
}
List<User> list = userDao.queryByHQL(hql, param.toArray());
return list!=null&&list.size()>0;
}
public void save(User user) {
userDao.save(user);
}
public void delete(int id) {
if(id != 0){
userDao.delete(id);
}
}
public User get(int id) {
if(id !=0){
return userDao.get(id);
}
return null;
}
public List<User> findAll() {
// TODO Auto-generated method stub
return userDao.queryAll();
}
}
DeptService:
package gz.itcast.crm.service.impl;
import gz.itcast.crm.dao.IDeptDao;
import gz.itcast.crm.entity.Dept;
import gz.itcast.crm.entity.PageBean;
import gz.itcast.crm.entity.User;
import gz.itcast.crm.service.IDeptService;
import gz.itcast.crm.web.query.DeptQuery;
import java.util.ArrayList;
import java.util.List;
import org.springframework.util.StringUtils;
public class DeptServiceImpl implements IDeptService {
private IDeptDao deptDao;
public void setDeptDao(IDeptDao deptDao) {
this.deptDao = deptDao;
}
public List<Dept> queryAll() {
return deptDao.queryAll();
}
public void save(Dept dept) {
deptDao.save(dept);
}
public Dept get(int id) {
return deptDao.get(id);
}
public void delete(int id) {
deptDao.delete(id);
}
public PageBean queryByPage(DeptQuery query) {
//封装PageBean
PageBean pb = new PageBean();
//1.设置当前页码
pb.setCurPage(query.getCurPage());
String condition = "";
List param = new ArrayList();
if(query!=null){
if(!StringUtils.isEmpty(query.getKeyword())){
condition +=" and o.deptName like ? or o.descr like ? or o.leader.realName like ?";
param.add("%"+query.getKeyword()+"%");
param.add("%"+query.getKeyword()+"%");
param.add("%"+query.getKeyword()+"%");
}
//录入时间
if(!StringUtils.isEmpty(query.getBeginTime())){
condition+=" and o.inputTime>=?";
param.add(query.getBeginTime());
}
if(!StringUtils.isEmpty(query.getEndTime())){
condition+=" and o.inputTime<=?";
param.add(query.getEndTime());
}
if(query.getLeader()!=0){
condition +=" and o.leader.id=?";
param.add(query.getLeader());
}
}
//2.设置当前页数
pb.setData(deptDao.queryByPage( condition , pb.getCurPage(), pb.getPageSize(), param.toArray() ) );
//3.设置总记录数
pb.setTotalCount(deptDao.queryByCount(condition,param.toArray()));
return pb;
}
public boolean checkName(String deptName, int id) {
//如果是添加,则全部数据进行检查;如果是修改,则排除当前修改的用户
List param = new ArrayList();
String hql = "from Dept where deptName=?";
param.add(deptName);
//修改操作
if(id!=0){
hql += " and id<>?";
param.add(id);
}
List<Dept> list = deptDao.queryByHQL(hql, param.toArray());
return list!=null&&list.size()>0;
}
}
SystemLogService:
package gz.itcast.crm.service.impl;
import gz.itcast.crm.dao.ISystemLogDao;
import gz.itcast.crm.entity.PageBean;
import gz.itcast.crm.entity.SystemLog;
import gz.itcast.crm.service.ISystemLogService;
import gz.itcast.crm.web.query.SystemLogQuery;
import java.util.ArrayList;
import java.util.List;
import org.springframework.util.StringUtils;
public class SystemLogServiceImpl implements ISystemLogService {
private ISystemLogDao systemLogDao;
public void setSystemLogDao(ISystemLogDao systemLogDao) {
this.systemLogDao = systemLogDao;
}
public List<SystemLog> queryAll() {
return systemLogDao.queryAll();
}
public void save(SystemLog SystemLog) {
systemLogDao.save(SystemLog);
}
public SystemLog get(int id) {
return systemLogDao.get(id);
}
public void delete(int id) {
systemLogDao.delete(id);
}
public PageBean queryByPage(SystemLogQuery query) {
//封装PageBean
PageBean pb = new PageBean();
//1.设置当前页码
pb.setCurPage(query.getCurPage());
//添加查询条件
String condition = "";
List param = new ArrayList();
if(query!=null){
if(!StringUtils.isEmpty(query.getKeyword())){
condition +=" and o.operator.realName like ? or o.func like ? or o.ip like ?";
param.add("%"+query.getKeyword()+"%");
param.add("%"+query.getKeyword()+"%");
param.add("%"+query.getKeyword()+"%");
}
//录入时间
if(!StringUtils.isEmpty(query.getBeginTime())){
condition+=" and o.inputTime>=?";
param.add(query.getBeginTime());
}
if(!StringUtils.isEmpty(query.getEndTime())){
condition+=" and o.inputTime<=?";
param.add(query.getEndTime());
}
if(query.getLeader()!=0){
condition +=" and o.operator.id=?";
param.add(query.getLeader());
}
}
//2.设置当前页数
pb.setData(systemLogDao.queryByPage( condition , pb.getCurPage(), pb.getPageSize(), param.toArray() ) );
//3.设置总记录数
pb.setTotalCount(systemLogDao.queryByCount(condition,param.toArray()));
return pb;
}
}
action层:
UserAction:
package gz.itcast.crm.web;
import gz.itcast.crm.entity.PageBean;
import gz.itcast.crm.entity.User;
import gz.itcast.crm.service.IUserService;
import gz.itcast.crm.web.query.UserQuery;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
public class UserAction extends BaseAction{
//注入userService
private IUserService userService;
public void setUserService(IUserService userService) {
this.userService = userService;
}
//接收User对象
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
//接收UserQuery对象
UserQuery uquery = new UserQuery();
public UserQuery getUquery() {
return uquery;
}
public void setUquery(UserQuery uquery) {
this.uquery = uquery;
}
//跳转页面
public String input(){
if(user != null &&user.getId() !=0){
//修改操作
user = userService.get(user.getId());
}
return "input";
}
//查询所有用户
public String pageList(){
if(uquery==null ||uquery.getCurPage()==null || uquery.getCurPage().equals("")){
uquery.setCurPage(1);
ActionContext.getContext().getSession().put("Uquery", uquery);
}
else{
UserQuery uquery1 = (UserQuery) ActionContext.getContext().getSession().get("Uquery");
uquery1.setCurPage(uquery.getCurPage());
//System.out.println(uquery.getCurPage());
uquery = uquery1;
}
PageBean pb = userService.queryByPage(uquery);
putContext("pb", pb);
return SUCCESS;
}
//校验save
public void validateSave() {
boolean result = userService.checkName(user.getName(),user.getId());
if(result){
addFieldError("user.name", "用户名已重复");
}
}
//添加用户
public String save(){
user.setInputTime(new Date());
userService.save(user);
return "save";
}
//删除用户
public String del(){
userService.delete(user.getId());
return pageList();
}
}
DeptAction:
package gz.itcast.crm.web;
import gz.itcast.crm.entity.Dept;
import gz.itcast.crm.entity.PageBean;
import gz.itcast.crm.entity.User;
import gz.itcast.crm.service.IDeptService;
import gz.itcast.crm.service.IUserService;
import gz.itcast.crm.web.query.DeptQuery;
import java.util.Date;
import java.util.List;
import com.opensymphony.xwork2.ActionContext;
public class DeptAction extends BaseAction {
//注入deptService
private IDeptService deptService;
public void setDeptService(IDeptService deptService) {
this.deptService = deptService;
}
private IUserService userService;
public void setUserService(IUserService userService) {
this.userService = userService;
}
//设置对象
private Dept dept = new Dept();
private DeptQuery query = new DeptQuery();
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public DeptQuery getQuery() {
return query;
}
public void setQuery(DeptQuery query) {
this.query = query;
}
//跳转输入页面
public String input(){
if(dept != null &&dept.getId() !=0){
dept = deptService.get(dept.getId());
}
List<User> list = userService.findAll();
ActionContext.getContext().getSession().put("list", list);
return "input";
}
//分页查询用户
public String pageList(){
//默认第一页
if(query==null || query.getCurPage()==null || query.getCurPage().equals("")){
query.setCurPage(1);
ActionContext.getContext().getSession().put("dquery", query);
}
else{
DeptQuery query1 = (DeptQuery) ActionContext.getContext().getSession().get("dquery");
query1.setCurPage(query.getCurPage());
query = query1;
}
//查询数据
PageBean pb = deptService.queryByPage(query);
//查询所有用户
List<User> users = userService.findAll();
putContext("users", users);
putContext("pb", pb);
return SUCCESS;
}
//校验保存
public void validateSave() {
boolean result = deptService.checkName(dept.getDeptName(),dept.getId());
if(result){
addFieldError("dept.deptName", "用户名已重复");
}
}
//保存方法
public String save(){
//调用业务
if(dept==null || dept.getId()==0){
dept.setInputTime(new Date());
}
deptService.save(dept);
//设置时间
//回显列表页面
return "save";
}
//删除用户
public String delete(){
deptService.delete(dept.getId());
return pageList();
}
}
SystemLogAction:
package gz.itcast.crm.web;
import gz.itcast.crm.entity.PageBean;
import gz.itcast.crm.entity.SystemLog;
import gz.itcast.crm.entity.User;
import gz.itcast.crm.service.ISystemLogService;
import gz.itcast.crm.service.IUserService;
import gz.itcast.crm.web.query.SystemLogQuery;
import java.util.List;
import com.opensymphony.xwork2.ActionContext;
public class SystemLogAction extends BaseAction {
//注入IsystemLogService
private ISystemLogService systemLogService;
public void setSystemLogService(ISystemLogService systemLogService) {
this.systemLogService = systemLogService;
}
//注入IUserService
private IUserService userService;
public void setUserService(IUserService userService) {
this.userService = userService;
}
//设置query属性
private SystemLogQuery query = new SystemLogQuery();
public SystemLogQuery getQuery() {
return query;
}
public void setQuery(SystemLogQuery query) {
this.query = query;
}
//设置system属性
private SystemLog system = new SystemLog();
public SystemLog getSystem() {
return system;
}
public void setSystem(SystemLog system) {
this.system = system;
}
//分页查询用户
public String pageList(){
//默认第一页
if(query==null || query.getCurPage()==null || query.getCurPage().equals("")){
query.setCurPage(1);
ActionContext.getContext().getSession().put("squery", query);
}
else{
SystemLogQuery squery = (SystemLogQuery) ActionContext.getContext().getSession().get("squery");
squery.setCurPage(query.getCurPage());
query = squery;
}
//查询数据
PageBean pb = systemLogService.queryByPage(query);
List<User> users = userService.findAll();
putContext("users", users);
putContext("pb", pb);
return SUCCESS;
}
//删除用户
public String delete(){
systemLogService.delete(system.getId());
return pageList();
}
}
在util层中,定义了一个切面类,也就是系统日志类,在applicationContext.xml文件中,采用aop切面的方法对其进行配置
SystemLogUtil:
package gz.itcast.crm.util;
import gz.itcast.crm.entity.SystemLog;
import gz.itcast.crm.entity.User;
import gz.itcast.crm.service.ISystemLogService;
import java.util.Date;
import org.apache.struts2.ServletActionContext;
import org.aspectj.lang.JoinPoint;
import com.opensymphony.xwork2.ActionContext;
public class SystemLogUtil {
private ISystemLogService systemLogService;
public void setSystemLogService(ISystemLogService systemLogService) {
this.systemLogService = systemLogService;
}
public void log(JoinPoint pt){
Object target = pt.getTarget();
if(target instanceof ISystemLogService){
return;
}
String clazzname = target.getClass().getSimpleName();
String method = pt.getSignature().getName();
String func = clazzname +":"+ method + "()";
SystemLog sl = new SystemLog();
sl.setInputTime(new Date());
String ip = ServletActionContext.getRequest().getRemoteHost();
sl.setIp(ip);
//sl.setIp("11111");
//获取登录用户
User u = new User();
u.setId(1);
sl.setOperator(u);
sl.setFunc(func);
//保存日志
systemLogService.save(sl);
}
}
还有一件很重要的事,便是使用SSH的时候需要在web.xml中进行配置,除了配置核心配置的过滤器和拦截器外,需要解决的懒加载问题,也可以在web.xml中进行配置
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></display-name>
<welcome-file-list>
<welcome-file>/WEB-INF/login.jsp</welcome-file>
</welcome-file-list>
<!-- 解决sessionFactory的懒加载问题 -->
<filter>
<filter-name>osiv</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactory</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>osiv</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- struts2的核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- spring的核心监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>ImgServlet</servlet-name>
<servlet-class>gz.itcast.crm.util.ImgServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImgServlet</servlet-name>
<url-pattern>/ImgServlet.img</url-pattern>
</servlet-mapping>
</web-app>
当整个项目都开发好了以后,在服务器中进行部署,在浏览器中打开的效果则为: