java EE開發之Servlet第一課:servlet的建立方式

新夢想IT發表於2022-07-28


 

本系列課程是在建立在讀者有一定的 java  Web基礎技術的基礎上,如果沒有基礎,那麼看起來會很吃力。

 

##1,回顧

tomcat就是一個web應用伺服器,那可以這樣說服務總公司,它可以向外界提供服務,但是它本身像一個超級服務場所,允許別人在它指定的地方開門店,但是門店必須在指定的位置,按照它的統一標準開店,由總公司統一管理。那我們建立的一個web專案相當於就是一個門店,然後布屬到webapps下。開了店子弄些服務員,寫的jsp就是服務員,但是jsp必須編譯成 java程式碼 才能執行 ,那麼這個Java檔案就是一個servlet,那麼servlet是另外一種服務員

 

JSP和SERVLET到底什麼區別呢?

JSP就象賓館前臺的服務員,要長的不錯,讓顧客一看就覺得比較舒服,他主要就是負責顯示這個賓館的形象的.而SERVLET就象部門經理,要處理各種各樣的業務和事情
那我們怎樣才能寫一個 servlet呢,sun公司定義一套實現servlet標準(介面),只要實現了這個介面,就擁有了自己的一個servlet類,那麼類是不會提供服務的,只有這個類的一個物件才能向外界提供服務,那誰來new出這個對像呢 ,由服務總公司new出來,然後給你的門店裡使用

 

##2.怎樣實現servlet

##方式一:實現servlet介面

###A.介面中方法的解釋

###1)服務的方法

 

向外界提供服務的方法 ,每請求一次,就向外界提供服務一次,但是要注意下面的例子,i是會遞增的,那證明無論請求多少次此servlet都只有一個物件,所以足以證明servlet 是 單例模式

ServletRequest介面的實現類物件封裝了從客戶端向服務端傳送的請求資訊ServletResponse介面的實現類物件封裝了從服務端向客戶端響應的資訊

 

1 int i=0;

2 public void service(ServletRequest request, ServletResponse response)throws ServletException, IOException {

3 System.out.println("服務了一次"+i+"次");

4 }

 

寫好了 service就可以讓服務員掛牌服務了

 

·  怎麼掛牌 :這裡是打了比方等價於servlet的配置

 

servlet需要配置的目的是為了讓客戶端能夠訪問到該Servlet(服務員)

 

1 <servlet>

2        <servlet-name>hello</servlet-name>

3        <servlet-class>com.accp.servlet.Hello</servlet-class>

4 </servlet>

5 <servlet-mapping>

6         <servlet-name>hello</servlet-name>

7         <url-pattern>/hello</url-pattern>  //注意“/”不能少

8 </servlet-mapping>

 

 

·  怎麼訪問呢

 

瀏覽器中輸入:

    埠號//專案名/url-pattern配值的引數值

可以看到我們已經訪問到了我們剛剛透過實現介面的方式的寫的 Servlet,並且成功的呼叫了service方法

 

###**2)初始化方法 **

ServletConfig 記錄當前這個服務員的資訊(比如芳齡多少啊,哪裡人士等等)ServletConfig其實就是記錄了servlet的配置資訊

    **注意:**在servlet被tomcat new出來的時候,就自動建立了ServletConfig這個物件然後tomcat會到new好的ServletConfig扔到方法內,供方法使用

 

一般使用的方式 :

(設定一個全域性的 ServletConfig,這樣其他的方法就可以使用到這個ServletConfig )

 

1 private  ServletConfig config;

2 public void init(ServletConfig config) throws ServletException {

3 //在這裡進行設定(重要

4 this.config =config;

5 System.out.println("開始學習了");

6 //拿到sevlet名字

7 System.out.println("Servlet名字:"+config.

8    getServletName()); 

9 }

 

###**3)銷燬的方法 **

sertvlet被銷燬的時候tomcat呼叫此方法,servlet在伺服器重啟或關掉的時候被銷燬

 

1 public void destroy() {

2 System.out.println("銷燬了");

3 }

 

###4)獲取config物件的方法

返回 servlet的配置資訊物件

 

1 public ServletConfig getServletConfig() {

2 return config;

3 }

 

###5)獲取servlet說明資訊的方法

返回 servlet的說明資訊

 

1 public String getServletInfo() {

2 return "這是我寫的servlet";

3 }

相當於 :

1 <%@ page info="這是我寫的jsp"%>

2 <%  out.println(this.getServletInfo())  %>

3

 

###B.使用ServletResponse 向客戶端列印輸出資訊

設定響應的編碼

 

    第一種方式:

    res.setContentType(“text/html;charset=GB18030”);

    與<%@ page contentType=“text/html; charset=GB18030”%>相對應

    第二種方式:

    使用配置檔案和SevletConfig的配合(更具通用性,很多servlet可以同時使用)

    配置檔案

 

1 <init-param>

2     <param-name>encoding</param-name>

3     <param-value>text/html;charset=GB18030</param-value>

4 </init-param>

 

SevletConfig物件得到初始化引數

 

1 String encoding = config.getInitParameter("encoding");

2 res.setContentType(encoding);

3 PrintWriter out = response.getWriter();

4 out.println("Hello! I am servlet!");//輸出英文

5 out.println("你好,我是servlet");//輸出中文

 

###C.使用ServletRequest物件拿到客戶端資訊

建立一個 jsp,寫一個表單,使用者登入提交,注意action=“url-pattern中的引數”(不要/),然後提交到一個與url-pattern對應的servlet,然後在servlet的service方法中就可以獲 取值

**注意:**中文亂碼問題(post)

 

1 //解決post方式提交的中文亂碼

2 req.setCharacterEncoding("GB18030"); 

使用超連結也可以

1 <a href="hello?uname=uu&pwd=uu">登入</a>

##方式二:繼承GenericServlet

重寫 service方法(必須的)

GenericServlet是一個抽象類實現了Servlet介面,增加了一個ServletConfig的引用

 

1 private ServletConfig config;

2 public void init() throws ServletException {}//新增的

3 public void init(ServletConfig config) throws ServletException {

4   this.config = config;

5   this.init();//呼叫新增的

6 }

 

這樣就做就沒有以前那麼麻煩,所以如果以後要重寫初始化方法,重寫新增的,如果要重寫原來的有參的 init(),要記得在方法裡寫上這句super.init(config),這是關鍵;

 

寫一個例子 :根據提交的方式輸出資訊

HttpServletRequest實現了ServletRequest介面

注意:請求是基於 http協議的,所以可以強制轉換

 

1 HttpServletRequest request = (HttpServletRequest)req;

2 PrintWriter out = res.getWriter();

3 String method = request.getMethod();

4 if(method.equalsIgnoreCase("post")){ 

5 out.println("hello,post");

6 }else{

7 out.println("hello,get");

8 }

9

 

這種方式過於麻煩於是可以採取第三種方式解決

##方式三:繼承HttpServlet

專門針對於 http協議的

HttpServlet繼承了GenericServlet,重寫了service方法

注意 service方法中

 

1 if (method.equals(METHOD_GET)) {

2 doGet();

3 }else if(method.equals(METHOD_POST)){

4 doGet();

5 }

 

所以我們繼承 HttpServlet只需要實現doGet()和doPost()

**原理是:**先看自己類裡面有沒有service方法,子類沒有就呼叫父類的service方法,然後根據請求方式,再呼叫子類重寫的doGet()和doPost() (多型)

如果同時又重寫了 service(),出現doGet()和doPost() 失效,是因為自己類的service()裡面並沒有去呼叫doGet()和doPost(),所以要注意在重寫service(),記得在方法體內加入 super.service(req, resp);,重新調回父類的

不推薦重新 service(),除非萬不得已,需要在service()處理資料,記得在方法體內加入super.service(req, resp);

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69940641/viewspace-2908032/,如需轉載,請註明出處,否則將追究法律責任。

相關文章