SSH_框架整合4--添加员工信息
一、
1 index.jsp:添加:<a href="emp-input">添加员工向信息:Add Employees' Information</a>
2 因为在添加员工信息时要选择员工的部门信息,所以要先获取Department信息:
(1)com.atguigu.ssh.dao中:提取EmployeeDao.java中公共部分代码(getSession())作为父类BaseDao
1 SSH_框架整合4--添加员工信息
新建DepartmentDao类来获取Department集合信息:DepartmentDao.java
1 package com.atguigu.ssh.dao; 2 3 import java.util.List; 4 5 import com.atguigu.ssh.entities.Department; 6 7 public class DepartmentDao extends BaseDao{ 8 9 //获取查询到的Department集合 10 public List<Department> getAll(){ 11 String hql="FROM Department"; 12 return getSession().createQuery(hql).list(); 13 } 14 }
(2)com.atguigu.ssh.service包中:新建DepartmentService类:DepartmentService.java
1 package com.atguigu.ssh.service; 2 3 import java.util.List; 4 5 import com.atguigu.ssh.dao.DepartmentDao; 6 import com.atguigu.ssh.entities.Department; 7 8 public class DepartmentService { 9 10 private DepartmentDao departmentDao; 11 public void setDepartmentDao(DepartmentDao departmentDao) { 12 this.departmentDao = departmentDao; 13 } 14 15 public List<Department> getAll(){ 16 return departmentDao.getAll(); 17 } 18 }
(3) com.atguigu.ssh.actions包下的EmployeeAction.java:填写获取Department集合的方法并且放入request中(jsp页面中就可以通过request直接获取)
1 //3-1 查询Department 2 private DepartmentService departmentService; 3 public void setDepartmentService(DepartmentService departmentService) { 4 this.departmentService = departmentService; 5 } 6 //3-2 实现添加员工信息的方法 7 public String input(){ 8 request.put("departments", departmentService.getAll()); 9 return INPUT; 10 }
3 完善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 http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <bean id="employeeDao" class="com.atguigu.ssh.dao.EmployeeDao"> 7 <property name="sessionFactory" ref="sessionFactory"></property> 8 </bean> 9 10 <bean id="departmentDao" class="com.atguigu.ssh.dao.DepartmentDao"> 11 <property name="sessionFactory" ref="sessionFactory"></property> 12 </bean> 13 14 <bean id="employeeService" class="com.atguigu.ssh.service.EmployeeService"> 15 <property name="employeeDao" ref="employeeDao"></property> 16 </bean> 17 18 <bean id="departmentService" class="com.atguigu.ssh.service.DepartmentService"> 19 <property name="departmentDao" ref="departmentDao"></property> 20 </bean> 21 22 <bean id="employeeAction" class="com.atguigu.ssh.actions.EmployeeAction" 23 scope="prototype"> 24 <property name="employeeService" ref="employeeService"></property> 25 <property name="departmentService" ref="departmentService"></property> 26 </bean> 27 </beans>
4 完善struts.xml,添加显示添加页面语句:<result name="input">/WEB-INF/views/emp-input.jsp</result>
5 WebContent-WEB-INF-views下新建emp-input.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="s" uri="/struts-tags" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <h4>Employee Input Page</h4> 12 13 <s:form action="emp-save" method="post"> 14 <s:textfield name="lastName" label="LastName"></s:textfield> 15 <s:textfield name="email" label="Email"></s:textfield> 16 <s:textfield name="birth" label="Birth"></s:textfield> 17 18 <s:select list="#request.departments" 19 listKey="id" listValue="departmentName" name="department.id" 20 label="Department"></s:select> 21 <s:submit></s:submit> 22 </s:form> 23 24 </body> 25 </html>
二、
1 实现ModelDriven拦截器操作
(1)EmployeeAction实现ModelDriven<Employee>,Preparable接口,添加实现方法:
1 //**** 2 @Override 3 public void prepare() throws Exception { 4 } 5 //**** 6 private Employee model; 7 //**** 8 @Override 9 public Employee getModel() { 10 return model; 11 } 12 //**** 4 使用ModelDriven拦截器方法存储添加的信息 13 public String save(){ 14 System.out.println(model); 15 model.setCreateTime(new Date()); 16 employeeService.saveorUpdate(model); 17 return SUCCESS; 18 } 19 //**** 20 public void prepareSave(){ 21 model=new Employee(); 22 } 23 24 //**** 拦截器的方法 25 public void prepareInput(){ 26 27 }
(2)Struts.xml配置下拦截器:
1 <!-- 定义新的拦截器栈, 2 配置 prepare 拦截器栈的 alwaysInvokePrepare 参数值为 false --> 3 <interceptors> 4 <interceptor-stack name="sshStack"> 5 <interceptor-ref name="paramsPrepareParamsStack"> 6 <param name="prepare.alwaysInvokePrepare">false</param> 7 </interceptor-ref> 8 </interceptor-stack> 9 </interceptors> 10 <!-- 使用新的拦截器栈 --> 11 <default-interceptor-ref name="sshStack"></default-interceptor-ref>
2 定制类型转换器:使输入的Birth字符串转化为Date类型
(1)新建包com.atguigu.ssh.converters:新建SSHDateConverter.java类
1 package com.atguigu.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 public SSHDateConverter() 16 { 17 dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 18 } 19 20 @Override 21 public Object convertFromString(Map context, String[] values, Class toClass) { 22 if(toClass == Date.class){ 23 if(values !=null && values.length>0){ 24 String value=values[0]; 25 try { 26 return dateFormat.parse(value); 27 } catch (ParseException e) { 28 e.printStackTrace(); 29 } 30 } 31 } 32 return values; 33 } 34 35 @Override 36 public String convertToString(Map context, Object o) { 37 if(o instanceof Date){ 38 Date date=(Date)o; 39 return dateFormat.format(date); 40 } 41 return null; 42 } 43 44 }
(2)src-cong下新建xwork-conversion.properties,配置类型转换器:
java.util.Date=com.atguigu.ssh.converters.SSHDateConverter
3 实现存储操作:
(1)EmployeeDao.java中添加save方法:
1 //3 添加、存储 2 public void saveOrUpadate(Employee employee){ 3 getSession().saveOrUpdate(employee); 4 }
(2)EmployeeService.java
1 //3 添加、存储 2 public void saveorUpdate(Employee employee){ 3 employeeDao.saveOrUpadate(employee); 4 }
(3)EmployeeAction.java:
1 //**** 4 使用ModelDriven拦截器方法存储添加的信息 2 public String save(){ 3 System.out.println(model); 4 model.setCreateTime(new Date()); 5 employeeService.saveorUpdate(model); 6 return SUCCESS; 7 } 8 //**** 9 public void prepareSave(){ 10 model=new Employee(); 11 }
4 显示页面:格式化时间操作:
1 <td> 2 <s:date name="birth" format="yyyy-MM-dd"/> 3 </td> 4 <td> 5 <s:date name="createTime" format="yyyy-MM-dd hh:mm:ss"/> 6 </td>
结构图:
文件:
1 EmployeeAction.java
1 package com.atguigu.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 9 import org.apache.struts2.interceptor.RequestAware; 10 11 import com.atguigu.ssh.entities.Employee; 12 import com.atguigu.ssh.service.DepartmentService; 13 import com.atguigu.ssh.service.EmployeeService; 14 import com.opensymphony.xwork2.ActionSupport; 15 import com.opensymphony.xwork2.ModelDriven; 16 import com.opensymphony.xwork2.Preparable; 17 18 public class EmployeeAction extends ActionSupport implements RequestAware, 19 ModelDriven<Employee>,Preparable{ 20 21 private static final long serialVersionUID = 1L; 22 23 private EmployeeService employeeService; 24 25 public void setEmployeeService(EmployeeService employeeService){ 26 this.employeeService=employeeService; 27 } 28 29 //**** 4 使用ModelDriven拦截器方法存储添加的信息 30 public String save(){ 31 System.out.println(model); 32 model.setCreateTime(new Date()); 33 employeeService.saveorUpdate(model); 34 return SUCCESS; 35 } 36 //**** 37 public void prepareSave(){ 38 model=new Employee(); 39 } 40 41 //3-1 查询Department 42 private DepartmentService departmentService; 43 public void setDepartmentService(DepartmentService departmentService) { 44 this.departmentService = departmentService; 45 } 46 //3-2 实现添加员工信息的方法 47 public String input(){ 48 request.put("departments", departmentService.getAll()); 49 return INPUT; 50 } 51 52 //**** 拦截器的方法 53 public void prepareInput(){ 54 55 } 56 57 //2 删除 58 private Integer id; 59 public void setId(Integer id) { 60 this.id = id; 61 } 62 /*public String delete(){ 63 employeeService.delete(id); 64 return SUCCESS; 65 }*/ 66 //2-1 使用Ajax方式删除 67 private InputStream inputStream; 68 69 public InputStream getInputStream() { 70 return inputStream; 71 } 72 73 public String delete(){ 74 employeeService.delete(id); 75 try { 76 //删除成功 77 inputStream=new ByteArrayInputStream("1".getBytes("UTF-8")); 78 } catch (UnsupportedEncodingException e) { 79 //删除失败 80 try { 81 inputStream=new ByteArrayInputStream("0".getBytes("UTF-8")); 82 } catch (UnsupportedEncodingException e1) { 83 // TODO Auto-generated catch block 84 e1.printStackTrace(); 85 } 86 e.printStackTrace(); 87 } 88 return "ajax-delete-success"; 89 } 90 //1 查询 91 public String list(){ 92 request.put("employees", employeeService.getAll()); 93 return "list"; 94 } 95 96 //放到页面里 97 private Map<String,Object> request; 98 99 @Override 100 public void setRequest(Map<String, Object> arg0) { 101 this.request=arg0; 102 } 103 104 //**** 105 @Override 106 public void prepare() throws Exception { 107 } 108 //**** 109 private Employee model; 110 //**** 111 @Override 112 public Employee getModel() { 113 return model; 114 } 115 116 }
2 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 <default-interceptor-ref name="sshStack"></default-interceptor-ref> 23 24 <action name="emp-*" class="employeeAction" 25 method="{1}"> 26 <result name="list">/WEB-INF/views/emp-list.jsp</result> 27 28 <result type="stream" name="ajax-delete-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 34 <result name="success" type="redirect">/emp-list</result> 35 </action> 36 </package> 37 38 </struts>
3 emp-list.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="s" uri="/struts-tags" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 <script type="text/javascript" SRC="scripts/jquery-1.7.2.js"></script> 10 <script type="text/javascript"> 11 //删除, 使用 ajax 的方式 12 $(function(){ 13 $(".delete").click(function(){ 14 var lastName=$(this).next(":input").val(); 15 var flag=confirm("是否要删除"+lastName+"的信息吗?"); 16 //确认删除, 使用 ajax 的方式 17 if(flag){ 18 //获取要删除的行 19 var $tr=$(this).parent().parent(); 20 var url=this.href; 21 var args={"time":new Date()}; 22 $.post(url,args,function(data){ 23 //若 data 的返回值为 1, 则提示 删除成功, 且把当前行删除 24 if(data==1){ 25 alert("删除成功!"); 26 $tr.remove(); 27 }else{ 28 //若 data 的返回值不是 1, 提示删除失败. 29 alert("删除失败!"); 30 } 31 }); 32 } 33 return false; 34 }); 35 }) 36 </script> 37 </head> 38 <body> 39 <h3>Employee List Page</h3> 40 41 <s:if test="#request.employees == null ||#request.size()==0"> 42 没有员工信息 43 </s:if> 44 <s:else> 45 <table border="1" cellpadding="10" cellspacing="0"> 46 <tr> 47 <td>ID</td> 48 <td>LASTNAME</td> 49 <td>EMAIL</td> 50 <td>BIRTH</td> 51 <td>CREATETIME</td> 52 <td>DEPT</td> 53 </tr> 54 <s:iterator value="#request.employees"> 55 <tr> 56 <td>${id}</td> 57 <td>${lastName}</td> 58 <td>${email }</td> 59 <%-- 60 <td>${birth}</td> 61 <td>${createTime}</td> 62 --%> 63 <td> 64 <s:date name="birth" format="yyyy-MM-dd"/> 65 </td> 66 <td> 67 <s:date name="createTime" format="yyyy-MM-dd hh:mm:ss"/> 68 </td> 69 70 <td>${department.departmentName}</td> 71 <td> 72 <a href="emp-delete?id=${id }" class="delete">Delete</a> 73 <input type="hidden" value="${lastName}"/> 74 </td> 75 </tr> 76 </s:iterator> 77 </table> 78 </s:else> 79 </body> 80 </html>
4 emp-input.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="s" uri="/struts-tags" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <h4>Employee Input Page</h4> 12 13 <s:form action="emp-save" method="post"> 14 <s:textfield name="lastName" label="LastName"></s:textfield> 15 <s:textfield name="email" label="Email"></s:textfield> 16 <s:textfield name="birth" label="Birth"></s:textfield> 17 18 <s:select list="#request.departments" 19 listKey="id" listValue="departmentName" name="department.id" 20 label="Department"></s:select> 21 <s:submit></s:submit> 22 </s:form> 23 24 </body> 25 </html>