一 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/css" href="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>
密 碼
</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/css" href="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類的一個實例