本文简单讲述使用servlet实现用户登录,包括用户登录、退出和注册等。
最早支持 Servlet 技术的是 JavaSoft 的 Java Web Server。此后,一些其它的基于 Java 的 Web Server 开始支持标准的 Servlet API。Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:
1) 客户端发送请求至服务器端;
2) 服务器将请求信息发送至 Servlet;
3) Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
4) 服务器将响应返回给客户端。
Servlet 看起来像是通常的 Java 程序。Servlet 导入特定的属于 Java Servlet API 的包。因为是对象字节码,可动态地从网络加载,可以说 Servlet 对 Server 就如同 Applet对 Client 一样,但是,由于 Servlet 运行于 Server 中,它们并不需要一个图形用户界面。从这个角度讲,Servlet 也被称为 FacelessObject。
一个 Servlet 就是 Java 编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序。虽然 Servlet 可以对任何类型的请求产生响应,但通常只用来扩展 Web 服务器的应用程序。
目前最新版本为 3.1。
1) 客户端请求该 Servlet;
2) 加载 Servlet 类到内存;
3) 实例化并调用init()方法初始化该 Servlet;
4) service()(根据请求方法不同调用doGet() 或者 doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions());
5) destroy()。
加载和实例化 Servlet。这项操作一般是动态执行的。然而,Server 通常会提供一个管理的选项,用于在 Server 启动时强制装载和初始化特定的 Servlet。
Server 创建一个 Servlet的实例
第一个客户端的请求到达 Server
Server 调用 Servlet 的 init() 方法(可配置为 Server 创建 Servlet 实例时调用,在 web.xml 中
一个客户端的请求到达 Server
Server 创建一个请求对象,处理客户端请求
Server 创建一个响应对象,响应客户端请求
Server 激活 Servlet 的 service() 方法,传递请求和响应对象作为参数
service() 方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
service() 方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如 doGet() 或 doPost() 或程序员自己开发的新的方法。
对于更多的客户端请求,Server 创建新的请求和响应对象,仍然激活此 Servlet 的 service() 方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用 init() 方法。一般 Servlet 只初始化一次(只有一个对象),当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。
HTTPServlet 使用一个 HTML 表单来发送和接收数据。要创建一个 HTTPServlet,请扩展 HttpServlet 类, 该类是用专门的方法来处理 HTML 表单的 GenericServlet 的一个子类。 HTML 表单是由
标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定服务器应执行哪一个Servlet(或其它的程序)。 HttpServlet 类包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是继承的。本例使用oracle数据库
-- Create table
create table P_USER
(
id VARCHAR2(50) not null,
username VARCHAR2(20),
password VARCHAR2(20),
email VARCHAR2(50)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64
minextents 1
maxextents unlimited
);
-- Add comments to the table
comment on table P_USER
is '用户表';
-- Add comments to the columns
comment on column P_USER.id
is 'id';
comment on column P_USER.username
is '用户名';
comment on column P_USER.password
is '密码';
comment on column P_USER.email
is 'email';
UserServlet.java
package com.baosight.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.baosight.bean.UserBean;
/**
* Title:UserServlet
* Description:TODO
* Company:
* @author yuan
* @date 2016-5-23 下午10:50:57*/
public class UserServlet 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 method = request.getParameter("method");
if("login".equals(method)){//登录
String username = request.getParameter("username");
String password = request.getParameter("password");
if(username==null||"".equals(username.trim())||password==null||"".equals(password.trim())){
System.out.println("用户名或密码不能为空!");
response.sendRedirect("login.jsp");
return;
}
UserBean userBean = new UserBean();
boolean isValid = userBean.valid(username,password);
if(isValid){
System.out.println("登录成功!");
request.getSession().setAttribute("username", username);
response.sendRedirect("welcome.jsp");
return;
}else{
System.out.println("用户名或密码错误,登录失败!");
response.sendRedirect("login.jsp");
return;
}
}else if("logout".equals(method)){//退出登录
System.out.println("退出登录!");
request.getSession().removeAttribute("username");
response.sendRedirect("login.jsp");
return;
}else if("register".equals(method)){//注册
String username = request.getParameter("username");
String password1 = request.getParameter("password1");
String password2 = request.getParameter("password2");
String email = request.getParameter("email");
if(username==null||"".equals(username.trim())||password1==null||"".equals(password1.trim())||password2==null||"".equals(password2.trim())||!password1.equals(password2)){
System.out.println("用户名或密码不能为空!");
response.sendRedirect("register.jsp");
return;
}
UserBean userBean = new UserBean();
boolean isExit = userBean.isExist(username);
if(!isExit){
userBean.add(username, password1, email);
System.out.println("注册成功,请登录!");
response.sendRedirect("login.jsp");
return;
}else{
System.out.println("用户名已存在!");
response.sendRedirect("register.jsp");
return;
}
}
}
}
上面根据页面form提交的请求中的method参数来判断业务类型,并分别调用userbean中的方法进行处理
关于登录:
当用户名或密码为空时返回登录页面login.jsp
当登录成功后将用户信息保存到session,跳转到欢迎页面welcome.jsp
当登录失败时返回登录页面login.jsp
关于退出登录:
从session中移除用户信息,跳转到登录页面login.jsp
关于注册:
当用户名或密码为空时返回注册页面register.jsp
当注册用户名在数据库不存在时,新增用户
新增成功后跳转到登录页面login.jsp
当注册用户名在数据库存在时,返回注册页面register.jsp
这里servlet起到了控制器的作用,对不同类型的请求分别进行处理并做出各自的响应
上述servlet模型也是后来出现的各种框架比如struts的基本实现原理
web.xml
This is the description of my J2EE component
This is the display name of my J2EE component
UserServlet
com.baosight.servlet.UserServlet
UserServlet
/UserServlet
index.jsp
DBAcess.java
package com.baosight.bean;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**数据库操作类
* Title:DBAcess
* Description:TODO
* Company:
* @author yuan
* @date 2016-5-22 下午12:40:24*/
public class DBAcess {
private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:" + "thin:@127.0.0.1:1521:orcl";
private String username = "scott";
private String password = "tiger";
private Connection conn;
private Statement stm;
private ResultSet rs;
//创建连接
public boolean createConn() {
boolean b = false;
try {
Class.forName(driver);// 加载Oracle驱动程序
conn = DriverManager.getConnection(url, username, password);
b = true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 获取连接
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
//修改
public boolean update(String sql){
boolean b = false;
try {
stm = conn.createStatement();
stm.execute(sql);
b = true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
//查询
public void query(String sql){
try {
stm = conn.createStatement();
rs = stm.executeQuery(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//判断有无数据
public boolean next(){
boolean b = false;
try {
if(rs.next()){
b = true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
//获取表字段值
public String getValue(String field) {
String value = null;
try {
if (rs != null) {
value = rs.getString(field);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return value;
}
//关闭连接
public void closeConn() {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭statement
public void closeStm() {
try {
if (stm != null) {
stm.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭ResultSet
public void closeRs() {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Statement getStm() {
return stm;
}
public void setStm(Statement stm) {
this.stm = stm;
}
public ResultSet getRs() {
return rs;
}
public void setRs(ResultSet rs) {
this.rs = rs;
}
public void setConn(Connection conn) {
this.conn = conn;
}
public Connection getConn() {
return conn;
}
}
package com.baosight.bean;
import com.baosight.util.GenerateUUID;
/**
* Title:UserBean
* Description:TODO
* Company:
* @author yuan
* @date 2016-5-22 下午1:05:00*/
public class UserBean {
//登录验证
public boolean valid(String username,String password){
boolean isValid = false;
DBAcess db = new DBAcess();
if(db.createConn()){
String sql = "select * from p_user where username='"+username+"' and password='"+password+"'";
db.query(sql);
if(db.next()){
isValid = true;
}
db.closeRs();
db.closeStm();
db.closeConn();
}
return isValid;
}
//注册验证
public boolean isExist(String username){
boolean isValid = false;
DBAcess db = new DBAcess();
if(db.createConn()){
String sql = "select * from p_user where username='"+username+"'";
db.query(sql);
if(db.next()){
isValid = true;
}
db.closeRs();
db.closeStm();
db.closeConn();
}
return isValid;
}
//注册用户
public boolean add(String username,String password,String email){
boolean isValid = false;
DBAcess db = new DBAcess();
if(db.createConn()){
String sql = "insert into p_user(id,username,password,email) values('"+GenerateUUID.next()+"','"+username+"','"+password+"','"+email+"')";
isValid = db.update(sql);
db.closeStm();
db.closeConn();
}
return isValid;
}
}
上述业务逻辑javabean,定义了登录验证、注册验证和新增用户等方法
package com.baosight.util;
import java.util.Date;
/**
* Title:GenerateUUID
* Description:TODO
* Company:
* @author yuan
* @date 2016-5-22 下午1:31:46*/
public class GenerateUUID {
private static Date date = new Date();
// private static StringBuilder buf = new StringBuilder();
private static int seq = 0;
private static final int ROTATION = 99999;
public static synchronized long next(){
if (seq > ROTATION) seq = 0;
// buf.delete(0, buf.length());
date.setTime(System.currentTimeMillis());
String str = String.format("%1$tY%1$tm%1$td%1$tk%1$tM%1$tS%2$05d", date, seq++);
return Long.parseLong(str);
}
public static void main(String[] args) {
for(int i=0;i<100;i++){
System.out.println(next());
}
}
}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
登录页面
注意:页面表单直接提交到servlet
页面效果
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP 'welcom.jsp' starting page
Main
Menu1
Menu2
Menu3
Menu4
Menu5
Menu6
Menu7
Menu8
注意:页面表单直接提交到servlet
页面效果
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
注册页面
注意:页面表单直接提交到servlet
运行效果
并使用javabean对数据库操作和业务逻辑处理进行了封装。
注意:页面表单直接提交到servlet
以上即为使用servlet实现用户登录的简单介绍,还需要不断完善。