Servlet页面登录的数据库验证程序(一)
一、基本思想是MVC模式,一个登录页面login.jsp,一个服务器处理程序Servlet.java,一个MySql数据库userinfo.
另外还有相关的数据封装类User和数据库连接类GetData,如果要加入密码验证,可能还要一个错误处理页面error.jsp。在这个小实例中,为了思路简单一点,暂时没有密码验证。
使用的工具是MyEclipse2015。
由于设计jdbc数据库的应用,需要准备mysql-connector-java-5.1.26-bin.jar开发包,拷贝到 WEB_INF下的lib文件夹。
二、建立login.jsp页面。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
request.setCharacterEncoding("utf-8");
//从会话中获取登录信息
String lUserName = (String)session.getAttribute("lUserName");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta charset="utf-8">
<title>My JSP 'login.jsp' starting page</title>
</head> <body>
<% if (lUserName != ""&&lUserName!=null) {%>
欢迎光临,<%=lUserName%><br><br>
<a href="loginserv?action=logout">退出登录</a>
<% } else { %>
<!-- 上下代码段说明:在页面加载时读取会话信息,如果读到有用户名数据,则显示欢迎语句,不显示表单。
如果没有读到用户名信息,则显示登陆请求表单。
如果在已登录状态,同时会显示一个退出登录的链接,点击之后发送“退出登录” 的请求,在servlet中将绘画信息中用户名清空在重定向。 -->
<form name="loginfrm" action="loginserv" method="post">
<table>
<tr><td>用户名:</td><td><input type="text" name="username" value="zhangsan"></td></tr>
<tr><td>密 码:</td><td><input type="text" name="password" value="mm123456"></td></tr>
<tr><td colspan="2" ><input type="submit" value="登录"></td></tr>
</table>
</form>
<% } %>
</body>
</html>
三、建立用户数据封装类User,目的是封装通过验证得到的合法用户记录数据。
package com.kaly.data;
public class User {
private int id;//自增长id
private String usename;//用户名
private String nickname;//昵称
private String info;//信息
//无参构造方法
public User(){
}
//有参构造方法
public User(int id, String usename, String nickname, String info) {
super();
this.id = id;
this.usename = usename;
this.nickname = nickname;
this.info = info;
}
/**
* 快捷生成对象数据体
* @param usename 用户名
* @param nickname 昵称
* @param info 信息
*/
public void setUserData(String usename, String nickname, String info) {
//这个方法是设计为用一行代码填充实例,一面多行调用set方法显得代码冗长,作用相当于有参构造方法,但是作用会有点区别
this.usename = usename;
this.nickname = nickname;
this.info = info;
}
//下面是setter和getter方法群
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsename() {
return usename;
}
public void setUsename(String usename) {
this.usename = usename;
}
public String getNickname() {
return nickname;
}
public void setNickname(String username2) {
this.nickname = username2;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
//覆写toString是为了调试的时候便捷输出
@Override
public String toString() {
return "User [id=" + id + ", usename=" + usename + ", username2="
+ nickname + ", info=" + info + "]";
}
}
四、创建数据库连接类GetData目的是在Servlet中使用时代码不致混乱,而且还可以重复使用。
package com.kaly.data; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; public class GetData {
//jdbc驱动类名
String driverStr="com.mysql.jdbc.Driver";
//数据库url
String dataStr="jdbc:mysql://192.168.2.100:3306/userinfo";
//访问数据库的用户名
String username="root";
//访问数据库的密码
String password="admin";
//数据库连接对象
private Connection conn;
//构造方法
public GetData(){
try {
//加载驱动类
Class.forName(driverStr);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获得数据库连接对象的方法
public Connection getConnection(){ try {
conn = (Connection) DriverManager.getConnection(dataStr,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//关闭数据库连接
public void close(){
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
五、用模版建立Servlet程序loginserv.java。
package com.kaly.servlet; import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import javax.mail.Session;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import com.kaly.data.GetData;
import com.kaly.data.User; public class loginserv extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String realusername=null;//经过验证的有效用户名
//以下两行主要解决中文乱码问题
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//获得表单请求信息
String getUser=request.getParameter("username");//用户名
String getpassword=request.getParameter("password");//密码,这个小程序暂时未验证密码
String otherAction=request.getParameter("action");//获取退出登录等信息
//验证登录信息
GetData data=new GetData();//实例化自定义的GetData对象
Connection connection=data.getConnection();//从data中获得数据连接对象
ResultSet rs;//游标对象
User user=new User();
try {
PreparedStatement pStatement=connection.prepareStatement("select * from user where username=?");
pStatement.setString(1, getUser);
//把经过查询得到的符合条件的记录交给游标对象rs
rs=pStatement.executeQuery();
//在游标对象rs中找到每一条记录,实际上如果用户名username不允许重复,则记录只有一条
while(rs.next()){
//把查询的数据封装到User对象,以后使用时只需要使用这个对象就可以了
user.setUserData(rs.getString(2), rs.getString(4), rs.getString(5));
}
data.close();//关闭数据连接
} catch (SQLException e) {
e.printStackTrace();
}
HttpSession session=request.getSession();//获得会话对象
session.setAttribute("lUserName", user.getNickname());//向会话对象写入数据
if(otherAction=="logout"){
//如果得到了"退出登录"的请求,则将登录的用户名信息置为null
session.setAttribute("lUserName", null);
}
//重定向到login.jsp页面
response.sendRedirect("login.jsp");
} }
六、查看WEB-INF下的web.xml。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>loginserv</servlet-name>
<servlet-class>com.kaly.servlet.loginserv</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>loginserv</servlet-name>
<url-pattern>/loginserv</url-pattern>
</servlet-mapping> </web-app>
注意其中的<url-pattern>节点,系统默认配置的文件在这里容易出错。
七、工程为普通的Web Project。工程结构如下:
八、创建数据库userinfo,建立表user,并添加示例数据。

九、重启服务,加载页面login.jsp。

输入一个数据库中存在的用户名,点击"登录"。经过请求和跳转后,页面显示欢迎和昵称信息。

点击"退出登录"超链接。页面又经过请求和跳转,显示登录表单。
如果输入了数据库中没有的用户名,页面看似没有反应,但是根据页面表单value可以看出,页面其实已经经过了请求和跳转,又回到了原始状态。
Servlet页面登录的数据库验证程序(一)的更多相关文章
- Servlet页面登录的数据库验证程序(二)
这个程序在原来的程序基础上加入了密码验证. 一.增加一个error.jsp页面,用于跳转出现用户名和密码错误显示信息. <%@ page language="java" im ...
- Servlet页面注册用户的小程序(一)
本实例实现用userreg.jsp页面中的表单提交注册请求,把注册信息提交给regservlet写入数据库并且查询新用户显示出来. 一.准备工作. 1.jdbc数据驱动开发包mysql-connect ...
- java登录时数据库验证账户密码-mysql
一:连接数据库: package login; import java.sql.*; public class conmysql { String drivername="com.mysql ...
- 11月10日上午ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...
- ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...
- servlet数据库验证登录
servlet数据库验证登录 一.将数据库连接和验证封装为一个单独的类 import java.sql.*; public class SQLtest { // JDBC 驱动名及数据库 URL st ...
- 14.ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...
- 【Tech】单点登录系统CAS服务器端搭建及实现用户名密码由MYSQL数据库验证
CAS是YALE大学发起的一个开源项目,旨在为web应用系统提供一种可靠的单点登录方法.它主要分为client和server端,server端负责对用户的认证工作,client端负责处理对客户端受保护 ...
- python登录验证程序
自己写的一个python登录验证程序: 基础需求: 让用户输入用户名密码 认证成功后显示欢迎信息 输错三次后退出程序 升级需求: 可以支持多个用户登录 (提示,通过列表存多个账户信息) 用户3次认证失 ...
随机推荐
- C/C++函数调用的几种方式及函数名修饰规则以及c++为什么不允许重载仅返回类型不同的函数
我们知道,调用函数时,计算机常用栈来存放函数执行需要的参数,由于栈的空间大小是有限的,在windows下栈是向低地址扩展的数据结构,是一块连续的内存区域.这句话的意思是栈顶的地址和栈的最大容量是系统预 ...
- 初学Scala
由于项目的需要接触了Scala语言,也花了一些时间来了解和学习Scala,今天对学习的Scala进行一个小的总结. 1.What is Scala? Scala的官方网站上给出的解释是: Scala ...
- 例子:Background Transfer Service Sample
本例演示了如何使用后台传输服务来进行后台文件下载,也就是说及时App已经停止运行,同样可以通过后台代理进行文件的下载操作. 对于后台文件传输一下知识点必须注意: 1. 通过使用 BackgroundT ...
- Java第六次作业修改版
import java.util.ArrayList; import java.util.Collections; import java.util.Random; public class Draw ...
- 《C++primer》v5 第5章 语句 读书笔记 习题答案
5.1 空语句只有一个";".如果什么也不想做可以使用空语句. 5.2 用花括号{}括起来的叫块,也叫复合语句.有多条语句作用在同一个作用域时,需要用花括号括起来. 5.3 降低了 ...
- 基于css3实现手风琴效果
终于在凌晨一点钟逼迫自己写博客.一直想记录自己的前端工程师之路,但毕竟拖延症晚期.因为第一篇随笔,所以多写一点废话吧.刚刚从学校毕业,放弃了一直学习的java,而想从事前端的工作.第一是觉得osgi这 ...
- sync_with_stdio
/* The synchronization referred to is @e only that between the standard * C facilities (e.g., stdout ...
- 《制造杀人犯/Making A Murder》中的疑点和感想
快马加鞭,一天之内看完了完整的10集,很震撼,在案件还存在诸多疑点的情况下.在还有如此多的细节无法确定的情况下,最后由12人组成的陪审团一致通过S.A的谋杀罪成立,尽管初次投票时有7票反对. ...
- 浏览器 私有属性&内核
-moz代表firefox浏览器私有属性 -ms代表IE浏览器私有属性 -webkit代表chrome.safari私有属性 IE使用的是Trident内核,Firefox 使用的是Gecko内核.目 ...
- Python学习感悟
学习任何新知识,我自己偏向于在实践中学习,这样效率更高:如果只是学习基本概念,会很枯燥. 现在的问题是:不是所有的新知识都可以在实践中学习!