重新学习JSP之五——投票系统

本篇用投票系统对前面的内容进行复习和整理。

一.需求分析

制作一个投票系统,让学生给自己喜欢的老师投票。该系统由一个界面组成,界面上有一个表格,表格有四列,分别为学号,姓名,得票数。得票数显示红色,并显示票数。表格的第四列是投票链接。点击链接,票数加1。

二.模块实现

设计两个JSP,一个JSP负责显示投票界面,一个JSP负责处理投票的请求,将对应的老师的得票数加1。工作完毕后,再跳转回第一个JSP页面。

页面作用
display.jsp1.连接数据库 2.查询教师编号,姓名,得票数 3.显示教师编号、姓名、得票数、投票链接
vote.jsp1.连接数据库 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开发与应用》,主编郭克华,副主编宋虹,清华大学出版社。

欢迎小伙伴来评论啊~~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值