1 Servlet簡介 Servlet(服務端小程式)是使用Java語言編寫的服務端小程式,可以像JSP一樣,生成動態的Web頁; Servlet運行在伺服器端,並由伺服器調用執行,是一種按照Servlet標準開發的類; Servlet程式是Java對CGI程式的實現,與傳統的CGI程式的多線程處理 ...
1 Servlet簡介
Servlet(服務端小程式)是使用Java語言編寫的服務端小程式,可以像JSP一樣,生成動態的Web頁;
Servlet運行在伺服器端,並由伺服器調用執行,是一種按照Servlet標準開發的類;
Servlet程式是Java對CGI程式的實現,與傳統的CGI程式的多線程處理操作不同的是,Servlet採用多線程的處理方式;
使得Servlet程式的運行效率比傳統的CGI更高;
Servlet保留有Java的可移植性的特點,使得更易使用,功能更加強大;
Servlet程式將按照如下步驟進行處理:
a 客戶端(可能是Web瀏覽器)通過HTTP提出請求;
b Web伺服器接受到該請求並將其發送給Servle;如果這個Servlet尚未被載入,Web伺服器將把它載入到Java虛擬機並執行它;
c Servlet程式將接受該HTTP請求並執行某種處理;
d Servlet會將處理後的結果想Web伺服器返回應答;
e Web伺服器將收到的應答發回給客戶端;
在整個Servlet程式中最重要的Servlet介面,此介面下定義了一個GenericServlet的子類;
但是一般不會直接繼承此類,而是根據所使用的協議選擇GenericServlet的子類繼承;
eg : 採用HTTP協議處理,一般而言當需要使用HTTP協議操作時用戶自定義的Servlet類都要繼承HttpServlet類;
2 第一個Servlet程式
開發一個可以處理HTTP請求的Servlet程式,則肯定要繼承HttpServlet類;
而且自定義的類至少還要覆寫HttpServlet類中提供的doGet()方法;
HttpServlet類中的方法:
public void doGet(HttpServletRequest reg,HttpServletResponse resp)throws ServletException,IOException 負責處理所有的get請求;
Servlet程式本身也是按照請求和應答的方式進行的,所以在doGet()方法中定義了兩個參數;
即HttpServletRequest和HttpServletResponse,用來接收和回應用戶的請求;
HelloServlet.java : 第一個Servlet程式
package org.shi.servletdemo ; import java.io.* ; import javax.servlet.* ; import javax.servlet.http.* ; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ PrintWriter out = resp.getWriter() ; out.println("<html>") ; out.println("<head><title>第一個Servlet程式</title></head>") ; out.println("<body>") ; out.println("<h1>HELLO WORLD</h1>") ; out.println("</body>") ; out.println("</html>") ; out.close() ; } }
以上代碼首先從HttpServletResponse對象中取得一個輸出流對象,然後通過列印流輸出HTML元素;
一個Servlet程式編譯完成後,實際上是無法立即訪問的,因為所有的Servlet程式都是以.class的形式存在的;
所以需要在WEB-INF\web.xml文件中進行Servlet程式的映射配置;
配置web.xml文件
<servlet> <servlet-name>hello</servlet-name> <servlet-class>org.shi.servletdemo.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/helloServlet</url-pattern> </servlet-mapping>
以上配置表示,通過/helloServlet路徑即可找到對應的<servlet>節點,並找到<servlet-class>所指定的Servlet程式的“包.類”名稱;
每次修改web.xml文件後,都要重新啟動伺服器,這樣新的配置才可以起作用;
在實際中通過Servlet完成頁面的輸出顯示並不是一件很方便的事,這也是jsp存在的原因,Servlet在開發中並不能作為輸出顯示使用;
3 Servlet與表單
Servlet本身也存在HttpServletRequest和HttpServletResponse對象的聲明,也可以使用Servlet接收表單所提交的內容;
input.html : 定義表單
<html> <head><title>定義表單</title></head> <body> <form action="InputServlet" method="post"> 請輸入內容:<input type="text" name="info"> <input type="submit" value="提交"> </form> </body> </html>
以上代碼中,表單在提交時會提交到InputServlet路徑上,由於提交方式是post,所以在編寫Servlet程式時就得使用doPost()方法;
地址提交屬於get提交方法;
在進行Servlet開發時,如果直接通過瀏覽器輸入一個地址,對於伺服器來講就相當於客戶端的發出的get請求,會自動調用doGet()處理;
InputServlet.java : 接收用戶請求
package org.shi.servletdemo ; import java.io.* ; import javax.servlet.* ; import javax.servlet.http.* ; public class InputServlet extends HttpServlet{ public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ String info = req.getParameter("info") ; // 接收請求參數 PrintWriter out = resp.getWriter() ; out.println("<html>") ; out.println("<head><title>MLDNJAVA</title></head>") ; out.println("<body>") ; out.println("<h1>" + info + "</h1>") ; out.println("</body>") ; out.println("</html>") ; out.close() ; } public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ this.doGet(req,resp) ; } }
以上代碼由於要處理表單,所以增加doPost()方法,但是由於要處理的操作代碼主體和doGet()方法一樣;
所以直接利用this.doGet(reg,resp)繼續調用本類中的doGet()方法完成操作;
配置web.xml ,註意映射路徑
<servlet> <servlet-name>input</servlet-name> <servlet-class>org.shi.servletdemo.InputServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>input</servlet-name> <url-pattern>/InputServlet</url-pattern> </servlet-mapping>
4 Servlet生命周期
Servlet程式是運行在伺服器端的一段Java程式,其生命周期收受到Web容器的控制;
生命周期包括載入程式、初始化、服務、銷毀、卸載5個部分;
Servlet生命周期對應的方法:
各個生命周期的作用如下:
A 載入Servlet
Web容器負責載入Servlet,當Web容器啟動後或者是第一次使用這個Servlet時,容器會負責創建Servlet實例;
但是用戶必須通過部署描述符(web.xml)指定Servlet的位置(Servlet所在的包.類名稱);
成功載入後,Web容器會通過反射的方式對Servlet進行實例化;
B 初始化
當一個Servlet被實例化後,容器將調用init()方法初始化這個對象,初始化目的是為了讓Servlet對象在處理客戶端請求前完成一些初始化的操作;
如建立資料庫的連接、讀取資源文件信息等,如果初始化失敗,則此Servlet將被直接卸載;
C 處理服務
當有請求提交時,Servlet將調用service()方法(常用的是doGet()和doPost())進行處理;
在service()方法中,Servlet可以通過ServletRequest接收客戶的請求,利用ServletResponse設置響應信息;
D 銷毀
當Web容器關閉或者檢測到一個Servlet要從容器中被刪除時,會自動調用destroy()方法,以便讓該實例釋放掉所占用的資源;
E 卸載
當一個Servlet調用完destroy()方法後,此實例將等待被垃圾回收器所回收;
如果需要再次調用此 Servlet時,會重新調用init()方法初始化;
-------------------------------------------------------------------------------------------
正常情況下,Servlet只會初始化一次,而處理服務會調用多次,銷毀也只調用一次;
如果一個Servlet長時間不使用,也會被容器自動銷毀,而如果再次使用會重新進行初始化操作,及特殊情況下初始化會進行多次,銷毀也進行多次;
-------------------------------------------------------------------------------------------
LifeCycleServlet.java : 生命周期
package org.shi.servletdemo ; import java.io.* ; import javax.servlet.* ; import javax.servlet.http.* ; public class LifeCycleServlet extends HttpServlet{ public void init() throws ServletException{ System.out.println("** 1、Servlet初始化 --> init()") ; } public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ System.out.println("** 2、Servlet服務 --> doGet()、doPost()") ; } public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ this.doGet(req,resp) ; } public void destroy(){ System.out.println("** 3、Servlet銷毀 --> destory()") ; try{ Thread.sleep(3000) ; }catch(Exception e){} }/* public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException{ System.out.println("************ 服務 **************") ; } */ }
以上代碼如果覆寫了service()方法,則對應的doGet()和doPost方法就不在起作用了,而是直接使用service()方法進行處理;
因為在HttpServlet類中已經將service()方法覆寫,方法的主要功能就是區分不同的請求類型;
在web.xml中配置Servlet
<servlet> <servlet-name>life</servlet-name> <servlet-class>org.shi.servletdemo.LifeCycleServlet</servlet-class>
<load-on-startup>1</load-on-startup> <!--容器啟動時,Servlet會自動進行初始化--> </servlet> <servlet-mapping> <servlet-name>life</servlet-name> <url-pattern>/LifeServlet</url-pattern> </servlet-mapping>
5 取得初始化配置信息
JSP中有一個內置對象,通過此對象可以讀取web.xml中配置的初始化參數;
此對象實際上是ServletConfig介面的實例;可以通過init()方法找到ServletConfig介面實例;
InitParamServlet.java : 讀取初始化配置的信息
package org.lxh.servletdemo ; import java.io.* ; import javax.servlet.* ; import javax.servlet.http.* ; public class InitParamServlet extends HttpServlet { private String initParam = null ; // 用於保存初始化參數 public void init() throws ServletException{ System.out.println("*****************") ; } public void init(ServletConfig config) throws ServletException{ System.out.println("#######################") ; this.initParam = config.getInitParameter("ref") ; // 接收的初始化參數名稱暫時為ref } public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ System.out.println("** 初始化參數:" + this.initParam) ; } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ this.doGet(req,resp) ; } }
在web.xml中配置初始化信息
<servlet> <servlet-name>initparam</servlet-name> <servlet-class>org.shi.servletdemo.InitParamServlet</servlet-class> <init-param> <param-name>ref</param-name><!--參數名--> <param-value>www.baidu.com</param-value><!--參數值--> </init-param> </servlet> <servlet-mapping> <servlet-name>initparam</servlet-name> <url-pattern>/InitParamServlet</url-pattern> </servlet-mapping>
在Servlet中初始化方法有init()和init(ServletConfig config)兩個,如果兩個初始化方法同時出現,則調用的是init(ServletConfig config)方法;
6 取得其他的內置對象
通過Servlet程式可以取得session及applicatio的內置對象
6.1 取得HttpSession實例
Servlet程式中要想取得一個session對象,則可以通過HttpServletRequest介面完成;
取得HttpSession介面實例
public HttpSession getSession() 返回當前的session
public HttpSession getSession(boolean create) 返回當前的session,如果沒有則創建一個新的session對象返回
HttpSessionDemoServlet.java : 取得HttpSession對象
package org.shi.servletdemo ; import java.io.* ; import javax.servlet.* ; import javax.servlet.http.* ; public class HttpSessionDemoServlet extends HttpServlet { //繼承HttpServlet public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ HttpSession ses = req.getSession() ; //取得session System.out.println("SESSION ID --> " + ses.getId()) ; //取得session Id ses.setAttribute("username","bugshi") ; // 設置session屬性 System.out.println("username屬性內容:" + ses.getAttribute("username")) ; } public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{//處理服務 this.doGet(req,resp) ; //調用doGet() } }
配置web.xml文件
<servlet> <servlet-name>sessiondemo</servlet-name> <servlet-class> org.shi.servletdemo.HttpSessionDemoServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>sessiondemo</servlet-name> <url-pattern>/HttpSessionDemoServlet</url-pattern> </servlet-mapping>
6.2 取得ServletContext實例
application內置對象是ServleContext介面的實例,表示Servlet上下文;
如果在一個Servlet中使用此對象,直接通過GenericServlet類提供的方法即可;
public ServletContext getServletContext() 取得ServletContext對象;
ServletContextDemoServlet.java 取得ServletContext對象
package org.shi.servletdemo ; import java.io.* ; import javax.servlet.* ; import javax.servlet.http.* ; public class ServletContextDemoServlet extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ ServletContext app = super.getServletContext() ; //取得application System.out.println("真實路徑:" + app.getRealPath("/")) ; } public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ this.doGet(req,resp) ; //調用doGet() } }
配置web.xml文件
<servlet> <servlet-name>applicationdemo</servlet-name> <servlet-class>
org.shi.servletdemo.ServletContextDemoServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>applicationdemo</servlet-name> <url-pattern>/ServletContextDemoServlet</url-pattern> </servlet-mapping>
以上代碼通過getServletContext()方法取得ServletContext實例後,將虛擬路徑對應的真實路徑進行輸出;
7 Servlet跳轉
從一個jsp或者一個HTML頁面可以通過表單或者超鏈接跳轉進行Servlet,那麼從Servlet可以跳轉到Servlet、jsp頁面;
7.1 客戶端跳轉
Servlet中如果要進行客戶端跳轉,直接使用HttpServletResponse介面的sendRedirect()方法;
但是此跳轉只能傳遞session及application範圍的屬性,而無法傳遞request範圍的屬性;
ClientRedirectDemo.java
package org.shi.servletdemo ; import java.io.* ; import javax.servlet.* ; import javax.servlet.http.* ; public class ClientRedirectDemo extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ //處理服務 req.getSession().setAttribute("name","bugshi") ; //設置session屬性 req.setAttribute("info","HelloJAVA") ; //設置request屬性 resp.sendRedirect("get_info.jsp") ; //頁面跳轉 } public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ this.doGet(req,resp) ; } }
配置web.xml文件
<servlet> <servlet-name>client</servlet-name> <servlet-class> org.shi.servletdemo.ClientRedirectDemo </servlet-class> </servlet> <servlet-mapping> <servlet-name>client</servlet-name> <url-pattern>/forward/ClientRedirectDemo</url-pattern> </servlet-mapping>
get_info.jsp : 接收屬性
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head><title>接收屬性</title></head> <body> <% request.setCharacterEncoding("GBK") ; %> <h2>sesion屬性:<%=session.getAttribute("name")%></h2> <h2>request屬性:<%=request.getAttribute("info")%></h2> </body> </html>
由於是客戶端跳轉,跳轉後的地址欄會發生改變;
只能接收session屬性範圍的內容,而request範圍屬性的內容無法接收到,這也是request屬性範圍只能在伺服器端跳轉的原因;
7.2 伺服器端跳轉
在Servlet中沒有像jsp中的<jsp:forward />指令;
如果要執行伺服器端的跳轉,必須依靠RequestDispatcher介面完成;
RequestDispatcher介面提供的方法
public void forward(ServletRequest request,ServletResponse response) throws ServletException,IOException 頁面跳轉
public void include(ServletRequest request,ServletResponse response) throws ServletException,IOException 頁麵包含
使用RequestDispatcher 介面的forward()方法即可完成跳轉功能;
如果要想使用此介面還需要ServletRequest介面提供的方法進行初始化;
該方法為:
public RequestDispatcher(String path) 取得RequestDispatcher介面的實例;
ServletRedirectDemo.java
package org.shi.servletdemo ; import java.io.* ; import javax.servlet.* ; import javax.servlet.http.* ; public class ServerRedirectDemo extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ req.getSession().setAttribute("name","bugshi") ; req.setAttribute("info","HelloJAVA") ; RequestDispatcher rd = req.getRequestDispatcher("get_info.jsp") ; // 準備好了跳轉操作 rd.forward(req,resp) ; // 完成跳轉 } public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ this.doGet(req,resp) ; } }
配置web.xml文件
<servlet> <servlet-name>server</servlet-name> <servlet-class> org.shi.servletdemo.ServerRedirectDemo </servlet-class> </servlet> <servlet-mapping> <servlet-name>server</servlet-name> <url-pattern>/forward/ServerRedirectDemo</url-pattern> </servlet-mapping>
伺服器端跳轉後,頁面的路徑不會發生改變,而且此時可以在跳轉後的JSP頁面接收到session及request範圍的屬性;
8 Web開發模式:Mode I 與Mode II
8.1 Mode I
指在開發中將顯示層、控制層、數據層的操作統一交個JSP或JavaBean來進行處理;
處理情況分為兩種:①一種為完全使用jsp進行開發,②另一種是使用JSP+JavaBean的模式進行開發
① 用戶發出的請求交給JSP頁面進行處理;如果是開發小型的Web程式,為了開發快速與遍歷,通常將顯示層和邏輯運算層都寫在JSP頁面中;
優點:
開發速度快;程式設計人員不需要額外的編寫JavaBean或Servlet,只需要專註開發jsp頁面;
小幅度修改代碼較方便;因為沒有使用到JavaBean或Servlet;修改程式時,直接修改JSP後,再交給Web容器重新編輯即可;
而不同像寫JavaBean或Servlet要先將Java源文件編譯為類文件,在放到Web容器中;
缺點:
程式可讀性低;程式代碼和網頁標記都匯合在了一起,增加維護的困難度和複雜度;
程式可重覆利用性低;將所有的程式都直接寫在了JSP頁面中,並沒有把常用的程式寫成組件以增加重用性,造成程式代碼過於繁雜,難以維護;
② 將顯示操作都寫入JSP頁面,而業務層都寫成JavaBean形式,將程式代碼封裝成組件;這樣JavaBean將負責大部分的數據處理等(類似於DAO);
如執行資料庫操作等,再將數據處理後的結果返回至JSP頁面顯示;
優點:
程式可讀性較高;大部分程式代碼寫在JavaBean中,不會和網頁顯示標記匯合在一起,後期維護時較為輕鬆;
可重覆利用性較高;核心業務代碼使用JavaBean來開發,可重覆使用此組件,大大減少重覆性程式代碼的操作;
缺點:
沒有流程式控制制;每一個JSP頁面都需要檢查請求的參數是否正確,條件判斷,異常發生時的處理;
所有的顯示操作都與具體的業務代碼緊密耦合在一起,日後維護困難;
8.2 Mode II
在 Mode II中所有的開發都是以Servlet為主體展開的,由Servlet接收所有的客戶端請求,然後根據請求調用相應的JavaBean;
將所有結果交給JSP完成,也就是MVC模式;
MVC是一個設計模式,它強制性的使應用程式的輸入、處理和輸出分開;
MVC設計被分成3個核心層,即模型層、顯示層和控制層,他們各自處理自己的事務;
顯示層:主要負責接收Servlet傳遞的內容,並且調用JavaBean,將內容顯示給用戶;
控制層:主要負責所有的用戶請求參數,判斷請求參數是否合法;根據請求的類型調用JavaBean執行操作並將最終的處理結果交給顯示層進行顯示;
模型層:完成一個獨立業務的操作組件,一般由JavaBean或EJB的形式進行定義的;
EJB是一種分部組件技術,主要負責業務中心的編寫,分為會話Bean,實體Bean和消息驅動Bean3種;
在MVC的設計模式中,最關鍵的部分是使用RequestDispatcher介面;因為內容都是通過此介面保存在JSP頁面上進行顯示的;
MVC處理流程圖:
當用戶有請求提交時,所有的請求都會交給Servlet進行處理;
然後由Servlet調用JavaBean,將JavaBean的操作結果通過RequestDispatcher介面傳遞到JSP頁面上;
這些要顯示的內容只是在一次請求-回應中有效,所以在MVC設計模式中,所有的屬性傳遞都是使用request屬性範圍,這樣做可以提升操作性能;
使用request傳遞屬性原因在於保存範圍越大占用的內容就越多;
9 實例操作:MVC設計模式應用
MVC登錄程式流程:
本程式中,用戶輸入的登錄信息提交給Servlet進行接收;
Servlet接收到請求內容後首先對其合法性進行校驗(輸入的內容是否為空或者長度是否滿足要求);
如果驗證失敗,則將錯誤信息傳遞給登錄頁面顯示;如果數據合法,則調用DAO層完成資料庫的驗證;
根據驗證的結構跳轉到登錄成功或登錄失敗的頁面;
本程式為了操作便捷,將登錄成功和失敗都統一設置成登錄頁;
-------------------------------------------------------------------------------------------------------------
User 用戶登錄的VO操作類;
DataBaseConnection 負責資料庫的連接和關閉操作;
IUserDAO 定義登錄操作的DAO介面;
UserDAOImpl DAO介面的真實實現類,完成具體的登錄驗證;
UserDAOProxy 定義代理操作,負責資料庫的打開和關閉並且調用真實主題;
DAOFactroy 工廠類,取得DAO介面的實例;
LoginServlet 接收請求參數,進行數據驗證,調用DAO完成具體的登錄驗證,並根據DAO的驗證返回登錄信息;
login.jsp 提供用戶輸入表單,可以顯示用戶登錄成功或失敗的信息;
-------------------------------------------------------------------------------------------------------------
資料庫創建腳本
DROP TABLE IF EXISTS user; CREATE TABLE user( userid varchar(30) PRIMARY KEY, name varchar(30) NOT NULL, password varchar(32) NOT NULL ); insert info user(userid,name,password) values('admin','administrator','admin');
按照DAO設計模式,首先定義出VO類;
User.java : 定義VO類
package org.shi.mvcdemo.vo ; public class User { private String userid ; private String name ; private String password ; public void setUserid(String userid){ this.userid = userid ; } public void setName(String name){ this.name = name ; } public void setPassword(String password){ this.password = password ; } public String getUserid(){ return this.userid ; } public String getName(){ return this.name ; } public String getPassword(){ return this.password ; } }
DatabaseConnection.java : 定義資料庫連接類
package org.lxh.mvcdemo.dbc ; import java.sql.* ; public class DatabaseConnection { private static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; private static final String DBURL = "jdbc:mysql://localhost:3306/shi" ; private static final String DBUSER = "root" ; private static final String DBPASSWORD = "123456" ; private Connection conn = null ; public DatabaseConnection() throws Exception{ try{ Class.forName(DBDRIVER) ; //載入驅動 this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; //連接資料庫 }catch(Exception e){ throw e ; } } public Connection getConnection(){ //取得資料庫連接 return this.conn ; } public void close() throws Exception{ if(this.conn != null){ try{ this.conn.close() ; }catch(Exception e){ throw e ; } } } }
定義DAO介面時,只需定義一個登錄驗證方法;
IUserDAO.java : 定義DAO介面
package org.shi.mvcdemo.dao ; import org.shi.mvcdemo.vo.User ; public interface IUserDAO { // 現在完成的是登陸驗證,那麼登陸操作只有兩種返回結果 public boolean findLogin(User user) throws Exception ; }
現在的方法只需來執行查詢操作,並採用findXxx命名形式;
UserDAOImpl.java:定義DAO實現類
package org.shi.mvcdemo.dao.impl ; import org.shi.mvcdemo.vo.User ; import org.shi.mvcdemo.dbc.* ; import org.shi.mvcdemo.dao.* ; import java.sql.* ; public class UserDAOImpl implements IUserDAO { private Connection conn = null ; //定義資料庫操作對象 private PreparedStatement pstmt = null ; //定義資料庫連接對象 public UserDAOImpl(Connection conn){ this.conn = conn ; } public boolean findLogin(User user) throws Exception{ boolean flag = false ; String sql = "SELECT name FROM user WHERE userid=? AND password=?" ; this.pstmt = this.conn.prepareStatement(sql) ; //實例化操作 this.pstmt.setString(1,user.getUserid()) ; this.pstmt.setString(2,user.getPassword()) ; ResultSet rs = this.pstmt.executeQuery() ; if(rs.next()){ user.setName(rs.getString(1)) ; // 取出一個用戶的真實姓名 flag = true ; } this.pstmt.close() ; return flag ; } }
在真實實現類中將通過輸入的用戶ID和密碼進行驗證,如果驗證成功,則通過VO將用戶的真實姓名取出並返回;
UserDAOProxy.java 定義DAO代理操作類
package org.shi.mvcdemo.dao.proxy ; import org.shi.mvcdemo.vo.User ; import org.shi.mvcdemo.dbc.* ; import org.shi.mvcdemo.dao.* ; import org.shi.mvcdemo.dao.impl.* ; import java.sql.* ; public class UserDAOProxy implements IUserDAO { private DatabaseConnection dbc = null ; private IUserDAO dao = null ;//定義DAO介面 public UserDAOProxy(){ try{ this.dbc =