前言:

1 该程序使用动态web项目

2 该程序使用SQL server需导入对应包( 具体可看前篇----JDBC的使用)

3 三层架构思想:

  ①表示层

      前台:jsp/html等 作为前台与用户交互

      后台:用于控制跳转,调用业务逻辑层

  ②业务逻辑层

      将数据访问层进行组装

      给表示层调用

  ③数据访问层

      所有小功能和函数建立

      与数据库相连 以dao命名

4 该程序体现面向接口开发:先接口-再实现类(此为规范!!)

  当实体类需要实例时

    运用:接口=new 实例

  service、dao加入接口

  命名规范:

    接口:IXXX    例:IStudentDao

    实现类:XXXImpl   例:StudentDaoImpl

5 DBUtil作为通用数据库工具类,实现通用调用数据库方法

6 该程序使用tomcat8.5

以下是示例目录

以下是代码实例

IStudentDao(作为dao的接口 将方法写出但不做声明)

package dao;

import java.util.List;

import entity.Student;

public interface IStudentDao {
public boolean isExist(int sno);
public boolean AddStudent(Student student);
public List<Student> queryAll();
public boolean updateStudentBySno(int sno,Student student);
public Student queryStudentBysno(int sno);
public boolean deleteStudentBySno(int sno);
}

StudentDaoImpl(实现接口方法-增、删、改、查单人/查所有)

##用DBUtil封装方法 达到减少代码量目的

package daoImpl;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import dao.IStudentDao;
import entity.Student;
import util.DBUtil; /*
* 数据访问层
* 与数据库交互
*/
public class StudentDaoImpl implements IStudentDao {
/*
* 判断学号是否存在
* 返回学号是否存在
*/
public boolean isExist(int sno) {
return queryStudentBysno(sno)==null?false:true;
} /*
* 增加学生信息
* 返回是否成功
*/
public boolean AddStudent(Student student) {
String sql="insert into student values(?,?,?,?)";
Object[] params= {student.getSno(),student.getSname(),student.getAge(),student.getAge(),student.getAddress()};
return DBUtil.executeUpdate(sql, params);
}
/*
* 根据学号删人
* 返回是否成功
*/
public boolean deleteStudentBySno(int sno) {
String sql="delete student where sno=?";
Object[] params= {sno};
return DBUtil.executeUpdate(sql, params);
}
/*
* 根据学号sno修改数据student
* 返回是否成功
*/
public boolean updateStudentBySno(int sno,Student student) {
String sql="update student set sname=?,sage=?,saddress=? where sno=?";
Object[] params= {student.getSname(),student.getAge(),student.getAddress(),sno};
return DBUtil.executeUpdate(sql, params);
}
/*
* 查询全部学生
* 返回学生集合
*/
public List<Student> queryAll() {
Student student=null;
PreparedStatement pst =null;
ResultSet rs =null;
List<Student> students=new ArrayList<Student>();
try {
String sql="select * from student";
rs = DBUtil.executeQuery(sql, null);
while(rs.next()) {
int no=rs.getInt("sno");
String name=rs.getString("sname");
int age=rs.getInt("sage");
String address=rs.getString("saddress");
student=new Student(no,name,age,address);
students.add(student);
}
return students;
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally {
try {
if(rs!=null) rs.close();
if(pst!=null) pst.close();
if(DBUtil.connection!=null) DBUtil.connection.close();
}
catch (SQLException e) {
e.printStackTrace();
}
} }
/*
* 根据学号查询学生
* 返回查询学生类
*/
public Student queryStudentBysno(int sno) {
Student student=null;
PreparedStatement pst =null;
ResultSet rs =null;
try {
String sql="select * from student where sno=?";
Object params[]= {sno};
rs = DBUtil.executeQuery(sql, params);
if(rs.next()) {
int no=rs.getInt("sno");
String name=rs.getString("sname");
int age=rs.getInt("sage");
String address=rs.getString("saddress");
student=new Student(no,name,age,address);
}
return student;
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally {
DBUtil.closeAll(rs, pst, DBUtil.connection);
}
}
}

DBUtil减少代码冗余-并实现 数据库通用工具类思想

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; //通用的数据库操作方法
public class DBUtil {
//sql数据库连接字符串
private static final String URL="jdbc:sqlserver://localhost:1433;databasename=javatest";
//sql用户名 和密码 用作连接用
private static final String USERNAME="sa";
private static final String PWD="cc123nice"; public static Connection connection=null;
public static PreparedStatement pst =null;
public static ResultSet rs =null; /*
* 得到PreparedStatement减少代码冗余
*/
public static PreparedStatement getPreparedStatement(String sql,Object[] params) {
//导入驱动,加载具体驱动类
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//与数据库建立链接
connection = DriverManager.getConnection(URL, USERNAME, PWD);
pst=connection.prepareStatement(sql);
if(params!=null) {
for(int i=0;i<params.length;i++){
pst.setObject(i+1,params[i]);
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return pst;
}
/*
* 最后关闭所有
*/
public static void closeAll(ResultSet rs,Statement stmt,Connection connection) {
try {
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();
if(connection!=null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/*
* 通用的增删改 通过传入的sql和obj数组确认语句
*/
public static boolean executeUpdate(String sql,Object[] params) {
try {
int count = getPreparedStatement(sql,params).executeUpdate();
if(count>0)
return true;
else
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}finally {
closeAll(null, pst, connection);
}
}
/*
* 通用的查询(只能返回到ResultSet)之后必须与具体类型耦合
*/
public static ResultSet executeQuery(String sql,Object[] params) {
try {
rs= getPreparedStatement(sql,params).executeQuery();
return rs;
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

IStudentService(作为service的接口 将方法写出但不做声明)

package service;

import java.util.List;

import entity.Student;

public interface IStudentService {
public boolean addStudent(Student student);
//删
public boolean deleteStudentBySno(int sno);
//改
public boolean updateStudentBySno(int sno,Student student);
//根据学号查
public Student queryStudentBysno(int sno) ;
//查询所有
public List<Student> queryAll();
}

StudentServiceImpl实现接口IStudentService方法实现

主要对dao实例内的方法进行封装

package serviceImpl;

import java.util.List;

import dao.IStudentDao;
import daoImpl.StudentDaoImpl;
import entity.Student;
import service.IStudentService; /*
* 业务逻辑层 对dao层进行组装 逻辑性增删改查(增删改==查+操作)
*/
public class StudentServiceImpl implements IStudentService{
IStudentDao std=new StudentDaoImpl();
//增
public boolean addStudent(Student student) {
if(!std.isExist(student.getSno())){
return std.AddStudent(student);
}else
return false;
}
//删
public boolean deleteStudentBySno(int sno) {
if(std.isExist(sno)){
return std.deleteStudentBySno(sno);
}else
return false;
}
//改
public boolean updateStudentBySno(int sno,Student student) {
if(std.isExist(sno)){
return std.updateStudentBySno(sno, student);
}else
return false;
}
//根据学号查
public Student queryStudentBysno(int sno) {
return std.queryStudentBysno(sno);
}
//查询所有
public List<Student> queryAll(){
return std.queryAll();
}
}

MyServerlet包中存放对各个方法的servlet(实现1对1的情况)将表示层的信息处理、向下-处理层传递/向上-表示层传递

AddServlet实现‘增加’的表示层后台

package MyServerlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import entity.Student;
import service.IStudentService;
import serviceImpl.StudentServiceImpl; /*
* serverlet--增加
*/
@WebServlet("/AddServerlet")
public class AddServlet extends HttpServlet {
private static final long serialVersionUID = 1204432039484958110L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
int sno =Integer.parseInt( request.getParameter("sno"));
String name = request.getParameter("sname");
int age = Integer.parseInt(request.getParameter("sage"));
String address = request.getParameter("saddress"); Student student =new Student(sno,name,age,address);
IStudentService studentService = new StudentServiceImpl();
boolean res = studentService.addStudent(student);
request.setCharacterEncoding("utf-8");
//给request增加标识符
if(!res)
request.setAttribute("res", "增加失败");
else
request.setAttribute("res", "增加成功");
}catch(Exception e){
request.setAttribute("res", "数据有误增加失败");
}
request.getRequestDispatcher("QueryAllServlet").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

DeleteServlet实现‘删除’的表示层后台

package MyServerlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import service.IStudentService;
import serviceImpl.StudentServiceImpl; @WebServlet("/DeleteServerlet")
public class DeleteServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接受学号
int sno = Integer.parseInt(request.getParameter("sno"));
IStudentService service = new StudentServiceImpl();
boolean res = service.deleteStudentBySno(sno);
response.setContentType("text/html; charset=utf-8");
if(!res)
request.setAttribute("res", "删除失败");
else
request.setAttribute("res", "删除成功"); request.getRequestDispatcher("QueryAllServlet").forward(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} }

QueryAllServlet实现‘查找所有’的表示层后台

package MyServerlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import service.IStudentService;
import serviceImpl.StudentServiceImpl; @WebServlet("/DeleteServerlet")
public class DeleteServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接受学号
int sno = Integer.parseInt(request.getParameter("sno"));
IStudentService service = new StudentServiceImpl();
boolean res = service.deleteStudentBySno(sno);
response.setContentType("text/html; charset=utf-8");
if(!res)
request.setAttribute("res", "删除失败");
else
request.setAttribute("res", "删除成功"); request.getRequestDispatcher("QueryAllServlet").forward(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} }

QuerySnoServlet实现‘通过学号查找’的表示层后台

此处重定向到studentinfo.jsp 以下进行解析

package MyServerlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import entity.Student;
import service.IStudentService;
import serviceImpl.StudentServiceImpl; @WebServlet("/QuerySnoServerlet")
public class QuerySnoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int no = Integer.parseInt(request.getParameter("sno"));
IStudentService service = new StudentServiceImpl();
Student student = service.queryStudentBysno(no);
request.setAttribute("student", student);
request.getRequestDispatcher("studentinfo.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} }

UpdateServlet实现‘修改’的表示层后台

package MyServerlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import entity.Student;
import service.IStudentService;
import serviceImpl.StudentServiceImpl; @WebServlet("/UpdateServlet")
public class UpdateServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理获取数据编码
request.setCharacterEncoding("utf-8");
//获取待修改学生的学号
int no = Integer.parseInt(request.getParameter("sno"));
//修改后内容
String name = request.getParameter("sname");
int age = Integer.parseInt(request.getParameter("sage"));
String address = request.getParameter("saddress");
Student student=new Student(name,age,address);
IStudentService service = new StudentServiceImpl();
boolean res = service.updateStudentBySno(no, student);
//处理相应编码
response.setContentType("text/html; charset=utf-8");
if(!res)
request.setAttribute("res", "修改失败");
else
request.setAttribute("res", "修改成功"); request.getRequestDispatcher("QueryAllServlet").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} }

以下为表示层前台

add.jsp增加学生信息表单

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>新增用户信息</title>
</head>
<body>
<form action="AddServerlet">
学号:<input type="text" name="sno"/><br/>
姓名:<input type="text" name="sname"/><br/>
年龄:<input type="text" name="sage"/><br/>
地址:<input type="text" name="saddress"/><br/>
<input type="submit" value="新增"/><br/>
</form>
</body>
</html>

index.jsp 以表单显示所有学生基本信息

  实现学号超链接更多信息

  实现新增信息

  实现删除信息

<%@page import="entity.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>学生信息列表</title>
</head>
<body>
<%
String res=(String)request.getAttribute("res");
if(res!=null){
out.print(res);
}
%>
<!-- 设置表格边框 -->
<table border="1PX"> <!-- 设置标题 -->
<tr>
<th>学号</th>
<th>姓名</th>
<th>年龄</th>
<th>操作</th>
</tr>
<%
//获取request域中的数据
List<Student> students=( List<Student> ) request.getAttribute("students");
for(Student student:students){
%>
<tr>
<td><a href="QuerySnoServerlet?sno=<%=student.getSno() %>"><%=student.getSno() %></a></td>
<td><%=student.getSname() %></td>
<td><%=student.getAge() %></td>
<td><a href="DeleteServerlet?sno=<%=student.getSno() %>">删除</a></td>
</tr>
<%
}
%>
</table>
<a href="add.jsp">增加</a>
</body>
</html>

studentinfo.jsp 以表单形式显示具体信息

  可以直接填写表单进行修改

<%@page import="entity.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
Student student=(Student)request.getAttribute("student");
%>
<!-- 表单显示信息 -->
<form action="UpdateServlet">
学号:<input type="text" name="sno" value=<%=student.getSno() %>><br>
姓名:<input type="text" name="sname" value=<%=student.getSname() %>><br>
年龄:<input type="text" name="sage" value=<%=student.getAge() %>><br>
地址:<input type="text" name="saddress" value=<%=student.getAddress() %>><br>
<input type="submit" value="修改">
</form>
<a href="QueryAllServlet">返回</a> </body>
</html>

成品示例(需要链接中不显示具体信息,再提交表单处增加 method='post')

进入界面显示所有学生信息

点击学号1查看具体信息

直接修改数据

点击增加可直接增加数据

新增后跳转回显示全部基本信息

点击删除后直接删除行列

JavaWeb -学生信息管理实践(JDBC+web+三层架构+DBUtil构造思路)的更多相关文章

  1. Django——WEB三层架构与MVC

    而我发此文的目的有二:一者,让初学者能够听到一家之言,是为解惑:二者,更希望抛砖引玉,得到专家的批判. 许多学生经常问我,MVC到底和WEB三层架构有啥关系? 开始时,我也只能给他们一些模糊的回答.时 ...

  2. WEB三层架构与MVC

    web三层架构是指: >用户接口层(UI Layer) >业务逻辑层(Bussiness Layer) >持久化层 关于业务逻辑和用户接口 在早期的web开发中,因为业务比较简单,并 ...

  3. 简单的web三层架构系统【第二版】

    昨天写了 web三层架构的第一版,准确的说是三层架构的前期,顶多算是个二层架构,要慢慢完善. 第一版里,程序虽说能运行起来,但是有一个缺陷,就是里面的SQL语句,是使用的拼接字符进行执行.这样安全系数 ...

  4. 关于WEB三层架构的思考

    1.MVC设计思想 MVC程序设计思想是眼下比較流行的WEB开发的模式,当中,M(model)是模型.即JavaBean,用来封装和保存数据:V(view)是视图,即JSP.用来显示内容:C(cont ...

  5. Java Web 三层架构详解

    java 三层架构ssh 一个spring2.5+hibernate3.2+struts2.0组合框架,使用spring的 IoC来管理应用的 所有bean,包括struts2的 action,充分发 ...

  6. 简单的web三层架构系统【第五版】

    接上一版,今天差不多就是三层架构后台代码的完结了,这一版写完,接下来就是前台的制作了,前台不太熟悉,还在深入学习.过一段时间在写,今天先把后台代码写完. 三层架构包括DAL层, BLL层, UI层(也 ...

  7. 简单的web三层架构系统【第三版】

    今天是第三版,和前几天一样今天还是要对代码进行优化,三层架构是一种思想,具体能不能使得整个系统安全和高性能,还是要看代码编写的是否合理,逻辑性是否严谨. 昨天偶然间看到别人写的三层架构中,竟然没有在方 ...

  8. 转:从web三层架构解析软件测试内容

    B/S架构的系统,都会使用如下的基础软件架构: 数据访问层:实现对数据的访问功能,如增加.删除.修改.查询数据. 业务逻辑层:实现业务的具体逻辑功能,如学生入学.退学.成绩管理等. 页面显示层:将业务 ...

  9. 简单的web三层架构系统【第四版】

    上一次写了第三版, 因为之前无意之间看到一段视频,说是把系统中所有的SQL语句都做成存储过程.可以在很大程度上优化系统的SQL执行速度.所以百度了一下细节问题,之后我把所有的SQL语句,都做成了存储过 ...

随机推荐

  1. vue-cli启动本地服务,局域网下通过ip访问不到的原因

    1.问题描述: 新开发了一个vue-cli项目,想通过手机查看效果,发现访问不到,ip地址和端口号都没错但是手机访问不到,在本机电脑浏览器输入ip端口号一样访问不到,只能通过localhost:808 ...

  2. PAT 1065 单身狗(25)(STL-map+思路+测试点分析)

    1065 单身狗(25 分) "单身狗"是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数 N(≤  ...

  3. PAT 1064 朋友数(20)(代码)

    1064 朋友数(20 分) 如果两个整数各位数字的和是一样的,则被称为是"朋友数",而那个公共的和就是它们的"朋友证号".例如 123 和 51 就是朋友数, ...

  4. 用AI制作炫酷效果

    PART1:制作第一个效果 步骤一:新建一个800*600的画布. 骤二:从工具栏选“矩形工具”,创建一个800*600的矩形.白色的是画布,浅红色(我的AI之前保留的填充颜色,每个人都不一样)的是你 ...

  5. windows驱动

    DriveEntry() 启动 停止 接口函数 驱动程序名 驱动程序版本号 异常处理 是否运行 声明LPOReceive类型的函数 声明函数指针(外部传进来的回调函数) 存放配置字符串 本机IP 串口 ...

  6. Easyui form 处理 Laravel 返回的 Json 数据

    默认地,Easyui Form 请求的格式是 Html/Text,如果服务端 Laravel 返回的数据是 Json 格式,则应当在客户端进行解析.以下是 Easyui 官方文档的说明: Handle ...

  7. [Selenium]验证点了某个Button之后无反应

    期望:点了某个Button,无反应 问题:怎么去验证无反应 WebElement webElement = page.getICORemove(); SeleniumUtil.hover(page.g ...

  8. 什么是tcp协议?

    这是世界上最顶尖的tcp讲解技术...

  9. linq group by / distinct

    https://www.cnblogs.com/qixu/p/6033532.html http://www.cnblogs.com/A_ming/archive/2013/05/24/3097062 ...

  10. java--多线程编程简介

    1.什么时候使用多线程编程 一个任务在正常情况下是按顺序执行的,但是如果当前任务里有多个相似进程块(例如for,while语句),我们就可以考虑把这些代码块抽出来并行运行,无需阻塞 2.实现多线程的几 ...