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,开始解析,并显示;
  • 解析到<img>时,请求VerifyCodeServlet;
  • VerifyCodeServlet生成验证码图片,保存验证码文本,把图片响应给浏览器;
  • 浏览器显示在页面中显示图片。

  

 

2.2 登录

  此处省略10000字

 

3 代码

 

login.jsp

<body>

<h1>登录</h1>

<hr/>

<p
style="font-weight: 900; color: red;">${msg }</p>

<form
action="<c:url
value='/LoginServlet'/>"
method="post">

    用户名:<input
type="text"
name="username"
value="${user.username }"
/><br/>

    密 码:<input
type="password"
name="password"/><br/>

    验证码:<input
type="text"
name="loginCode"
size="2"/>

    <img
id="vCode"
src="<c:url
value='/VerifyCodeServlet?name=loginCode'/>"
border="2"/>

    <a
href="javascript:_change()"
style="font-size: 12;">看不清,换一张</a><br/>

<input
type="submit"
value="登录"/>

</form>

</body>

<script
type="text/javascript">

    function _change() {

        var img = document.getElementById("vCode");

        img.src = "<c:url value='/VerifyCodeServlet?name=loginCode&'/>" + new Date().getTime();

    }

</script>

 

 

regist.jsp

<body>

<h1>注册</h1>

<hr/>

<p
style="font-weight: 900; color: red;">${msg }</p>

<form
action="<c:url
value='/RegistServlet'/>"
method="post">

    用户名:<input
type="text"
name="username"
value="${user.username }"
/><br/>

    密 码:<input
type="password"
name="password"/><br/>

    确认密码:<input
type="password"
name="repassword"/><br/>

    验证码:<input
type="text"
name="registCode"
size="2"/>

    <img
id="vCode"
src="<c:url
value='/VerifyCodeServlet?name=registCode'/>"
border="2"/>

    <a
href="javascript:_change()"
style="font-size: 12;">看不清,换一张</a><br/>

<input
type="submit"
value="注册"/>

</form>

</body>

<script
type="text/javascript">

        function _change() {

            var img = document.getElementById("vCode");

            img.src = "<c:url value='/VerifyCodeServlet?name=registCode&'/>" + new Date().getTime();

        }

</script>

 

 

index.jsp

<body>

<h1>主页</h1>

<hr/>

<c:choose>

    <c:when
test="${empty sessionScope.user }">

        您还没有登录

    </c:when>

    <c:otherwise>

        用户名:${sessionScope.user.username }

        <a
href="<c:url
value='/QuitServlet'/>">退出</a>

    </c:otherwise>

</c:choose>

</body>

 

 

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);

        }

    }

}

 

day14(编码实战-用户登录注册)的更多相关文章

  1. android安卓Sqlite数据库实现用户登录注册

    看了很多别人写的安卓SQlite数据的操作代码,一点也不通俗易懂,我觉得我写的不错,而且安卓项目也用上了,所以在博客园里保存分享一下!建立一个类 并继承SQLiteOpenHelper public ...

  2. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  3. 纯JSP实现用户登录注册,记事本

    没有美化,没有格式,没有样式 1.JSP登陆注册 将用户注册的信息保存在application对象中,用于登录时的验证. 首页如下: 如果未登录,在  session 中找不到 currentUser ...

  4. JavaWeb学习 (二十一)————基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  5. Java Spring+Mysql+Mybatis 实现用户登录注册功能

    前言: 最近在学习Java的编程,前辈让我写一个包含数据库和前端的用户登录功能,通过看博客等我先是写了一个最基础的servlet+jsp,再到后来开始用maven进行编程,最终的完成版是一个 Spri ...

  6. 基于Servlet+JSP+JavaBean开发模式的用户登录注册

    http://www.cnblogs.com/xdp-gacl/p/3902537.html 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBea ...

  7. javaweb(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  8. /*用户登录注册页面输入框的设置*/<span>的使用

    <!DOCTYPE html> /*用户登录注册页面输入框的设置*/ <html lang="en"> <head> <meta char ...

  9. flask 开发用户登录注册功能

    flask 开发用户登录注册功能 flask开发过程议案需要四个模块:html页面模板.form表单.db数据库操作.app视图函数 1.主程序 # app.py # Auther: hhh5460 ...

随机推荐

  1. rsync文件同步、Inotify-tools参数详解

    inotifywait用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树: inotifywatch用于收集被监控的文件系统计数据,包括每个inotify事 ...

  2. python 包管理和virturlenv

    python 包管理工具 Python当前的包管理工具链是 easy_install/pip + distribute/setuptools + distutils,显得较为混乱. 而将来的工具链组合 ...

  3. OpenCV学习:图像的载入和显示

    一.使用IplImage结构读取并显示图像文件: 运行结果: 二.使用Mat类读取并显示图像文件: 使用 Mat 类,内存管理变得简单,不再像使用 IplImage 那样需要自己申请和释放内存,而且一 ...

  4. ASP.Net MVC开发基础学习笔记(7):数据查询页面

     前言 前面铺垫了那么多,今天我们就用MVC5 + EF6 + Bootstrap3来正式创建一个基本查询页面. 为什么从查询页面開始?嘿嘿.由于小弟的.Net生涯就是从查询页面開始的,记得正式工 ...

  5. Android 6.0启动过程具体解析

    在之前的一篇文章中.从概念上学习了Andoird系统的启动过程.Android系统启动过程学习 而在这篇文章中,我们将从代码角度细致学习Android系统的启动过程,同一时候,学习Android启动过 ...

  6. 超全面的JavaWeb笔记day07<Java基础加强>

    1.myeclipse安装和使用(**) 2.debug调试模式(**) - F6: 单步执行 - F8:结束断点,后面有断点到下一个断点 3.myeclipse快捷键(**) 4.junit单元测试 ...

  7. 设置MySQL的字符编码

    前言 这里我已经将MySQL的数据库编码设置为UTF-8,所以下面现实的都是UTF-8. 设置MySQL数据库的编码方式有三种,分别是基于session会话的.基于全局gloable的.永久性改变的. ...

  8. timerWithTimeInterval 方法详用

    1.初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelect ...

  9. 《C++ Primer Plus》第15章 友元、异常和其他 学习笔记

    友元使得能够为类开发更灵活的接口.类可以将其他函数.其他类和其他类的成员函数作为友元.在某些情况下,可能需要前向声明,需要特别注意类和方法声明的顺序,以正确地组合友元.潜逃类是在其他类中生命的类,它有 ...

  10. JS 保存表单默认值 为空时自动填充默认值

    var inputArray = document.getElementsByTagName("input"); var strArray = []; ; i < input ...