1. 程式人生 > >java web筆記——軟體三層結構&MVC模式實現註冊登陸案例

java web筆記——軟體三層結構&MVC模式實現註冊登陸案例

<學習筆記>

Servlet+JSP+JavaBean(MVC)模式適合開發較複雜的web應用,在這種模式下,servlet負責處理使用者請求,jsp負責資料顯示,javaBean負責封裝資料,各個模組之間層次清晰。

軟體三層結構為Web層、業務邏輯層(service層)、資料訪問層(dao層)。

結構模型

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("\\[email protected]\\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模式實現註冊登陸案例

<學習筆記> Servlet+JSP+JavaBean(MVC)模式適合開發較複雜的web應用,在這種模式下,servlet負責處理使用者請求,jsp負責資料顯示,javaBean負責封裝資料,各個模組之間層次清晰。 軟體三層結構為Web層、業務

PHP結構(下)——PHP實現AOP

讓我們把注意力集中到中間服務層上來。中間服務層程式碼比較簡單,只是呼叫資料訪問層程式碼將留言儲存到資料庫。如程式碼1所示:     // 程式碼 1 // 中間服務層 class LWordServiceCore implements ILWordService

javaweb:常用的web設計模式(Model1,Model2,javaweb架構和mvc)和結構案例展示

Jsp模式介紹: SUN公司推出JSP技術後,同時也推薦了兩種web應用程式的開發模式,一種是JSP+JavaBean模式,一種是Servlet+JSP+JavaBean模式。 JSP+JavaBean模式適合開發業務邏輯不太複雜的web應用程式,這種模式下,JavaBean用於封裝業務

簡單區分軟體開發中幾個概念:C/S結構和B/S結構結構和兩結構MVC架構

C/S——客戶端/服務端,簡單講就是客戶端電腦上需要安裝專有的軟體來更伺服器交流,就像QQ。主要通過訊息的機制傳遞(當然也可以自己寫協議,遊戲就是這樣做的。) B/S——瀏覽器/服務端,你只要有瀏覽器就可以與伺服器進行通訊,不用再安裝專門的客戶端,通訊協議使用HTTP協議.

Java結構,附原始碼

1,三層架構分為:資料訪問層(dao,持久層),業務邏輯層(service,業務層),表示層(view,表示層) 2,資料訪問層:主要負責資料庫的訪問(增刪改查)。 3,業務邏輯層:主要負責業務處理和資料傳遞,將資料訪問層傳來的資料加工處理,並將資料傳給表示層。 如圖4所示,表示層:將業

從零寫一個Java WEB框架()Dao優化

該系列,其實是對《架構探險》這本書的實踐。本人想記錄自己的學習心得所寫下的。 從一個簡單的Servlet專案開始起步。對每一層進行優化,然後形成一個輕量級的框架。 每一篇,都是針對專案的不足點進行優化的。 專案已放上github

Java結構

1、 三層架構分為:資料訪問層(dao,持久層),業務邏輯層(service,業務層),表示層(view,表示層) 2、資料訪問層:主要負責資料庫的訪問(增刪改查)。 3、業務邏輯層:主要負責業務處理和資料傳遞,將資料訪問層傳來的資料加工處理,並將資料傳給表示層。 4、

JavaWeb(六)--應用程式設計模型(JSP model2 ,MVC結構

一、MVC MVC並非是java特有,幾乎所有B/S結構專案都用它 M----->Model模型 V------>view檢視     C----->controller控制層  二、JSP model2

B/S系統MVC結構詳解

我們平時總是將三層架構與MVC混為一談,殊不知它倆並不是一個概念。 下面我來為大家揭曉我所知道的一些真相。 首先,它倆根本不是一個概念。 三層架構是一個分層式的軟體體系架構設計,它可適用於任何一個專案。 MVC是一個設計模式,它是根據專案的具體需求來決定是否適

android的四體系結構,基於mvc結構淺析

從多方面理解Android體系結構 1.以分層的方式來看Android 安卓體系結構分為四層。 首先看一下官方關於Android體系結構的圖: 1)、Linux Kernel:負責硬體的驅動程式、網路、電源、系統安全以及記憶體管理等功能。 2)、 Libraries和

JavaEE軟體架構和MVC的區別

JavaEE軟體三層機構是由sun公司提供JavaEE開發規範的: Web層(表現層)、業務邏輯層、資料持久層。【其中WEB層會使用前端控制器模式】 MVC是一種思想,是一種模式: 將軟體分

MVC框架模式&&結構&&SSM框架

MVC框架模式&&三層結構&&SSM框架 本文主要說明MVC框架模式和三層結構的區別和聯絡。SSM框架由於需要通過實際工程專案瞭解,所以暫時只給出定義。 定義

8、外觀模式MVC結構開發中隱藏的模式

外觀模式(Facade):為子系統中的一組介面提供y一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易sh使用UML圖:package com.thpin.repository.designpattern; public class FacadeDem

JAVA學習筆記

byte repl efi ber 時間 clas 區分大小寫 增強for size @SuppressWarnings("resource")是用來壓制資源泄露警告的。比如使用io類,最後沒有關閉。Set集合特點:1)無序,不隨機2)元素唯一3)沒下標註意:Collect

Java設計模式學習筆記:建造者模式

() stat sys pri builder 統一 return tengine str 建造者模式:實現了構建和裝配的解耦,即對象的各個子組件單獨構建,再進行裝配,從而建造完整對象。 該模式適用於構建較為復雜的對象(多個子組件)。 不同的構建者,使用相同的裝配者,可以建

在javaee的結構中,為什麽事物存在於業務

jdbc中的事物書寫我們都知道在javaee實際開發中,分為3層結構來開發,controller,service和dao 那麽為什麽事物要存在於業務層中,事物是通過connection對象操作的,使用原始jdbc鏈接數據庫的鏈接也是connection操作的,connection是在到是怎麽傳遞到dao的呢?

Java.web筆記一覽

字符串切割 ebean 筆記一 quest 取數 tld 頁面 運行 sql數據庫 攻師之路 JSP 技術掌握:JSP語法 + EL + JSTL 為什麽sun推出 JSP技術 ? Servlet 生成網頁比較復雜,本身不支持HTML語法,html代碼需要通過res

Java學習筆記):面向對象

default 直接 imp 尋找 bst 構造 時也 fin 不同 1.繼承 語法 class 父類{} class 子類 extends 父類{} 只能多層繼承,不能多重繼承,子類不能直接訪問父類中的私有成員,可通過getter和setter方法獲得 子類對象new實

==和equalse的區別 ——Thinking in Java學習筆記

不知道是不是很多人和我一樣,一直都以為==比較的是引用物件的地址,equals比較的是物件的值? 先來做個實驗: Test5 test3 = new Test5("spot", "Ruff!"); Test5 test4 = new Test5("spot", "Ruff!"); Sys