jsp+Servlet+xml实现用户注册和登录!初学者必看!!!

一:用户注册和登录

1.项目介绍

该项目使用了jsp+servlet实现了一个简单的用户注册和登录功能。利用xml文件来充当数据库来存储用户信息。用户可以在网页上注册多个用户,只有注册成功的账号才可以进行登录。

需要知识:
jsp+servlet+dom4j

2.思维导图

在这里插入图片描述

3.项目界面:

在这里插入图片描述在这里插入图片描述

4.项目代码

1.Dao层

UserDao:

public class UserDao {
    String path="E:\\Test\\user.xml";
	//String path="D:\\学习\\javaEE\\workspace\\T1LoginandRegister\\WebContent\\WebContent\\user.xml";
    //根据用户名查询用户是否存在
    public User selectUserByUsername(String userName) {
    	/*
    	 * 1.得到document对象
    	 * 2.xpath查询
    	 * 3.查询结果是否存在,如果不存在返回null
    	 * 4.如果存在,把查询到的数据封装为User对象并返回
    	 *
    	 */
    	
    	SAXReader saxReader=new SAXReader();
    	try {
			Document document=saxReader.read(path);
			Element ele=(Element) document.selectSingleNode("//user[@username='"+userName+"']");
			if(ele==null) return null;
			String username=ele.attributeValue("username");
			String password=ele.attributeValue("password");
			User user=new User();
			user.setUsername(username);
			user.setPassword(password);
			return user;
		} catch (DocumentException e) {
			throw new RuntimeException(e);
		}
    }
    //添加用户
    public void addUser(User user) {
    	/*
    	 * 1.得到document对象
    	 * 2.找到文档的根元素
    	 * 3.在根元素中添加user
    	 * 4.回写xml文件
    	 */
    	SAXReader saxReader=new SAXReader();
    	try {
			Document document=saxReader.read(path);
			Element root=document.getRootElement();
			Element us=root.addElement("user");
			us.addAttribute("username", user.getUsername());
			us.addAttribute("password", user.getPassword());
			OutputFormat format=OutputFormat.createPrettyPrint();
			XMLWriter xmlWriter=new XMLWriter(new FileOutputStream(path),format);
			xmlWriter.write(document);
			xmlWriter.close();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
    }
}

2.Service层

UserService:

/*
 * 用户逻辑层
 */
public class UserService {
    private UserDao userDao= new UserDao();
    /*
     * 用户注册功能,检查用户是否存在,存在的话抛出异常,不存在向数据库添加用户
     */
    public void registUser(User user) throws UserException{
    	
    	User _user=userDao.selectUserByUsername(user.getUsername());
    	if(_user!=null) throw new UserException("用户名"+_user.getUsername()+"已被注册");
    	userDao.addUser(user);
    }
    /*
     * 用户登录功能,使用表单中的数据进行查询,如果用户名不存在,抛出错误信息,如果密码错误抛出错误信息
     */
	public User login(User user) throws UserException{
		User _user=userDao.selectUserByUsername(user.getUsername());
		if(_user==null) throw new UserException("用户名不存在");
		if(!_user.getPassword().equals(user.getPassword())) {
			throw new UserException("密码错误");
		}
		/*
		 * 返回数据库中查询出来的user,而不是form,因为form中只有用户名和密码,而user是用户的所有信息
		 * 
		 */
		return _user;
	}
}

3.Servlet

LoginServlet:

package net.xyz.web.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.xyz.user.domain.User;
import net.xyz.user.service.UserException;
import net.xyz.user.service.UserService;

/**
 *封装表单数据
 *调用service的login()方法,得到返回的user对象
 *如果抛出异常,获取异常信息,保存到reqeust域,转发到login.jsp
 *如果没有异常,将用户信息保存到session中,重定向到weclome.jsp
 *
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public LoginServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//处理编码方式
		request.setCharacterEncoding("utf-8");
	    response.setCharacterEncoding("text/html;charset=utf-8");
	    UserService userService=new UserService();
	    String username=request.getParameter("username");
	    String password=request.getParameter("password");
	    User user=new User();
	    user.setUsername(username);
	    user.setPassword(password);
	    System.out.println(user.toString());
		try {
			 System.out.println(1);
			 User user1 = userService.login(user);
			 System.out.println(2);
			 request.getSession().setAttribute("user", user1);
			 System.out.println(3);
			 response.sendRedirect(request.getContextPath()+"/user/welcome.jsp");
			 System.out.println(4);
		} catch (UserException e) {
			System.out.println("出错了");
			request.setAttribute("msg", e.getMessage());
			request.getRequestDispatcher("/user/login.jsp").forward(request, response);
		}
	 
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

registServelt:

import java.io.IOException;
import java.util.HashMap;
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;

import net.xyz.user.domain.User;
import net.xyz.user.service.UserException;
import net.xyz.user.service.UserService;

/**
 * Servlet implementation class RegistServlet
 */
@WebServlet("/RegistServlet")
public class RegistServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public RegistServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置编码方式
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		UserService userService=new UserService();
		//封装表单数据,调用UserService层,如果错误显示异常信息并保存到request域中
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		String verifyCode=request.getParameter("verifyCode");
		User user=new User();
		user.setUsername(username);
		user.setPassword(password);
		user.setVerifyCode(verifyCode);
		//校验用户表单是否符合规范,用map来转错误信息
		Map<String,String> errors=new HashMap<String,String>();
		//校验用户名是否符合规范
		if(username==null||username.trim().isEmpty()) {
			errors.put("username", "用户名不能为空");
		}else if(username.length()<3||username.length()>15) {
			errors.put("username","用户名长度必须在3-15之间!");
		}
		//校验密码是否符合规范
		if(password==null||password.trim().isEmpty()) {
			errors.put("password", "密码不能为空");
		}else if(password.length()<3||password.length()>15) {
			errors.put("password","密码长度必须在3-15之间!");
		}
		/*
		 * 判断map是否为空,不为空,说明存在错误
		 * 
		 */
		System.out.println(errors);
		if(errors!=null&&errors.size()>0) {
			/*
			 * 1.保存errors到request域
			 * 2.保存form到request域中,为了回显
			 * 3.转发到regist.jsp
			 */
			request.setAttribute("errors", errors);
			request.setAttribute("user", user);
			request.getRequestDispatcher("/user/regist.jsp").forward(request, response);
			return;
		}
		//校验用户验证码是否正确,如果不正确保存错误信息
		String sessionVerifyCode=(String) request.getSession().getAttribute("session");
		if(!sessionVerifyCode.equals(verifyCode)) {
			request.setAttribute("msg", "验证码填写错误");
			request.getRequestDispatcher("/user/regist.jsp").forward(request, response);;
		}
			try {
				userService.registUser(user);
				response.getWriter().write("<h1>注册成功<h1>"+"<a href='"+request.getContextPath()+"/user/login.jsp'>点击这里登录</a>");
			} catch (UserException e) {
				
				request.setAttribute("msg", e.getMessage());
				request.getRequestDispatcher("/user/regist.jsp").forward(request, response);;
				System.out.println("出错了");
			}
			
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

VerifyCodeServelt:


/**
 * Servlet implementation class VerifyCodeServlet
 */
@WebServlet("/VerifyCodeServlet")
//向客户端回图片,并将验证码文本信息保存到session域中
public class VerifyCodeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public VerifyCodeServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置编码方式
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("text/html;charset=utf-8");
		/*
		 * 1.向客户端返回图片
		 * 2.将图片中的文本信息保存到session域中
		 */
		VerifyCode vc=new VerifyCode();
		BufferedImage image=vc.getImage();
		request.getSession().setAttribute("session", vc.getText());
		VerifyCode.output(image, response.getOutputStream());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

4.登录注册界面

login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>登录界面</h1>
<form action="${pageContext.request.contextPath }/LoginServlet" method="post">
<p style="color:red;font-weight: 900">${msg }</p>
  用户名:<input type="text" name="username"></br>
  密  码:<input type="text" name="password"></br>
  <input type="submit" value="登录"></br>
</form>
<a href="regist.jsp">注册账号</a>
</body>
</html>

regist.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function _change(){
	var img=document.getElementById("img");
	img.src="/T1LoginandRegister/VerifyCodeServlet?a="+new Date().getTime();
}
</script>
</head>
<body>
<h1>用户注册</h1>
<p style="color:red ;font-weight: 900">${msg }</p>
<form action="${ pageContext.request.contextPath }/RegistServlet" method="post">
    用户名:<input type="text" name="username">${errors.username }</br>
    密   码:<input type="text" name="password"> ${errors.password }</br>
    验证码:<input type="text" name="verifyCode" size=3>
    <img id="img" src="/T1LoginandRegister/VerifyCodeServlet">
    <a href="javascript:_change()">换一张</a></br>
    <input type="submit" value="注册">
</form>
</body>
</html>

5.项目源码地址

GitHub:https://github.com/xuyuanzhi051/T1LoginandRegist

猜你喜欢

转载自blog.csdn.net/qq_44867340/article/details/106056261