1.程序设计思想
⑴将JDBC驱动jar包导入到WEB-INF的lib文件夹下
⑵建立数据库,在数据库中建表,分别将课程名称、任课教师及上课地点录入到列中
⑶首先写出加载驱动、关闭资源的工具类和异常处理类,然后再写出课程信息模型类、对课程信息进行操作的接口及实现接口的方法类
⑷.java文件建立好之后,用jsp写做信息录入界面和信息核对的反馈界面,另外接收任课教师信息的字符串要用.equals方法判别是否属于5个限定的教师之中,接收上课地点的字符串要用substring()或者startwith()方法判别该字符串是否以限定的四个教学楼名称开头,然后设置提示信息并跳转回信息录入界面重新输入。
⑸对于录入的数据由于是汉字,还涉及到一个编码不匹配的问题,需要设计一个过滤器类,并对web.xml进行相应的修改,将用户发送的所有请求先通过此过滤器过滤,本程序中也就是将编码集改为UTF-8,从而使录入的汉字能在数据库中正确显示。
2.源程序代码
1.工具类
package Util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DBUtil { public static Connection getConnection() { try { //加载驱动 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance(); System.out.println("驱动加载成功!"); } catch(ClassNotFoundException | InstantiationException | IllegalAccessException e) { System.out.println("驱动加载失败!"); e.printStackTrace(); } String user="sa"; String password="woshizcy0919"; String url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Class_DB"; Connection connection=null; try { //创建链接对象connection connection=DriverManager.getConnection(url, user, password); System.out.println("数据库连接成功!"); } catch(SQLException e) { System.out.println("数据库连接失败!"); e.printStackTrace(); } return connection; } //关闭资源的方法 public static void close(Connection connection) { if(connection!=null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(PreparedStatement preparedStatement) { if(preparedStatement !=null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(ResultSet resultSet) { if(resultSet!=null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
2.异常处理类
package Util; public class ClassModelException extends RuntimeException { public ClassModelException() { super(); // TODO Auto-generated constructor stub } public ClassModelException(String arg0, Throwable arg1, boolean arg2, boolean arg3) { super(arg0, arg1, arg2, arg3); // TODO Auto-generated constructor stub } public ClassModelException(String arg0, Throwable arg1) { super(arg0, arg1); // TODO Auto-generated constructor stub } public ClassModelException(String arg0) { super(arg0); // TODO Auto-generated constructor stub } public ClassModelException(Throwable arg0) { super(arg0); // TODO Auto-generated constructor stub } }
3.模型类
package model; public class ClassModel { private String classname; private String teacher; private String place; public String getClassname() { return classname; } public void setClassname(String classname) { this.classname = classname; } public String getTeacher() { return teacher; } public void setTeacher(String teacher) { this.teacher = teacher; } public String getPlace() { return place; } public void setPlace(String place) { this.place = place; } }
4.对课程信息操作的接口
package dao; import model.ClassModel; public interface IClassModelDao { public void add(ClassModel classmodel); }
5.实现接口的方法
package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import Util.ClassModelException; import Util.DBUtil; import model.ClassModel; public class ClassModelDaoImpl implements IClassModelDao { public void add(ClassModel classmodel) { //获得连接的对象 Connection connection=DBUtil.getConnection(); //准备sql语句 String sql="select count(*) from t_classmodel where classname=?"; //创建语句传输对象 PreparedStatement preparedStatement=null; ResultSet resultSet=null; try { preparedStatement=connection.prepareStatement(sql); preparedStatement.setString(1, classmodel.getClassname()); //接收结果集 resultSet=preparedStatement.executeQuery(); //遍历结果集 while(resultSet.next()) { if(resultSet.getInt(1)>0) { throw new ClassModelException("该课程已存在!"); } } sql="insert into t_classmodel(classname,teacher,place) values(?,?,?)"; preparedStatement=connection.prepareStatement(sql); preparedStatement.setString(1, classmodel.getClassname()); preparedStatement.setString(2, classmodel.getTeacher()); preparedStatement.setString(3, classmodel.getPlace()); preparedStatement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { //关闭JDBC对象 DBUtil.close(resultSet); DBUtil.close(preparedStatement); DBUtil.close(connection); } } }
6.过滤器类
package filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class CharFilter implements Filter { String encoding = null; @Override public void init(FilterConfig filterConfig) throws ServletException { encoding = filterConfig.getInitParameter("encoding"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { //request.setCharacterEncoding("utf-8"); request.setCharacterEncoding(encoding); System.out.println(encoding); chain.doFilter(request, response); } @Override public void destroy() { // TODO Auto-generated method stub } }
7.web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>Class_Message</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> <filter> <filter-name>CharFilter</filter-name> <filter-class>filter.CharFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
8.课程信息录入界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>课程信息录入</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <%=request.getAttribute("error") %> <form action="SaveCheck.jsp" method="post"> <table align="center" border="1" width="500"> <tr> <td>课程名称:</td> <td> <input type="text" name="classname"/> </td> </tr> <tr> <td>任课教师:</td> <td> <input type="text" name="teacher"> </td> </tr> <tr> <td>上课地点:</td> <td> <input type="text" name="place"> </td> </tr> <tr align="center"> <td colspan="2"> <input type="submit" value="保存"/> </td> </tr> </table> </form> </body> </html>
9.课程信息核对的方法及返回界面
<%@page import="Util.ClassModelException"%> <%@page import="dao.ClassModelDaoImpl"%> <%@page import="model.ClassModel"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>课程信息验证</title> </head> <body> <% //接收客户端传递过来的参数 String classname = request.getParameter("classname"); String teacher = request.getParameter("teacher"); String place = request.getParameter("place"); if(classname == null || "".equals(classname.trim())||teacher == null || "".equals(teacher.trim())||place == null || "".equals(place.trim())) { request.setAttribute("error", "所有信息均不能为空!"); %> <jsp:forward page="Save.jsp"></jsp:forward> <% } %> <% if(!(teacher.equals("王建民")||teacher.equals("刘立嘉")||teacher.equals("刘丹")||teacher.equals("王辉")||teacher.equals("杨子光"))) { request.setAttribute("error", "任课教师输入错误,请重新输入!"); %> <jsp:forward page="Save.jsp"></jsp:forward> <% } %> <% System.out.println(place.substring(0,2)); if(!place.substring(0,2).equals("基教")&&!place.substring(0,2).equals("一教")&&!place.substring(0,2).equals("二教")&&!place.substring(0,2).equals("三教")) {//用.equals判断字符串内容是否相等,而==是比较两个字符串是否引用同一个字符串变量 request.setAttribute("error", "上课地点输入错误,请重新输入!"); %> <jsp:forward page="Save.jsp"></jsp:forward> <% } %> <% ClassModel classmodel = new ClassModel(); classmodel.setClassname(classname); classmodel.setTeacher(teacher); classmodel.setPlace(place); ClassModelDaoImpl classModelDaoImpl = new ClassModelDaoImpl(); try{ classModelDaoImpl.add(classmodel); %> 课程保存成功!<br> <a href="Save.jsp">返回</a><br> <% }catch(ClassModelException e){ %> <h2 style="color:red ; font-size:50px">发生错误 : <%=e.getMessage() %></h2> <% } %> </body> </html>
3.运行结果截图
(1)正确输入界面及结果
(2)任课教师输入错误及结果
(3)上课地点输入错误及结果
4.项目计划日志
(1)整体计划时间:120分钟
阶段计划时间:.java程序——45分钟,.jsp程序——50分钟,建表和导包——5分钟
(2)整体完成时间:155分钟
阶段完成时间:.java程序——65分钟,.jsp程序——65分钟,建表和导包——5分钟
(3)注入缺陷数量:3个
排除缺陷数量:3个
5.时间记录日志
开始时间:11月28日 9:05
结束时间:11月28日 17:40
中断时间:11月28日 9:50~15:50
净时间:155分钟
备注(中断原因):上午3.4数据结构上机课、中午吃饭、午休、下午3点导员开会
6.缺陷记录日志
1.form表单的提交方法开始用的是get,这个会把用户输入的信息显示到地址栏上,不安全,应改为post
2.输入数据库开始的时候中文信息直接存到数据库会乱码,应设计一个过滤器类,并对web.xml进行相应修改,达到用户发送的请求都能被UTF-8编码集提前过滤,保证输入数据库的数据不乱码
3.开始用==方法对输入的字符串与限定字符串判定,结果总是不相等,这是由于用.equals判断字符串内容是否相等,而==是比较两个字符串是否引用同一个字符串对象,这是.equals与==方法判定字符串的重要区别,所以应改为.equals方法判等
7.总结
这次软件工程概论课堂测试相对比较基础,只是做一个简单的保存课程信息的界面并存到数据库中,存放之前对各类输入的字符串进行条件判别,如果符合条件才录入数据库,如果不符合条件需要有提示语句,并跳转到信息录入的界面让用户重新输入,这就涉及到两个问题,一个是编码集之间的转化出现乱码,让我学会了用过滤器类来提前对用户发送的每一条请求都过滤为UTF-8编码集,以此解决了中文乱码问题;另外一个就是对接收的用户字符串进行条件判别,让我巩固了.equals与==判等的重要区别,知道了如果不符合条件怎么通过界面提示用户和怎么不再继续运行而跳转到键入信息的初始页面。还有我觉得我不足的地方,空字符串的判别只是一律的提醒不能为空,而不能做到哪个不输入提示哪个不能为空;还有提示的位置没有调换到对应输入框的后边,这样更加符合用户需求;还有就是如果出现输入的字符串与限定的字符串要求不匹配的话,我设计的只是跳转到原界面重新输入,我在想能不能把这个写到异常处理类中,出现错误则抛出异常,并通过跳转到新的界面用字符串的形式提示用户异常为什么。