一:用户注册和登录
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>