真诚感谢wrr悉心指导
在实现此功能前,需要先完成服务器环境搭载。
如有需要可以参考
eclipse使用jsp_无忧#的博客-CSDN博客_eclipse jsp
Java获取网页form提交的信息_无忧#的博客-CSDN博客
确保可以正常运行程序
目录
效果展示
JSP部分
登录和注册部分类似,在JSP中写一些简单的HTML代码,form表单提交方法为post。方便演示将信息提交到后端处理。
登录部分:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>会员用户登录</title>
</head>
<body >
<div style="text-align: center;">
<span style="font-size: 26px">用户登录</span>
<hr>
<form action="<%=request.getContextPath() %>/login.htm" method="post"><%--目标jsp --%>
用户名称:<input type="text" name="username"><br>
用户密码:<input type="text" name="password"><br>
<input type="submit" value="提交">
<a href="register.jsp">没有帐户?点击注册</a>
</form>
</div>
</body>
</html>
注册部分:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>会员注册界面</title>
</head>
<body>
<div style="text-align: center;">
<form action="<%=request.getContextPath() %>/register.htm" method="post">
<table border="1" cellspacing="0" cellpadding="0">
<tr><td>登录名:</td><td><input type="text" name="username" /></td></tr>
<tr><td>密码:</td><td><input type="password" name="password" /></td></tr>
<tr><td>确认密码:</td><td><input type="password" name="confirdpassword" /></td></tr>
<tr><td>邮箱地址:</td><td><input type="email" name="email" /></td></tr>
<tr align="center"><td colspan="2"><input type="submit" value="提交" /></td></tr>
</table>
</form>
</div>
</body>
</html>
退出部分:
session对象可以判断会话是否为同一会话,session通过删除绑定的对象,可以使session失效。
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%
String username=(String)session.getAttribute("username");//将session保存的信息删除
session.removeAttribute(username);
session.invalidate();
response.sendRedirect("login.jsp");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>退出</title>
</head>
<body>
</body>
</html>
JAVA部分
@WebServlet(name = "loginServlet" ,urlPatterns = "/login.htm")是什么意思?
Servlet3.0提供了注解(annotation),我们可以不用再web.xml里面配置servlet,只需要加上@WebServlet注解就可以修改该servlet的属性了。web.xml可以配置的servlet属性,在@WebServlet中都可以配置。
jsp页面 通过action提交到RegistServlet 类:
如<form action="RegistServlet " method="post" >
创建RegistServlet类来处理jsp页面发出的请求
用法形如:
@WebServlet("/RegistServlet")
其中/RegistServlet表示访问servlet的 url 映射(地址)(此处为相对路径,即 “项目名称/RegistServlet” )。
HttpServlet中的doGet()和doPost()方法
一般来说我们是用不到doGet方法的,doGet方法提交表单的时候会在url后边显示提交的内容,所以不安全。而且doGet方法只能提交256个字符(1024字节),而doPost没有限制,因为get方式数据的传输载体是URL(提交方式能form,也能任意的URL链接),而POST是HTTP头键值对(只能以form方式提交)。通常我们使用的都是doPost方法,你只要在servlet中让这两个方法互相调用就行了
验证登录
request.getParameter()方法:
1.获取通过http协议提交过来的数据 通过容器的实现来取得通过get或者post方式提交过来的数据
2.request.getParameter()方法传递的数据,会从web客户端传到web服务器端,代表HTTP请求数据,该方法返回String类型的数据
request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段
request.getAttribute()方法返回request范围内存在的对象
request.setAttribute() 和 getAttribute() 方法传递的数据只会存在于Web容器内部HttpServletRequest 类有 setAttribute() 方法,而没有setParameter() 方法
一般通过表单和链接传递的参数使用getParameter
getRequestDispatcher()包含两个重要方法,分别是请求转发和请求包含。一个请求跨多个Servlet时,需要使用请求转发和请求包含。
首先需要获得一个RequestDispatcher 对象:RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");
请求转发: rd.forward( request , response );
请求包含: rd.include( request , response);
需注意的是,无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!这里用到了forward()
response.sendRedirect()与request.getRequestDispatcher().forward(request,response)
两者都可以使页面跳转response.sendRedirect(url)-----是在客户端跳转
request.getRequestDispatcher(url).forward(request,response) -----是在服务器端跳转
response.sendRedirect(url)跳转到指定的URL地址后,上个页面(跳转之前的原来页面)中的请求全部结束,原request对象将会消亡,数据将会消失。紧接着,当前新页面会新建request对象,即产生新的request对象。使用response.sendRedirect()地址栏中的网址将改变
使用request.getRequestDispatcher().forward(request,response)地址栏中的网址保持不变。
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(name = "loginServlet" ,urlPatterns = "/login.htm")
public class LoginServlet extends HttpServlet{
private static final long serialVersionUID=1L;
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
doPost(request, response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
String userName=request.getParameter("username");
String password=request.getParameter("password");
if(checkLogin(userName, password)) request.getRequestDispatcher("/member.htm").forward(request, response);
else response.sendRedirect("login.jsp");
}
public boolean checkLogin(String username,String password) {
User user=User.getInstance();
Map<String, String> map=user.getUserMap();
if(username!=null&&!username.equals("")&&password!=null&&!password.equals("")&&map.containsKey(username)) {
String []arr=map.get(username).split("##");
if(arr[0].equals(password)) {
return true;
}else {
return false;
}
}else {
return false;
}
}
}
注册部分
再注册过程中,如果出现注册行为不规范,将会将错误记录到list中,在注册失败界面遍历显示。
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(name="registeServlet",urlPatterns = {"/register.htm"})
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID=1L;
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
doPost(request, response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
String username=request.getParameter("username");
String password=request.getParameter("password");
String confirdpassword=request.getParameter("confirdpassword");
String email=request.getParameter("email");
List<String> errors=new ArrayList<String>();
if(!isValidUserName(username))errors.add("用户名为空或者已经存在");
if(!isValidPassWord(password, confirdpassword))errors.add("密码为空或者密码不一致");
if(errors.isEmpty()) {
User user=User.getInstance();
Map<String, String> map=user.getUserMap();
map.put(username, password+"##"+email);
request.getRequestDispatcher("/success.htm").forward(request, response);
}else {
request.setAttribute("errors", errors);
request.getRequestDispatcher("/error.htm").forward(request, response);
}
}
public boolean isValidUserName(String userName) {
User user =User.getInstance();
Map<String, String> map=user.getUserMap();
if(userName==null||userName.equals(""))return false;
else return !map.containsKey(userName);
}
public boolean isValidPassWord(String password,String confirdpassword) {
if(password==null||password.equals("")||confirdpassword==null||confirdpassword.equals("")) {
return false;
}else {
return password.equals(confirdpassword);
}
}
}
注册成功部分
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
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(name="successServlet",urlPatterns = {"/success.htm"})
public class SuccessServlet extends HttpServlet{
private static final long serialVersionUID=1L;
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
doPost(request, response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.println("<!DOCTYPE HTML>");
out.println("<HTML>");
out.println("<HEAD><TITLE>新增会员成功</TITLE></HEAD>");
out.println("<BODY>");
out.println("<h2>会员,"+request.getParameter("username")+"注册成功</h2>");
List<String> list=(List<String>) request.getAttribute("errors");
out.println("<a href=\""+request.getContextPath()+"/login.jsp\">返回首页登录</a>");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
注册失败部分
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
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(name="errorServlet",urlPatterns = {"/error.htm"})
public class ErrorServlet extends HttpServlet{
private static final long serialVersionUID=1L;
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
doPost(request, response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.println("<!DOCTYPE HTML>");
out.println("<HTML>");
out.println("<HEAD><TITLE>新增会员失败</TITLE></HEAD>");
out.println("<BODY>");
out.println("<h2>新增会员失败</h2>");
List<String> list= (List<String>) request.getAttribute("errors");
for (String string : list) {
out.println(string+"<br>");
}
out.println("<a href=\""+request.getContextPath()+"/register.jsp\">返回注册首页</a>");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
登录成功部分
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
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(name = "memberServlet" ,urlPatterns = "/member.htm")
public class MemberServlet extends HttpServlet{
private static final long serialVersionUID=1L;
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
doPost(request, response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.println("<!DOCTYPE HTML>");
out.println("<HTML>");
out.println("<HEAD><TITLE>会员登录成功</TITLE></HEAD>");
out.println("<BODY>");
out.println("<h2>会员,"+request.getParameter("username")+"你好</h2>");
out.println("<a href=\""+request.getContextPath()+"/logout.jsp\">退出登录</a>");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
User
此处User采用单例模式
可以参考 Java单例模式(类和对象)_无忧#的博客-CSDN博客_java 单例对象
import java.util.HashMap;
import java.util.Map;
public class User {
public Map<String, String> usermap=new HashMap<String, String>();
private static User user=null;
private User() {
usermap.put("zyy", "123##[email protected]");
usermap.put("wrr", "123##[email protected]");
}
public static User getInstance() {
if(user==null) {
user=new User();
}
return user;
}
public Map<String, String> getUserMap(){
return usermap;
}
}
尝试运行
将java代码放到java目录下,jsp代码放到webapp下。
将全部代码复制后运行login.jsp。