JavaWeb学习(八)—案例:Servlet实现注册和登录页面的请求处理
本案例主要实现了以下功能:
1.首页点击注册跳转至注册页面,点击登录跳转至登陆页面。
2.注册页面提交表单验证,注册成功跳转至登录页面,注册失败提示错误信息,重定向至注册页面。
3.登陆页面提交表单验证,登陆成功跳转至用户信息页面,登录失败提示错误信息,重定向至登陆页面
4.用户信息页面动态读取用户数据,点击注销用户,销毁用户信息,跳转至首页。点击退出用户,跳转至首页。
首页index.jsp的主要处理:在a标签中嵌入EL表达式,使用pageContext获取request,再通过request获取contextPath,contextPath相当于项目发布的路径,如本页面发布在http://localhost:8080/ServletDemo04/下,通过字符串拼接,就可以获得完整的URL
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<style>
div {
margin: 0 auto;
text-align: center;
}
</style>
</head>
<body>
<div>
<p>
<h1>ServletDemo03</h1>
</p>
</div>
<br>
<br>
<br>
<br>
<br>
<div>
<a href="${pageContext.request.contextPath}/register.jsp">注册新用户</a>
<a href="${pageContext.request.contextPath}/login.jsp">用户登录</a>
</div>
</body>
</html>
首页效果如下:
注册页面register.jsp的处理:使用表单注册验证,在action中依然通过获取contextPath拼接完整的URL;使用js实现错误提示窗
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册新用户</title>
<script>
//从servletContext中获取注册错误信息
var error = '${pageContext.servletContext.getAttribute("RegisterError")}';
if (error === 'pwd') {
alert("两次输入密码不一致,请重新输入");//显示错误提示窗
}
</script>
</head>
<body>
<h2>注册新用户</h2>
<form action="${pageContext.request.contextPath}/r2" method="post">
<p>
用户名:<input type="text" name="username">
</p>
<p>
设置密码:<input type="password" name="password1">
</p>
<p>
确认密码:<input type="password" name="password2">
</p>
<p>
请选择感兴趣的方向:<br/>
<input type="checkbox" name="interest" value="Web前端">Web前端
<input type="checkbox" name="interest" value="大数据">大数据
<input type="checkbox" name="interest" value="人工智能">人工智能
<input type="checkbox" name="interest" value="后台开发">后台开发
</p>
<p>
<input type="submit" value="注册">
<input type="reset" value="重新注册">
</p>
</form>
</body>
</html>
注册页面的效果图:
通过注册页面提交用户注册信息后对应的处理程序如下:
public class RequestTest02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//统一编码方式,尽量避免乱码问题出现
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//获取一个ServletContext实现servlet的交互,用于传递用户名和密码
ServletContext servletContext = this.getServletContext();
//从前端获取请求信息
String username = req.getParameter("username");
String password1 = req.getParameter("password1");
String password2 = req.getParameter("password2");
String[] interests = req.getParameterValues("interest");
}
//将注册信息存入servletContext中
servletContext.setAttribute("username",username);
servletContext.setAttribute("password",password1);
servletContext.setAttribute("interest", Arrays.toString(interests));
//在控制台打印前端的请求信息,用于测试
System.out.println("用户名:"+username);
System.out.println("用户密码:"+password1);
System.out.println("确认密码:"+password2);
if (password1.equals(password2)){
//如果注册时,两次密码输入一致,注册成功,跳转至登录页面
// 重定向至登陆页面,客户端行为(服务器通知客户端请求另一个页面)
//resp.sendRedirect("login.jsp");
//转发请求:服务器行为(服务器转发请求至另一个页面)
req.getRequestDispatcher("login.jsp").forward(req,resp);
}else {
//注册失败
//为了提示错误信息,在servletContext中设置一个注册错误的属性,这个属性可以子啊jsp页面中获取该属性
servletContext.setAttribute("RegisterError","pwd");
//重定向至注册页面
resp.sendRedirect("register.jsp");
}
}
}
注册成功会跳转至登陆页面,注册失败会有错误信息的弹窗提示:
登录页面login.jsp的处理:这里依然采用了html的表单验证,action传递URL参数,js实现错误信息提示。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登陆</title>
<script>
var error1 = '${pageContext.servletContext.getAttribute("LoginError")}';
//这里的UserError本来是想标记用户在未注册情况下登录产生的错误提示,但是提示500错误,这个功能本代码暂未实现。
var error2 = '${pageContext.servletContext.getAttribute("UserError")}';
if (error1 === 'pwd') {
alert("用户名或密码输入有误,请重新输入!");
}
if (error2 === 'NotExist') {
alert("用户名不存在");
}
</script>
</head>
<body>
<h2>用户登录</h2>
<form action="${pageContext.request.contextPath}/r3" method="post">
<p>
用户名:<input type="text" name="username">
</p>
<p>
密码:<input type="password" name="password">
</p>
<p>
<input type="submit" value="登录">
</p>
</form>
</body>
</html>
登陆页面的效果:
通过登录页面用户信息后对应的处理程序如下:
public class RequestTest03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//从前端获取请求信息
String name = req.getParameter("username");
String pwd = req.getParameter("password");
//通过servletContext拿到注册成功的用户信息
ServletContext servletContext = this.getServletContext();
String username = (String) servletContext.getAttribute("username");
String password = (String) servletContext.getAttribute("password");
//判断用户是否存在
if (username.equals(null)){
//提示不存在该用户,重定向至首页
//测试中,程序没有进入这段逻辑
servletContext.setAttribute("UserError","NotExist");
resp.sendRedirect("index.jsp");
}
//判断用户名和密码是否正确
if (username.equals(name) && password.equals(pwd)){
//用户名和密码输入正确,则跳转至用户信息页面
req.getRequestDispatcher("useInfo.jsp").forward(req,resp);
}else {
//用户名和密码输入错误,重定向至登陆页面
servletContext.setAttribute("LoginError","pwd");
resp.sendRedirect("login.jsp");
}
}
}
登录失败的效果:先提示错误信息,点击确定会重定向至登录页面
登录成功会跳转至用户信息界面userInfo.jsp,该页面的处理主要包括从servletContext中获取用户的数据,并显示在页面中,这需要用到jsp的知识,这里使用了EL表达式,将动态的数据嵌入在页面中。除此之外,页面的最后需要完成注销用户和退出当前用户两个功能。退出用户只需将页面跳转至首页即可,通过a标签就可以实现。注销用户使要具体的程序实现。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>个人信息</title>
</head>
<body>
<h3>个人信息</h3>
<ul>
<li>
<span>用户名:${pageContext.servletContext.getAttribute("username")}</span>
</li>
<li>
<span>用户密码:${pageContext.servletContext.getAttribute("password")}</span>
</li>
<li>
<span>感兴趣的方向:${pageContext.servletContext.getAttribute("interest")}</span>
</li>
</ul>
<p>
<a href="${pageContext.request.contextPath}/r4">注销当前用户</a>
<a href="${pageContext.request.contextPath}/index.jsp">退出当前用户</a>
</p>
</body>
</html>
用户信息页面的效果:
注销用户的处理程序:通过移除servletContext中的用户属性,达到注销的目的。
public class RequestTest04 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
servletContext.removeAttribute("username");
servletContext.removeAttribute("password");
servletContext.removeAttribute("interest");
if (servletContext.getAttribute("username")==null){
//用户信息被注销,回到首页
resp.sendRedirect("index.jsp");
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>RequestTest02</servlet-name>
<servlet-class>com.hooi.demo01.RequestTest02</servlet-class>
</servlet>
<servlet>
<servlet-name>RequestTest03</servlet-name>
<servlet-class>com.hooi.demo01.RequestTest03</servlet-class>
</servlet>
<servlet>
<servlet-name>RequestTest04</servlet-name>
<servlet-class>com.hooi.demo01.RequestTest04</servlet-class>
</servlet>
<!--=======================================================================-->
<servlet-mapping>
<servlet-name>RequestTest02</servlet-name>
<url-pattern>/r2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RequestTest03</servlet-name>
<url-pattern>/r3</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RequestTest04</servlet-name>
<url-pattern>/r4</url-pattern>
</servlet-mapping>
</web-app>