题目要求:1登录账号:要求由6到12位字母、数字、下划线组成,只有字母可以开头;2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母、数字组成;3性别:要求用单选框或下拉框实现,选项只有“男”或“女”;4学号:要求八位数字组成,前四位为“2018”开头,输入自己学号;5 姓名:输入自己的姓名;6 电子邮箱:要求判断正确格式xxxx@xxxx.xxxx;7 点击“添加”按钮,将学生个人信息存储到数据库中;8 可以演示连接上数据库。
思路:连接数据库;JSP设置网页(由于要求不高,设计不是很精致);判定格式,提示错误信息;信息导入数据库
代码如下:
package util DBUtil.java
1 package util; 2 3 4 import java.sql.Connection; 5 import java.sql.DriverManager; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.sql.Statement; 9 10 11 12 public class DBUtil { 13 //useSSL=false:避免连接时出现SSL问题 14 public static String db_url = "jdbc:mysql://localhost:3306/exam?useSSL=false"; 15 public static String db_user = "root";//用户名 16 public static String db_pass = "Inazuma";//密码 17 18 public static Connection getConn () { 19 Connection conn = null; 20 21 try { 22 Class.forName("com.mysql.jdbc.Driver");//加载JDBC驱动 23 conn = DriverManager.getConnection(db_url, db_user, db_pass); 24 } catch (Exception e) { 25 e.printStackTrace(); 26 } 27 28 return conn; 29 } 30 31 //关闭Connection和Statement对象 32 public static void close (Statement state, Connection conn) { 33 if (state != null) { 34 try { 35 state.close(); 36 } catch (SQLException e) { 37 e.printStackTrace(); 38 } 39 } 40 41 if (conn != null) { 42 try { 43 conn.close(); 44 } catch (SQLException e) { 45 e.printStackTrace(); 46 } 47 } 48 } 49 //若调用ResultSet对象,执行下段close方法 50 public static void close (ResultSet rs, Statement state, Connection conn) { 51 if (rs != null) { 52 try { 53 rs.close(); 54 } catch (SQLException e) { 55 e.printStackTrace(); 56 } 57 } 58 59 if (state != null) { 60 try { 61 state.close(); 62 } catch (SQLException e) { 63 e.printStackTrace(); 64 } 65 } 66 67 if (conn != null) { 68 try { 69 conn.close(); 70 } catch (SQLException e) { 71 e.printStackTrace(); 72 } 73 } 74 } 75 76 77 }
此段代码为JDBC驱动程序,用于连接数据库。
package Servlet ExamServlet.java
1 package Servlet; 2 import java.io.IOException; 3 4 import javax.servlet.ServletException; 5 import javax.servlet.annotation.WebServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 import javax.servlet.http.HttpServlet; 9 10 11 import Dao.ExamDao; 12 13 @WebServlet("/ExamServlet") 14 public class ExamServlet extends HttpServlet{ 15 private static final long serialVersionUID = 1L; 16 ExamDao Dao=new ExamDao(); 17 18 //resp:HTTP协议 19 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 20 req.setCharacterEncoding("utf-8"); 21 //获取网页中action里method参数 22 String method = req.getParameter("method"); 23 //若相同执行其方法 24 if ("add".equals(method)) { 25 add(req, resp); 26 } 27 } 28 //向数据库写入信息 29 private void add(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { 30 req.setCharacterEncoding("utf-8"); 31 String ZH=req.getParameter("username"); 32 String MM=req.getParameter("password"); 33 String XB=req.getParameter("sex"); 34 String XM=req.getParameter("pname"); 35 String XH=req.getParameter("number"); 36 String YX=req.getParameter("address"); 37 String XX=req.getParameter("school"); 38 String XI=req.getParameter("xi"); 39 String BJ=req.getParameter("class"); 40 String NF=req.getParameter("year"); 41 String SYD=req.getParameter("home"); 42 String BZ=req.getParameter("bz"); 43 int i = Dao.Judge(ZH, MM, XH, YX); //给i赋值,若出现错误则用其判定执行的错误语句 44 45 //执行成功 46 if(Dao.add(ZH, MM, XB, XM, XH, YX, XX,XI,BJ,NF,SYD,BZ)) { 47 req.setAttribute("message", "添加成功"); 48 req.getRequestDispatcher("Test.jsp").forward(req,resp); 49 } 50 //执行失败 51 else { 52 //用户名错误 53 if(i == 1) { 54 req.setAttribute("message", "用户名错误"); 55 } 56 //密码错误 57 else if(i == 2) { 58 req.setAttribute("message", "密码错误"); 59 } 60 //学号错误 61 else if(i == 3) { 62 req.setAttribute("message", "学号错误"); 63 } 64 //邮箱格式错误 65 else if(i == 4) { 66 req.setAttribute("message", "邮箱格式错误"); 67 } 68 //向jsp文件中传值 69 req.getRequestDispatcher("Test.jsp").forward(req,resp); 70 } 71 } 72 }
此代码用于读取jsp制作的网页中,文本框输入的信息,并将其传给ExamDao类,实现对数据库的增加数据操作,同时向jsp文件传递req,resp,决定输出的提示信息。
package Dao ExamDao.java
1 package Dao; 2 3 import java.sql.Connection; 4 import java.sql.Statement; 5 //调用DBUtil初始化Connection和Statement对象 6 import util.DBUtil; 7 public class ExamDao { 8 public boolean add(String ZH,String MM,String XB,String XM,String XH,String YX,String XX,String XI,String BJ,String NF,String SYD,String BZ) { 9 //insert into 后接表名,表名(表中头名)values后输入数据,数据见上方代码,其中String类等数据从Servlet传来。 10 String sql="insert into student(username,password,sex,pname,number,address,school,xi,class,year,home,bz)" 11 + "values('"+ZH+"','"+MM+"','"+XB+"','"+XM+"','"+XH+"','"+YX+"','"+XX+"','"+XI+"','"+BJ+"','"+NF+"','"+SYD+"','"+BZ+"')"; 12 Connection conn = DBUtil.getConn(); 13 //驱动连接 14 Statement state = null; 15 boolean f=false; 16 int a = 0; 17 int temp = 0; 18 ExamDao n= new ExamDao(); 19 20 try { 21 temp = n.Judge(ZH, MM, XH, YX); 22 if(temp == 0) { 23 state = conn.createStatement(); 24 //每执行一条语句,a++ 25 //executeUpdate:返回int,表示多少眺语句受到了影响 26 a=state.executeUpdate(sql); 27 } 28 else 29 a = 0; 30 } catch (Exception e) { 31 e.printStackTrace(); 32 } finally { 33 DBUtil.close(state, conn); 34 } 35 36 if (a > 0) { 37 //返回为真 38 f = true; 39 } 40 //返回为假 41 return f; 42 43 } 44 //根据题目要求判定格式 45 public int Judge(String ZH,String MM,String XH, String YX) { 46 //用户名格式:首元素为字母;长度6-12位;由字母,下划线,数字构成 47 if(ZH!=null) { 48 //正则表达式:字母,下划线,数字 49 String rz = "^\\w+$"; 50 int s1 = ZH.length(); 51 String c = ZH.substring(0, 1); 52 String nc = c.toLowerCase(); 53 char c1 = nc.charAt(0); 54 //出错返回为1 55 if(s1<6||s1>12) { 56 return 1; 57 } 58 else if(c1<'a'||c1>'z') { 59 return 1; 60 } 61 else if(!ZH.matches(rz)) { 62 return 1; 63 } 64 } 65 //密码格式:不小于八位,由数字或字母组成 66 if(MM!=null) { 67 //正则表达式:字母,数字 68 String rm = "^[a-z0-9A-Z]+$"; 69 int s2 = MM.length(); 70 //出错返回为2 71 if(s2<8) { 72 return 2; 73 } 74 else if(!MM.matches(rm)) { 75 return 2; 76 } 77 } 78 //学号格式:固定八位,全数字,前四位必须为“2018” 79 if(XH!=null) { 80 int s3 = XH.length(); 81 //出错返回3 82 if(s3<8) { 83 return 3; 84 } 85 else { 86 //数字串的正则表达式 87 String rx = "[0-9]*"; 88 String x = XH.substring(0,4); 89 boolean y = x.equals("2018"); 90 if(s3!=8||!y) { 91 return 3; 92 } 93 else if(!XH.matches(rx)) { 94 return 3; 95 } 96 } 97 } 98 //邮箱:标准格式 99 if(YX!=null) { 100 //邮箱格式的正则表达式 101 String regex = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}"; 102 //出错返回4 103 if(!YX.matches(regex)) { 104 return 4; 105 } 106 } 107 return 0; 108 } 109 }
此代码用于执行增加数据操作,同时判断输入格式,返回不同的值,在ExamServlet文件中用i记录返回值,并以此判断是否能成功执行,以及错误时的提示错误信息。
Test.jsp
1 <!--UTF-8:避免中文变成乱码 --> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta charset="UTF-8"> 8 <title>添加学生信息</title> 9 <!-- 设置格式:右对齐 --> 10 <style> 11 .a{ 12 width: 300px; 13 height: 30px; 14 15 } 16 #b{ 17 width: 500px; 18 border: 1px solid red; 19 text-align: right; 20 } 21 </style> 22 </head> 23 <body> 24 <!-- 文本及文本框 --> 25 <div id="b"> 26 <form action="ExamServlet?method=add" method="post" > 27 登录账号:<input type="text"name="username"><br> 28 登录密码:<input type="password"name="password"><br> 29 性别:<select name="sex"> 30 <option value="男">男</option> 31 <option value="女">女</option> 32 </select><br> 33 姓名:<input type="text"name="pname"><br> 34 学号:<input type="text"name="number"><br> 35 电子邮件:<input type="text"name="address"><br> 36 所在学校:<input type="text"name="school"><br> 37 所在系:<input type="text"name="xi"><br> 38 所在班级:<input type="text"name="class"><br> 39 入学年份(届):<input type="text"name="year"><br> 40 生源地:<input type="text"name="home"><br> 41 备注:<input type="text"name="bz"><br> 42 <button type="submit">添加</button> 43 </form> 44 </div> 45 </body> 46 <!-- 输出提示信息 --> 47 <% 48 Object message = request.getAttribute("message"); 49 if(message!=null && !"".equals(message)){ 50 51 %> 52 <script type="text/javascript"> 53 alert("<%=request.getAttribute("message")%>"); 54 </script> 55 <%} %> 56 </html>
此代码用于形成网页。
预览
信息提示:
数据库信息(含第一次添加成功的信息)应用软件:Navicat for MySQL
错误反省:1.创建项目时,导入jar包过程中出现操作失误,导致创建好的项目没有成功连接数据库
2.根据情况返回错误信息:由于我的代码是把提示信息写入ExamServlet文件,再传值,所以需要在Servlet文件中就要确定要传值形式,一开始用i作为标准写if语句,以防万一我将ExamDao中Judge方法复制了过去,所有return语句改为对i的赋值语句,但我并没有考虑到默认值为null的情况,示范的时候为了节省时间,是不会把所有信息都填上的,这就导致了有些为了取子串而定义的String类对象出现异常,同时导致了ExamDao中Judge方法出现错误,最后执行失败。经过多次尝试后,在对要求的信息格式进行判断之前,会先判定该值是否为空,为了使代码看着更加简洁,我在ExamServlet文件中导入Dao包,初始化ExamDao对象后调用Judge方法将返回值赋给i,问题解决。