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与==判等的重要区别,知道了如果不符合条件怎么通过界面提示用户和怎么不再继续运行而跳转到键入信息的初始页面。还有我觉得我不足的地方,空字符串的判别只是一律的提醒不能为空,而不能做到哪个不输入提示哪个不能为空;还有提示的位置没有调换到对应输入框的后边,这样更加符合用户需求;还有就是如果出现输入的字符串与限定的字符串要求不匹配的话,我设计的只是跳转到原界面重新输入,我在想能不能把这个写到异常处理类中,出现错误则抛出异常,并通过跳转到新的界面用字符串的形式提示用户异常为什么。

课程存储校对:程序设计思想、源程序代码、运行结果截图,以及开发过程中的项目计划日志、时间记录日志、缺陷记录日志(PSP0级记录)。的更多相关文章

  1. 撰写一篇博客要求讲述四则运算2的设计思想,源程序代码、运行结果截图、编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志。

    一.撰写一篇博客要求讲述四则运算2的设计思想,源程序代码.运行结果截图.编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志. 1.设计思想: ①创建test.jsp建立第一个前端界面,提 ...

  2. 模仿JavaAppArguments.java示例,编写一个程序,此程序从命令行接收多个数 字,求和之后输出结果,写出其的设计思想、程序流程图、源程序代码。

    一 设计思想 首先现在file中建立一个类,并把任务名和类名写上(注意类名的大写):第二步则是参数的输入,并且定义求和变量:第三步则是对参数数据类型的要求,要把字符类型转化为整数类型并输出(这也是本道 ...

  3. erlang虚拟机代码运行原理

    erlang是开源的,非常多人都研究过源码.可是.从erlang代码到c代码.这是个不小的跨度.并且代码也比較复杂. 所以这里,我利用一些时间,整理下erlang代码的运行过程.从erlang代码编译 ...

  4. Hbase集群搭建及所有配置调优参数整理及API代码运行

    最近为了方便开发,在自己的虚拟机上搭建了三节点的Hadoop集群与Hbase集群,hadoop集群的搭建与zookeeper集群这里就不再详细说明,原来的笔记中记录过.这里将hbase配置参数进行相应 ...

  5. 解决“无法连接到Python代码运行助手。请检查本机的设置”问题

    廖雪峰老师python课程里有个代码运行助手,可以让你在线输入Python代码,然后通过本机运行的一个Python脚本来执行代码,很方便的一个脚本工具,但是很多人用过之后出现了这样的提示:“无法连接到 ...

  6. 第十章实践——系统级I/O代码运行

    第十章实践——系统级I/O代码运行 实验代码清单如下: 1. cp1——复制一个文件到另一个文件中(两个已经存在的文件) 复制前: 执行后结果 2. setecho.echostate——改变.显示输 ...

  7. 如何加速MATLAB代码运行

    学习笔记 V1.0 2015/4/17 如何加速MATLAB代码运行 概述 本文源于LDPCC的MATLAB代码,即<CCSDS标准的LDPC编译码仿真>.由于代码的问题,在信息位长度很长 ...

  8. Spark菜鸟学习营Day6 分布式代码运行调试

    Spark菜鸟学习营Day6 分布式代码运行调试 作为代码调试,一般会分成两个部分 语法调试,也就是确定能够运行 结果调试,也就是确定程序逻辑的正确 其实这个都离不开运行,所以我们说一下如何让开发的S ...

  9. 监控代码运行时长 -- StopWatch用法例程

    在.net环境下,精确的测量出某段代码运行的时长,在网络通信.串口通信以及异步操作中很有意义.现在做了简单的总结.具体代码如下: (1).首先 using System.Diagnostics; (2 ...

随机推荐

  1. 【Git学习一】Git 初始化

    在开始Git之旅之前,我们需要设置一下Git的配置变量. 1.告诉Git当前用户的姓名和邮件地址,配置用户名和邮件地址将在版本库提交时用到. 例子: ------------------------- ...

  2. shell重定向介绍及使用

    我们在写脚本或用脚本时,往往会发现 > /dev/null 2>&1 这类的命令.之前都是简单的了解一下,并没有深度消化,直到自己写脚本时,不认真写成了2>&1 &g ...

  3. LeetCode算法题-Linked List Cycle(Java实现)

    这是悦乐书的第176次更新,第178篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第35题(顺位题号是141).给定一个链表,确定它是否有一个循环. 本次解题使用的开发工 ...

  4. echarts修改上下左右的边距

    grid: {                top: '4%',                left: '3%',                right: '4%',            ...

  5. HTML做的网页 如何使当前页面跳转到另一页面锚点处

    当前页面a.html另一页面b.html当前页面: <a href="b.html#aaa">跳转到b页面aaa处</a>另一页面:<a name=& ...

  6. E - Intervals 贪心

    Chiaki has n intervals and the i-th of them is [li, ri]. She wants to delete some intervals so that ...

  7. 15.selenium_case03

    # 利用搜狗搜索接口抓取微信公众号 # 搜狗的微信搜索: # http://weixin.sogou.com # 搜索:“Python爱好者社区” # 找到它的微信号:python_shequ fro ...

  8. UVA1607-Gates(思维+二分)

    Problem UVA1607-Gates Accept: 111  Submit: 767Time Limit: 3000 mSec Problem Description Input The fi ...

  9. 配置DispatcherServlet应该写/还是/*

    相亲怎么做 web应用需要放在Tomcat容器中才能启动,Tomcat容器内有一个默认的web.xml文件,在自己项目中配置的XML文件都是继承自Tomcat中的全局XML文件并重写其中相应配置,这种 ...

  10. tar只解压tar包中某个文件

    如果tar包很大,而只想解压出其中某个文件.方法如下: 只想解压出Redis-1.972.tar  中的Changes文件,来查看有哪些更改. [root@uplooking]# tar -tf Re ...