1.前期准备:jar包(c3p0、jdbc ,各个框架)
web.xml文件:spring的 转码的,和Struts2的过滤器
<?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>L1219_SSHE</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- spring --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:app.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 转码 --> <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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 过滤器 --> <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> </web-app>
Hibernate.cfg.xml的文件,并生成实体类的映射文件,
注意:现在用spring来生成映射文件。
spring的app.xml的配置,用的连接池来连接数据库
Hibernate的各种配置,sessionFactory声明当前session,通过sessionFactory.getCurrentSession()来获取,(DAO层)
声明事务
然后见如下图所示的各种包,在包中实现各接口以及实现类(impl)实现类中主要是个方法(增删改查)
Struts2的配置,主要是Action的方法的配置,(增删改查的action)
注意:name是页面发送的get或post请求的URL地址,class是spring中对应的id, method是Action类中的方法名
DAO层接口
package com.hanqi.dao; import java.util.List; import java.util.Map; import com.hanqi.entity.Student; public interface StudentDAO { //获取数据列表 List<Student> find(int page , int rows,String sort,Map<String,String> where); //获取数据条数 int getTotal(Map<String,String> where); void insert(Student stu);//添加 void update(Student stu);//修改 void delete(String sno);//删除 }
DAO的实现类
package com.hanqi.dao.impl; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.hibernate.Query; import org.hibernate.SessionFactory; import com.hanqi.dao.StudentDAO; import com.hanqi.entity.Student; public class StudentDAOImpl implements StudentDAO { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @Override public List<Student> find(int page, int rows, String sort, Map<String, String> where) { //创建基础HQL语句 String sql = "from Student where 1=1"; //判断传递的的参数 String sname = where.get("sname_s"); if(sname != null && !sname.equals("")) { sql += " and sname = :sname"; } String sclass = where.get("sclass_s"); if(sclass != null && !sclass.equals("")) { sql += " and sclass = :sclass"; } //排序 if(sort != null && !sort.equals("")) { sql += " order by " + sort; } //得到HQL //并判断查询条件 Query q = sessionFactory.getCurrentSession().createQuery(sql); if(sname != null && !sname.equals("")) { q.setString("sname",sname); } if(sclass != null && !sclass.equals("")) { q.setString("sclass",sclass); } List<Student> rtn = new ArrayList<Student>(); rtn = q.setMaxResults(rows)//每页行数 .setFirstResult((page-1)*rows).list();//起始页码 return rtn; } @Override public int getTotal(Map<String, String> where) { int rtn= 0; //创建基础HQL语句 String sql = "select count(1) from Student where 1=1"; //判断传递的的参数 String sname = where.get("sname_s"); if(sname != null && !sname.equals("")) { sql += " and sname = :sname";//and前面加空格 } String sclass = where.get("sclass_s"); if(sclass != null && !sclass.equals("")) { sql += " and sclass = :sclass"; } //得到HQL Query q = sessionFactory.getCurrentSession().createQuery(sql); if(sname != null && !sname.equals("")) { q.setString("sname",sname); } if(sclass != null && !sclass.equals("")) { q.setString("sclass",sclass); } //获取Query对对象,定义集合并实例化 List<Object> lo = q.list(); if(lo != null && lo.size() > 0) { rtn = Integer.parseInt(lo.get(0).toString());//转换成int并赋值 } return rtn; } //添加数据 @Override public void insert(Student stu) { sessionFactory.getCurrentSession().save(stu); } //修改数据 @Override public void update(Student stu) { sessionFactory.getCurrentSession().update(stu); } //删除 @Override public void delete(String sno) { //Student st = (Student)se.get(Student.class, sno); //se.delete(st); //HQL方式执行删除 sessionFactory.getCurrentSession().createQuery("delete Student where sno =?") .setString(0, sno) .executeUpdate(); } }
service接口
package com.hanqi.service; import java.util.List; import java.util.Map; import com.hanqi.entity.Student; public interface StudentService { List<Student>getList(int page , int rows,String sort,Map<String,String> where); int getTotal(Map<String,String> where); String getPageJSON(int page, int rows,String sort,Map<String,String> where); // void insert(Student stu); // void update(Student stu); // void delete(String sno); //service的添加 void addStudent(Student stu); //修改 void editStudent(Student stu); //删除 void deleteStudent(String sno); }
service的实现类
package com.hanqi.service.impl; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSONObject; import com.hanqi.dao.StudentDAO; import com.hanqi.entity.Student; import com.hanqi.service.PageJSON; import com.hanqi.service.StudentService; public class StudentServiceImpl implements StudentService { private StudentDAO studentDAO; public void setStudentDAO(StudentDAO studentDAO) { this.studentDAO = studentDAO; } @Override public List<Student> getList(int page, int rows, String sort, Map<String, String> where) { // TODO 自动生成的方法存根 return studentDAO.find(page, rows, sort, where); } @Override public int getTotal(Map<String, String> where) { // TODO 自动生成的方法存根 return studentDAO.getTotal(where); } @Override public String getPageJSON(int page, int rows, String sort, Map<String, String> where) { PageJSON<Student> pj = new PageJSON<Student>();//引用泛型类 String rtn = JSONObject.toJSONString(pj); //"{total:0,rows:[]}";//空的JSON对象 int total = studentDAO.getTotal(where);//符合查询条件的总条数 if(total>0) { List<Student> ls = studentDAO.find(page, rows,sort,where); //String ls_json = JSONArray.toJSONString(ls);//转成JSON格式 pj.setTotal(total); pj.setRows(ls); rtn = JSONObject.toJSONString(pj); //转义字符,转成JSON读取的格式 //rtn = "{"total":"+total+","rows":"+ls_json+"}" ; } return rtn; } // @Override // public void insert(Student stu) { // // TODO 自动生成的方法存根 // studentDAO.insert(stu); // } // // // @Override // public void update(Student stu) { // // TODO 自动生成的方法存根 // studentDAO.update(stu); // // } // // // @Override // public void delete(String sno) { // // TODO 自动生成的方法存根 // studentDAO.delete(sno); // } @Override public void addStudent(Student stu) { // TODO 自动生成的方法存根 studentDAO.insert(stu); } @Override public void editStudent(Student stu) { // TODO 自动生成的方法存根 studentDAO.update(stu); } @Override public void deleteStudent(String sno) { // TODO 自动生成的方法存根 studentDAO.delete(sno); } }
Action
package com.hanqi.action; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import com.hanqi.entity.Student; import com.hanqi.service.StudentService; public class StudentAction { private StudentService studentService; HttpServletResponse response = ServletActionContext.getResponse(); public void setStudentService(StudentService studentService) { this.studentService = studentService; } //接受参数 private int page; private int rows; private String sort; private String order; private String sname_s; private String sclass_s; //添加的参数 private String sno ; private String sname ; private String ssex; private String sbirthday; private String sclass; //接受参数表示添加或修改 private String type ; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getSno() { return sno; } public void setSno(String sno) { this.sno = sno; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getSsex() { return ssex; } public void setSsex(String ssex) { this.ssex = ssex; } public String getSbirthday() { return sbirthday; } public void setSbirthday(String sbirthday) { this.sbirthday = sbirthday; } public String getSclass() { return sclass; } public void setSclass(String sclass) { this.sclass = sclass; } public StudentService getStudentService() { return studentService; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getRows() { return rows; } public void setRows(int rows) { this.rows = rows; } public String getSort() { return sort; } public void setSort(String sort) { this.sort = sort; } public String getOrder() { return order; } public void setOrder(String order) { this.order = order; } public String getSname_s() { return sname_s; } public void setSname_s(String sname_s) { this.sname_s = sname_s; } public String getSclass_s() { return sclass_s; } public void setSclass_s(String sclass_s) { this.sclass_s = sclass_s; } @Override public String toString() { return "StudentAction [page=" + page + ", rows=" + rows + ", sort=" + sort + ", order=" + order + ", sname_s=" + sname_s + ", sclass_s=" + sclass_s + "]"; } //返回数据列表 public void getStudentList() { System.out.println("this="+this); //调用serIve try { //查询参数 if(sname_s != null) { sname_s = new String(sname_s.getBytes("ISO-8859-1"),"UTF-8"); } if(sclass_s != null) { sclass_s = new String(sclass_s.getBytes("ISO-8859-1"),"UTF-8"); } System.out.println("sname_s="+sname_s+"sclass_s="+sclass_s); //对条件进行打包 Map<String,String> where = new HashMap<String,String>(); where.put("sname_s", sname_s); where.put("sclass_s", sclass_s); //对分页情况的判断 //组合排序语句 String ls = ""; if(sort != null && order != null) { ls= sort + " " + order;//注意加空格 } //System.out.println("ls="+ls); String json = studentService.getPageJSON(page, rows,ls,where); System.out.println("json="+json); //返回数据 HttpServletResponse response = ServletActionContext.getResponse(); response.setCharacterEncoding("UTF-8"); response.setContentType("text/json"); response.getWriter().println(json); } catch(Exception e) { e.printStackTrace(); } } //添加 public void getSave() { HttpServletResponse response = ServletActionContext.getResponse(); String msg = "{'success':true,'message':'保存成功'}"; if(sno != null && type != null) { try { Student stu = new Student(); stu.setSno(sno); stu.setSclass(sclass); stu.setSname(sname); stu.setSsex(ssex); if(sbirthday !=null && !sbirthday.trim().equals("")) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); stu.setSbirthday(sdf.parse(sbirthday)); } if(type.equals("add"))//根据type判断按钮调用方法 { studentService.addStudent(stu); } else { studentService.editStudent(stu); } } catch(Exception e) { msg = "{'success':false,'message':'访问失败'}"; } try { response.getWriter().print(msg); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } else { msg = "{'success':false,'message':'访问异常'}"; try { response.getWriter().print(msg); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } }
删除的action
package com.hanqi.action; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import com.hanqi.service.StudentService; public class DeleteStudentAction { private StudentService studentService; HttpServletResponse response = ServletActionContext.getResponse(); public void setStudentService(StudentService studentService) { this.studentService = studentService; } //接受删除的参数 private String snos; public String getSnos() { return snos; } public void setSnos(String snos) { this.snos = snos; } //删除 public void getDelete() { String msg = "{'success':true,'message':'删除成功'}"; if(snos != null ) { System.out.println("snos=="+snos); try { String [] sno = snos.split(",");//分割 for(String s : sno) { studentService.deleteStudent(s); } } catch(Exception e) { msg = "{'success':false,'message':'访问异常'}"; } } else { msg = "{'success':false,'message':'删除失败'}"; } try { response.getWriter().print(msg); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }
页面显示层
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <!-- 顺序不可以乱 --> <!-- 1.jQuery的js包 --> <script type="text/javascript" src="jquery-easyui-1.4.4/jquery.min.js"></script> <!-- 2.css资源 --> <link rel="stylesheet" type="text/css" href="jquery-easyui-1.4.4/themes/default/easyui.css"> <!-- 3. 图标资源 --> <link rel="stylesheet" type="text/css" href="jquery-easyui-1.4.4/themes/icon.css"> <!-- 4.easyui的js包 --> <script type="text/javascript" src="jquery-easyui-1.4.4/jquery.easyui.min.js"></script> <!-- 5.本地语言 --> <script type="text/javascript" src="jquery-easyui-1.4.4/locale/easyui-lang-zh_CN.js"></script> </head> <body> <script type="text/javascript"> //把long型的日期转成yyyy-MM-dd function getDate(date) { //得到日期对象 var d = new Date(date); //得到年 月 日 var year = d.getFullYear(); var month = (d.getMonth()+1); var day = d.getDate(); //拼装 var rtn = year+"-"+(month<10 ? "0"+month : month) + "-"+(day<10 ? "0"+day : day); return rtn; } var type = "add";//定义点击按钮,初始化是添加的 $(function(){ $("#hh").datagrid({ url:'studentAction.action',//Struts.xml的name //冻结列 frozenColumns:[[ {field:'id',checkbox:true},//复选框 {field:'sno',title:'学号',100} ]], //定义列 列配置对象 columns:[[ {field:'sname',title:'姓名',200,align:'center'}, {field:'ssex',title:'性别',200,align:'center', formatter: function(value,row,index){ if(value == '男'||value == 'f') { return '男'; } else { return '女'; } }, styler:function(value,row,index){ if(value=='男'|| value=='f') { return 'background-color:#ccccff;color:red;'; } } }, {field:'sbirthday',title:'生日',200,align:'right', formatter:function(value, row, index){ if(value && value !="") { return getDate(value); } else { return '无'; } } }, {field:'sclass',title:'班级',200,align:'center'} ]] , fitColumns:true, //列自适应宽度,不能和冻结列同时设置为true striped:true, //斑马线 idField:'sno', //主键列 rownumbers:true, //显示行号 singleSelect:false, //是否单选 pagination:true, //分页栏 pageList:[8,16,24,32] , //每页行数选择列表 pageSize:8 , //初始每页行数 remoteSort:true , //是否服务器端排序,设成false才能客户端排序 sortName:'sno',//排序字段,基于服务器端排序 sortOrder:'desc',//排序顺序 //顶部工具栏 toolbar:[ { iconCls:'icon-search', text:'查询', handler:function(){ //序列化查询表单 var f = $("#form2").serialize(); //alert(f); $("#hh").datagrid({url:"studentAction.action?"+f})},//把查询条件带给servlet }, { iconCls:'icon-add', text:'添加', handler:function(){ type ="add"; //$("#sno").textbox({readonly:false}); //清除表单旧数据 $("#form1").form("reset");//重置表单数据 $("#saveStu").dialog('open'); } }, { iconCls:'icon-edit', text:'修改', handler:function(){ type ="edit"; //判断是否选中一条数据 var data = $("#hh").datagrid('getSelected'); if(data) { //alert(date); //设置主键字段只读 $("#sno").textbox({readonly:true}); $("#form1").form("reset");//重置表单数据 $('#form1').form('load',{sno:data.sno, sname:data.sname, ssex:data.ssex, sbirthday:getDate(data.sbirthday), sclass:data.sclass }); //$("#form1").form() $("#saveStu").dialog({title:'修改学生'}).dialog('open'); } else { $.messager.show({ title:'提示', msg:'请选中一条记录' }); } } }, { iconCls:'icon-delete', text:'删除', handler:function(){ //getSelections返回所有被选中的行,当没有记录被选中的时候将返回一个空数组。 var data = $("#hh").datagrid('getSelections'); if(data.length > 0) { //alert("条数="+data.length); $.messager.confirm( '确认','您确认要删除吗?',function(r){ if(r) { //alert("fff="+data[0].sno); //使用数组保存选中数据的记录主键 var snos=[]; for(var i = 0 ; i<data.length;i++) { snos [i]= data[i].sno; } //把要删除的主键传递给Servlet $.get("deleteStudent.action?snos="+snos, function(rtn){ //alert(rtn); //解析 var ms = eval("("+ rtn +")"); if(ms.success) { //若删除成功刷新页面 $("#hh").datagrid('reload'); } $.messager.show({ title:'提示', msg:ms.message }); }); } } ); } else { $.messager.show({ title:'提示', msg:'请选择一条要删除的数据' }) } } } ], }); }) </script> <div id="search" class="easyui-panel" title="查询条件" style="height:80px;100%" data-options="{ iconCls:'icon-search', collapsible:true}"> <form id="form2"><br> <table border="0" style="margin-left:30px"> <tr> <td>姓名:<input class="easyui-textbox" id="sname_s" name="sname_s"></td> <td>班级:<input class="easyui-textbox" id="sclass_s" name="sclass_s"></td> </tr> </table> </form> </div> <table id="hh"></table> <div class="easyui-dialog" id="saveStu" style="400px; height:300px" title="添加学生" data-options="{ closed:true, modal:true, buttons:[{ text:'保存', iconCls:'icon-save', handler:function(){ $('#form1').form('submit',{ url:'saveStudent.action?type='+ type, // onSubmit:function(){ var isValid = $(this).form('validate'); if(!isValid) { $.messager.show({ title:'消息', msg:'数据验证未通过' }); } return isValid; // 返回false终止表单提交 }, success:function(data){ var msg = eval('('+ data +')');//eval是js的方法 if(!msg.success) { alert(msg.message); } else { $('#hh').datagrid('load'); $.messager.show({ title:'消息', msg:'数据验证通过,保存成功' }); $('#saveStu').dialog('close'); } } }); } }, { text:'取消', iconCls:'icon-cancel', handler:function(){$('#saveStu').dialog('close')}, }] }"> <form action="" id="form1" method="post"><br><br> <table border="0" width=100%> <tr> <td align="right" width="30%">学号:</td> <td> <input class="easyui-textbox" id="sno" name="sno" data-options="required:true,validType:'length[3,8]'"> </td> </tr> <tr> <td align="right" width="30%">姓名:</td> <td> <input class="easyui-textbox" id="sname" name="sname" data-options="required:true,validType:'length[2,3]'"> </td> </tr> <tr> <td align="right" width="30%">性别:</td> <td> <input type="radio" name="ssex" value="男" checked>男 <input type="radio" name="ssex" value="女">女 </td> </tr> <tr> <td align="right" >生日:</td> <td> <input class="easyui-datebox" id="sbirthday" name="sbirthday" data-options="required:false,"> </td> </tr> <tr> <td align="right" >班级:</td> <td> <input class="easyui-textbox" id="sclass" name="sclass" data-options="required:true,validType:'length[5,5]'"> </td> </tr> </table> </form> </div> </body> </html>