最近在学这本书,文章是本书第五章的综合练习,由于还没掌握数据库方面的知识所以写出来的没太大意义纯粹是检验自己最近的学习成果,小白文,把能想到的知识点基本写进去了有些太琐碎的没写,之前写一篇会更细点,文中出现错误的名词和思路也希望大家能够提醒指正?

看代码之前先捋一捋思路(jsp文件放在WEB-INF目录下,servlet文件和User类放在同一目录)
数据展示的页面我以JSP编写,逻辑检查部分以Servlet编写
代码顺序如下
User类包含哈希表,模拟数据库
主界面 有注册和登录的链接
注册页面 使用form表单提交用户名,密码,确认密码和邮箱,有提交,重置按键和返回主页面的超链接
注册检查页面 检查用户名,密码,确认密码,邮箱是否为空,User中哈希表是否已有此项,密码和确认密码是
否相同且大于6位,正则表达式检查邮箱的格式
注册成功页面 显示用户信息,返回主页面的超链接
登录页面 使用form表单提交用户名,密码和前往注册的按键,还有返回主页面的超链接
登录检查页面 检查用户名,密码是否为空,User中哈希表是否有此项,若有密码是否相同
登录成功页面 显示用户信息,返回主页面的超链接
登录失败页面 重新返回登录界面


User.java
package com.test;
import java.util.HashMap;
import java.util.Map;
public class User {
private Map<String,String> acount = new HashMap<String,String>();
private static User user = null;
//模拟数据库内数据
private User() {
acount.put("zhangsan","111111##zhangsan@sian.com");
acount.put("lisi","222222##lisi@sian.com");
acount.put("wangeu","333333##wangwu@sian.com");
acount.put("zhaoliu","444444##zhaoliu@sian.com");
}
//可以理解为连接数据库
public static User getInstance() {
if(user==null) {
user=new User();
}
return user;
}
//获取数据库的表
public Map<String,String> getUserMap(){
return acount;
}
}主页面:
HomePage.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!-- <%@是编译器指示,在http协议消息头中,Content-Type表示具体请求中的媒体类型信息-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- 上行用来说明你用的XHTML或者HTML是什么版本,浏览器会根据你DOCTYPE定义的DTD(文档类型定义)来解释页面代码 -->
<html>
<head>
<title>HomePage</title>
</head>
<body>
<center> <>内内容都居中
<h4>首页</h4> <!-- h1,2,3,4的只区别在于显示的字体大小 -->
<hr> <!-- 分隔符 -->
<a href="register.jsp">注册</a> <a href="login.jsp">登录</a>
<!-- 会编译成空格,不使用的情况下不管输入多少都只能添加一个空格,无论在<a>中还是在外面
还有全角的空格“ ”,这个相当于两个&Nbsp;的位置。
<pre></pre>包含的空格 也会直接显示出来。后两个方法可能不奏效
-->
</center>
</body>
</html>
注册页面:
register.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>RegisterPage</title>
</head>
<body>
<center>
注册页面
<hr>
<form action="<%=request.getContextPath() %>/register.check" method="post">
<table border="1"> <!-- 边框样式1,还有2345等等,为0是透明 -->
<tr>
<td>用户名:</td>
<td><input name="username" /></td>
<!-- 这里省略了type="text",但默认是就是text,可写可不写 -->
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="passwd"/></td>
</tr>
<tr>
<td>密码确认:</td>
<td><input type="password" name="checkPasswd"/></td>
</tr>
<tr>
<td>邮箱:</td>
<td><input name="email" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="提交"/>
<input type="reset" value="重置"></td>
<!-- 跨列是colspan,跨行是rowspan,根据自己的需求在tr或td中添加 -->
</tr>
<tr>
<td colspan="2" align="center"><a href="<%=request.getContextPath()%>/HomePage.jsp">返回主页</a></td>
<!-- align是动词校准的意思,常用属性有center,left左,right右 -->
</tr>
</table>
</form>
</center>
</body>
</html>
注册判断:
RegisterCheckPage.java
package com.test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns= {"/register.check"},name="registerCheckPage")
public class RegisterCheckPage extends HttpServlet {
private static final long serialVersionUID = 1L;
public RegisterCheckPage() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String passwd = request.getParameter("passwd");
String checkPasswd = request.getParameter("checkPasswd");
String email = request.getParameter("email");
List<String> errors = new ArrayList<String>(); //存储出错的提示信息
if(isValidUsername(username)) {
errors.add("用户名已存在或为空");
System.out.println("1");
}
if(isValidPasswd(passwd,checkPasswd)) {
errors.add("密码为空或不一致或长度不够");
System.out.println("2");
}
if(!isValidEmail(email)) {
errors.add("邮箱错误或为空");
System.out.println("3");
}
if(!errors.isEmpty()) {
request.setAttribute("errors", errors); //添加到request属性
request.getRequestDispatcher("/failedRegister.jsp").forward(request,response); //跳转到失败页面
}else {
User user = User.getInstance();
Map<String,String>map=user.getUserMap();
map.put(username,passwd+"##"+email);
request.getRequestDispatcher("/successRegister.jsp").forward(request,response); //跳转到成功页面
}
}
public boolean isValidUsername(String username) {
User user = User.getInstance(); //模拟连接数据库
Map<String,String> map = user.getUserMap();
if(username!=null&&!username.equals("")) {
if(map.get(username)!=null&&!map.get(username).equals("")) {
//判断用户名是否为空,是否已存在该用户
return true;
}else {
return false;
}
}
if(username==null|username.equals("")) {
return true;
}
return true;
}
public boolean isValidPasswd(String passwd,String checkPasswd) {
return passwd==null||checkPasswd==null||
passwd.length()<6||checkPasswd.length()<6||
!passwd.equals(checkPasswd);
//判断长度是否大于等于6,是否为空
}
public boolean isValidEmail(String email) {
boolean flag = false;
if(email==null||"".equals(email)) {
flag = false;
}
//用正则表达式判断格式
if(email!=null&&!"".equals(email)) {
flag = email.matches("^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$");
}
return flag;
}
}注册成功页面(这里做的不够好应再添加用户名检测防止用户直接访问此页面):
successRegister.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>注册成功</title>
</head>
<body>
<h2>会员<%=request.getParameter("username") %>注册成功</h2>
密码为:<%=request.getParameter("passwd") %><br/>
<a href="<%=request.getContextPath() %>/HomePage.jsp">返回首页登录</a>
</body>
</html>
注册失败页面:
failedRegister.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>注册失败</title>
</head>
<body>
<h2>新增会员失败</h2>
<%
List<String> list = (List<String>)request.getAttribute("errors");
<!-- 获取出错信息 -->
for(String str:list){
%>
<%=str %><br/>
<%
}
%>
<a href="<%=request.getContextPath() %>/register.jsp">返回注册首页</a>
</body>
</html>
登录界面:
login.jsp
<%@ page language="java" import="java.util.*" import="java.lang.String" import="com.test.User" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>会员登录</title>
</head>
<body>
<center>
会员登录<br/>
<form action="<%=request.getContextPath() %>/login.htm" method="post">
<!-- request.getContextPath()返回该web项目的根路径,如下图login.jsp前路径为获取路径 -->
<table border="1">
<tr>
<td>登录名:</td>
<td><input name="username" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input name="passwd" type="password"/></td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" value="提交"/>
<input type="button" onclick="window.location.href = 'register.jsp'" value="注册"/></td>
</tr>
<tr align="center">
<td colspan="2"><a href="<%=request.getContextPath()%>/HomePage.jsp">返回</a></td>
</tr>
</table>
</form>
<%
//在登陆检测中如果发现出错则在此页面提示错误,若没有不提示
String failLogin = (String)request.getAttribute("failLogin");
%>
<%=failLogin %>
</center>
</body>
</html>
登录判断:
LoginCheck.java
package com.test;
import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns={"/login.htm"},name="loginCheck")
public class LoginCheck extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginCheck() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String passwd = request.getParameter("passwd");
String failLogin="登录失败请检查用户名和密码";
if(checkLogin(username,passwd)){
request.getRequestDispatcher("/member.jsp").forward(request,response);
}else {
request.setAttribute("failLogin", failLogin); //若出错则把失败信息加入request属性
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
//检查用户名密码是否为空,库中是否存在用户,若存在密码是否一致
public boolean checkLogin(String username,String passwd) {
User user = User.getInstance();
Map<String,String>map=user.getUserMap();
if(username!=null&&!"".equals(username)&& //检测用户名密码是否为空
passwd!=null&&!"".equals(passwd)) {
if(map.get("username")!=null) { //判断是否存在该用户若是
String[] arr = map.get(username).split("##"); //提取密码
if(arr[0].equals(passwd)){ //检查是否一致
return true;
}else {
return false;
}
}else {
return false;
}
}else {
return false;
}
}
}登陆成功页面:
member.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>会员登录成功</title>
</head>
<body>
<h2>会员<%=request.getParameter("username")%>,您好</h2>
<a href="<%=request.getContextPath()%>/HomePage.jsp">返回首页登录</a>
</body>
</html>
登录错误:

















