码迷,mamicode.com
首页 > 编程语言 > 详细

java web笔记——软件三层结构&MVC模式实现注册登陆案例

时间:2016-07-13 17:37:29      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

<学习笔记>

Servlet+JSP+JavaBean(MVC)模式适合开发较复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javaBean负责封装数据,各个模块之间层次清晰。

软件三层结构为Web层、业务逻辑层(service层)、数据访问层(dao层)。

技术分享

简易的注册登陆案例
项目完整源码地址:https://git.oschina.net/beyondzl/register_login

1.搭建开发环境

1.1导人第三方开发包

    dom4j-1.6.1.jar(提供了一个使用XML的Java库)
    jaxen-1.1.1.jar(dom4j的xpath api依赖jaxen完成 )
    jstl(JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。)
    org.apache.commons.beanutils.jar(javabean工具)
    log4j-1.2.15.jar
    commons-codec-1.10.jar(消息加密解密工具类)
    commons-logging-1.2.jar
    standard.jar(JSP标准标签库)

1.2创建组织程序的包
    cn.itcast.domain
    cn.itcast.dao(接口)
    cn.itcast.dao.impl(实现类)
    cn.itcast.service(接口)
    cn.itcast.service.impl(实现类)
    cn.itcast.web.controller(处理请求的servlet)
    cn.itcast.web.UI(给用户提供用户界面)
    cn.itcast.utils(工具类)
    cn.itcast.exception(异常类)
    cn.itcast.form(表单信息)
    junit.text(单元测试)
    WEB-INF/jsp(保存所有的JSP)
    WEB-INF/lib(保存导入的第三方jar包)
    message.jsp(全局消息页面)

1.3创建代表数据库的XML文件
    在类目录下创建一个代表数据库的xml文件

web层UIServlet将浏览器发送的请求转发到相应的jsp注册登录显示页面。
web层处理请求的Servlet调用service层方法实现注册和登录的业务逻辑功能,将request参数存入form bean ,校验合格后将form bean数据拷贝到user bean 存入数据库。
在JSP注册界面用EL表达式回送校验错误信息和之前填写的内容。

dao层的实现类 :

package cn.itcast.dao.impl;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

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

import cn.itcast.dao.UserDao;
import cn.itcast.domain.User;
import cn.itcast.utils.XmlUtils;

//对XML文件中的数据元素进行操作
public class UserDaoImpl implements UserDao {
    public void add(User user) {
        try {
            Document document = XmlUtils.getDocument();
            Element root = document.getRootElement();
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

            Element user_tag = root.addElement("user");
            user_tag.setAttributeValue("id", user.getId());
            user_tag.setAttributeValue("username", user.getUsername());
            user_tag.setAttributeValue("password", user.getPassword());
            user_tag.setAttributeValue("email", user.getEmail());
            user_tag.setAttributeValue("nicname", user.getNicname());
            user_tag.setAttributeValue("birthday", user.getBirthday()==null?"":df.format(user.getBirthday()));

            XmlUtils.write2Xml(document);
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public User find(String username, String password) {
        try{
            Document document = XmlUtils.getDocument();         
            Element e = (Element) document.selectSingleNode("//user[@username=‘"+username+"‘ and @password=‘"+password+"‘]");//查找匹配的user标签

            if(e==null) {
                return null;
            }
            User user = new User();//javabean类,封装用户信息
            String date = e.attributeValue("birthday");
            if(date==null || date.equals("")) {
                user.setBirthday(null);
            }
            else {
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                user.setBirthday(df.parse(date));
            }
            user.setEmail(e.attributeValue("email"));
            user.setId(e.attributeValue("id"));
            user.setNicname(e.attributeValue("nicname"));
            user.setPassword(e.attributeValue("password"));
            user.setUsername(e.attributeValue("username"));

            return user;

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

    }

    public boolean find(String username) {
        try{
            Document document = XmlUtils.getDocument();
            Element e = (Element)document.selectSingleNode("//user[@username=‘"+username+"‘]");
            if(e==null) {
                return false;
            }
            else{
                return true;
            }
        }catch(Exception e) {
            throw new RuntimeException(e);
        }
    }
}

service层实现类:

package cn.itcast.service.impl;

import cn.itcast.dao.UserDao;
import cn.itcast.dao.impl.UserDaoImpl;
import cn.itcast.domain.User;
import cn.itcast.exception.UserExistException;
import cn.itcast.utils.ServiceUtils;

public class BusinessServiceImpl {
    private UserDao dao= new UserDaoImpl();//调用dao层方法,实现注册和登录功能

    public void register(User user) throws UserExistException {
        boolean b = dao.find(user.getUsername());
        if(b) {
            throw new UserExistException();
        }
        else {
            user.setPassword(ServiceUtils.md5(user.getPassword()));//service工具类,密码使用md5码加密
            dao.add(user);

        }

    }

    public User login(String username, String password) {
        password = ServiceUtils.md5(password);
        return dao.find(username, password);

    }
}

校验注册提交的表单信息是否符合规范:

package cn.itcast.form;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;

public class RegisterForm {
    private String username;
    private String password;
    private String password2;
    private String email;
    private String birthday;
    private String nicname;
    private String yzm;
    private String yzm2;
    private Map<String, String> errors = new HashMap<String, String>();

    public Map<String, String> getErrors() {
        return errors;
    }
    public void setErrors(Map<String, String> errors) {
        this.errors = errors;
    }
    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 getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getBirthday() {
        return birthday;
    }
    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
    public String getNicname() {
        return nicname;
    }
    public void setNicname(String nicname) {
        this.nicname = nicname;
    }


    public String getYzm() {
        return yzm;
    }
    public void setYzm(String yzm) {
        this.yzm = yzm;
    }
    public String getYzm2() {
        return yzm2;
    }
    public void setYzm2(String yzm2) {
        this.yzm2 = yzm2;
    }

    public boolean validate() {
        boolean isOK = true;
        if(this.username==null || this.username.trim().equals("")) {
            isOK = false;
            errors.put("username","用户名不能为空");
        }
        else if(!this.username.matches("[A-Za-z]{3,8}")) {
            isOK = false;
            errors.put("username", "用户名不符合规范");
        }

        if(this.password==null || this.password.trim().equals("")) {
            isOK = false;
            errors.put("password", "密码不能为空");
        }
        else if(!this.password.matches("\\d{6,12}")) {
            isOK = false;
            errors.put("password", "密码不符合规范");
        } 

        if(this.password2==null || this.password2.trim().equals("")) {
            isOK = false;
            errors.put("password2", "确认密码不能为空");
        }
        else if(!this.password.equals(password2)) {
            isOK = false;
            errors.put("password2", "两次输入密码不一致");
        }

        if(this.email==null || this.email.trim().equals("")) {
            isOK = false;
            errors.put("email","邮箱不能为空");
        }
        else if(!this.email.matches("\\w+@\\w+(\\.\\w+)+")) {
            isOK = false;
            errors.put("email", "邮箱不符合规范");
        }

        if(this.birthday!=null && !this.birthday.trim().equals("")) {
            try{
                DateLocaleConverter dlc = new DateLocaleConverter();
                dlc.convert(this.birthday, "yyyy-MM-dd");
            }catch(Exception e) {
                isOK = false;
                errors.put("birthday", "日期格式不正确");
            }
        }

        if(this.nicname==null || this.nicname.trim().equals("")) {
            isOK = false;
            errors.put("nicname", "昵称不能为空");
        }
        else if (!this.nicname.matches("[\u4e00-\u9fa5]+")) {
            isOK = false;
            errors.put("nicname", "昵称必须为汉字 ");
        }

        if(this.yzm==null || this.yzm.trim().equals("")) {
            isOK = false;
            errors.put("check", "验证码不能为空!");
        }
        else if(!this.yzm.equals(this.yzm2)) {
            isOK = false;
            errors.put("check", "验证码错误!");
        }
        return isOK;
    }
}

错误总结:
1.dom4j对node的操作需要commons-logging的支持
2.BASE64明文编码使用commons-codec包
3.方法BeanUtils.copyProperties(dest, src);只支持8种基本数据类型的转换,将表单(formbean)String类型数据转换成用户(userbean)Date类型数据需要注册如下方法:

ConvertUtils.register(new Converter(){
            public Date convert(Class type, Object value) {
                if(value == null) {
                    return null;
                }
                String str = (String)value;
                if(str.trim().equals("")) {
                    return null;
                }
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                try {
                    return df.parse(str);
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    throw new RuntimeException(e);
                }

            }
        }, Date.class);//注意别导入了java.sql.Date

4.css中background-image:url(../images/login.gif);
url中地址应是相对于webapp的根目录,如:/webRoot/images/login.gif

java web笔记——软件三层结构&MVC模式实现注册登陆案例

标签:

原文地址:http://blog.csdn.net/qq_15370821/article/details/51881299

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!