在我前面一篇分页的基础上,新增了添加功能和添加过程中的Ajax与Validate的验证功能。其他的功能在后面的博客写来,如果对您有帮助,敬请关注。

先看一下实现的效果:

(1)点击添加学生信息按键后跳出对话框,其中的学生主键和姓名不能为空,而且学生主键不能和数据库中已有的重复。

(2)当输入已有的学生信息的时候,提示已被使用

(3)当操作人员不顾提示,强行提交的时候。系统拒绝提交,并且跳出提示框。

(4)当操作人员正常操作,提交后会自动刷新,在表格中按照从小到大的顺序排列出来。

具体实现步骤:

1、依然是使用SSH框架,数据库表没有新增,所以整体的结果基本不变。将原来的index.jsp中的JavaScript部分划分到index.js中。

2、web.xm、applicationContext.xml、Student.java、Student.hbm.xml、连接数据库的applicationContext_db.xml、Spring依赖注入的applicationContext_bean.xml这些配置文件和上篇博客一模一样,保持不变。SSH的耦合度的优势在慢慢突显。

3、在StudentService.java中编写接口,新增操作的方法一定要以save开头,因为在applicationContext_db.xml配置中已经限定,或者你去该applicationContext_db.xml的配置

  1. <span style="font-size:18px;">package com.service;
  2. import java.util.List;
  3. import com.model.Student;
  4. public interface StudentService {
  5. public List getStudentList(String page,String rows) throws Exception;//根据第几页获取,每页几行获取数据
  6. public int getStudentTotal() throws Exception;//统计一共有多少数据
  7. public void saveStudent(Student student)throws Exception;//新增学生信息
  8. public String queryBy_unique(String table,String field ,String parameter) throws Exception;//验证唯一性
  9. }
  10. </span>

4、在StudentServiceImpl.java的类中编写接口的实现类,验证方法queryBy_unique传入三个参数:表名,字段名,字段对应的参数。所以可以做成通用的验证方法,而不是针对某张表的某个字段的验证。

  1. package com.serviceImpl;
  2. import java.util.List;
  3. import org.hibernate.Query;
  4. import org.hibernate.SessionFactory;
  5. import com.model.Student;
  6. import com.service.StudentService;
  7. public class StudentServiceImpl implements StudentService {
  8. private SessionFactory sessionFactory;
  9. // 根据第几页获取,每页几行获取数据
  10. public List getStudentList(String page, String rows) {
  11. //当为缺省值的时候进行赋值
  12. int currentpage = Integer.parseInt((page == null || page == "0") ? "1": page);//第几页
  13. int pagesize = Integer.parseInt((rows == null || rows == "0") ? "10": rows);//每页多少行
  14. //查询学生信息,顺便按学号进行排序
  15. List list = this.sessionFactory.getCurrentSession().createQuery("from Student  order by studentid")
  16. .setFirstResult((currentpage - 1) * pagesize).setMaxResults(pagesize).list();
  17. //setFirstResult 是设置开始查找处。setFirstResult的值 (当前页面-1)X每页条数
  18. //设置每页最多显示的条数  setMaxResults每页的条数了
  19. return list;
  20. }
  21. // 统计一共有多少数据
  22. public int getStudentTotal() throws Exception {
  23. return this.sessionFactory.getCurrentSession().find("from Student").size();
  24. }
  25. // 新增学生信息
  26. public void saveStudent(Student student) throws Exception {
  27. this.sessionFactory.getCurrentSession().save(student);
  28. }
  29. //判断是否具有唯一性
  30. public String queryBy_unique(String table,String field ,String parameter) throws Exception {
  31. System.out.println("===============验证唯一性=========");
  32. String s="select * from "+table +" t where t."+field+"='"+parameter+"'";
  33. System.out.println("SQL语句:"+s);
  34. Query query = this.sessionFactory.getCurrentSession().createSQLQuery(s);
  35. int n=query.list().size();
  36. if(n==0)//如果集合的数量为0,说明没有重复,具有唯一性
  37. {
  38. return "1";//返回值为1,代表具有唯一性
  39. }
  40. return "0";//返回值为0,代表已经有了,重复了
  41. }
  42. public SessionFactory getSessionFactory() {
  43. return sessionFactory;
  44. }
  45. public void setSessionFactory(SessionFactory sessionFactory) {
  46. this.sessionFactory = sessionFactory;
  47. }
  48. }

5、在控制层StudentAction.java中编写:

  1. package com.action;
  2. import java.io.PrintWriter;
  3. import java.util.List;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import net.sf.json.JSONObject;
  7. import org.apache.log4j.Logger;
  8. import org.apache.struts2.ServletActionContext;
  9. import com.model.Student;
  10. import com.service.StudentService;
  11. public class StudentAction {
  12. static Logger log = Logger.getLogger(StudentAction.class);
  13. private JSONObject jsonObj;
  14. private String rows;// 每页显示的记录数
  15. private String page;// 当前第几页
  16. private StudentService student_services;//String依赖注入
  17. private Student student;//学生
  18. private String parameter;//参数
  19. private String table;//表名
  20. private String field;//字段
  21. //查询出所有学生信息
  22. public String allInfo() throws Exception {
  23. log.info("查询出所有学生信息");  //引用到log4j你应该加入  log4j的配置文件,不然用System.out.println();来替换
  24. List list = student_services.getStudentList(page, rows);//传入参数页码和行数,获取当前页的数据
  25. this.toBeJson(list,student_services.getStudentTotal());//调用自己写的toBeJson方法转化为JSon格式
  26. return null;
  27. }
  28. //新增学生信息
  29. public String add() throws Exception{
  30. log.info("新增学生信息");
  31. student_services.saveStudent(student);
  32. return null;
  33. }
  34. //查询唯一性
  35. public String verify() throws Exception{
  36. log.info("ACTION验证唯一性");
  37. String s = student_services.queryBy_unique(table,field ,parameter);
  38. log.info("结果:" + s);
  39. //将验证的结果返回JSP页面,s为1代表没有重复,为0代表有重复
  40. HttpServletResponse response = ServletActionContext.getResponse();
  41. response.setContentType("text/html;charset=utf-8");
  42. PrintWriter out = response.getWriter();
  43. out.print(s);
  44. out.flush();
  45. out.close();
  46. return null;
  47. }
  48. //转化为Json格式
  49. public void toBeJson(List list,int total) throws Exception{
  50. HttpServletResponse response = ServletActionContext.getResponse();
  51. HttpServletRequest request = ServletActionContext.getRequest();
  52. JSONObject jobj = new JSONObject();//new一个JSON
  53. jobj.accumulate("total",total );//total代表一共有多少数据
  54. jobj.accumulate("rows", list);//row是代表显示的页的数据
  55. response.setCharacterEncoding("utf-8");//指定为utf-8
  56. response.getWriter().write(jobj.toString());//转化为JSOn格式
  57. log.info(jobj.toString());
  58. }
  59. public StudentService getStudent_services() {
  60. return student_services;
  61. }
  62. public void setStudent_services(StudentService student_services) {
  63. this.student_services = student_services;
  64. }
  65. public void setJsonObj(JSONObject jsonObj) {
  66. this.jsonObj = jsonObj;
  67. }
  68. public void setRows(String rows) {
  69. this.rows = rows;
  70. }
  71. public void setPage(String page) {
  72. this.page = page;
  73. }
  74. public void setStudent(Student student) {
  75. this.student = student;
  76. }
  77. public Student getStudent() {
  78. return student;
  79. }
  80. public void setParameter(String parameter) {
  81. this.parameter = parameter;
  82. }
  83. public void setTable(String table) {
  84. this.table = table;
  85. }
  86. public void setField(String field) {
  87. this.field = field;
  88. }
  89. }

6、改进Struts.xml配置,完整的action名称是student加上控制层对应的方法名

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <package name="Easyui" extends="json-default">
  7. <!-- 学生信息 -->
  8. <action name="student*" class="student_action" method="{1}">
  9. <result type="json"> </result>
  10. </action>
  11. </package>
  12. </struts>

7、编写index.jsp页面,将原先的JavaScript代码分离到index.js中

  1. <%@ page language="java" pageEncoding="utf-8" isELIgnored="false"%>
  2. <%
  3. String path = request.getContextPath();
  4. %>
  5. <%@ taglib prefix="s" uri="/struts-tags"%>
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  7. <html>
  8. <head>
  9. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  10. <title>Easyui</title>
  11. <!-- 引入Jquery -->
  12. <script type="text/javascript" src="<%=path%>/js/easyui/jquery-1.8.0.min.js" charset="utf-8"></script>
  13. <!-- 引入Jquery_easyui -->
  14. <script type="text/javascript" src="<%=path%>/js/easyui/jquery.easyui.min.js" charset="utf-8"></script>
  15. <!-- 引入easyUi国际化--中文 -->
  16. <script type="text/javascript" src="<%=path%>/js/easyui/locale/easyui-lang-zh_CN.js" charset="utf-8"></script>
  17. <!-- 引入easyUi默认的CSS格式--蓝色 -->
  18. <link rel="stylesheet" type="text/css" href="<%=path%>/js/easyui/themes/default/easyui.css" />
  19. <!-- 引入easyUi小图标 -->
  20. <link rel="stylesheet" type="text/css" href="<%=path%>/js/easyui/themes/icon.css" />
  21. <!-- 引入对应的JS,切记一定要放在Jquery.js和Jquery_Easyui.js后面,因为里面需要调用他们,建议放在最后面 -->
  22. <script type="text/javascript" src="<%=path%>/index.js" charset="utf-8"></script>
  23. </head>
  24. <body>
  25. <h2>
  26. <b>easyui的DataGrid实例</b>
  27. </h2>
  28. <table id="mydatagrid">
  29. <thead>
  30. <tr>
  31. <th data-options="field:'studentid',width:100,align:'center'">学生学号</th>
  32. <th data-options="field:'name',width:100,align:'center'">姓名</th>
  33. <th data-options="field:'gender',width:100,align:'center'">性别</th>
  34. <th data-options="field:'age',width:100,align:'center'">年龄</th>
  35. </tr>
  36. </thead>
  37. </table>
  38. <!-- 显示添加按钮的Div -->
  39. <div id="easyui_toolbar" style="padding: 2px 0px 2px 15px; height: auto">
  40. <a href="#" id="easyui_add" class="easyui-linkbutton" iconCls="icon-add" plain="true">添加学生信息</a>
  41. </div>
  42. <!-- 添加学生信息的表单       -->
  43. <div id="addDlg" class="easyui-dialog" style="width: 580px; height: 350px; padding: 10px 20px" closed="true" buttons="#addDlgBtn">
  44. <form id="addForm" method="post">
  45. <table>
  46. <tr>
  47. <td>学生主键</td>
  48. <td>
  49. <input name="student.studentid" id="studentid" class="easyui-validatebox" required="true" missingMessage="学生主键不能为空">
  50. </td>
  51. <td>
  52. <!-- 存放提示重复信息的div -->
  53. <div id="xianshi1" style="float: left"></div>
  54. <div style="float: left"> </div>
  55. <div id="xianshi2" style="font-size: 14px; color: #FF0000; float: left"></div>
  56. </td>
  57. </tr>
  58. <tr>
  59. <td>姓名</td>
  60. <td>
  61. <input name="student.name" id="name" class="easyui-validatebox" required="true" missingMessage="姓名不能为空">
  62. </td>
  63. </tr>
  64. <tr>
  65. <td>性别</td>
  66. <td>
  67. <!-- 使用Easyui中的combobox -->
  68. <select class="easyui-combobox" style="width: 155px;" name="student.gender" id="gender" data-options="panelHeight:'auto'">
  69. <option value="男">男</option>
  70. <option value="女">女</option>
  71. </select>
  72. </td>
  73. </tr>
  74. <tr>
  75. <td>年龄</td>
  76. <td>
  77. <input name="student.age" id="age" class="easyui-validatebox">
  78. </td>
  79. </tr>
  80. </table>
  81. </form>
  82. </div>
  83. <!-- 保存学生信息的按钮,被Jquery设置,当没被调用的时候不显示     -->
  84. <div id="addDlgBtn">
  85. <a href="#" id="addSaveBooktimecode" class="easyui-linkbutton" iconCls="icon-ok" onclick="add_ok()">确认</a>
  86. <a href="#" class="easyui-linkbutton" iconCls="icon-cancel" onclick="javascript:$('#addDlg').dialog('close')">取消</a>
  87. </div>
  88. </body>
  89. </html>

8、编写index.jsp页面对应的JS-------index.js

  1. var isClickOk=true;//判断的变量
  2. $(function() {
  3. //datagrid设置参数
  4. $('#mydatagrid').datagrid({
  5. title : 'datagrid实例',
  6. iconCls : 'icon-ok',
  7. width : 600,
  8. pageSize : 5,//默认选择的分页是每页5行数据
  9. pageList : [ 5, 10, 15, 20 ],//可以选择的分页集合
  10. nowrap : true,//设置为true,当数据长度超出列宽时将会自动截取
  11. striped : true,//设置为true将交替显示行背景。
  12. collapsible : true,//显示可折叠按钮
  13. toolbar:"#easyui_toolbar",//在添加 增添、删除、修改操作的按钮要用到这个
  14. url:'studentallInfo.action',//url调用Action方法
  15. loadMsg : '数据装载中......',
  16. singleSelect:true,//为true时只能选择单行
  17. fitColumns:true,//允许表格自动缩放,以适应父容器
  18. sortName : 'studentid',//当数据表格初始化时以哪一列来排序
  19. sortOrder : 'asc',//定义排序顺序,可以是'asc'或者'desc'(正序或者倒序)。
  20. remoteSort : false,
  21. frozenColumns : [ [ {
  22. field : 'ck',
  23. checkbox : true
  24. } ] ],
  25. pagination : true,//分页
  26. rownumbers : true//行数
  27. });
  28. //当点击添加学生信息的时候触发
  29. $("#easyui_add").click(function() {
  30. $("#xianshi1").empty();//清除上次出现的图标1
  31. $("#xianshi2").empty();//清除上次出现的图标2
  32. $('#addDlg').dialog('open').dialog('setTitle', '添加学生信息');//打开对话框
  33. $('#addForm').form('clear');
  34. });
  35. //当光标移开焦点的时候进行重复验证
  36. $("#studentid").blur(function(){
  37. jQuery.ajax({   //使用Ajax异步验证主键是否重复
  38. type : "post",
  39. url : "studentverify.action?table=Student&field=studentid¶meter="+$('#studentid').val(),
  40. dataType:'json',
  41. success : function(s){
  42. if($('#studentid').val()==""){//当为主键为空的时候什么都不显示,因为Easyui的Validate里面已经自动方法限制
  43. }
  44. else if( s == "1" )//当返回值为1,表示在数据库中没有找到重复的主键
  45. {   isClickOk=true;
  46. $("#xianshi1").empty();
  47. var txt1="<img src="+"'imgs/agree_ok.gif'"+"/>";//引入打勾图标的路径
  48. $("#xianshi1").append(txt1);//在id为xianshi1里面加载打勾图标
  49. $("#xianshi2").empty();
  50. $("#xianshi2").append("未被使用");//在di为xianshi2中加载“未被使用”这四个字
  51. }
  52. else
  53. {
  54. $("#xianshi1").empty();
  55. isClickOk=false;
  56. var txt1="<img src="+"'imgs/agree_no.gif'"+"/>"//引入打叉图标的路径
  57. $("#xianshi1").append(txt1);//在id为xianshi1里面加载打叉图标
  58. $("#xianshi2").empty();
  59. $("#xianshi2").append("已被使用");//在id为xianshi2里面加载“已被使用”四个字
  60. }
  61. }
  62. });
  63. });
  64. });
  65. //添加信息点击保存的时候触发此函数
  66. function add_ok(){
  67. $.messager.defaults={ok:"确定",cancel:"取消"};
  68. $.messager.confirm('Confirm', '您确定增加?', function(r){//使用确定,取消的选择框
  69. if (r){
  70. $('#addForm').form('submit',{//引入Easyui的Form
  71. url:"studentadd.action",//URL指向添加的Action
  72. onSubmit: function(){
  73. if(isClickOk==false){//当主键重复的时候先前就已经被设置为false,如果为false就不提交,显示提示框信息不能重复
  74. $.messager.alert('操作提示', '主键不能重复!','error');
  75. return false;
  76. }
  77. else if($('#addForm').form('validate')){//判断Easyui的Validate如果都没错误就同意提交
  78. $.messager.alert('操作提示', '添加信息成功!','info');
  79. return true;
  80. }else{//如果Easyui的Validate的验证有一个不完整就不提交
  81. $.messager.alert('操作提示', '信息填写不完整!','error');
  82. return false;
  83. }
  84. }
  85. });
  86. $('#mydatagrid').datagrid({url:'studentallInfo.action'});//实现Datagrid重新刷新效果
  87. $('#addDlg').dialog('close');//关闭对话框
  88. }
  89. });
  90. }

9、启动程序,输入http://localhost:8080/easyui/index.jsp进行测试

最新文章

  1. 【转】RBAC权限管理
  2. iOS数据持久化
  3. MTK6577+Android4.04编译
  4. MFC对话框应用程序添加自定义消息
  5. 【转】linux文件系统之mount流程分析
  6. Linux下VMWare虚拟机的使用技巧
  7. SQL Server 查看表定义的 2 种方法
  8. libconfig第二篇----两个小例子
  9. MySQL 服务日志
  10. SSH KEY 批量分发
  11. Redux 核心概念
  12. Angular利用@ViewChild在父组件执行子组件的方法
  13. __new__()方法的使用和实例化
  14. CDN原理介绍(转)
  15. P3924 康娜的线段树(期望)
  16. 从boost到Adaboost再到GBRT-GBDT-MART
  17. 关于Spring-Data-Jpa的一些理解
  18. 按书上学写测试pytest
  19. js 判断id 是否存在
  20. HUAS 1482 lsy的后宫(DP+矩阵快速幂)

热门文章

  1. TCP/IP协议学习之实例ping命令学习笔记
  2. js 数组切换图片
  3. 句柄C++
  4. openwrt makefile选项
  5. 读入一行字符给string类型
  6. 1.java.io包中定义了多个流类型来实现输入和输出功能,
  7. Perl 之 use(), require(), do(), %INC and @INC
  8. request.getparam()与request.getAttibute()的区别
  9. 字符串查找 cmd find命令
  10. Anton and School