采用的框架 Struts2+Spring4+Hbiernate4.
目录结构
:
EmployeeAction:
1 package com.xx.ssh.actions; 2 3 import java.io.ByteArrayInputStream; 4 import java.io.InputStream; 5 import java.io.UnsupportedEncodingException; 6 import java.util.Date; 7 import java.util.Map; 8 import org.apache.struts2.interceptor.RequestAware; 9 import com.opensymphony.xwork2.ActionSupport; 10 import com.opensymphony.xwork2.ModelDriven; 11 import com.opensymphony.xwork2.Preparable; 12 import com.xx.ssh.entities.Employee; 13 import com.xx.ssh.service.DepartmentService; 14 import com.xx.ssh.service.EmployeeService; 15 16 public class EmployeeAction extends ActionSupport implements RequestAware, 17 ModelDriven<Employee>, Preparable { 18 19 private static final long serialVersionUID = 1L; 20 21 private EmployeeService employssService; 22 23 public void setEmployssService(EmployeeService employssService) { 24 this.employssService = employssService; 25 } 26 27 private DepartmentService departmentService; 28 29 public void setDepartmentService(DepartmentService departmentService) { 30 this.departmentService = departmentService; 31 } 32 33 public String list() { 34 request.put("employees", employssService.getAll()); 35 System.out.println("request: " + request.size()); 36 return "list"; 37 } 38 39 private Integer id; 40 41 public void setId(Integer id) { 42 this.id = id; 43 } 44 45 private InputStream inputStream; 46 47 public InputStream getInputStream() { 48 return inputStream; 49 } 50 //回调函数。判断是否删除 51 public String delete() { 52 try { 53 employssService.delete(id); 54 inputStream = new ByteArrayInputStream("1".getBytes("UTF-8")); 55 } catch (Exception e) { 56 e.printStackTrace(); 57 try { 58 inputStream = new ByteArrayInputStream("0".getBytes("UTF-8")); 59 } catch (UnsupportedEncodingException e1) { 60 e1.printStackTrace(); 61 } 62 } 63 return "ajax-success"; 64 } 65 66 private String lastName; 67 68 public void setLastName(String lastName) { 69 this.lastName = lastName; 70 } 71 //回调函数。判断用户名是否存在。 72 public String validateLastName() { 73 try { 74 if (employssService.lastNameIsValid(lastName)) { 75 76 inputStream = new ByteArrayInputStream("1".getBytes("utf-8")); 77 } else { 78 79 inputStream = new ByteArrayInputStream("0".getBytes("utf-8")); 80 } 81 } catch (Exception e) { 82 83 } 84 return "ajax-success"; 85 } 86 87 private Employee model; 88 89 /* 90 * 可以根椐ID来判断为save方法准备的model是new的还是数据库获取的。 91 */ 92 public void prepareSave() { 93 if (id == null) { 94 model = new Employee(); 95 } else { 96 model = employssService.get(id); 97 } 98 } 99 100 public String save() { 101 102 if (id == null) { 103 model.setCreateTime(new Date()); 104 105 } 106 employssService.saveOrUpdate(model); 107 return SUCCESS; 108 } 109 110 public String input() { 111 request.put("departments", departmentService.getAll()); 112 return INPUT; 113 } 114 115 public void prepareInput() { 116 if (id != null) { 117 model = employssService.get(id); 118 } 119 120 } 121 122 private Map<String, Object> request; 123 124 @Override 125 public void setRequest(Map<String, Object> arg0) { 126 this.request = arg0; 127 128 } 129 130 @Override 131 public Employee getModel() { 132 133 return model; 134 } 135 136 @Override 137 public void prepare() throws Exception { 138 139 } 140 141 }
SSHDateConverter:自定义转换器
1 package com.xx.ssh.converters; 2 3 import java.text.DateFormat; 4 import java.text.ParseException; 5 import java.text.SimpleDateFormat; 6 import java.util.Date; 7 import java.util.Map; 8 9 import org.apache.struts2.util.StrutsTypeConverter; 10 11 public class SSHDateConverter extends StrutsTypeConverter { 12 13 private DateFormat dateFormat; 14 { 15 dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 16 } 17 18 @Override 19 public Object convertFromString(Map context, String[] values, Class toClass) { 20 if(toClass == Date.class){ 21 try { 22 return dateFormat.parse(values[0]); 23 } catch (ParseException e) { 24 e.printStackTrace(); 25 } 26 } 27 28 return null; 29 } 30 31 @Override 32 public String convertToString(Map context, Object o) { 33 if(o instanceof Date){ 34 return dateFormat.format((Date)o); 35 } 36 return null; 37 } 38 39 }
BaseDao:SessionFactory
1 package com.xx.ssh.dao; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 6 public class BaseDao { 7 private SessionFactory sessionFactory; 8 9 public void setSessionFactory(SessionFactory sessionFactory) { 10 this.sessionFactory = sessionFactory; 11 } 12 13 public Session getSession() { 14 return this.sessionFactory.getCurrentSession(); 15 } 16 }
DepartmentDao:Dao层
1 package com.xx.ssh.dao; 2 3 import java.util.List; 4 5 import com.xx.ssh.entities.Department; 6 7 public class DepartmentDao extends BaseDao{ 8 public List<Department> getAll(){ 9 String hql="FROM Department"; 10 return getSession().createQuery(hql).list(); 11 } 12 }
EmployeeDao
1 package com.xx.ssh.dao; 2 3 import java.util.List; 4 5 import org.hibernate.Query; 6 import org.hibernate.Session; 7 import org.hibernate.SessionFactory; 8 9 import com.xx.ssh.entities.Employee; 10 11 public class EmployeeDao extends BaseDao { 12 13 14 public void delete(Integer id){ 15 String hql="delete from Employee e where e.id=? "; 16 getSession().createQuery(hql).setInteger(0,id).executeUpdate(); 17 } 18 19 public List<Employee> getAll(){ 20 21 String hql="from Employee e LEFT OUTER JOIN FETCH e.department"; 22 return getSession().createQuery(hql).list(); 23 } 24 public void saveOrUpdate(Employee employee){ 25 getSession().saveOrUpdate(employee); 26 } 27 public Employee getEmployeeByLastName(String lastName){ 28 29 String hql="from Employee e where e.lastName=? "; 30 Query query = getSession().createQuery(hql).setString(0,lastName); 31 return (Employee)query.uniqueResult(); 32 } 33 public Employee get(Integer id){ 34 return (Employee) getSession().get(Employee.class,id); 35 36 } 37 }
实体:Department
1 package com.xx.ssh.entities; 2 3 public class Department { 4 private Integer id; 5 private String departmentName; 6 7 public Integer getId() { 8 return id; 9 } 10 11 public void setId(Integer id) { 12 this.id = id; 13 } 14 15 public String getDepartmentName() { 16 return departmentName; 17 } 18 19 public void setDepartmentName(String departmentName) { 20 this.departmentName = departmentName; 21 } 22 }
实体:Employee
1 package com.xx.ssh.entities; 2 3 import java.util.Date; 4 5 public class Employee { 6 7 8 // 9 private Integer id; 10 //不能被修改 11 private String lastName; 12 private String email; 13 //从前端传入的是string类型,所以需要注意转换。 14 private Date birth; 15 //不能被修改 16 private Date createTime; 17 //单向n-1的关联关系 18 private Department department; 19 20 public Integer getId() { 21 return id; 22 } 23 public void setId(Integer id) { 24 this.id = id; 25 } 26 public String getLastName() { 27 return lastName; 28 } 29 public void setLastName(String lastName) { 30 this.lastName = lastName; 31 } 32 public String getEmail() { 33 return email; 34 } 35 public void setEmail(String email) { 36 this.email = email; 37 } 38 public Date getBirth() { 39 return birth; 40 } 41 public void setBirth(Date birth) { 42 this.birth = birth; 43 } 44 public Date getCreateTime() { 45 return createTime; 46 } 47 public void setCreateTime(Date createTime) { 48 this.createTime = createTime; 49 } 50 public Department getDepartment() { 51 return department; 52 } 53 public void setDepartment(Department department) { 54 this.department = department; 55 } 56 57 @Override 58 public String toString() { 59 return "Employee [birth=" + birth + ", createTime=" + createTime 60 + ", department.id=" + department + ", email=" + email + ", id=" 61 + id + ", lastName=" + lastName + "]"; 62 } 63 }
表与类映射文件配置。
Department.hbm.xml
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2014-7-22 11:21:48 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.xx.ssh.entities.Department" table="SSH_DEPARTMENT"> 7 <id name="id" type="java.lang.Integer"> 8 <column name="ID" /> 9 <generator class="native" /> 10 </id> 11 12 <property name="departmentName" type="java.lang.String"> 13 <column name="DEPARTMENT_NAME" /> 14 </property> 15 16 </class> 17 </hibernate-mapping>
Employee.hbm.xml
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2014-7-22 11:21:48 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.xx.ssh.entities.Employee" table="SSH_EMPLOYEE"> 7 8 <id name="id" type="java.lang.Integer"> 9 <column name="ID" /> 10 <generator class="native" /> 11 </id> 12 13 <property name="lastName" type="java.lang.String"> 14 <column name="LAST_NAME" /> 15 </property> 16 17 <property name="email" type="java.lang.String"> 18 <column name="EMAIL" /> 19 </property> 20 21 <property name="birth" type="java.util.Date"> 22 <column name="BIRTH" /> 23 </property> 24 25 <property name="createTime" type="java.util.Date"> 26 <column name="CREATE_TIME" /> 27 </property> 28 29 <!-- 映射单向 n-1 的关联关系 --> 30 <many-to-one name="department" class="com.xx.ssh.entities.Department" lazy="false"> 31 <column name="DEPARTMENT_ID" /> 32 </many-to-one> 33 34 </class> 35 </hibernate-mapping>
Service层:Department
1 package com.xx.ssh.service; 2 3 import java.util.List; 4 5 import com.xx.ssh.dao.DepartmentDao; 6 import com.xx.ssh.entities.Department; 7 8 public class DepartmentService { 9 private DepartmentDao departmentDao; 10 11 public void setDepartmentDao(DepartmentDao departmentDao){ 12 this.departmentDao=departmentDao; 13 } 14 public List<Department>getAll(){ 15 return departmentDao.getAll(); 16 } 17 18 }
Service层:Employee
1 package com.xx.ssh.service; 2 3 import java.util.List; 4 5 import com.xx.ssh.dao.EmployeeDao; 6 import com.xx.ssh.entities.Employee; 7 8 public class EmployeeService { 9 private EmployeeDao employeeDao; 10 11 public void setEmployeeDao(EmployeeDao employeeDao) 12 { 13 this.employeeDao=employeeDao; 14 } 15 public boolean lastNameIsValid(String lastName){ 16 return employeeDao.getEmployeeByLastName(lastName)==null; 17 } 18 public void delete(Integer id){ 19 employeeDao.delete(id); 20 } 21 public void saveOrUpdate(Employee employee){ 22 employeeDao.saveOrUpdate(employee); 23 } 24 public List<Employee> getAll(){ 25 List<Employee> employees=employeeDao.getAll(); 26 /*employees.clear();*/ 27 System.out.println(employees.size()); 28 return employees; 29 } 30 public Employee get(Integer id) { 31 // TODO Auto-generated method stub 32 return employeeDao.get(id); 33 34 } 35 36 }
配置文件:
applicationContext-beans.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 7 <bean id="employeeDao" class="com.xx.ssh.dao.EmployeeDao"> 8 <property name="sessionFactory" ref="sessionFactory"></property> 9 </bean> 10 11 <bean id="departmentDao" class="com.xx.ssh.dao.DepartmentDao"> 12 <property name="sessionFactory" ref="sessionFactory"></property> 13 </bean> 14 15 <bean id="employeeService" class="com.xx.ssh.service.EmployeeService"> 16 <property name="employeeDao" ref="employeeDao"></property> 17 </bean> 18 19 <bean id="departmentService" class="com.xx.ssh.service.DepartmentService"> 20 <property name="departmentDao" ref="departmentDao"></property> 21 </bean> 22 23 <bean id="employeeAction" class="com.xx.ssh.actions.EmployeeAction" 24 scope="prototype"> 25 <property name="employssService" ref="employeeService"></property> 26 <property name="departmentService" ref="departmentService"></property> 27 </bean> 28 </beans>
applicationContext.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/aop 10 http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 11 http://www.springframework.org/schema/context 12 http://www.springframework.org/schema/context/spring-context-4.0.xsd 13 http://www.springframework.org/schema/tx 14 http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> 15 16 <!-- 导入资源文件 --> 17 <context:property-placeholder location="classpath:db.properties"/> 18 19 <!-- 配置 C3P0 数据源 --> 20 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 21 <property name="user" value="${jdbc.user}"></property> 22 <property name="password" value="${jdbc.password}"></property> 23 <property name="driverClass" value="${jdbc.driverClass}"></property> 24 <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> 25 </bean> 26 27 <!-- 配置 SessionFactory --> 28 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 29 <property name="dataSource" ref="dataSource"></property> 30 <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> 31 <property name="mappingLocations" value="classpath:com/xx/ssh/entities/*.hbm.xml"></property> 32 </bean> 33 34 <!-- 配置 Spring 的声明式事务 --> 35 <!-- 1. 配置 hibernate 的事务管理器 --> 36 <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 37 <property name="sessionFactory" ref="sessionFactory"></property> 38 </bean> 39 40 <!-- 2. 配置事务属性 --> 41 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 42 <tx:attributes> 43 <tx:method name="get*" read-only="true"/> 44 <tx:method name="lastNameIsValid" read-only="true"/> 45 <tx:method name="*"/> 46 </tx:attributes> 47 </tx:advice> 48 49 <!-- 3. 配置事务切入点, 再把事务属性和事务切入点关联起来 --> 50 <aop:config> 51 <aop:pointcut expression="execution(* com.xx.ssh.service.*.*(..))" id="txPointcut"/> 52 <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/> 53 </aop:config> 54 </beans>
db.properties
1 jdbc.user=root 2 jdbc.password=root 3 jdbc.driverClass=com.mysql.jdbc.Driver 4 jdbc.jdbcUrl=jdbc:mysql:///spring6 5 6 jdbc.initPoolSize=5 7 jdbc.maxPoolSize=10
hibernate.cfg.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- 配置hibernate的基本属性--> 8 9 <!-- 方言 --> 10 <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> 11 12 <!--是否显示及格式化SQL--> 13 <property name="hibernate.show_sql">true</property> 14 <property name="hibernate.format_sql">true</property> 15 16 <!-- 生成数据表的策略 --> 17 <property name="hibernate.hbm2ddl.auto">update</property> 18 19 <!--二级缓存相关 --> 20 </session-factory> 21 </hibernate-configuration>
struts.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 8 <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 9 <constant name="struts.devMode" value="true" /> 10 11 <package name="default" namespace="/" extends="struts-default"> 12 13 <!-- 定义新的拦截器栈, 配置 prepare 拦截器栈的 alwaysInvokePrepare 参数值为 false --> 14 <interceptors> 15 <interceptor-stack name="sshStack"> 16 <interceptor-ref name="paramsPrepareParamsStack"> 17 <param name="prepare.alwaysInvokePrepare">false</param> 18 </interceptor-ref> 19 </interceptor-stack> 20 </interceptors> 21 22 <!-- 使用新的拦截器栈 --> 23 <default-interceptor-ref name="sshStack"></default-interceptor-ref> 24 25 <action name="emp-*" class="employeeAction" 26 method="{1}"> 27 <result name="list">/WEB-INF/views/emp-list.jsp</result> 28 <result type="stream" name="ajax-success"> 29 <param name="contentType">text/html</param> 30 <param name="inputName">inputStream</param> 31 </result> 32 <result name="input">/WEB-INF/views/emp-input.jsp</result> 33 <result name="success" type="redirect">/emp-list</result> 34 </action> 35 36 </package> 37 38 </struts>
xwork-conversion.properties :时间转换器配置文件。
java.util.Date=com.xx.ssh.converters.SSHDateConverter
web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 5 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 6 7 8 <context-param> 9 <param-name>contextConfigLocation</param-name> 10 <param-value>classpath:applicationContext*.xml</param-value> 11 </context-param> 12 <listener> 13 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 14 </listener> <!-- 为spring添加监听器 --> 15 <!-- 配置 Struts2 的 Filter --> 16 <filter> 17 <filter-name>struts2</filter-name> 18 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 19 </filter> 20 <filter-mapping> 21 <filter-name>struts2</filter-name> 22 <url-pattern>/*</url-pattern> 23 </filter-mapping> 24 </web-app>
JSP:
emp-input.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="${pageContext.request.contextPath}/scripts/jquery-1.8.0.js"></script> <script type="text/javascript"> $(function(){ $(":input[name=lastName]").change(function(){ var val= $(this).val(); val=$.trim(val); var $this=$(this); if(val!=""){ $this.nextAll("font").remove(); var url="emp-validateLastName"; var args={"lastName":val,"time":new Date()}; $.post(url,args,function(data){ //表示可用 if(data == "1"){ $this.after("<font color='green'>LastName可用</font>" ); } //表示不可用 else if(data == "0") { $this.after("<font color='red'>LastName不可用</font>" ); }else{ alert("服务器错误"); } }) }else{ //alert("lastName 不能为空"); var i=$(this).val(""); alert(i); //this.focus(); } }) }) </script> </head> <body> <s:debug></s:debug> <h4>Employee Input Page</h4> <s:form action="emp-save" method="post"> <s:if test="id != null"> <s:textfield name="lastName" label="LastName" disabled="true"></s:textfield> <s:hidden name="id"></s:hidden> <%-- <!-- 通过添加隐藏域的方式把未显式提交的字段值提交到服务器 --> <s:hidden name="lastName"></s:hidden> <s:hidden name="createTime"></s:hidden> --%> </s:if> <s:else> <s:textfield name="lastName" label="LastName"></s:textfield> </s:else> <s:textfield name="email" label="Email"></s:textfield> <s:textfield name="birth" label="Birth"></s:textfield> <s:select list="#request.departments" listKey="id" listValue="departmentName" name="department.id" label="Department"></s:select> <s:submit></s:submit> </s:form> </body> </html>
emp-list.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!-- --> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="${pageContext.request.contextPath }/scripts/jquery-1.8.0.js"></script> <script type="text/javascript" > $(function(){ //1.点击delete时,弹出确定是要删除xx的信息吗。若确定,删除。反之。取消 $(".delete").click(function(){ var lastName=$(this).next(":input").val(); var flag=confirm("确定是要删除"+lastName+"信息吗?"); if(flag){ var $tr=$(this).parent().parent(); //删除,使用ajax方式 。 var url=this.href; var args={"time":new Date()}; $.post(url,args,function(data){ //若data的返回值为1.则提示删除成功,且把当前行删除 。 if(data=="1"){ alert("删除成功"); $tr.remove(); }else{ alert("删除失败"); } }); } //取消默认行为。 return false; }); }); </script> </head> <body> <h4>Employee List Page</h4> <s:if test="#request.employees == null || #request.employees.size()==0"> 没有任何员工信息; </s:if> <s:else> <table border="1" cellpadding="10" cellspacing="0"> <tr> <td>ID</td> <td>LASTNAME</td> <td>EMAIL</td> <td>BIRTH</td> <td>CREATETIME</td> <td>DEPT</td> <td>DELETE</td> <td>Edit</td> </tr> <s:iterator value="#request.employees"> <tr> <td>${id } </td> <td>${lastName }</td> <td>${email }</td> <td> <s:date name="birth" format="yyyy-MM-dd"/> </td> <td> <s:date name="birth" format="yyyy-MM-dd hh:mm:ss"/> </td> <td>${department.departmentName }</td> <td><a href="emp-delete?id=${id }" class="delete">Delete</a> <input type="hidden" value="${lastName }"/> </td> <td><a href="emp-input?id=${id }">Edit</a></td> </tr> </s:iterator> </table> </s:else> </body> </html>