login.jsp为显示登录表单和处理登录请求的页面,登录成功后跳转到logonSuccess.jsp页面,登录失败时重新显示登录表单和失败的帮助信息,以便用户重新登录;如果已登录用户再次访问logon.jsp,login.jsp将请求转发给logonSuccess.jsp页面。
login.jsp页面代码及其分析如下:
<%@ page language="java" import="java.util.*,com.csdn.beans.*,com.csdn.web.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
"pragma" content="no-cache">
"cache-control" content="no-cache">
"expires" content="0">
"keywords" content="keyword1,keyword2,keyword3">
"description" content="This is my page">
<%--在当前会话的范围内,如果用户已经登录,那么直接转向到loginSuccess.jsp页面 --%>
<%
if(session.getAttribute("user")!=null){
%>
<%
}
%>
<%--如果是没有登录,要显示表单。 --%>
<%--用户信息的验证,用户名和密码封装在LoginFormBean对象中,用户名和密码是否正确,如果正确,就跳转到loginSuccess.jsp页面,如果不正确,还要跳转到login.jsp页面中来,让用户重新登录 --%>
<%
if(request.getParameter("submit")!=null){
//验证
if(loginForm.validate()){//基本语法格式的验证:用户名是不是空格字符或者密码的长度是不是在6-10个字符之间?
//验证用户名和密码是否是合法的
DbUtil util=DbUtil.getInstance();
//查看用户名是否合法
UserBean user=util.getUser(loginForm.getName());
if(user==null){
loginForm.setErrorMsg("name","name is not validate!");
}else{
if(user.validatePassword(loginForm.getPassword())){
//表示登录成功
session.setAttribute("user",user);
pageContext.forward("loginSuccess.jsp");//实现页面跳转
}else{
//用户名存在,但是密码错误
loginForm.setErrorMsg("password","password is error!");
}
}
}
}
%>
<%--表单的显示 --%>
loginSuccess.jsp页面代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
"pragma" content="no-cache">
"cache-control" content="no-cache">
"expires" content="0">
"keywords" content="keyword1,keyword2,keyword3">
"description" content="This is my page">
<%--用户的详细信息显示出来 --%>
LoginFormBean.java就是封装登录表单信息的JavaBean程序,它可以对各个属性(也就是登录表单内的各个字段中所填写的数据)进行语法格式方面的校验。
LoginFormBean.java代码:
package com.csdn.beans;
import java.util.Hashtable;
//这是一个表单bean
public class LoginFormBean {
private String name;
private String password;
//定义一个属性errors,用来存储所有的错误消息.通过键值对来进行存储的
private Hashtable errors=new Hashtable();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//定义一个验证的方法,验证一下输入的账号和密码是否存在语法格式错误
public boolean validate(){
boolean allOk=true;
//验证的代码,验证账号和密码是否有效
//判断
if(name.trim().equals("")){
errors.put("name","name is not empty,please input your true name!");//添加一条错误消息
allOk=false;
}
if(password.length()>10||password.length()<6){
errors.put("password","password must have 6-10 characters!");
allOk=false;
}
return allOk;
}
//想要得到具体的错误消息
public void setErrorMsg(String err,String errMsg){
if(err!=null || errMsg!=null){
//调用put方法
errors.put(err,errMsg);
}
}
//获取Hashtable集合中存储的错误消息
public String getErrorMsg(String err){
String errMsg=(String)errors.get(err);
return (errMsg==null)? "" : errMsg;
}
}
UserBean.java为代表用户信息的JavaBean程序,logon.jsp页面根据登录信息从DbUtil对象中检索出相应的UserBean对象,logonSuccess.jsp页面从UserBean对象中提取用户信息显示。
UserBean.java代码:
package com.csdn.beans;
public class UserBean {
private String name;
private String password;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
//验证方法
public boolean validatePassword(String password){
if(this.password.equals(password)){
return true;
}else{
return false;
}
}
}
DbUtil.java是用于访问数据库的辅助类,它相当于一个DAO(数据访问对象),这里用DbUtil类中封装的一个HashTable对象来代替数据库,HashTable对象中的每一个元素即为一个UserBean对象。
DbUtil.java代码:
package com.csdn.web.util;
import java.util.Hashtable;
import com.csdn.beans.UserBean;
public class DbUtil {
private Hashtable users=new Hashtable();
static DbUtil instance=new DbUtil();
private DbUtil(){
UserBean user1=new UserBean();
user1.setName("zhangsan");
user1.setPassword("1234567");
user1.setEmail("[email protected]");
UserBean user2=new UserBean();
user2.setName("lisi");
user2.setPassword("1234567");
user2.setEmail("[email protected]");
UserBean user3=new UserBean();
user3.setName("wangwu");
user3.setPassword("1234567");
user3.setEmail("[email protected]");
users.put(user1.getName(),user1);
users.put(user2.getName(),user2);
users.put(user3.getName(),user3);
}
public static DbUtil getInstance(){
return instance;
}
//根据用户名查找指定的用户
public UserBean getUser(String name){
UserBean user=(UserBean)users.get(name);
return user;
}
}
logonSuccess.jsp是用户登录成功后进入的页面,这里仅仅是显示出登录用户的信息和提供注销用户登录的功能;如果用户没有登录就直接访问logonSuccess.jsp页面,logonSuccess.jsp将请求转发给logon.jsp页面要求用户登录。
UserBean中仅仅是定义了三个属性:name、password和email。注意:要存储在Session域中或跨JVM传输的JavaBean应实现Serializable接口
DbUtil类是一个单件类,在整个Web应用程序中只能创建DbUtil类的一个实例对象,在DbUtil类内部预存储了两个用户信息来模拟数据库中的用户记录。
LogonFormBean对其中的每个属性进行基本的格式验证,如果有误则将相应的错误信息保存到一个HashTable对象中,同时也定义了供JSP页面检索错误信息的方法。