Web基础之Servlet+JDBC+JSP项目实战终结篇

来源:互联网 发布:hp1005扫描软件下载 编辑:程序博客网 时间:2024/05/19 21:40

Web基础之Servlet+JDBC+JSP项目实战终结篇

一、项目说明:
通过前面的实战,我们已经通过Servlet+JDBC+JSP实现了新增班级信息以及显示班级信息的功能、查看班级学生信息、为班级新增学生信息,学生充值、学生消费、学生充值流水以及消费流水的查询等功能;同时,我们也通过反射对其中的DAO层进行了优化,接下来,我们将再新增加两个实用也是日常中常见的功能来完结我们的项目;

二、新增需求:

批量新增学生信息功能
数据的分页显示功能

三、项目思路分析:
批量新增学生信息功能:
1、修改新增学生页面,增加批量新增学生的按钮;点击按钮跳转到批量新增学生页面;
2、点击该页面的+号或者-号按钮,可以新增加一行或者减少一行学生信息的表格(JS实现)
3、点击提交,Servlet端批量接收学生信息;并封装学生信息;
4、调用dao层数据库操作,批量插入学生信息;

数据分页功能:(分页显示班级信息)
1、新建pageclassInfo.jsp前端页面
2、当点击分页显示所有班级的时候,默认每页显示5条数据,按照升序排列
3、当选择每页的页面或这排序规则改变时,利用JS发起请求
4、请求交给ClassInfoServlet处理,通过获取每页该显示多少条数据以及排序规则,然后该servlet中的dao层计算总共有多少条数据,要分几页显示;将查询到的结果封装到新的bean中;保存查询结果;
5、前台页面显示



四、项目运行效果:

4、1:批量新增:




页面对应的前台JSP页面代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ page import="java.util.List"%><%@ page import="com.huaxin.bean.StudentInfoBean"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>新增学生信息页面</title><style type="text/css">tr {text-align: center;}</style></head><body><div style="margin: 0 auto; margin-top: 40px;"><form action="addStuInfoReq?reqType=ADD_STU_INFO" method="POST"><center><table width="40%" border="1" bgcolor="#FFFFC6"><caption style="margin-bottom: 20px">新增学生信息</caption><tr><td>学生姓名:</td><td><input type="text" name="stuSname"></td></tr><tr><td>学生性别:</td><td><select name="stuSsex"><option>男</option><option>女</option></select></td></tr><tr><td>学生年龄:</td><td><input type="text" name="stuSage"> <inputtype="hidden" name="classId"value="<%=request.getParameter("cid")%>"></td></tr><tr><td><input type="reset" value="重置"></td><td><input type="submit" value="确定"></td></tr></table></center></form></div><div style="margin-top:30px;margin-left: auto;margin-right: auto;text-align: right"><formaction="addStuInfoReq?reqType=BATCH_ADD_STU_INFO&cid=<%=request.getParameter("cid")%>"method="POST"><center><table width="40%" border="0"><tr><td><input type="submit" value="批量新增学生"></td></tr></table></center></form></div><div style="margin: 0 auto; margin-top: 40px;"><center><table width="80%" border="1" bgcolor="#FFFFC6"><caption style="margin-bottom: 20px">学生信息列表</caption><tr><th>所属班级</th><th>学生学号</th><th>学生姓名</th><th>学生性别</th><th>学生年龄</th><th>余额</th><th>  操作类型  </th></tr><%List<StudentInfoBean> stuInfo=(List<StudentInfoBean>)request.getAttribute("allStudentInfo");for(StudentInfoBean stu: stuInfo){%><tr><td><%=stu.getCid()%></td><td><%=stu.getSno()%></td><td><%=stu.getSname()%></td><td><%=stu.getSsex()%></td><td><%=stu.getSage()%></td><td><%=stu.getSbalance()%></td><td><ahref="http://localhost:8080/JDBC/findStudentBySno?reqType=FIND_STUDENT_BY_SNO&sno=<%=stu.getSno()%>&cid=<%=stu.getCid()%>">充值</a>    <ahref="http://localhost:8080/JDBC/tradeInfo.jsp?sno=<%=stu.getSno()%>">消费</a></td></tr><%}%></table></center></div></body></html>

中间的核心代码:




StuentInfoServlet中的逻辑处理:







batchADD.jsp页面
<%@ 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><meta charset="utf-8"><title>动态新增学生信息</title><script type="text/javascript">function addNewInfo(){var tabObj=document.getElementById('tab');var trObj =document.createElement('tr');var tdObj=createTd("text","studentName","学生姓名");trObj.appendChild(tdObj);var tdObj=createTd("text","studentSex","学生性别");trObj.appendChild(tdObj);var tdObj=createTd("text","studentAge","学生年龄");trObj.appendChild(tdObj);tabObj.appendChild(trObj);}function createTd(type,name,lable){var tdObj=document.createElement('td');var textNode =document.createTextNode(lable+"    :"+"      ");var inputObj =document.createElement('input');inputObj.type=type;inputObj.name=name;tdObj.appendChild(textNode);tdObj.appendChild(inputObj);return tdObj;}function deleteInfo(){var tabObj =document.getElementById('tab');var child =tabObj.children;var length=child.length;if(length>2){tabObj.removeChild(child[length-1]);}}</script></head><body><form action="addStuInfoReq?reqType=ADD_MANRY_STU_INFO&cid=<%=request.getParameter("cid") %>" method="POST"><div style="margin:30px ;margin-left: auto;margin-right: auto;"><table id="tab" width="60%" border="1" bgcolor="#FFFFC6"><caption>批量新增学生信息</caption><tr><td>学生姓名 : <input type="text" name="studentName"></td><td>学生性别 : <input type="text" name="studentSex"></td><td>学生年龄 : <input type="text" name="studentAge"></td></tr></table></div><div style="margin-left: auto;margin-right: auto;"><table style="text-align: center;"  width="60%"  border="1" bgcolor="#FFFFC6"><tr><td><input type="button" value="+" onclick="addNewInfo()"></td><td><input type="button" value="-" onclick="deleteInfo()"></td><td><input type="submit" value="确定"></td></tr></table></div></form></body></html>


batchAdd.jsp显示效果(点击+号和-号可以减少或者新增一行表格)

填好学生信息后点击确定按钮提交:StudentInfoServlet处理请求:

if("ADD_MANRY_STU_INFO".equals(reqType)){//获取客户端输入的参数int cid=Integer.parseInt(req.getParameter("cid"));//通过getParameterMap()方法接收参数Map<String ,String[]>params=req.getParameterMap();//把学生信息用数组存起来List<StudentInfoBean> stuList = new ArrayList<StudentInfoBean>();if(params!=null && !params.isEmpty()){String [] sutNames=params.get("studentName");String [] stuSexs=params.get("studentSex");String [] stuAges=params.get("studentAge");//封装学生信息for (int i = 0; i < sutNames.length; i++) {StudentInfoBean bean = new StudentInfoBean();bean.setCid(cid);bean.setSname(sutNames[i]);bean.setSsex(stuSexs[i]);bean.setSage(Integer.valueOf(stuAges[i]));bean.setSbalance(BigDecimal.ZERO);stuList.add(bean);}}StudentInfoDao dao = new StudentInfoDao();//调用dao层的批量新增操作;dao.batchAddStudentInfo(stuList);List<StudentInfoBean> allStudentInfo=dao.findAllStudentByClassId(cid);//保存查询到的学生信息req.setAttribute("allStudentInfo", allStudentInfo);//将查询结果交给jsp处理req.getRequestDispatcher("/studentInfo.jsp").forward(req, resp);}


dao层处理逻辑:

public void batchAddStudentInfo(List<StudentInfoBean> stuList) {String sql= "INSERT INTO student_info (sname,ssex,sage,cid,sbalance) VALUES (?,?,?,?,?)";List<Object[]> argList =new ArrayList<Object[]>();//可以再做优化for (int i = 0; i < stuList.size(); i++) {StudentInfoBean bean =stuList.get(i);Object[] arg=new Object[]{bean.getSname(),bean.getSsex(),bean.getSage(),bean.getCid(),bean.getSbalance(),};argList.add(arg);}DAOUtil.batchADD(sql,argList);}


DAOUtil类处理逻辑:
public static void batchADD(String sql, List<Object[]> argList) {Connection conn = null;PreparedStatement pstmt = null;try {// 获取数据库连接conn = DBUtil.getConnection();// 创建SQL执行对象pstmt = conn.prepareStatement(sql);//设置预编译对象的值if(argList!=null && argList.size()>0){for (Object[] args : argList) {                    if (args != null && args.length > 0) {                        setArgs(pstmt, args);                        pstmt.addBatch();                    }                }}// 执行sql语句pstmt.executeBatch();} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.release(conn, pstmt, null);}}



4、2:数据分页显示:
1、新建PageInfoDataBean类(pageCount代表有多少页,data代表要显示在该页面的数据)
package com.huaxin.bean;import java.util.List;//利用泛型public class PageInfoDataBean<E> {private int pagecount;private List<E> data;public int getPagecount() {return pagecount;}public void setPagecount(int pagecount) {this.pagecount = pagecount;}public List<E> getData() {return data;}public void setData(List<E> data) {this.data = data;}}



pageclassInfo.jsp前台页面显示效果:



默认每页显示5条数据,按照升序排列:




当排序规则或者每页数据条数发生改变时,会重新发起请求,查询数据





pageclassInfo.jsp前台页面代码实现:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ page import="com.huaxin.bean.ClassInfoBean"%><%@ page import="com.huaxin.bean.PageInfoDataBean"%><%@ page import="java.util.List"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>班级信息界面</title><style type="text/css">th {text-align: center;}td {text-align: center;}</style><script type="text/javascript">function orderByChange() {var selectObj1=document.getElementById("pagesize");var pagesize=selectObj1.value;var selectObj=document.getElementById("orderBy");var order=selectObj.value;//发起请求window.location.href="http://localhost:8080/JDBC/showclassInfoReq?reqType=QUERY_ALL_CLASS_PAGED&pageIndex=1&pageSize="+pagesize+"&orderBy="+order;}function pagesizeChange(){var selectObj1=document.getElementById("pagesize");var pagesize=selectObj1.value;var selectObj=document.getElementById("orderBy");var order=selectObj.value;//发起请求window.location.href="http://localhost:8080/JDBC/showclassInfoReq?reqType=QUERY_ALL_CLASS_PAGED&pageIndex=1&pageSize="+pagesize+"&orderBy="+order;}</script></head><body><div style="margin: 0 auto; margin-top: 40px;" ><form action="classInfoReq?reqType=ADD_NEW_CLASS_INFO" method="POST"><center><table width="40%" ; border="1" ; bgcolor="#FFFFC6"><caption style="margin-bottom: 20px">新增班级信息</caption><tr><td>班级名称:</td><td><input type="text" name="className"></td></tr><tr><td><input type="reset" value="重置"></td><td><input type="submit" value="确定"></td></tr></table></center></form></div><div style="margin: 0 auto; margin-top: 40px;"><center><table width="40%" border="1" bgcolor="#FFFFC6"><caption style="margin-bottom: 20px">班级信息列表<div style=" float: right ;margin: 0 auto;" ><form action="showclassInfoReq?reqType=QUERY_ALL_CLASS_PAGED&pageIndex=1&pageSize=5&orderBy=ASC"method="POST"><center><table width="40%" border="0"><tr><td><input type="submit" value="分页显示所有班级"></td></tr></table></center></form></div></caption><tr><th>班级序号</th><th>班级名称</th><th>班级明细</th></tr><%PageInfoDataBean<ClassInfoBean> classInfo=(PageInfoDataBean<ClassInfoBean>)request.getAttribute("result");if(classInfo!=null){List<ClassInfoBean> classs=classInfo.getData();for(ClassInfoBean clazz : classs){%><tr><td><%=clazz.getCid()%></td><td><%=clazz.getCname()%></td><td><ahref="http://localhost:8080/JDBC/findAllStudentByClassId?reqType=FIND_STUDENT_BY_CLASS_ID&cid=<%=clazz.getCid()%>">查看明细</a></td></tr><%}}%></table></center></div><!-- 制作页码 --><div style="margin: 0 auto; margin-top: 40px;"><form><center><table width="100%" ;bgcolor="#FFFFC6"><tr><td>排序规则:<select id="orderBy" onchange="orderByChange()"><option value="ASC">升序</option><option value="DESC">降序</option></select></td><td>每页:<select id="pagesize" onchange="pagesizeChange()"><option value="5">5</option><option value="10">10</option><option value="15">15</option><option value="20">20</option></select>条数据</td><td><%PageInfoDataBean<ClassInfoBean> classInfo1=(PageInfoDataBean<ClassInfoBean>)request.getAttribute("result");if(classInfo1!=null){int pageLength=classInfo1.getPagecount();if(pageLength>0){for(int i=0;i<pageLength;i++){%><a href="http://localhost:8080/JDBC/showclassInfoReq?reqType=QUERY_ALL_CLASS_PAGED&pageIndex=<%=(i+1)%>&pageSize=<%=request.getParameter("pageSize")%>&orderBy=<%=request.getParameter("orderBy") %>">第<%=(i+1) %>页</a>    <%}}}%></td></tr></table></center></form></div><script type="text/javascript">var order="<%=request.getParameter("orderBy")%>";var pagesize="<%=request.getParameter("pageSize")%>";var selectObj1=document.getElementById("pagesize");selectObj1.value=pagesize;var selectObj=document.getElementById("orderBy");selectObj.value=order;</script></body></html>

前台页面中的核心代码:









后端逻辑处理:ClassInfoServlet逻辑处理:

//如果是分页显示数据if("QUERY_ALL_CLASS_PAGED".equals(reqType)){//获取参数int pageIndex=Integer.parseInt(req.getParameter("pageIndex"));int pageSize=Integer.parseInt(req.getParameter("pageSize"));String order=req.getParameter("orderBy");//默认为升序排序if(order==null || "".equals(order.trim())){order="ASC";}ClassInfoDao dao = new ClassInfoDao();PageInfoDataBean<ClassInfoBean> result=dao.queryInfoPaged(pageIndex, pageSize, order);req.setAttribute("result", result);req.getRequestDispatcher("/pageclassInfo.jsp").forward(req, resp);}


dao层逻辑处理:
public PageInfoDataBean<ClassInfoBean> queryInfoPaged(int pageIndex,int pageSize,String order){PageInfoDataBean<ClassInfoBean> result =new PageInfoDataBean<>();int startIndex=(pageIndex-1)*pageSize;String sql="select cid ,cname from class_info order by cid  "+order +"  LIMIT ?,?";List<ClassInfoBean> info=DAOUtil.queryForObjectList(sql, ClassInfoBean.class, startIndex,pageSize);result.setData(info);//查询页数Integer count=DAOUtil.queryPageCount("SELECT COUNT(cid) from class_info", Integer.class);Double count1=Math.ceil(Double.valueOf(count+"")/pageSize);result.setPagecount(count1.intValue());return result;}


DAOUtil逻辑处理:
public static <T> T queryPageCount(String sql,Class<T> clazz,Object...args){Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;Object result =null;try {// 获取连接conn = DBUtil.getConnection();pstmt = conn.prepareStatement(sql);// 执行sql语句if(args!=null && args.length>0){setArgs(pstmt, args);}//得到结果集rs = pstmt.executeQuery();//创建返回对象// 遍历结果集while (rs.next()) {if(clazz==Integer.class){result=Integer.valueOf(rs.getInt(1));}if(clazz==Integer.TYPE){result=rs.getInt(1);}}} catch (Exception e) {e.printStackTrace();} finally {DBUtil.release(conn, pstmt, rs);}return clazz.cast(result);}


五、总结
在这里,我们的Servlet+JDBC+JSP项目实战就正式完结了;
回顾这一路的过程,我们首先做了一个非常简单的新增班级信息并显示的功能;接下来,我们做了新增查看班级信息以及为班级新增学生信息的功能;然后,我们做了新增学生充值功能学生消费功能查询充值流水和消费流水信息功能;再到最近,利用反射优化dao层对象的封装以及批量新增和分页数据显示的使用功能;
一路走来,的确的非常辛苦,不过,在这过程中,学会了很多新知识;自己的视野得到了极大的扩展;知道了做一个WEB应用该如何下手,以及常用功能的实现等等;同时也对WEB应用系统有了更加深刻的了解;
最近自己打开一个WEB应用系统,总会脑补一下它背后的实现原理;原来一个WEB应用系统背后就是靠我们现在所学的知识做的;
由于源代码较多,这里不贴了;我已经上传到我的资源中;
可以点击一下链接进行下载;
项目源代码下载地址
学无止境;共勉!

原创粉丝点击