日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

    歡迎訪問 生活随笔!

    生活随笔

    當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

    编程问答

    web中hasmoreelements_Web开发模式【Mode I 和Mode II的介绍、应用案例】

    發(fā)布時間:2024/8/23 编程问答 28 豆豆
    生活随笔 收集整理的這篇文章主要介紹了 web中hasmoreelements_Web开发模式【Mode I 和Mode II的介绍、应用案例】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

    開發(fā)模式的介紹

    在Web開發(fā)模式中,有兩個主要的開發(fā)結(jié)構(gòu),稱為模式一(Mode I)和模式二(Mode II).

    首先我們來理清一些概念吧:DAO(Data Access Object):主要對數(shù)據(jù)的操作,增加、修改、刪除等原子性操作。

    Web層:界面+控制器,也就是說JSP【界面】+Servlet【控制器】

    Service業(yè)務(wù)層:將多個原子性的DAO操作進行組合,組合成一個完整的業(yè)務(wù)邏輯

    控制層:主要使用Servlet進行控制

    數(shù)據(jù)訪問層:使用DAO、Hibernate、JDBC技術(shù)實現(xiàn)對數(shù)據(jù)的增刪改查

    JavaBean用于封裝數(shù)據(jù),處理部分核心邏輯,每一層中都用到!

    模式一

    模式一指的就是在開發(fā)中將顯示層、控制層、數(shù)據(jù)層的操作統(tǒng)一交給JSP或者JavaBean來進行處理!

    模式一有兩種情況:完全使用JSP做開發(fā)優(yōu)點:

    缺點:程序的可讀性差、復(fù)用性低、代碼復(fù)雜!什么jsp代碼、html代碼都往上面寫,這肯定很難閱讀,很難重用!開發(fā)速度賊快,只要寫JSP就行了,JavaBean和Servlet都不用設(shè)計!

    小幅度修改代碼方便,直接修改JSP頁面交給WEB容器就行了,不像Servlet還要編譯成.class文件再交給服務(wù)器!【當(dāng)然了,在ide下開發(fā)這個也不算是事】

    使用JSP+JavaBean做開發(fā)優(yōu)點:

    缺點:沒有流程控制,程序中的JSP頁面都需要檢查請求的參數(shù)是否正確,異常發(fā)生時的處理。顯示操作和業(yè)務(wù)邏輯代碼工作會緊密耦合在一起的!日后維護會困難程序的可讀性較高,大部分的代碼都寫在JavaBean上,不會和HTML代碼混合在一起,可讀性還行的。

    可重復(fù)利用高,核心的代碼都由JavaBean開發(fā)了,JavaBean的設(shè)計就是用來重用、封裝,大大減少編寫重復(fù)代碼的工作!

    應(yīng)用例子:

    我們使用JavaBean+JSP開發(fā)一個簡易的計算器吧,效果如圖下:

    首先開發(fā)JavaBean對象public class Calculator {

    private double firstNum;

    private double secondNum;

    private char Operator = '+';

    private double result;

    //JavaBean提供了計算的功能

    public void calculate() {

    switch (this.Operator) {

    case '+':

    this.result = this.firstNum + this.secondNum;

    break;

    case '-':

    this.result = this.firstNum - this.secondNum;

    break;

    case '*':

    this.result = this.firstNum * this.secondNum;

    break;

    case '/':

    if (this.secondNum == 0) {

    throw new RuntimeException("除數(shù)不能為0");

    }

    this.result = this.firstNum / this.secondNum;

    break;

    default:

    throw new RuntimeException("傳入的字符非法!");

    }

    }

    public double getFirstNum() {

    return firstNum;

    }

    public void setFirstNum(double firstNum) {

    this.firstNum = firstNum;

    }

    public double getSecondNum() {

    return secondNum;

    }

    public void setSecondNum(double secondNum) {

    this.secondNum = secondNum;

    }

    public char getOperator() {

    return Operator;

    }

    public void setOperator(char operator) {

    Operator = operator;

    }

    public double getResult() {

    return result;

    }

    public void setResult(double result) {

    this.result = result;

    }

    }再開發(fā)顯示頁面%--開發(fā)用戶界面--%>

    簡單計數(shù)器

    第一個參數(shù):

    運算符

    +

    -

    *

    /

    第二個參數(shù):效果:

    獲取得到顯示頁面提交的參數(shù),調(diào)用JavaBean的方法,最后輸出結(jié)果!calculator.calculate();效果:

    開發(fā)這個簡易的計算器,只用了一個JSP頁面和一個JavaBean完成!

    總的來說,Mode I 適合小型的開發(fā),復(fù)雜程序低的開發(fā),因為Mode I 的特點就是開發(fā)速度快,但在進行維護的時候就要付出更大的代價!

    模式二

    Mode II 中所有的開發(fā)都是以Servlet為主體展開的,由Servlet接收所有的客戶端請求,然后根據(jù)請求調(diào)用相對應(yīng)的JavaBean,并所有的顯示結(jié)果交給JSP完成!,也就是俗稱的MVC設(shè)計模式!

    MVC設(shè)計模式:顯示層(View):主要負責(zé)接受Servlet傳遞的內(nèi)容,調(diào)用JavaBean,將內(nèi)容顯示給用戶

    控制層(Controller):主要負責(zé)所有用戶的請求參數(shù),判斷請求參數(shù)是否合法,根據(jù)請求的類型調(diào)用JavaBean,將最終的處理結(jié)果交給顯示層顯示!

    模型層(Mode):模型層包括了業(yè)務(wù)層,DAO層。

    應(yīng)用例子:

    我們使用MVC模式開發(fā)一個簡單的用戶登陸注冊的案例吧!作為一個簡單的用戶登陸注冊,這里就直接使用XML文檔當(dāng)作小型數(shù)據(jù)庫吧!

    ①搭建開發(fā)環(huán)境導(dǎo)入相對應(yīng)的開發(fā)包

    創(chuàng)建程序的包名

    創(chuàng)建xml文件,當(dāng)做小型的數(shù)據(jù)庫

    ②開發(fā)實體Userprivate int id;

    private String username;

    private String password;

    private String email;

    private Date birthday;

    //....各種setter、getter

    ③開發(fā)dao這個根據(jù)業(yè)務(wù)來開發(fā),我們是登陸注冊,那應(yīng)該提供什么功能呢?注冊(外界傳遞一個User對象進來,我可以在XML文檔多一條信息)。登陸(外界傳遞用戶名和密碼過來,我就在XML文檔中查找有沒該用戶名和密碼,如果有就返回一個User對象)

    3.1登陸功能://外界傳遞用戶名和密碼進來,我要在XML文檔中查找是否有該條記錄

    public User find(String username, String password) {

    //得到XML文檔的流對象

    InputStream inputStream = UserImplXML.class.getClassLoader().getResourceAsStream("user.xml");

    //得到dom4j的解析器對象

    SAXReader saxReader = new SAXReader();

    try {

    //解析XML文檔

    Document document = saxReader.read(path);

    //使用XPATH技術(shù),查找XML文檔中是否有傳遞進來的username和password

    Element element = (Element) document.selectSingleNode("//user[@username='" + username + "' and@password='" + password + "']");

    if (element == null) {

    return null;

    }

    //如果有,就把XML查出來的節(jié)點信息封裝到User對象,返回出去

    User user = new User();

    user.setId(Integer.parseInt(element.attributeValue("id")));

    user.setUsername(element.attributeValue("username"));

    user.setPassword(element.attributeValue("password"));

    user.setEmail(element.attributeValue("email"));

    //生日就需要轉(zhuǎn)換一下了,XML文檔保存的是字符串,User對象需要的是Date類型

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd");

    Date birthday = simpleDateFormat.parse(element.attributeValue("birthday"));

    user.setBirthday(birthday);

    //返回User對象出去

    return user;

    } catch (DocumentException e) {

    e.printStackTrace();

    throw new RuntimeException("初始化時候出錯啦!");

    } catch (ParseException e) {

    e.printStackTrace();

    throw new RuntimeException("查詢的時候出錯啦!");

    }

    }做完一個功能,最好就測試一下,看有沒有錯誤再繼續(xù)往下寫!private String username = "zhongfucheng";

    private String password = "123";

    @Test

    public void testLogin() {

    UserImplXML userImplXML = new UserImplXML();

    User user = userImplXML.find(username, password);

    System.out.println(user.getBirthday());

    System.out.println(user.getEmail());

    System.out.println(user.getId());

    System.out.println(user.getUsername());

    System.out.println(user.getPassword());

    }效果:

    3.2注冊功能//注冊功能,外界傳遞一個User對象進來。我就在XML文檔中添加一條信息

    public void register(User user) {

    //獲取XML文檔路徑!

    String path = UserImplXML.class.getClassLoader().getResource("user.xml").getPath();

    try {

    //獲取dom4j的解析器,解析XML文檔

    SAXReader saxReader = new SAXReader();

    Document document = saxReader.read(path);

    //在XML文檔中創(chuàng)建新的節(jié)點

    Element newElement = DocumentHelper.createElement("user");

    newElement.addAttribute("id", String.valueOf(user.getId()));

    newElement.addAttribute("username", user.getUsername());

    newElement.addAttribute("email", user.getEmail());

    newElement.addAttribute("password", user.getPassword());

    //日期返回的是指定格式的日期

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd");

    String date = simpleDateFormat.format(user.getBirthday());

    newElement.addAttribute("birthday",date);

    //把新創(chuàng)建的節(jié)點增加到父節(jié)點上

    document.getRootElement().add(newElement);

    //把XML內(nèi)容中文檔的內(nèi)容寫到硬盤文件上

    OutputFormat outputFormat = OutputFormat.createPrettyPrint();

    outputFormat.setEncoding("UTF-8");

    XMLWriter xmlWriter = new XMLWriter(new FileWriter(path),outputFormat);

    xmlWriter.write(document);

    xmlWriter.close();

    } catch (DocumentException e) {

    e.printStackTrace();

    throw new RuntimeException("注冊的時候出錯了!!!");

    } catch (IOException e) {

    e.printStackTrace();

    throw new RuntimeException("注冊的時候出錯了!!!");

    }

    }我們也測試一下有沒有錯誤!@Test

    public void testRegister() {

    UserImplXML userImplXML = new UserImplXML();

    //這里我為了測試的方便,就添加一個帶5個參數(shù)的構(gòu)造函數(shù)了!

    User user = new User(10, "nihao", "123", "sina@qq.com", new Date());

    userImplXML.register(user);

    }注意!測試的結(jié)果是在classes目錄下的user.xml文件查詢的!因為我們是用Test來測試代碼,讀取XML文件時使用的是類裝載器的方法,在編譯后,按照WEB的結(jié)構(gòu)目錄,XML文件的讀寫是在WEB-INF的classes目錄下的!

    DAO的實現(xiàn)已經(jīng)開發(fā)完成了,接下來我們就對DAO的實現(xiàn)進行抽取。【當(dāng)然了,也可以先寫DAO再寫DAO的實現(xiàn)】

    ④開發(fā)service層

    service層的開發(fā)就非常簡單了!上面已經(jīng)說了,service層就是:將多個原子性的DAO操作進行組合,組合成一個完整的業(yè)務(wù)邏輯。簡單來說:對web層提供所有的業(yè)務(wù)服務(wù)的!

    在邏輯代碼不是非常復(fù)雜的情況下,我們可以沒有service層的,這里還是演示一下吧!public class UserServiceXML {

    //Service層就是調(diào)用Dao層的方法,我們就直接在類中創(chuàng)建Dao層的對象了

    UserDao userImplXML = new UserImplXML();

    public void register(User user) {

    userImplXML.register(user);

    }

    public void login(String username, String password) {

    userImplXML.find(username, password);

    }

    }當(dāng)然了,為了更好的解耦,也把它抽取成接口!

    ⑤開發(fā)web層

    5.1我們來先做注冊的界面吧!提供注冊界面的Servletpublic class RegisterUIServlet extends javax.servlet.http.HttpServlet {

    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

    //直接跳轉(zhuǎn)到顯示注冊界面的JSP

    request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response);

    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

    this.doPost(request, response);

    }

    }開發(fā)注冊界面的JSP歡迎來到注冊界面!

    用戶名

    密碼

    確認密碼

    郵箱

    生日JSP頁面是這樣子的

    接下來,我們要開發(fā)處理用戶注冊提交的Servlet//首先要接受Parameter的參數(shù),封裝到User里面去

    String username = request.getParameter("username");

    String password = request.getParameter("password");

    //......如果參數(shù)過多,我們就要寫好多好多類似的代碼了...此時,我們應(yīng)該想起反射機制中的BeanUtils開發(fā)包..為了更好地重用,我就將它寫成一個工具類!/*

    * 將Parameter參數(shù)的數(shù)據(jù)封裝到Bean中,為了外邊不用強轉(zhuǎn),這里就使用泛型了!

    *

    * @request ? 由于要獲取的是Parameter參數(shù)的信息,所以需要有request對象

    * @tClass ? ?本身是不知道封裝什么對象的,所以用class

    *

    * */

    public static T request2Bean(HttpServletRequest httpServletRequest, Class tClass) {

    try {

    //創(chuàng)建tClass的對象

    T bean = tClass.newInstance();

    //獲取得到Parameter中全部的參數(shù)的名字

    Enumeration enumeration = httpServletRequest.getParameterNames();

    //遍歷上邊獲取得到的集合

    while (enumeration.hasMoreElements()) {

    //獲取得到每一個帶過來參數(shù)的名字

    String name = (String) enumeration.nextElement();

    //獲取得到值

    String value = httpServletRequest.getParameter(name);

    //把數(shù)據(jù)封裝到Bean對象中

    BeanUtils.setProperty(bean, name, value);

    }

    return bean;

    } catch (Exception e) {

    e.printStackTrace();

    throw new RuntimeException("封裝數(shù)據(jù)到Bean對象中出錯了!");

    }

    }經(jīng)過我們測試,日期不能直接封裝到Bean對象中,會直接報出異常!

    對于日期而言,需要一個日期轉(zhuǎn)換器。當(dāng)BeanUtils的setProperty()方法檢測到日期時,會自動調(diào)用日期轉(zhuǎn)換器對日期進行轉(zhuǎn)換,從而實現(xiàn)封裝!

    于是乎,就在上面的方法中添加以下一句代碼//日期轉(zhuǎn)換器

    ConvertUtils.register(new DateLocaleConverter(), Date.class);還有一個問題,用戶的id不是自己輸入的,是由程序生成的。我們避免id的重復(fù),就使用UUID生成用戶的id吧!為了更好的重用,我們也把它封裝成一個方法!/*生成ID*/

    public static int makeId() {

    return Integer.parseInt(UUID.randomUUID().toString());

    }好的,我們來測試一下吧!以下是RegisterServlet的代碼User user = WebUtils.request2Bean(request, User.class);

    user.setId(WebUtils.makeId());

    //調(diào)用service層的注冊方法,實現(xiàn)注冊

    ServiceBussiness serviceBussiness = new UserServiceXML();

    serviceBussiness.register(user);效果:

    上面的代碼是不夠完善的(沒有校驗用戶輸入的信息、注冊成功或失敗都沒有給出提示..等等)下面,我們來校驗用戶輸入的信息吧,如果用戶輸入的信息不合法,就直接跳轉(zhuǎn)回注冊的界面。

    剛才我們是用BeanUtils把Parameter的信息全部直接封裝到User對象中,但現(xiàn)在我想要驗證用戶提交表單的數(shù)據(jù),也應(yīng)該把表單的數(shù)據(jù)用一個對象保存著【面向?qū)ο蟮乃枷搿⒎庋b、重用】

    流程是這樣子的:當(dāng)用戶提交表單數(shù)據(jù)的時候,就把表單數(shù)據(jù)封裝到我們設(shè)計的表單對象上,調(diào)用表單對象的方法,驗證數(shù)據(jù)是否合法!

    好了,我們來開發(fā)一個表單的對象吧,最重要的是怎么填寫validate()方法!!public class FormBean {

    //表單提交過來的數(shù)據(jù)全都是String類型的,birthday也不例外!

    private String username;

    private String password;

    private String password2;

    private String email;

    private String birthday;

    /*用于判斷表單提交過來的數(shù)據(jù)是否合法*/

    public boolean validate() {

    return false;

    }

    //......各種setter、getter方法

    }以下是我定下的規(guī)則:

    方法的代碼如下:public boolean validate() {

    //用戶名不能為空,并且要是3-8的字符 abcdABcd

    if (this.username == null || this.username.trim().equals("")) {

    return false;

    } else {

    if (!this.username.matches("[a-zA-Z]{3,8}")) {

    return false;

    }

    }

    //密碼不能為空,并且要是3-8的數(shù)字

    if (this.password == null || this.password.trim().equals("")) {

    return false;

    } else {

    if (!this.password.matches("\\d{3,8}")) {

    return false;

    }

    }

    //兩次密碼要一致

    if (this.password2 != null && !this.password2.trim().equals("")) {

    if (!this.password2.equals(this.password)) {

    return false;

    }

    }

    //郵箱可以為空,如果為空就必須合法

    if (this.email != null && !this.email.trim().equals("")) {

    if (!this.email.matches("\\w+@\\w+(\\.\\w+)+")) {

    System.out.println("郵箱錯誤了!");

    return false;

    }

    }

    //日期可以為空,如果為空就必須合法

    if (this.birthday != null && !this.birthday.trim().equals("")) {

    try {

    DateLocaleConverter dateLocaleConverter = new DateLocaleConverter();

    dateLocaleConverter.convert(this.birthday);

    } catch (Exception e) {

    System.out.println("日期錯誤了!");

    return false;

    }

    }

    //如果上面都沒有執(zhí)行,那么就是合法的了,返回true

    return true;

    }處理表單數(shù)據(jù)的Servlet,代碼是這樣子的://將表單的數(shù)據(jù)封裝到formBean中

    FormBean formBean = WebUtils.request2Bean(request, FormBean.class);

    //驗證表單的數(shù)據(jù)是否合法,如果不合法就跳轉(zhuǎn)回去注冊的頁面

    if(formBean.validate()==false){

    request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response);

    return;

    }

    try {

    //將表單的數(shù)據(jù)封裝到User對象中

    User user = WebUtils.request2Bean(request, User.class);

    user.setId(WebUtils.makeId());

    //調(diào)用service層的注冊方法,實現(xiàn)注冊

    ServiceBussiness serviceBussiness = new UserServiceXML();

    serviceBussiness.register(user);

    } catch (Exception e) {

    e.printStackTrace();

    }接下來我們測試一下吧!將所有的信息都按照規(guī)定的輸入!

    沒有問題!已經(jīng)將記錄寫到XML文件上了!

    但是,如果我沒有輸入日期呢?

    它拋出了錯誤!原因也非常簡單:表單數(shù)據(jù)提交給Servlet,Servlet將表單的數(shù)據(jù)(Parameter中的數(shù)據(jù))用BeanUtils封裝到User對象中,當(dāng)封裝到日期的時候,發(fā)現(xiàn)日期為null,無法轉(zhuǎn)換成日期對象!

    那我們現(xiàn)在要怎么解決呢?

    首先我們要明確:因為我們在設(shè)定的時候,已經(jīng)允許了email和birthday可以為空,那么在DAO層就應(yīng)該有相應(yīng)的邏輯判斷email和birthday是否為空!if (user.getEmail() == null) {

    newElement.addAttribute("email", "");

    } else {

    newElement.addAttribute("email", user.getEmail());

    }

    //如果不是空才格式化信息

    if (user.getBirthday() != null) {

    //日期返回的是指定格式的日期

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

    String date = simpleDateFormat.format(user.getBirthday());

    newElement.addAttribute("birthday", date);

    } else {

    newElement.addAttribute("birthday", "");

    }

    解決辦法:Parameter中的數(shù)據(jù)如果是"",我就不把數(shù)據(jù)封裝到User對象中,執(zhí)行下一次循環(huán)!public static T request2Bean(HttpServletRequest httpServletRequest, Class tClass) {

    try {

    //創(chuàng)建tClass的對象

    T bean = tClass.newInstance();

    //獲取得到Parameter中全部的參數(shù)的名字

    Enumeration enumeration = httpServletRequest.getParameterNames();

    //日期轉(zhuǎn)換器

    ConvertUtils.register(new DateLocaleConverter(), Date.class);

    //遍歷上邊獲取得到的集合

    while (enumeration.hasMoreElements()) {

    //獲取得到每一個帶過來參數(shù)的名字

    String name = (String) enumeration.nextElement();

    //獲取得到值

    String value = httpServletRequest.getParameter(name);

    //如果Parameter中的數(shù)據(jù)為"",那么我就不封裝到User對象里邊去!執(zhí)行下一次循環(huán)

    if (value == "") {

    continue;

    } else {

    //把數(shù)據(jù)封裝到Bean對象中

    BeanUtils.setProperty(bean, name, value);

    }

    }

    return bean;

    } catch (Exception e) {

    e.printStackTrace();

    throw new RuntimeException("封裝數(shù)據(jù)到Bean對象中出錯了!");

    }

    }效果:

    將數(shù)據(jù)封裝到User對象中還有另外一個辦法:我們知道BeanUtils有個copyProperties()方法,可以將某個對象的成員數(shù)據(jù)拷貝到另外一個對象的成員變量數(shù)據(jù)上(前提是成員變量的名稱相同!)我們FormBean對象的成員變量名稱和User對象的成員變量的名稱是一致的!并且,前面在驗證的時候,我們已經(jīng)把Parameter中帶過來的數(shù)據(jù)封裝到了FormBean對象中了,所以我們可以使用copyProperties()方法!

    使用該方法時,值得注意的是:第一個參數(shù)是拷貝到哪一個對象上(也就是User對象),第二個參數(shù)是被拷貝的對象(也就是formbean對象),口訣:后拷前....不要搞混了!!!!!(我就是搞混了,弄了很久...)

    處理表單的Servlet完整代碼如下://將表單的數(shù)據(jù)封裝到formBean中

    FormBean formBean = WebUtils.request2Bean(request, FormBean.class);

    //驗證表單的數(shù)據(jù)是否合法,如果不合法就跳轉(zhuǎn)回去注冊的頁面

    if(formBean.validate()==false){

    request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response);

    return;

    }

    try {

    //這是第一種--------------------------

    /*User user = new User();

    user.setId(WebUtils.makeId());

    BeanUtils.copyProperties(user,formBean);*/

    //------------------------------------------

    //這是第二種

    User user1 = WebUtils.request2Bean(request,User.class);

    user1.setId(WebUtils.makeId());

    //-----------------------------------

    //調(diào)用service層的注冊方法,實現(xiàn)注冊

    ServiceBussiness serviceBussiness = new UserServiceXML();

    serviceBussiness.register(user1);

    } catch (Exception e) {

    e.printStackTrace();

    }

    現(xiàn)在還有問題,如果我填寫信息不合法,提交給服務(wù)器驗證以后,服務(wù)器應(yīng)該告訴用戶哪個信息不合法,而不是直接把跳轉(zhuǎn)回注冊界面,把所有的信息全部清空,讓用戶重新填寫!

    我們應(yīng)該這樣做:當(dāng)發(fā)現(xiàn)用戶輸入的信息不合法時,把錯誤的信息記錄下來,等到返回注冊頁面,就提示用戶哪里出錯了!在FormBean對象中添加一個HashMap集合(因為等會還要根據(jù)關(guān)鍵字把錯誤信息顯示給用戶!)

    FormBean的全部代碼如下://表單提交過來的數(shù)據(jù)全都是String類型的,birthday也不例外!

    private String username;

    private String password;

    private String password2;

    private String email;

    private String birthday;

    //記錄錯誤的信息

    private HashMap error = new HashMap<>();

    /*用于判斷表單提交過來的數(shù)據(jù)是否合法*/

    public boolean validate() {

    //用戶名不能為空,并且要是3-8的字符 abcdABcd

    if (this.username == null || this.username.trim().equals("")) {

    error.put("username", "用戶名不能為空,并且要是3-8的字符");

    return false;

    } else {

    if (!this.username.matches("[a-zA-Z]{3,8}")) {

    error.put("username", "用戶名不能為空,并且要是3-8的字符");

    return false;

    }

    }

    //密碼不能為空,并且要是3-8的數(shù)字

    if (this.password == null || this.password.trim().equals("")) {

    error.put("password", "密碼不能為空,并且要是3-8的數(shù)字");

    return false;

    } else {

    if (!this.password.matches("\\d{3,8}")) {

    error.put("password", "密碼不能為空,并且要是3-8的數(shù)字");

    return false;

    }

    }

    //兩次密碼要一致

    if (this.password2 != null && !this.password2.trim().equals("")) {

    if (!this.password2.equals(this.password)) {

    error.put("password2", "兩次密碼要一致");

    return false;

    }

    }

    //郵箱可以為空,如果為空就必須合法

    if (this.email != null && !this.email.trim().equals("")) {

    if (!this.email.matches("\\w+@\\w+(\\.\\w+)+")) {

    error.put("email", "郵箱不合法!");

    return false;

    }

    }

    //日期可以為空,如果為空就必須合法

    if (this.birthday != null && !this.birthday.trim().equals("")) {

    try {

    DateLocaleConverter dateLocaleConverter = new DateLocaleConverter();

    dateLocaleConverter.convert(this.birthday);

    } catch (Exception e) {

    error.put("birthday", "日期不合法!");

    return false;

    }

    }

    //如果上面都沒有執(zhí)行,那么就是合法的了,返回true

    return true;

    }

    //.....各種的setter和getter在跳轉(zhuǎn)到注冊頁面之前,把formbean對象存到request域中。在注冊頁面就可以把錯誤的信息取出來(使用EL表達式)!

    處理表單的Servlet的部分代碼//驗證表單的數(shù)據(jù)是否合法,如果不合法就跳轉(zhuǎn)回去注冊的頁面

    if(formBean.validate()==false){

    //在跳轉(zhuǎn)之前,把formbean對象傳遞給注冊頁面

    request.setAttribute("formbean", formBean);

    request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response);

    return;

    }在注冊頁面中,使用EL表達式把錯誤的信息寫出來

    測試:

    效果:

    做到這里,還是有丟丟的問題,我們不應(yīng)該把用戶輸入的數(shù)據(jù)全部清空的!你想想,如果用戶注冊需要輸入多個信息,僅僅一個出錯了,就把全部信息清空,要他重新填寫,這樣是不合理的!我們在各個的輸入項中使用EL表達式回顯數(shù)據(jù)就行了!

    效果:

    還沒有完善,細心的朋友可以發(fā)現(xiàn),上面圖的日期也是錯誤的,但是沒一次性標(biāo)記出來給用戶!要改也十分簡單:在驗證的時候,不要先急著return false 用一個布爾型變量記住,最后返回布爾型的變量即可

    無論注冊成功還是失敗都需要給用戶一個友好界面的!

    5.2登陸界面

    登陸和注冊是類似的,我們按著注冊的步驟來寫就對了!

    首先寫一個提供登陸界面的Servlet//直接跳轉(zhuǎn)到登陸界面

    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);寫登陸界面這是登陸界面

    用戶名

    密碼寫處理登陸表單的Servlet//獲取提交過來的數(shù)據(jù)

    String username = request.getParameter("username");

    String password = request.getParameter("password");

    //調(diào)用service層的方法,去查詢數(shù)據(jù)庫(XML)是否有該條記錄

    try {

    ServiceBussiness serviceBussiness = new UserServiceXML();

    User user = serviceBussiness.login(username, password);

    if (user == null) {

    request.setAttribute("message", "用戶名或密碼是錯的");

    } else {

    request.setAttribute("message","登陸成功");

    }

    } catch (Exception e) {

    e.printStackTrace();

    request.setAttribute("message","登陸失敗咯");

    }

    request.getRequestDispatcher("/message.jsp").forward(request, response);效果:

    5.3把注冊和登陸都掛在首頁上這是首頁!

    登陸

    注冊

    總結(jié)使用JSP+JavaBean開發(fā)一個簡單計算器,是非常容易的,顯示頁面和請求都是交由JSP來做。沒有什么新的知識點,用一些JSP行為就能完成了。

    MVC模式開發(fā)使用Servlet來做處理請求,代碼量略大,但層次清晰

    使用BeanUtils開發(fā)組件可以將request請求的參數(shù)封裝到JavaBean對象中,Date屬性要另外處理

    校驗的功能也是使用一個JavaBean來完成,目的就是為了可重用性,職責(zé)分工。同時,我們可以在該JavaBean設(shè)置一個Map集合來保存錯誤的信息,以便在前臺上展示錯誤信息。如果文章有錯的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章的同學(xué),可以關(guān)注微信公眾號:Java3y

    總結(jié)

    以上是生活随笔為你收集整理的web中hasmoreelements_Web开发模式【Mode I 和Mode II的介绍、应用案例】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。