黑马day07 登录注冊案例(一)

简单介绍:依据三层架构的思想设计本案例。

1.搭建好开发环境

准备好须要的包和模拟数据库配置文件users.xml

-->cn.itheima.dao

-->cn.itheima.service

-->cn.itheima.domain

-->cn.itheima.web

-->cn.itheima.utils

-->cn.itheima.exception

-->cn.itheima.test

2.建立模拟数据库users.xml

<?xml version="1.0" encoding="UTF-8"?>
<users>
	<user username="admin" password="admin" nickname="admin" email="[email protected]"></user>
</users>

3.建立javaBean users

package cn.itheima.domain;

import cn.itheima.exception.MsgException;

public class User {
	private String username;
	private String password;
	private String password2;
	private String nickname;
	private String email;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getPassword2() {
		return password2;
	}
	public void setPassword2(String password2) {
		this.password2 = password2;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public void check()throws MsgException{
		if(username==null || "".equals(username)){
			throw new MsgException("用户名不能为空!");
		}
		if(password==null || "".equals(password)){
			throw new MsgException("密码不能为空!");
		}
		if(password2==null || "".equals(password2)){
			throw new MsgException("确认密码不能为空!");
		}
		if(!password.equals(password2)){
			throw new MsgException("两次密码不一致!");
		}
		if(nickname==null || "".equals(nickname)){
			throw new MsgException("昵称不能为空!");
		}
		if(email==null || "".equals(email)){
			throw new MsgException("邮箱不能为空!");
		}
		if(!email.matches("^\\[email protected]\\w+(\\.\\w+)+$")){
			throw new MsgException("邮箱格式不对!");
		}
	}

}

4.建立UserDao...实现对应的查询和加入功能(主要通过使用dom树操作xml文件)

package cn.itheima.dao;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import cn.itheima.domain.User;
import cn.itheima.utils.XmlUtil;

public class XmlUserDao {
	/***
	 * 依据用户名查询用户
	 * @param username用户名
	 * @return 依据用户名找到用户的信息封装到javaBean中,没有返回null
	 */
	public User findUserByUsername(String username){
		Document doc = XmlUtil.getDocument();
		Element root = doc.getRootElement();
		List<Element> list = root.selectNodes("//user[@username='"+username+"']");
		if(list.size()>0){//假设找到这个用户就封装到bean中返回user
			Element userEle = list.get(0);
			User user=new User();
			user.setUsername(userEle.attributeValue("username"));
			user.setPassword(userEle.attributeValue("password"));
			user.setNickname(userEle.attributeValue("nickname"));
			user.setEmail(userEle.attributeValue("email"));
			return user;
		}else{//没有找到用户
			return null;
		}

	}
	/**
	 * 通过username与password查找用户,找到就封装到javaBean中,找不到返回null
	 * @param username
	 * @param password
	 * @return
	 */
	public User findUserByUserNameAndPassword(String username,String password){
		Document doc = XmlUtil.getDocument();
		Element root = doc.getRootElement();
		List<Element> list = root.selectNodes("//user[@username='"+username+"' and @password='"+password+"']");
		if(list.size()>0){//假设找到这个用户就封装到bean中返回user
			Element userEle = list.get(0);
			User user=new User();
			user.setUsername(userEle.attributeValue("username"));
			user.setPassword(userEle.attributeValue("password"));
			user.setNickname(userEle.attributeValue("nickname"));
			user.setEmail(userEle.attributeValue("email"));
			return user;
		}else{//没有找到用户
			return null;
		}
	}
	/**
	 * 加入一个用户到数据库中
	 * @param user
	 */
	public void addUserToXml(User user){
		Document doc = XmlUtil.getDocument();
		Element root = doc.getRootElement();
		//1.凭空创建一个<user>标签,并设置属性
		Element userEle = DocumentHelper.createElement("user");
		userEle.setAttributeValue("username", user.getUsername());
		userEle.setAttributeValue("password", user.getPassword());
		userEle.setAttributeValue("nickname", user.getNickname());
		userEle.setAttributeValue("email", user.getEmail());
		//2.挂在到root标签下
		root.add(userEle);
		//3.改动xml文件
		XmlUtil.updateXml();

	}
}

5.建立一个工具类提供获取document和改动xml的方法

package cn.itheima.utils;

import java.io.FileOutputStream;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class XmlUtil {
	private static Document doc=null;
	private static String  path=XmlUtil.class.getClassLoader().getResource("users.xml").getPath();
	static{
		SAXReader reader=new SAXReader();
		try {
			doc = reader.read(path);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 返回文档对象
	 * @return
	 */
	public static Document getDocument(){
		return doc;
	}
	/**
	 * 改动xml文件
	 */
	public  static void updateXml(){
		try {
			XMLWriter writer=new XMLWriter(new FileOutputStream(path),OutputFormat.createPrettyPrint());
			writer.write(doc);
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException();
		}
	}
}

6.开发service 提供方法注冊的方法和检查username和password的方法

package cn.itheima.service;

import cn.itheima.dao.XmlUserDao;
import cn.itheima.domain.User;
import cn.itheima.exception.MsgException;

public class UserSevice {
	XmlUserDao dao=new XmlUserDao();
	/**
	 * 注冊用户
	 * @param user
	 * @throws MsgException
	 */
	public void registUser(User user) throws MsgException{
		//1.推断数据库中是不是实用户了
		if(dao.findUserByUsername(user.getUsername())!=null){
			throw new MsgException("用户已经存在");
		}
		//2.加入到数据库中
		dao.addUserToXml(user);
	}
	/**
	 * 检查username与password是否正确
	 * @param username
	 * @param password
	 * @return
	 */
	public User isUser(String username,String password){
		return dao.findUserByUserNameAndPassword(username, password);
	}
}

7.建立异常类MsgExcetion

package cn.itheima.exception;
public class MsgException extends Exception {
	public MsgException() {
	}
	public MsgException(String msg) {
		super(msg);
	}
}

8.开发案例的主页面index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>

  <body>
  	<c:if test="${sessionScope.user==null }">
  		欢迎光临 游客!<hr/><a href="${pageContext.request.contextPath}/regist.jsp">注冊</a><hr><a href="${pageContext.request.contextPath}/login.jsp">登录</a>
  	</c:if>
  	<c:if test="${sessionScope.user!=null}">
  		欢迎光临${sessionScope.user.username }!

<hr><a href="${pageContext.request.contextPath}/login.jsp">登录</a><hr/><a href="${pageContext.request.contextPath}/servlet/LogoutServlet">注销</a>
  	</c:if>
  </body>
</html>

执行结果示意图:

时间: 2024-08-26 19:55:18

黑马day07 登录注冊案例(一)的相关文章

表单验证(登录/注冊)

登录,注冊是我们使用的较多的表单认证,每一个项目都从头開始写,显然是没有必要的.以下和大家分享下我所写的表单验证: 以下的代码,会附上完整代码.使用的过程中.仅仅须要依据自己的项目进行简单的改动就可以,很方便. 此表单认证使用了jquery,如您须要原生的JS,改写起来,也是很方便的. 请看效果图: <!doctype html> <html lang="en"> <head> <!--站点编码格式.UTF-8 国际编码,GBK或 gb2312

Windows Azure Mobiles Services实现client的登录注冊

下文仅仅是简单实现,client以Android端的实现为例: 用户表Account: package com.microsoft.ecodrive.model; public class Account { @com.google.gson.annotations.SerializedName("id") public String id; @com.google.gson.annotations.SerializedName("username") public

黑马day07 登录注册案例(一)

简介:根据三层架构的思想设计本案例. 1.搭建环境 准备好需要的包和模拟数据库配置文件users.xml -->cn.itheima.dao -->cn.itheima.service -->cn.itheima.domain -->cn.itheima.web -->cn.itheima.utils -->cn.itheima.exception -->cn.itheima.test 2.建立模拟数据库users.xml <?xml version=&qu

黑马day07 登录注册案例(二)

1根据index.jsp我们先开发注册的功能,当点击注册按钮的时候,超链接到注册页面,下面是一个注册的jsp页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> &l

Android实战简易教程-第二十三枪(基于Baas的用户注冊和登录模块实现!)

接着上两篇文章.我们基于Bmob提供的API实现用户登录功能.总体看一下代码. 1.注冊页面xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layou

谈谈移动互联网应用的用户注冊登录安全考虑之不可逆加密的应用原则

如今移动互联网应用一般都会採用用户注冊登录机制以便增强用户粘性. 那么为了安全设计.用户的password应该怎样传输?在云端又怎样保存?这个问题我思考过许久.总结下面一些思路.主要涉及到不可逆加密的使用原则. 如果用户的注冊/登录过程均是在全然安全的环境下进行,你能够地设计得非常easy: 注冊就是把设置的password直接保存起来,登录就是直接比較password. 这过程不涉及到不论什么加密技术. 然而在实际应用中.整个过程可能是在不安全的环境下进行,比如保存password的系统可能被

YII用户注冊和用户登录(三)之模型中规则制定和分析

3 模型中规则制定和分析 YII模型主要分为两类,一个数据模型,处理和数据库相关的增删改查.继承CActiveRecord.还有一个是表单模型,继承CFormModel.不与数据库进行交互.操作与数据模型保持一致. 先分析数据模型: 数据模型基本包括四个方法.这里有两个须要注意的地方: 1 还记得视图中有确认password选项吗?数据库中没有这一个字段,不进行处理的话.程序会报错 处理方法:声明这样变量,并将这个变量进行label映射 例如以下: public $password2; // /

C# 系统应用之注冊表使用具体解释

在平时做项目时,我们有时会遇到注冊表的操作,比如前面我们须要获取IE浏览器地址栏的信息.获取"我的电脑"地址栏输入的目录信息.USB近期使用信息等.注冊表项是注冊表的基本组织单位,它包括子表项和值条目.简言之,注冊表项相当于注冊表里的目录.它们存储计算机安装程序的信息,如颜色设置.屏幕大小.历史记录等. 举个曾经使用注冊表最多的样例:当我们玩魔兽或dota时,总须要打开"执行"->输入"regedit"打开注冊表,在HKEY_CURRENT

从注冊流程 分析怎样安全退出多个Activity 多种方式(附DEMO)

前言 因为一个同学问到我怎样依照一个流程走好之后回到首页.我曾经看到过4个解决方式,后来发现有做个记录和总结的必要,就写了这篇博文. (之前看小强也写过一篇,这里通过自身的分析完整的总结一下下面6种方案,并加上一个DEMO便于大家了解大体流程) 在android的用户交互中.button触发的意图(Intent)跳转会为你又一次打开新的一个界面活动(Activity).对于之前的界面依据需求进行摧毁(Finish())或则保留. 假设一个交互流程中.是从A開始.依照A - B - C - D -