有参数时可以使用
2025-09-30
完成本任务所用到的主要知识点:
➢ 会话跟踪及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),代码如下。(https://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 投票结果
相关文章
有参数时可以使用
2025-09-30
在介绍Servlet 层次结构时,列出了javax.servlet 和javax.servlet.http 这两个包包含开发Servlet 需要用到的主要API,并将其进行了分类。在这里将详细介绍这些Servlet 常用API。Servlet API 是一组基于处理客户端和服务器之间请求和响应的Java 语言标准API。例如,HttpServlet 是常用的抽象类,它的HTTP 处理方法是空的。Servlet 接口中的方法见表2.3。Servlet API 提供了Servlet 接口的直接实现,称为GenericServlet。Servlet 可以通过这些类理解客户的请求,将其处理后的内容通过HttpServletResponse 回复到Web 容器。表2.6ServletResponse 接口中常用......
2025-09-30
统一资源定位符也被称为网页地址,是用于完整地描述Internet 上网页和其他资源的地址的一种标识方法。现在它已经被万维网联盟编制为Internet 标准RFC1738 了。例如:其中“http”指使用的协议,“mail.***.com”是服务器名,“80”是端口号,“/a/j/js3/main.jsp”是路径,“?sid=SDeQWJeebVpZIlKECzee”是询问。同样,“80”是超文本传输协议文件的常用端口号,因此一般也不必写明,用户只要键入统一资源定位符的一部分(mail.***.com/a/j/js3/main.jsp?......
2025-09-30
通用资源标志符是互联网的一个协议要素,可以通过它来定位任何远程或本地的可用资源。URI 的通用格式为:其中协议指的是访问资源使用的协议名称,常见的有http、ftp、mailto、file 等。协议和主机名称或IP 地址间使用半角冒号(:)连接,包含资源路径的冒号后还有两个半角斜杠(//)。主机名称或IP 地址是用于在网络中查找服务器并用于和它建立连接来获取资源。因为在大部分情况下,服务器都会采用协议默认的端口号。......
2025-09-30
视频教学资源掌握请求转发与重定向掌握在Servlet 中处理表单数据掌握Servlet 编程中常见中文乱码的处理了解会话跟踪技术了解Servlet 与线程安全请在预习前完成下列单词的学习,并将单词写在横线上。隐藏域提交显示隐藏域信息2.编写一个HTML 页面模拟用户登录功能,提交到Servlet 中进行验证。当用户名为“admin”和密码为“123456”时,跳转到成功提示页面并显示登录用户名;当用户名和密码错误时,跳转到错误提示页面,效果如下图所示。......
2025-09-30
out 对象实际上是PrintWriter 对象的带缓冲的版本,可以通过page 指令的buffer属性来调整缓冲区的大小,默认的缓冲区是8 kb。表5.2out 对象中与缓存区操作相关的方法out 对象针对不同的数据类型,提供了多个重载的print()和println()方法,用于输出数据。out.newLine():输出一个换行符。例5.1:out 对象使用示例。建立Java Web 项目ch06,并在WebRoot 文件夹下建立out.jsp 文件,其内容如下:发布ch06 项目,并启动Tomcat 服务器。图5.1在浏览器中查看运行效果和源代码......
2025-09-30
请求转发,也被称为内部跳转。考虑生活中的一个场景,110 报警中心收到群众报警电话,根据报警的内容,将报警请求交由不同的派出所进行处理。在这里,110 报警中心充当了一个调度员的角色,它负责将各种报警请求转发给实际的处理单位。例3.1:请求转发示例新建Java Web 项目ch04,在项目中建立两个Servlet:UseForward.java 和Other-Servlet.java。图3.1请求转发从运行结果可以看出,访问的是UseForward,而浏览器中显示的却是OtherServlet中的内容。......
2025-09-30
视频教学资源掌握JavaBean 的属性及相关概念掌握在JSP 中使用JavaBean掌握常见的JSP 标准动作的使用请在预习前完成下列单词的学习,并将单词写在横线上。产品信息页面2.在JSP 中使用标准动作元素来显示网站首页,网站头部包含一个top.jsp 页面,并传入一个参数“index.jsp”;网站中间包含一个center.jsp 页面,网站底部包含一个bottom.jsp 页面,效果如下图所示。......
2025-09-30
相关推荐