首页 理论教育JavaWeb应用开发:网络投票结果

JavaWeb应用开发:网络投票结果

【摘要】:投票之后公布投票结果。图上机3.6投票页面选择“诸葛亮”,单击“提交”按钮,最终将转向投票结果页面,如图上机3.7 所示。图上机3.8已经投过票了使用局域网的其他计算机进行投票,比如本机的内网IP 为“192.168.1.100”,则可以将访问网址中的localhost 更换为该IP 地址。图上机3.9投票结果

完成本任务所用到的主要知识点:

➢ 会话跟踪及Cookie 的使用

➢ 请求转发与请求重定向

➢ Servlet 与线程安全

建立一个投票应用程序,评选刘备的三员大将(诸葛亮关羽张飞)谁最令人喜欢。要求:用户登录后方可投票,且用户每天只能投票一次。投票之后公布投票结果。

(1)投票功能如何实现

可以在ServletContext 对象中存储三个变量分别对应于诸葛亮、关羽、张飞的票数,每当一个用户投票就将对应的票数加1。

(2)如何实现只有登录用户才能投票

可以将登录用户的信息保存在会话(Session)中,在客户端用户访问各页面时先判断会话中是否保存用户信息。若会话中未存储用户信息,则表明用户未登录。

(3)如何实现用户每天只能投票一次

当用户投票后,向Cookie 中写入一条数据,比如投票时间,设置Cookie 的存储时间为1 天。在用户每次进行投票之前先读取Cookie 中写入的数据(如投票时间),若读取到数据,则表明已投票;若没有读取到数据,则表明未投票或者已是另一天。但是上述方法有局限性,Cookie 毕竟是存储在客户端的,用户可以删除或者禁用Cookie,若这样的话,可能就达不到限制的目的。在实际应用中可以将这些存储在Cookie 中的重要数据存储在服务器端(比如数据库中),这里为了练习Cookie 的使用,所以就选择使用Cookie 存储。

(1)创建项目sj4_2。

(2)在项目的WebRoot 目录下建立登录表单页面login.html。代码如下:

(3)建立验证登录的Servlet(ValidateLogin.java),代码如下:

在ValidaeLogin 中,首先获取表单提交的用户名和密码,然后进行验证。由于本例没有建立数据库,所以上述验证代码是假定用户名为“admin”,密码为“admin123”。当验证通过后,就将登录数据存储在session 对象中;若验证未通过,即登录失败,就转向错误页面显示错误信息。其中User 类是封装登录数据的实体类,其代码如下:

(4)建立投票页面(VoteForm.java),代码如下:

在VoteForm 中,首先判断用户是否登录,若未登录则跳转到登录页面,若登录了则显示投票页面。

(5)建立投票处理Servlet(VoteServlet.java),代码如下。(www.chuimin.cn)

在VoteServlet 中,首先也验证了用户是否登录。然后从Cookie 中获取投票时间,因为在进行投票后会将投票时间写入客户端Cookie 中,所以若成功获取了投票时间,表明该用户、该客户端已经投过票了,则输出提示信息,并提供一个查看投票结果的链接;若没有获取到投票时间,则进行投票。在投票的方法中为了防止并发访问,避免出现Servlet 线程安全问题,使用了synchronized 关键字同步application 对象。投票之后重定向到投票结果页面显示投票结果。

(6)建立投票结果Servlet(ShowVoteResult.java),代码如下。

只有登录用户才能查看投票结果,所以在ShowVoteResult 中,同样验证了用户是否登录。然后从application 对象中获取了诸葛亮、关羽和张飞的票数,进行计算。还使用了NumberFormat 对象格式化数字。

(7)测试项目。

首先访问登录页面,输入错误的用户名或密码,如图上机3.4 所示。

图上机3.4 登录界面,输出错误的用户名或密码

单击“登录”按钮后,服务器将接收到错误的用户名或密码。验证登录失败后,服务器使用response 对象的sendError()方法重定向到显示错误信息的页面,效果如图上机3.5 所示。

图上机3.5 显示错误信息的页面

重新访问登录页面,使用正确的用户名和密码。登录后将显示投票页面,效果如图上机3.6 所示。

图上机3.6 投票页面

选择“诸葛亮”,单击“提交”按钮,最终将转向投票结果页面,如图上机3.7 所示。

图上机3.7 投票结果页面

在本机重新打开一个IE 浏览器进行投票,效果如图上机3.8 所示。

图上机3.8 已经投过票了

使用局域网的其他计算机进行投票,比如本机的内网IP 为“192.168.1.100”,则可以将访问网址中的localhost 更换为该IP 地址。如图上机3.9 所示,经过多个客户端进行投票后的结果。

图上机3.9 投票结果