本案例主要实现了以下功能:
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" %>
$Title$
ServletDemo03
注册页面register.jsp的处理:使用表单注册验证,在action中依然通过获取contextPath拼接完整的URL;使用js实现错误提示窗
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
注册新用户
注册新用户
通过注册页面提交用户注册信息后对应的处理程序如下:
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" %>
用户登陆
用户登录
通过登录页面用户信息后对应的处理程序如下:
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" %>
个人信息
个人信息
-
用户名:${pageContext.servletContext.getAttribute("username")}
-
用户密码:${pageContext.servletContext.getAttribute("password")}
-
感兴趣的方向:${pageContext.servletContext.getAttribute("interest")}
注销用户的处理程序:通过移除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文件:
<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>RequestTest02servlet-name>
<servlet-class>com.hooi.demo01.RequestTest02servlet-class>
servlet>
<servlet>
<servlet-name>RequestTest03servlet-name>
<servlet-class>com.hooi.demo01.RequestTest03servlet-class>
servlet>
<servlet>
<servlet-name>RequestTest04servlet-name>
<servlet-class>com.hooi.demo01.RequestTest04servlet-class>
servlet>
<servlet-mapping>
<servlet-name>RequestTest02servlet-name>
<url-pattern>/r2url-pattern>
servlet-mapping>
<servlet-mapping>
<servlet-name>RequestTest03servlet-name>
<url-pattern>/r3url-pattern>
servlet-mapping>
<servlet-mapping>
<servlet-name>RequestTest04servlet-name>
<url-pattern>/r4url-pattern>
servlet-mapping>
web-app>