课程存储校对:程序设计思想、源程序代码、运行结果截图,以及开发过程中的项目计划日志、时间记录日志、缺陷记录日志(PSP0级记录)。
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级记录)。的更多相关文章
- 撰写一篇博客要求讲述四则运算2的设计思想,源程序代码、运行结果截图、编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志。
一.撰写一篇博客要求讲述四则运算2的设计思想,源程序代码.运行结果截图.编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志. 1.设计思想: ①创建test.jsp建立第一个前端界面,提 ...
- 模仿JavaAppArguments.java示例,编写一个程序,此程序从命令行接收多个数 字,求和之后输出结果,写出其的设计思想、程序流程图、源程序代码。
一 设计思想 首先现在file中建立一个类,并把任务名和类名写上(注意类名的大写):第二步则是参数的输入,并且定义求和变量:第三步则是对参数数据类型的要求,要把字符类型转化为整数类型并输出(这也是本道 ...
- erlang虚拟机代码运行原理
erlang是开源的,非常多人都研究过源码.可是.从erlang代码到c代码.这是个不小的跨度.并且代码也比較复杂. 所以这里,我利用一些时间,整理下erlang代码的运行过程.从erlang代码编译 ...
- Hbase集群搭建及所有配置调优参数整理及API代码运行
最近为了方便开发,在自己的虚拟机上搭建了三节点的Hadoop集群与Hbase集群,hadoop集群的搭建与zookeeper集群这里就不再详细说明,原来的笔记中记录过.这里将hbase配置参数进行相应 ...
- 解决“无法连接到Python代码运行助手。请检查本机的设置”问题
廖雪峰老师python课程里有个代码运行助手,可以让你在线输入Python代码,然后通过本机运行的一个Python脚本来执行代码,很方便的一个脚本工具,但是很多人用过之后出现了这样的提示:“无法连接到 ...
- 第十章实践——系统级I/O代码运行
第十章实践——系统级I/O代码运行 实验代码清单如下: 1. cp1——复制一个文件到另一个文件中(两个已经存在的文件) 复制前: 执行后结果 2. setecho.echostate——改变.显示输 ...
- 如何加速MATLAB代码运行
学习笔记 V1.0 2015/4/17 如何加速MATLAB代码运行 概述 本文源于LDPCC的MATLAB代码,即<CCSDS标准的LDPC编译码仿真>.由于代码的问题,在信息位长度很长 ...
- Spark菜鸟学习营Day6 分布式代码运行调试
Spark菜鸟学习营Day6 分布式代码运行调试 作为代码调试,一般会分成两个部分 语法调试,也就是确定能够运行 结果调试,也就是确定程序逻辑的正确 其实这个都离不开运行,所以我们说一下如何让开发的S ...
- 监控代码运行时长 -- StopWatch用法例程
在.net环境下,精确的测量出某段代码运行的时长,在网络通信.串口通信以及异步操作中很有意义.现在做了简单的总结.具体代码如下: (1).首先 using System.Diagnostics; (2 ...
随机推荐
- 如何写 go 代码 (How to Write Go Code 翻译)
目录 1. 写在前面的话 2. 介绍 3. 代码组织 3.1. 工作区 3.2. GOPATH 环境变量 3.3. Package 路径 3.4. 第一个 GO 程序 3.5. 第一个 GO 库 3. ...
- Go学习笔记07-结构体与方法
Go学习笔记07-结构体与方法 Go语言 面向对象 结构的定义与创建 面向对象 Go语言只支持封装,不支持继承和多态. Go语言中只有struct,即结构体:没有class. 结构的定义与创建 pac ...
- 13.scrapy框架的日志等级和请求传参
今日概要 日志等级 请求传参 如何提高scrapy的爬取效率 今日详情 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是s ...
- Linux /var/log下的各种日志文件详解
1)/var/log/secure:记录登录系统存取数据的文件;例如:pop3,ssh,telnet,ftp等都会记录在此. 2)/var/log/wtmp:记录登录这的信息记录,被编码过,所以必须以 ...
- 单页应用 - Token 验证
单页应用 - Token 验证 转:https://juejin.im/post/58da720b570c350058ecd40f 第一次接触单页应用,记录公司项目关于Token验证知识. Token ...
- WinForm下的loading框的实现
前言:在项目使用C/S模式情况下,由于需要经常进行数据的刷新,如果直接进行刷新,会有一个等待控件重画的过程,非常的不友好,因此在这里添加一个loading框进行等待显示. 实现:在经过多方面查询资料, ...
- 【CQOI2006】凸多边形
1713 -- [CQOI2006]凸多边形 Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input ...
- 使用chrome远程调试设备及调试模拟器设备
使用chrome开发工具远程在Android上远程调试 准备工作 开始远程调试之前,需要做好如下准备: 在你电脑上安装Chrome 32 或者更新的版本 一根连接Android设备的USB线 手机系统 ...
- Spring将Bean导入IOC容器
@Import 注解可以普通类导入到 IoC容器中. 想要让一个普通类接受 Spring 容器管理,有以下方法 使用 @Bean 注解 使用 @Controller @Service @Reposit ...
- UVA10410-Tree Reconstruction(BFS序和DFS序的性质)
Problem UVA10410-Tree Reconstruction Accept:708 Submit:4330 Time Limit: 3000 mSec Problem Descripti ...