iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 4
0

前言

今天要繼續整理一下CH 1-2章的部分
但前面都是概略性的介紹
之後幾章會再詳談裡面的內容

Servlet 和Container

昨天有提到Containcer會去作為Servlet和web application的橋樑
Servlet最常使用的部分為

  • doGet(): 使用Get方法處理HTTP請求
  • doPost(): 使用Post方法處理HTTP請求
    通常會去Override這兩個方法,去處理我們要的行為
    回來看一下之前的練習範例:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
		request.getRequestDispatcher("Longin.jsp").forward(request, response);
} 

HttpServletRequest request, HttpServletResponse response
這部分就是servlet取得由Container所建立的的request&response
只是在這個練習裡,將本來由response所呈現的頁面
改由request觸發我們的JSP程式去執行

至於Container如何去和servlet去做對應
這裡就要整理一下web.xml
也就是部屬描述檔(Deployment Descriptor,簡稱DD)
Container藉由這個DD來得知如何去執行servlet及JSP

了解web.xml
看前面例子的xml檔,主要分成兩個部分

  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.servlet.LoginServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

首先上面servlet的部分,主要是定義servlet,告訴container這支servlet要去啟動哪一支程式
所以當container看到LoginServlet得時候,因為DD有設定了
就會去執行在com/servlet/這個package下的LoginServlet.class

再來下半部Servlet-mapping的部分
主要是告訴container要根據怎樣URL去呼叫哪一支servlet
因這裡將URL-pattern設定為/
表示不管怎樣都會呼叫到loginServlet
localhost:8080/MyFirstServlet/@%@#%# --> 不管後面接什麼都會呼叫到loginServlet

如果用eclipse新增一支servlet,若帶default的話
會發現在servlet會出現webservlet annotation的語法

@WebServlet("/LoginServlet")

這也代表URL上如果有出現自己定義的名稱,就會呼叫這支servlet

另外,就完整的寫法如下:

@WebServlet(name = "LoginServlet", urlPatterns = {
    "/LoginServlet", "/abc", loadOnStartup = 0
})

urlPatterns可以指向多個,也就是說照上面的寫法
localhost:8080/MyFirstServlet/LoginServlet
或是localhost:8080/MyFirstServlet/abc都會呼叫到LoginServlet這支servlet
另外loadOnStartup表示的則是載入的順序
分別由小到大,若為負數則container會依照時機去載入
此外在這裡順序性也有關係
記得沒錯的話是由上面到下面依序執行的

如果同時在DD裡面有設定,又在servlet宣告
則container會根據DD --> WebServlet 的順序去執行
如果不要讓container去抓WebServlet的值
可以在web.xml(DD)的設定增加以下設定
metadata-complete="true"

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0" metadata-complete="true">

如此一來只會去抓web.xml裡面的設定(這個值defautl是false)

回來到前面的練習
因為在DD裡面設定url-pattern為/
所以不管URL後面接什麼,DD都會去執行LoginServlet

DD除了將URL導到實際的servlet
還有其他的功用:

  • 權限管理
  • 錯誤頁面設定(erroe page)
  • 標籤程式庫(JSTL)
  • 初始組態設定
    主要即供一種用宣告的方式,去客製web程式

MVC for Servlet & JSP

MVC主要是將商業邏輯和呈現結果分開
讓商業邏輯獨立出來有辦法重複使用(reusable)

在servlet和JSP的MVC架構對應如下圖
http://ithelp.ithome.com.tw/upload/images/20161204/20103425DB9BPQay2x.jpg

  • M = moduble 主要才處理商業邏輯的底層,連結DB操作資料
  • V = View 主要是呈現最後的結果,以及傳入外部的參數,在這裡就是JSP
  • C = controller 類似像一個溝通的角色,將HTTP傳進來的請求,判後丟給module
    再把module處理好的狀態供View存取,在這裡就是servlet的角色

上一篇
[Day 3 ] Servlet & JSP簡介(part 1)
下一篇
[Day 5] Servlet的頁面跳轉
系列文
30 days JSP & Servlet學習紀錄 30

尚未有邦友留言

立即登入留言