day14javaweb三层开发实例

day14
案例:用户注册登录
  要求:3层框架,使用验证码

1 功能分析
 注册
 登录

1.1 JSP页面
 regist.jsp
 注册表单:用户输入注册信息;
 回显错误信息:当注册失败时,显示错误信息;
 login.jsp
 登录表单:用户输入登录信息;
 回显错误便利店:当登录失败时,显示错误信息;
 index.jsp
 用户已登录:显示当前用户名,以及“退出”链接;
 用户未登录:显示“您还没有登录”;

1.2 实体类
User:
 String username;
 String password;

1.3 Servlet
 VerifyCodeServlet
 生成验证码;
 在session中保存验证码文本;
 把图片输出到页面
 RegistServlet
 获取用户名、密码,封装到User对象中;
 获取验证码、获取确认密码;
 校验用户名、密码、验证码不能为空,校验失败,向request中保存错误信息,转发回regist.jsp显示错误信息;
 比较两次输入的错误是否一致,如果不一致,向request中保存错误信息,转发回regist.jsp显示错误信息;
 获取session中的验证码,与表单输入的验证码比较,如果不一致,向request中保存错误信息,转发回regist.jsp显示错误信息;
 使用UserService的regist()方法完成注册,如果注册失败,向request中保存错误信息,转发回regist.jsp显示错误信息,如果注册成功,转发到login.jsp页面,表示注册成功;
 LoginServlet
 获取用户名、密码、验证码;
 校验用户名、密码、验证码是否为空,校验失败,向request中保存错误信息,转发回login.jsp显示错误信息;
 获取session中的验证码,与表单中的验证码比较,如果不同,向request中保存错误信息,转发回login.jsp显示错误信息;
 删除session中的验证码;
 通过UserService的login()方法完成登录,如果抛出异常,获取异常信息,保存到request中,转发到login.jsp显示错误信息;
 向session中保存当前用户对象;
 转发到index.jsp页面,表示登录成功!
 QuitServlet
 获取session,销毁之;
 重定向到index.jsp;

1.4 Service
  UserException:为UserService使用的异常类;
UserService:
 void regist(User user):
 使用UserDao的findByUsername()方法查询名为user.getUsername()的用户,如果用户存在,说明用户名已经被注册,抛出异常;
 使用UserDao的add(User)方法保存用户信息;
 User login(String username, String password):
 使用UserDao的findByUsername()方法查询名为user.getUsername()的用户,如果用户不存在,说明用户名错误,抛出异常;
 如果查询到了User,那么比较参数password与user.getPassword()是否相等,如果不等,说明密码错误,抛出异常;
 如果一致,表示登录成功,返回User对象;

1.5 DAO
UserDao:
 void add(User):
 创建SAXReader对象,获取Document对象,再获取根元素;
 给root元素添加子元素;
 给子元素设置username属性,值为user.getUsername();
 给子元素设置password属性,值为user.getPassword();
 创建OutputFormat对象,指定缩进为“\t”,指定添加换行;
 设置OutputFormat清空原有空白;
 使用FileWrtier和OutputFormat创建XMLWriter对象;
 使用XMLWriter对象的write()保存Document;
 关闭XMLWriter对象;
 User findByUsername(String username):
 创建SAXReader对象,获取Document对象;
 使用Xpath(//user[username=’xxx’])来查询元素;
 如果元素没有查询到,返回null;
 如果元素查询到了,那么创建User对象;
 把元素的username属性赋给User的username属性;
 把元素的password属性赋给User的password属性;
 返回user对象;

2 流程图

2.1 注册
 用户在浏览器地址栏中请求regist.jsp;
 服务器发送html给浏览器;
 浏览器收到html,开始解析,并显示;
 解析到时,请求VerifyCodeServlet;
 VerifyCodeServlet生成验证码图片,保存验证码文本,把图片响应给浏览器;
 浏览器显示在页面中显示图片。

2.2 登录
  此处省略10000字

3 代码

login.jsp

登录


${msg }

用户名:
密 码:
验证码: 看不清,换一张

regist.jsp

注册


${msg }

用户名:
密 码:
确认密码:
验证码: 看不清,换一张

index.jsp

主页


您还没有登录 用户名:${sessionScope.user.username } 退出

VerifyCodeServlet
public class VerifyCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter(“name”);

	VerifyCode vc = new VerifyCode();//创建验证码类
	BufferedImage image  = vc.getImage();//创建验证码图片
	request.getSession().setAttribute(name, vc.getText());//获取验证码文本

System.out.println(vc.getText());
VerifyCode.output(image, response.getOutputStream());//输出图片到页面
}
}

RegistServlet
public class RegistServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding(“utf-8”);
response.setContentType(“text/html;charset=utf-8”);

	User user = new User();
	try {
		BeanUtils.populate(user, request.getParameterMap());
	} catch (Exception e) {
	}
	String loginCode = request.getParameter("registCode");
	String repassword = request.getParameter("repassword");
	
	if(user.getUsername() == null || user.getUsername().trim().isEmpty()) {
		request.setAttribute("msg", "用户名不能为空!");
		request.setAttribute("user", user);
		request.getRequestDispatcher("/regist.jsp").forward(request, response);
		return;
	}
	if(user.getPassword() == null || user.getPassword().trim().isEmpty()) {
		request.setAttribute("msg", "密码不能为空!");
		request.setAttribute("user", user);
		request.getRequestDispatcher("/regist.jsp").forward(request, response);
		return;
	}
	if(!user.getPassword().equals(repassword)) {
		request.setAttribute("msg", "两次输入不一致!");
		request.setAttribute("user", user);
		request.getRequestDispatcher("/regist.jsp").forward(request, response);
		return;			
	}
	if(loginCode == null || loginCode.trim().isEmpty()) {
		request.setAttribute("msg", "验证码不能为空!");
		request.setAttribute("user", user);
		request.getRequestDispatcher("/regist.jsp").forward(request, response);
		return;			
	}
	
	String vCode = (String)request.getSession().getAttribute("registCode");
	request.getSession().removeAttribute("registCode");
	if(!vCode.equalsIgnoreCase(loginCode)) {
		request.setAttribute("msg", "验证码错误!");
		request.setAttribute("user", user);
		request.getRequestDispatcher("/regist.jsp").forward(request, response);
		return;				
	}
	
	UserService userService = new UserService();
	try {
		userService.regist(user);
		request.getRequestDispatcher("/login.jsp").forward(request, response);
	} catch (UserException e) {
		request.setAttribute("msg", e.getMessage());
		request.setAttribute("user", user);
		request.getRequestDispatcher("/regist.jsp").forward(request, response);
		return;
	}
}

}

LoginServlet
public class LoginServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding(“utf-8”);
response.setContentType(“text/html;charset=utf-8”);

	String username = request.getParameter("username");
	String password = request.getParameter("password");
	String loginCode = request.getParameter("loginCode");
	
	if(username == null || username.trim().isEmpty()) {
		request.setAttribute("msg", "用户名不能为空!");
		request.setAttribute("username", username);
		request.getRequestDispatcher("/login.jsp").forward(request, response);
		return;
	}
	if(password == null || password.trim().isEmpty()) {
		request.setAttribute("msg", "密码不能为空!");
		request.setAttribute("username", username);
		request.getRequestDispatcher("/login.jsp").forward(request, response);
		return;			
	}
	if(loginCode == null || loginCode.trim().isEmpty()) {
		request.setAttribute("msg", "验证码不能为空!");
		request.setAttribute("username", username);
		request.getRequestDispatcher("/login.jsp").forward(request, response);
		return;			
	}
	
	String vCode = (String)request.getSession().getAttribute("loginCode");
	request.getSession().removeAttribute("loginCode");
	if(!vCode.equalsIgnoreCase(loginCode)) {
		request.setAttribute("msg", "验证码错误!");
		request.setAttribute("username", username);
		request.getRequestDispatcher("/login.jsp").forward(request, response);
		return;				
	}
	
	UserService userService = new UserService();
	User user;
	try {
		user = userService.login(username, password);
	} catch (UserException e) {
		request.setAttribute("msg", e.getMessage());
		request.setAttribute("username", username);
		request.getRequestDispatcher("/login.jsp").forward(request, response);
		return;	
	}
	
	request.getSession().setAttribute("user", user);
	request.getRequestDispatcher("/index.jsp").forward(request, response);
}

}

QuitServlet
public class QuitServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 使session失效
request.getSession().invalidate();
response.sendRedirect(request.getContextPath() + “/index.jsp”);
}
}

UserException
public class UserException extends Exception {
public UserException() {}
public UserException(String message, Throwable cause) {
super(message, cause);
}
public UserException(String message) {
super(message);
}
public UserException(Throwable cause) {
super(cause);
}
}

UserService
public class UserService {
private UserDao userDao = new UserDao();

public User login(String username, String password) throws UserException {
	User user = userDao.findByUsername(username);
	if(user == null) {
		throw new UserException("用户名错误!");
	}
	if(!user.getPassword().equals(password)) {
		throw new UserException("密码错误!");
	}
	return user;
}

public void regist(User user) throws UserException {
	User _user = userDao.findByUsername(user.getUsername());
	if(_user != null) {
		throw new UserException("用户名已注册!");
	}
	userDao.add(user);
}

}

UserDao
public class UserDao {
private String path;

public UserDao() {
	path = this.getClass().getResource("/users.xml").getPath();
}

public void add(User user) {
	try {
		SAXReader reader = new SAXReader();
		Document doc = reader.read(path);
		
		Element root = doc.getRootElement();
		Element userEle = root.addElement("user");
		userEle.addAttribute("username", user.getUsername());
		userEle.addAttribute("password", user.getPassword());
		
		// 创建格式化器,使用\t缩进,添加换行
		OutputFormat format = new OutputFormat("\t", true);
		// 清空数据中原有的换行
		format.setTrimText(true);
		// 创建XML输出流对象
		XMLWriter writer = new XMLWriter(new FileWriter(path), format);
		// 输出Document
		writer.write(doc);
		// 关闭流
		writer.close();

	} catch (Exception e) {
		throw new RuntimeException(e);
	}
}

public User findByUsername(String username) {
	try {
		SAXReader reader = new SAXReader();
		Document doc = reader.read(path);
		Element ele = (Element) doc.selectSingleNode("//user[@username='" + username + "']");
		if(ele == null) {
			return null;
		}
		User user = new User();
		user.setUsername(ele.attributeValue("username"));
		user.setPassword(ele.attributeValue("password"));
		return user;
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值