JSP的開發與設計模式

一   JSP的設計模式

1.MVC模式的概念:

(1)在開發一個軟件之前,必須先設計好其架構,一個基本的架構思想是將軟件分成不同的模塊,問題的關鍵就是如何劃分模塊。

(2)MVC(模型-視圖-控制器)是20世紀80年代爲Smalltalk-80編程語言發明的一種軟件設計模式,它是一種分離業務邏輯與顯示界面的設計方法。

(3)MVC的模型(Model)部分負責管理程序的業務數據,視圖(View)部分負責顯示界面,控制器(Controller)部分則負責與用戶進行交互(接受請求和選擇響應視圖)。

圖示、:

二  JSP的開發模式

1.開發模式的介紹 

JSP規範給出了使用JSP頁面構建Web應用程序的兩個方案—JSP模式1和模式2兩個模式的區別在於處理的位置。

2.兩個開發模式的介紹:

(1)JSP模式1(JSP + JavaBean):在模式1的體系結構中,JSP頁面負責處理請求並將響應發送給客戶端。圖示:

   

注:jsp既包含輸出效果的html+css代碼,又包含業務邏輯的Java代碼

      JavaBean是封裝對數據庫的操作代碼和部分的業務邏輯代碼

模式1的運行流程:

    首先用戶通過瀏覽器調用Web應用中的JSP頁面,發送request請求,JSP頁面接收到瀏覽器的請求後,通過調用JavaBean對象的方法從數據庫中讀取數據,然後JSP頁面再把數據返回瀏覽器,最終在瀏覽器中顯示相應的信息。

模式1的優點:

   非常適合小型Web項目的快速開發;對Java Web開發人員的技術要求不高。

模式1的弊端:

    Java和HTML柔和在一起,在Web項目開發的後期和維護階段會造成很大的困難。

模式1的模式實例---用來實現用戶登入,用到的是jsp和javaBean的設計:

實現思路---圖示:

      

圖解:

(1)logon.jsp爲顯示登錄表單和處理登錄請求的頁面,登錄成功後跳轉到logonSuccess.jsp頁面,登錄失敗時重新顯示登錄表單和失敗的幫助信息,以便用戶重新登錄;如果已登錄用戶再次訪問logon.jsp,login.jsp將請求轉發給logonSuccess.jsp頁面。

(2)LogonFormBean.java就是封裝登錄表單信息的JavaBean程序,它可以對各個屬性(也就是登錄表單內的各個字段中所填寫的數據)進行語法格式方面的校驗。

(3)UserBean.java爲代表用戶信息的JavaBean程序,logon.jsp頁面根據登錄信息從DbUtil對象中檢索出相應的UserBean對象,logonSuccess.jsp頁面從   UserBean對象中提取用戶信息顯示。

(4)DbUtil.java是用於訪問數據庫的輔助類,它相當於一個DAO(數據訪問對象),這裏用DbUtil類中封裝的一個HashTable對象來代替數據庫,HashTable對象中的每一個元素即爲一個UserBean對象。

(5)UserBean中僅僅是定義了三個屬性:name、password和email。注意:要存儲在Session域中或跨JVM傳輸的JavaBean應實現Serializable接口

•    DbUtil類是一個單件類,在整個Web應用程序中只能創建DbUtil類的一個實例對象,在DbUtil類內部預存儲了兩個用戶信息來模擬數據庫中的用戶記錄。

•    LogonFormBean對其中的每個屬性進行基本的格式驗證,如果有誤則將相應的錯誤信息保存到一個HashTable對象中,同時也定義了供JSP頁面檢索錯誤信息的 方法。

代碼:

首先創建UserBean.java----表單的詳細信息存儲在userBeaan中

package com.csdn.beans;

public class UserBean {

    private String name;

    private String password;

    private String email;

    public UserBean() {

       super();

       // TODO Auto-generated constructor stub

    }

    public UserBean(String name, String password, String email) {

       super();

       this.name = name;

       this.password = password;

       this.email = email;

    }

    public String getName() {

       return name;

    }

    public void setName(String name) {

       this.name = name;

    }

    public String getPassword() {

       return password;

    }

    public void setPassword(String password) {

       this.password = password;

    }

    public String getEmail() {

       return email;

    }

    public void setEmail(String email) {

       this.email = email;

    }

    @Override

    public String toString() {

       return "UserBean [email=" + email + ", name=" + name + ", password="

              + password + "]";

    }

    //驗證方法

    public boolean validatePassword(String password){

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

           return true;

       }else{

           return false;

       }

    }

創建LoginFormBean.java-----把表單中的信息封裝到一個類中,驗證輸入的格式是否正確

package com.csdn.beans;

import java.util.Hashtable;

 

public class LoginFormBean {

    private String name;

    private String password;

    // 存儲所有的錯誤消息,通過鍵值對存儲

    private Hashtable errors = newHashtable();

 

    public LoginFormBean() {

       super();

       // TODO Auto-generated constructor stub

    }

 

    public LoginFormBean(String name, String password) {

       super();

       this.name = name;

       this.password = password;

    }

 

    public String getName() {

       return name;

    }

 

    public void setName(String name) {

       this.name = name;

    }

 

    public String getPassword() {

       return password;

    }

 

    public void setPassword(String password) {

       this.password = password;

    }

 

    @Override

    public String toString() {

       return "LoginFormBean [name=" + name + ", password=" + password + "]";

    }

 

    // 驗證用戶輸入的用戶名和密碼是否存在,是語法格式的驗證

    public boolean validate() {

       boolean allOk = true;

       // trim()去掉兩邊的空串

 

       if (name.trim().equals("")) {

           errors.put("name", "用戶名爲空,請重新輸入你的用戶名");

 

           allOk = false;

       }

       if (password.length() > 10 || password.length() < 6) {

           errors.put("password", "密碼不能爲空,或密碼的位數沒有在指定的範圍,請重新輸入");

           allOk = false;

       }

       return allOk;

    }

 

    // 錯誤消息的插入

    public void setErrorMsg(String err, String errMsg) {

       if (err != null || errMsg !=null) {

           errors.put(err, errMsg);

       }

    }

 

    // 錯誤消息的設置

    public String getErrorMsg(String err) {

       String errMsg = (String) errors.get(err);

       return (errMsg == null) ? "" : errMsg;

    }

}

 

創建login.jsp 來對用戶進行驗證

    <%@ page language="java"

    import="java.util.*,com.csdn.beans.*,com.csdn.util.*"

    pageEncoding="utf-8"%>

<%

    String path = request.getContextPath();

    String basePath = request.getScheme() + "://"

           + request.getServerName() + ":" + request.getServerPort()

           + path + "/";

%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

    <head>

       <base href="<%=basePath%>">

 

       <title>My JSP 'login.jsp' starting page</title>

 

       <meta http-equiv="pragma" content="no-cache">

       <meta http-equiv="cache-control" content="no-cache">

       <meta http-equiv="expires" content="0">

       <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

       <meta http-equiv="description" content="This is my page">

       <!--

    <link rel="stylesheet" type="text/csshref="styles.css">

    -->

 

    </head>

 

    <body>

       <%

           request.setCharacterEncoding("utf-8");

       %>

       <!-- 在當前的會話範圍內,如果用戶已經登入,應該轉向到loginSuccess.jsp -->

       <%

           if (session.getAttribute("user") != null) {

       %>

       <jsp:forward page="loginSuccess.jsp"></jsp:forward>

       <%

           }

       %>

 

       <!-- 用戶信息的驗證,用戶的賬號和密碼應該封裝在loginFormBean對象中,有基本的語法格式的驗證,用戶的名字和密碼是否正確,如果不正確,跳轉到當前的頁面中來  -->

 

       <jsp:useBean id="loginForm" class="com.csdn.beans.LoginFormBean"

           scope="page"></jsp:useBean>

       <jsp:setProperty property="*" name="loginForm" />

       <!-- 條件判定 -->

       <%

           if (request.getParameter("submit") !=null) {

              //基本語法格式的驗證,用戶名是不是字符,是不是爲空

              if (loginForm.validate()) {

                  //驗證用戶名和密碼是否是合法的

                  DbUtil util = DbUtil.getInstance();

                  UserBean user = util.getUser(loginForm.getName());

                  if (user == null) {

                     loginForm.setErrorMsg("name", "用戶名不存在");

                  } else {

                     if (user.validatePassword(loginForm.getPassword())) {

                         // 登入成功

                         session.setAttribute("user", user);

                         pageContext.forward("loginSuccess.jsp");

                     } else {

                         //用戶名存在但是密碼不對

                         loginForm.setErrorMsg("password", "密碼錯誤!");

                     }

                  }

              }

           }

       %>

 

       <!-- 表單的顯示 -->

       <form action="login.jsp" method="post">

           <table border="1px">

              <tr>

                  <td>

                     用戶名

                  </td>

                  <td>

                     <input type="text" name="name" />

                  </td>

                  <td>

                     <%=loginForm.getErrorMsg("name") %>

                  </td>

               </tr>

              <tr>

                  <td>

                     密&nbsp;&nbsp;碼

                  </td>

                  <td>

                     <input type="password" name="password" />

                  </td>

                  <td style="font-size:red;">

                     <%=loginForm.getErrorMsg("password") %>

                  </td>

              </tr>

              <tr>

                  <td>

                     <input type="submit" value="submit" name="submit" />

                  </td>

                  <td>

                     <input type="reset" value="reset" name="reset" />

                  </td>

                  <td></td>

              </tr>

           </table>

       </form>

    </body>

</html>

 

創建loginSuccess.jsp---用來顯示跳轉成功頁面

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <base href="<%=basePath%>">

   

    <title>My JSP 'loginSuccess.jsp' starting page</title>

   

    <meta http-equiv="pragma" content="no-cache">

    <meta http-equiv="cache-control" content="no-cache">

    <meta http-equiv="expires" content="0">   

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="This is my page">

    <!--

    <link rel="stylesheet" type="text/csshref="styles.css">

    -->

 

  </head>

 

  <body>

    <!-- 顯示用戶的詳細信息 -->

    <jsp:useBean id="user" class="com.csdn.beans.UserBean" scope="session"></jsp:useBean>

    <jsp:getProperty property="name" name="user"/><br/>

    <jsp:getProperty property="password" name="user"/><br/>

    <jsp:getProperty property="email" name="user"/><br/>

    <!-- 註銷操作 -->

    <a href="login.jsp">註銷用戶</a>

  </body>

</html>

 

補充:

(1)設置和獲取jsp中的初始化參數---用application對象

PageContext執行forword和include

ServiceContext application.setAttribute(“”,””);

String encoding = application.getInitParameter(“encoding”);

 

(2)Servlet對象

 Page對象提供對網頁上定義的所有對象的訪問,page對象表頁面本身,他是java.lang.Object類的一個實例

發佈了10 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章