03-EasyUI尚硅谷-form表单
一、表单的基础
把表单放入panel中,对个别控件进行自定义校验器(可以加正则等)、控件的数据格式校验
jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>Form Test</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.2.6/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.2.6/themes/icon.css"> <script type="text/javascript" src="js/jquery-easyui-1.2.6/jquery-1.7.2.min.js"></script> <script type="text/javascript" src="js/jquery-easyui-1.2.6/jquery.easyui.min.js"></script> <script type="text/javascript" src="js/jquery-easyui-1.2.6/locale/easyui-lang-zh_CN.js"></script> <script type="text/javascript"> $(function() { // 面板 $("#userDiv").panel({ width: 300, height: 450, title: '新增用户' }); // 用户名和密码校验器 $("input[name='username']").validatebox({ required: true, validType: 'minLength[2,5]', missingMessage: '用户名必填' }); $("input[name='password']").validatebox({ required: true, validType: 'equalLength[4]', missingMessage: '密码必填' }); // 年龄 $("input[name='age']").numberbox({ min: 1, max: 200, required: true, missingMessage: '年龄必填' }); // 生日 $("input[name='birthday']").datetimebox({ required: true, missingMessage: '生日必填', // 只可选择,禁止输入 editable: false }); // 下拉框(查看easyui.css文件中的combobox-item-hover的css,可以设置鼠标悬停在下拉选项上的颜色) $("input[name='city']").combobox({ url: 'json/city_data.json', // 这个json文件的编码一定要是utf-8,否则会中文乱码,右键-Properties-设置utf-8 valueField: 'id', // 对应json文件中的key textField: 'text', // 对应json文件中的key value: '请选择', editable: false }); // 薪水 $("input[name='salary']").numberbox({ min: 2000, max: 20000, required: true, missingMessage: '薪水必填', precision: 2 }); // 时间日期控件 $("input[name='starttime'],input[name='endtime']").datetimebox({ required: true, missingMessage: '时间必填', // 只可选择,禁止输入 editable: false, // 开始时间不能迟于结束时间 // ... }); // 个人描述 $("input[name='description']").validatebox({ required: true, validType: 'minLength[5,50]', missingMessage: '个人描述必填', invalidMessage: '个人描述必须在5-50个字符之间!' // 这里使用invalidMessage覆盖掉用户名中的提示信息【原来的不变,只改变这里的提示内容】 }); // 重写了校验器 $.extend($.fn.validatebox.defaults.rules, { minLength: { // 校验器,value:用户输入的内容 param:定义的校验数组 validator: function(value, param) { return value.length >= param[0] && value.length <= param[1]; }, // 如果出错,显示的提示信息 message: "用户名必须在2-5个字符之间!" }, equalLength: { // 校验器,value:用户输入的内容 param:定义的校验数组 validator: function(value, param) { return value.length == param[0]; }, // 如果出错,显示的提示信息 message: "密码必须是4位字符!" } }); }); </script> </head> <body> <div id="userDiv" style="background: #fafafa;"> <form action="" method="post" id="userForm" class="easyui-form"> <table id="userTable" style="text-align: right;padding: 20px;" cellpadding="2px;" cellspacing="5px;"> <tr> <td>用户名:</td> <td><input type="text" name="username"/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password"/></td> </tr> <tr> <td>性别:</td> <td> <input type="radio" name="sex" value="1" checked="checked"/> 男 <input type="radio" name="sex" value="2"/> 女 </td> </tr> <tr> <td>年龄:</td> <td><input type="text" name="age"/></td> </tr> <tr> <td>生日:</td> <td><input type="text" name="birthday" style="width: 150px;"/></td> </tr> <tr> <td>所属城市:</td> <td> <input type="text" name="city" style="width: 150px;"/> </td> </tr> <tr> <td>薪水:</td> <td><input type="text" name="salary"/></td> </tr> <tr> <td>开始时间:</td> <td><input type="text" name="starttime" style="width: 150px;"/></td> </tr> <tr> <td>结束时间:</td> <td><input type="text" name="endtime" style="width: 150px;"/></td> </tr> <tr> <td>描述:</td> <td><input type="text" name="description"/></td> </tr> <tr> <td colspan="2"><a id="saveUser" class="easyui-linkbutton">新增</a></td> </tr> </table> </form> </div> </body> </html>
city_data.json:
[ { "id": 1, "text": "东莞" }, { "id": 2, "text": "深圳" }, { "id": 3, "text": "广州" }, { "id": 4, "text": "珠海" }, { "id": 5, "text": "佛山" } ]
效果:
二、表单提交的方式【 以下代码只作为测试演示用,实际开发中不能使用! 】
1.传统ajax提交
2.定义form自动提交
3.定义form手动提交
--------------------------------------------------
准备:
数据表脚本:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL, `password` varchar(50) DEFAULT NULL, `sex` varchar(10) DEFAULT NULL, `age` int(10) DEFAULT NULL, `birthday` varchar(50) DEFAULT NULL, `city` int(10) DEFAULT NULL, `salary` varchar(50) DEFAULT NULL, `starttime` varchar(100) DEFAULT NULL, `endtime` varchar(100) DEFAULT NULL, `description` varchar(500) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
User.java:
public class User implements Serializable { private String id; private String username; private String password; private String sex; private String age; private String birthday; private String city; private String salary; private String starttime; private String endtime; private String description;
DBHelper.java:
package sxt.easyui.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DBHelper { // 数据库连接参数 public static final String DRIVERCLASS = "com.mysql.jdbc.Driver"; public static final String URL = "jdbc:mysql://localhost:3306/easyui?useUnicode=true&characterEncoding=utf-8"; public static final String USRENAME = "root"; public static final String PASSWORD = "123456"; // Connection public static Connection getConn() { Connection conn = null; try { Class.forName(DRIVERCLASS); conn = DriverManager.getConnection(URL, USRENAME, PASSWORD); } catch (Exception e) { e.printStackTrace(); } return conn; } // PrepareStatement public static PreparedStatement prepare(Connection conn, String sql) { PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } return ps; } // 关闭数据库, 释放资源 public static void close(ResultSet rs) { if (rs != null) { try { rs.close(); rs = null; } catch (Exception e) { e.printStackTrace(); } } } public static void close(PreparedStatement ps) { if (ps != null) { try { ps.close(); ps = null; } catch (SQLException e) { e.printStackTrace(); } } } public static void close(Connection conn) { if (conn != null) { try { conn.close(); conn = null; } catch (SQLException e) { e.printStackTrace(); } } } }
web.xml:
<?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_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Easyui</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> <servlet> <servlet-name>UserServlet</servlet-name> <servlet-class>sxt.easyui.servlet.UserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserServlet</servlet-name> <url-pattern>/UserServlet</url-pattern> </servlet-mapping> </web-app>
UserServlet.java:
package sxt.easyui.servlet; import java.io.IOException; import java.sql.Connection; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import sxt.easyui.util.DBHelper; import com.mysql.jdbc.PreparedStatement; @SuppressWarnings("serial") public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getParameter("method"); if ("saveUser".equals(method)) { this.saveUser(req, resp); } } // 新增用户 private void saveUser(HttpServletRequest req, HttpServletResponse resp) { // 接收表单数据 String username = req.getParameter("username"); String password = req.getParameter("password"); String sex = req.getParameter("sex"); String age = req.getParameter("age"); String birthday = req.getParameter("birthday"); String city = req.getParameter("city"); String salary = req.getParameter("salary"); String starttime = req.getParameter("starttime"); String endtime = req.getParameter("endtime"); String description = req.getParameter("description"); // 构建User对象 /*User user = new User(id, username, password, sex, age, birthday, city, salary, starttime, endtime, description);*/ // 插入记录 Connection conn = DBHelper.getConn(); String sql = "INSERT INTO user(username, password, sex, age, birthday, city, salary, starttime, endtime, description) " + "VALUES('"+username+"','"+password+"','"+sex+"','"+age+"','"+birthday+"','"+city+"','"+salary+"','"+starttime +"','"+endtime+"','"+description+"')"; PreparedStatement ps = (PreparedStatement) DBHelper.prepare(conn, sql); resp.setContentType("text/html;charset=utf-8"); String str = ""; try { // int a = 1/0; // 操作失败演示 int count = ps.executeUpdate(); // 用户添加成功后返回:{"status":"ok","message":"操作成功!"},失败返回:// 用户添加成功后返回:{"status":"error","message":"操作失败!"} if (count == 1) { str = "{\"status\":\"ok\",\"message\":\"操作成功!\"}"; } else { str = "{\"status\":\"error\",\"message\":\"操作失败!\"}"; } } catch (Exception e) { str = "{\"status\":\"error\",\"message\":\"操作失败!\"}"; e.printStackTrace(); } finally { // 不管操作成功或者失败,都会执行这里的代码 try { resp.getWriter().write(str); } catch (IOException e) { e.printStackTrace(); } DBHelper.close(ps); DBHelper.close(conn); } } }
1.传统ajax提交
003.jsp:(form表单省略,在上面的代码可以找到,这里只写ajax方法)
// 提交表单 $("#saveUserBtn").click(function() { $.ajax({ type: "post", // 提交方式 url: "UserServlet?method=saveUser", // 提交地址 cache: false, // 是否缓存 data: $("#userForm").serialize(), // 提交的数据,这里不需要一个个去构造js对象/json串,直接将表单序列化成username=xxx&password=xxx的字串 dataType: "text", // 请求成功后响应的数据类型,可以是text/html/xml/json等等 success: function(result) { //var result = eval("("+result+")"); var result = $.parseJSON(result); $.messager.show({ title: result.status, msg: result.message }); }, error: function(result) { var result = $.parseJSON(result); $.messager.show({ title: result.status, msg: result.message }); } }); });
效果:
添加成功或者失败都会在屏幕右下角弹出操作提示信息。
2.定义form自动提交
// 提交表单,使用easyui的表单提交方式提交表单 $("#saveUserBtn").click(function() { $("#userForm").form('submit', { url: "UserServlet?method=saveUser", onSubmit: function() { // 如果表单校验不通过,就阻止表单提交 if (!$("#userForm").form('validate')) { $.messager.show({ title: "提示信息", msg: "验证没有通过,不能提交表单!" }); return false; // 阻止提交 } }, success: function(result) { var result = $.parseJSON(result); $.messager.show({ title: result.status, msg: result.message }); }, error: function(result) { var result = $.parseJSON(result); $.messager.show({ title: result.status, msg: result.message }); } }); });
效果同上;
按回车提交表单:
// 提交表单,使用easyui的表单提交方式提交表单 $("#userForm").find("input").on("keyup", function(event) { if (event.keyCode == 13) { $("#userForm").form('submit', { url: "UserServlet?method=saveUser", onSubmit: function() { // 如果表单校验不通过,就阻止表单提交 if (!$("#userForm").form('validate')) { $.messager.show({ title: "提示信息", msg: "验证没有通过,不能提交表单!" }); return false; // 阻止提交 } }, success: function(result) { var result = $.parseJSON(result); $.messager.show({ title: result.status, msg: result.message }); }, error: function(result) { var result = $.parseJSON(result); $.messager.show({ title: result.status, msg: result.message }); } }); } });
当光标在表单控件上,按回车,就会提交表单,如果表单校验不通过,那么屏幕右下角就会弹出提示框。
3.定义form手动提交【 使用场景:多种方式提交表单的时候,比如回车可以提交表单,点击保存按钮也可以提交表单,为了代码不重复,就使用这种情况:
先定义好表单,然后各种方式进行提交】