本篇用投票系统对前面的内容进行复习和整理。
一.需求分析
制作一个投票系统,让学生给自己喜欢的老师投票。该系统由一个界面组成,界面上有一个表格,表格有四列,分别为学号,姓名,得票数。得票数显示红色,并显示票数。表格的第四列是投票链接。点击链接,票数加1。
二.模块实现
设计两个JSP,一个JSP负责显示投票界面,一个JSP负责处理投票的请求,将对应的老师的得票数加1。工作完毕后,再跳转回第一个JSP页面。
页面 | 作用 |
---|---|
display.jsp | 1.连接数据库 2.查询教师编号,姓名,得票数 3.显示教师编号、姓名、得票数、投票链接 |
vote.jsp | 1.连接数据库 2.获取投票链接传来的编号 3.将教师编号对应的得票数加1 3.跳回display.jsp |
三.开发过程
3.1准备数据
数据库为MySql,数据库名为school,用户名为root,密码为123456。
创建表,如下图:
初始化一些数据,如下图:
3.2如何显示红色进度条
实际上红色进度条是一个红色的图片,显示时让高度不变,让宽度和得票数成正比就可以了。准备一个红色图片:bar.jpg
3.3编写display.jsp
new 一个Web项目:Prj06。将MySQL数据库驱动导入到项目中,将bar.jpg复制到WebRoot下的img目录(该目录事先创建)。代码如下:
display.jsp
<%@ page language="java" import="java.sql.*" pageEncoding="gb2312"%>
<html>
<head>
<title>display</title>
</head>
<body>
<table align = "center" ><!-- align是内容的位置 -->
<caption>欢迎给老师投票</caption><!-- 表格的标题,通常紧跟在table后面 -->
<tr bgcolor = "yellow">
<td>编号</td>
<td>姓名</td>
<td>得票数</td>
<td>投票</td>
</tr>
<%
Class.forName("com.mysql.cj.jdbc.Driver");//加载驱动
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:8080/school?useSSL=false&serverTimeZone=GMT", "root", "123456");
Statement stat = conn.createStatement();
String sql = "select * from t_vote";//查询数据库语句
ResultSet rs = stat.executeQuery(sql);//执行查询
while(rs.next()){
String teacherno = rs.getString("teacherno");
String teachername = rs.getString("teachername");
int vote = rs.getInt("vote");
%>
<tr bgcolor = "pink">
<td><%= teacherno %></td>
<td><%= teachername %></td>
<td><img src = "img/bar.jpg" width = "<%= vote %>" height = "10"><%= vote %></td>
<td><a href = "vote.jsp?teacherno=<%= teacherno %>">投票</a></td>
</tr>
<%
}
stat.close();
conn.close();
%>
</table>
</body>
</html>
在上述代码中:
<img src = "img/bar.jpg" width = "<%= vote %>" height = "10">
显示进度条,固定高度为10,宽度和得票数相等。
3.4编写vote.jsp
vote.jsp
<%@ page language="java" import="java.sql.*" pageEncoding="gb2312"%>
<html>
<head>
<title>vote</title>
</head>
<body>
<%
String teacherno = request.getParameter("teacherno");
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:8080/school?useSSL=false&serverTimezone=GMT", "root", "123456");
String sql = "update t_vote set vote = vote + 1 where teacherno = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,teacherno);
ps.executeUpdate();
ps.close();
conn.close();
%>
<jsp:forward page = "display.jsp"></jsp:forward>
</body>
</html>
将项目部署到服务器。 在浏览器输入http://localhost:8080/Prj06/display.jsp ,如下图:
3.5存在的问题
两个jsp文件都存在大量访问数据库的代码,
Class.forName("com.mysql.cj.jdbc.Driver");//加载驱动
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/school?useSSL=false&serverTimezone=GMT","root", "123456");
3.6如何封装数据库
对于代码重复,常见的解决方法是将重复的代码写入函数。而函数可以写在jsp声明里面,如下:
db.inc
<%@ page language="java" import="java.sql.*" pageEncoding="gb2312"%>
<%!
public Connection getConnection() throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");//加载驱动
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/school?useSSL=false&serverTimezone=GMT","root", "123456");
return conn;
}
%>
提醒: 如果不是直接访问页面,而是仅仅定义一些功能,文件扩展名可以任意。该函数一定要定义在jsp声明中。
3.7如何重用代码
经过处理的display.jsp的代码如下:
<%@ page language="java" import="java.sql.*" pageEncoding="gb2312"%>
<%@ include file = "db.inc" %>
<html>
<head>
<title>display</title>
</head>
<body>
<table align = "center" ><!-- align是内容的位置 -->
<caption>欢迎给老师投票</caption><!-- 表格的标题,通常紧跟在table后面 -->
<tr bgcolor = "yellow">
<td>编号</td>
<td>姓名</td>
<td>得票数</td>
<td>投票</td>
</tr>
<%
Connection conn =getConnection();
Statement stat = conn.createStatement();
String sql = "select * from t_vote";//查询数据库语句
ResultSet rs = stat.executeQuery(sql);//执行查询
while(rs.next()){
String teacherno = rs.getString("teacherno");
String teachername = rs.getString("teachername");
int vote = rs.getInt("vote");
%>
<tr bgcolor = "pink">
<td><%= teacherno %></td>
<td><%= teachername %></td>
<td><img src = "img/bar.jpg" width = "<%= vote %>" height = "10"><%= vote %></td>
<td><a href = "vote.jsp?teacherno=<%= teacherno %>">投票</a></td>
</tr>
<%
}
stat.close();
conn.close();
%>
</table>
</body>
</html>
上述代码中的
Connection conn = getConnection();
表示调用导入的getConnection()方法
摘自《Java Web开发与应用》,主编郭克华,副主编宋虹,清华大学出版社。
欢迎小伙伴来评论啊~~