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