文档章节

EL+servlet+jsp实现简单的投票程序版本二

开源中国段子手
 开源中国段子手
发布于 2016/01/28 10:53
字数 1290
阅读 148
收藏 3
点赞 1
评论 0

在该项目版本一中,主要涉及最基本的java web基础知识。本篇博文仍然是基本知识,不过在版本一中,所有投票不计名不限定ip,bug很多。在版本二中有所改善,主要在投票之前加上了登录这一块,如果该用户名已经投票则自动跳转投票结果页面。

如果您对EL表达式不熟悉,请阅读我前面相关EL的基础博文

EL表达式(一):http://my.oschina.net/passer007/blog/608675

EL表达式(二):http://my.oschina.net/passer007/blog/610221

EL表达式中的隐含对象: http://my.oschina.net/passer007/blog/610380

如果你在翻阅版本二之前还没有阅读版本一请移步版本一,因为版本一中出现的版本二中不需要修改的页面我将不会在此博文中粘贴出来:

EL+servlet+jsp实现简单的投票程序版本一:http://my.oschina.net/passer007/blog/610513

写在前面的tips:由于是简单的投票程序,我在验证用户是否投票这一过程中直接采用用户名验证,不需要取数据库再验证用户密码,需要验证密码的同学可以自己完善程序。

在版本二中由于验证用户名,必须需要建立数据库连接,一下是连接数据库的基础代码:

package com.zhong.el;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DataBaseUtil {
	public static Connection getConnection(){
		System.out.println("正在尝试为您连接数据库,请稍等。。。");
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			String url = "jdbc:mysql://localhost:3306/Book";
			String user = "root";
			String password = "123456";
			conn = DriverManager.getConnection(url, user, password);
			System.out.println("数据库连接已成功,请确定您当前连接的数据库:Book");
		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("数据库连接失败,请检查用户名密码!");
			e.printStackTrace();
		}
		return conn;
	}
	
	public static void closeConnection(Connection conn){
		if(conn!=null){
			try {
				System.out.println("数据库正在关闭,请稍等。。。");
				conn.close();
				System.out.println("数据库关闭成功!");
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				System.out.println("数据库关闭失败,请检查后重试!");
				e.printStackTrace();
			}
		}else{
			System.out.println("请检查您的连接是否为空!");
		}
	}
	
}
由于知识简单的验证用户名,因此,用户DAO显得相对简单,只需要进数据表查取用户名即可
package com.zhong.el;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDao {
	public boolean isExistUsername(String username){
		Connection conn = DataBaseUtil.getConnection();
		String sql = "select * from tab_user where username = ?";
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, username);
			ResultSet rs = ps.executeQuery();
			if(!rs.next()){
				return true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
}
下面是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 http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action = "<%=request.getContextPath() %>/LoginInServlet" method = "post">
		输入用户名:<input type = "text" name = "username">
		<input type = "submit" value = "登录">
	</form>
</body>
</html>
最后是对用户登录界面传来的用户名进行验证并产生相对应的处理的servlet
package com.zhong.el;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginInServlet
 */
@WebServlet("/LoginInServlet")
public class LoginInServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginInServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String username = request.getParameter("username");
		UserDao userdao = new UserDao();
		PrintWriter pw = response.getWriter();
		if(userdao.isExistUsername(username)){
			pw.println("<script>alert('用户可以投票!');window.location.href = 'EL/index.jsp';</script>");
		}else{
			pw.println("<script>alert('该用户已经投票!');window.location.href = 'showResult.jsp'</script>");
		}
	}

}
好了,版本二中新添的功能在此结束,请注意投票的主代码在版本一中,请阅读开头的版本一进去相应连接。

最后是两个问题:版本二中最严重的问题是我并没有在投票界面获取用户,也就是说在不登录的情况下直接访问投票页面是可以无限制投票的。这一问题的解决方案是:

    其一:限制必须登录之后才可以访问该界面

    其二:在该界面进行用户名检测

    (以上问题已经修改,代码已经重新上传)

    第二个问题是:

        没有对已经投票的用户名进行入库(这一问题也相对简单,不会再更新,留给读者自己完成)

如果有第三版的话我会在第三版中进行修改,没有第三版的话就请各位自行修改了~(到此也不会再出第三版,除非以后哪天的生活中需要用到我一定会拿来好好更新的,以上全部都是简单的例子,供大家一起学习交流吧,欢迎各路大神指责。)

                                                                                                                                                                        系列博文如有转载请注明出处

© 著作权归作者所有

共有 人打赏支持
开源中国段子手
粉丝 42
博文 177
码字总数 95519
作品 0
南京
程序员
EL+servlet+jsp实现简单的投票程序版本一

如果你还没有EL基础的话请看我的前面几篇博客: EL表达式(一):http://my.oschina.net/passer007/blog/608675 EL表达式(二):http://my.oschina.net/passer007/blog/610221 EL表达式中的...

开源中国段子手 ⋅ 2016/01/27 ⋅ 0

DeDeCMS 5.7 发布,老牌开源CMS给力

期盼已久的DedeCMS v5.7程序在3月8日下午正式发布和各站长们见面了。作为织梦的忠实粉丝当然第一时间安装DedeCMS v5.7来进行测试。 一、安装界面及程序 在安装界面上V5.7相比V5.6并没有太大的...

老表 ⋅ 2011/03/09 ⋅ 8

状态模式

1 场景问题 1.1 实现在线投票 考虑一个在线投票的应用,要实现控制同一个用户只能投一票,如果一个用户反复投票,而且投票次数超过5次,则判定为恶意刷票,要取消该用户投票的资格,当然同时...

ciyo_yang ⋅ 2017/07/15 ⋅ 0

研磨设计模式 之 状态模式(State)1——跟着cc学设计系列

18.1 场景问题 18.1.1 实现在线投票 考虑一个在线投票的应用,要实现控制同一个用户只能投一票,如果一个用户反复投票,而且投票次数超过5次,则判定为恶意刷票,要取消该用户投票的资格,当...

白金小猪4号 ⋅ 2014/01/21 ⋅ 0

【白话设计模式十九】状态模式(State)

白话设计模式 工厂模式 单例模式 【白话设计模式一】简单工厂模式(Simple Factory) 【白话设计模式二】外观模式(Facade) 【白话设计模式三】适配器模式(Adapter) 【白话设计模式四】单例模式...

陶邦仁 ⋅ 2016/04/11 ⋅ 0

二、存储架构演变

1、架构演变 在2014年7月,为了准备当时的814撒娇节大促销活动,我们把单个redis的服务迁移到twemproxy上。twemproxy在后端快速完成数据分片和扩容。为了避免再次扩容,我们静态分配足够多的...

玄学酱 ⋅ 02/27 ⋅ 0

区块链 PoS 共识——Tendermint

导言 欢迎查阅 Tendermint 指南!本指南是新手学习 Tendermint 最好的材料 什么是 Tendermint? Tendermint 是一种能够为多台机器安全和保证数据一致性复制应用程序的软件。从安全性层面看,分...

hww_面条酱 ⋅ 2017/12/04 ⋅ 0

php论坛程序--YouYaX_V3.7.1_UTF8版本发布

作为一款新的php论坛程序,它的定位是比较清晰的, “开发简单、设计自由、”, 摒弃其他不必要的功能。 版本更新记录: * 网络图片恶意地址防范处理 * 网络恶意视频音乐地址防范 * 引用页效...

YouYaX开发者 ⋅ 2012/12/22 ⋅ 0

使用 Node.js、Express、AngularJS 和 MongoDB 构建一个Web程序

使用 Node.js、Express、AngularJS 和 MongoDB 构建一个实时问卷调查应用程序 2014 年 3 月 20 日 04:53 | 抄本 Joe Lennon 高级移动应用程序开发人员 Joe Lennon 是来自爱尔兰科克市的软件开...

Bob_Zheng ⋅ 2015/12/19 ⋅ 0

2011 Mozilla Demoparty 赏析

Mozilla Demoparty是由Mozilla Labs发起的一项旨在启发人们将艺术与web技术相结合的活动,参与者可以自由提交他们的Demo。大部分的Demo都是基于HTML5、WebGL和 CSS3等新技术构建的,并巧妙的...

红薯 ⋅ 2011/09/11 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Day 17 vim简介与一般模式介绍

vim简介 vi和Vim的最大区别就是编辑一个文件时vi不会显示颜色,而Vim会显示颜色。显示颜色更便于用户编辑,凄然功能没有太大的区别 使用 yum install -y vim-enhanced 安装 vim的三种常用模式...

杉下 ⋅ 58分钟前 ⋅ 0

【每天一个JQuery特效】根据可见状态确定是否显示或隐藏元素(3)

效果图示: 主要代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>根据可见状态确定 是否显示或隐藏元素</title><script src="js/jquery-3.3.1.min.js" ty......

Rhymo-Wu ⋅ 今天 ⋅ 0

OSChina 周四乱弹 —— 初中我身体就已经垮了,不知道为什么

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @加油东溪少年 :下完这场雨 后弦 《下完这场雨》- 后弦 手机党少年们想听歌,请使劲儿戳(这里) @马丁的代码 :买了日本 日本果然赢了 翻了...

小小编辑 ⋅ 今天 ⋅ 12

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部