Servlet程式開發

来源:http://www.cnblogs.com/shici/archive/2017/11/14/7758381.html
-Advertisement-
Play Games

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 = 	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 常用命令和使用方法如下: man cat 和 tac cat是正序顯示文件內容 tac是倒敘顯示文件內容 sort 對文件內容排序 uniq 忽略文件中重覆行 history 顯示輸入的歷史命令,一般保存兩千行命令 more more命令,功能類似 cat ,cat命令是整個文件的內容從上到下顯示在 ...
  • TensorFlow Serving https://tensorflow.github.io/serving/ 。 生產環境靈活、高性能機器學習模型服務系統。適合基於實際數據大規模運行,產生多個模型訓練過程。可用於開發環境、生產環境。 模型生命周期管理。模型先數據訓練,逐步產生初步模型,優化模型。 ...
  • 說說最近在開發微信小程式語音識別遇到的問題吧 最先使用微信小程式錄音控制項可以拿到silk格式,後來微信官方又支持mp3格式了 但是我們拿到這些格式以後,都還不能直接使用,做語音識別,因為目前百度的語音識別格式不支持mp3格式的 百度php語音識別介面 http://yuyin.baidu.com/d ...
  • 接上篇隨筆。繼續介紹ajax的使用。 上篇友情連接:http://www.cnblogs.com/liluning/p/7831169.html 本篇導航: Ajax響應參數 csrf 跨站請求偽造 jQuery.serialize() 上傳文件 一、Ajax響應參數 上篇最後介紹了ajax的請求參 ...
  • 1. Spring MVC執行過程 1. 客戶端的請求提交到dispatcherServlet 2. DispatcherServlet查詢一個或者多個handlermapping ,找請求的Controller 3. DispatcherServlet將請求提交給Controller, Contr ...
  • ThreadLocal的主要應用場景為按線程多實例(每個線程對應一個實例)的對象的訪問,並且這個對象很多地方都要用到。例如:同一個網站登錄用戶,每個用戶伺服器會為其開一個線程,每個線程中創建一個ThreadLocal,裡面存用戶基本信息等,在很多頁面跳轉時,會顯示用戶信息或者得到用戶的一些信息等頻繁 ...
  • java學習路線: 作為Java程式員來說,最痛苦的事情莫過於可以選擇的範圍太廣,可以讀的書太多,往往容易無所適從。我想就我自己讀過的技術書籍中挑選出來一些,按照學習的先後順序,推薦給大家,特別是那些想不斷提高自己技術水平的Java程式員們。此外,大家可以加入457036818交流群,互相分享一下關 ...
  • Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the d ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...