Servlet類最終開發步驟:
我們來了解一下GenericServlet:
我們來了解一下HttpServlet:
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
doGet()
、doPost()
等等這些請求的方法就可以了。介面卡:介面卡就是一種適配中介軟體,它存在於不匹配的二者之間,用於連線二者,將不匹配變得匹配,簡單點理解就是平常所見的轉接頭,轉換器之類的存在。
public interface MyInterface {
void m1();
void m2();
void m3();
void m4();
void m5();
void test();
//但是這個介面中我們常用的方法只有test(),我們在實現此介面的時候,還需要實現其他方法,很累贅。
//所以我們就需要一個介面卡!
}
public abstract class Test implements MyInterface{
public void m1() {
}
public void m2() {
}
public void m3() {
}
public void m4() {
}
public void m5() {
}
//這是一個介面卡
//在建立一個介面的實現類,我們將常用的方法設定為抽象的方法
//這樣我們只需要繼承該類,然後實現方法即可
public abstract void test();
}
public class Realize extends Test{
public void test() {
//這樣我們就不需要再去實現介面中的 其他方法了
}
}
模板方法模式:是一種行為設計模式, 它在超類中定義了一個演演算法的框架, 允許子類在不修改結構的情況下重寫演演算法的特定步驟。
模板方法模式建議將演演算法分解為一系列步驟, 然後將這些步驟改寫為方法, 最後在 「模板方法」 中依次呼叫這些方法。 步驟可以是 抽象的, 也可以有一些預設的實現。 為了能夠使用演演算法, 使用者端需要自行提供子類並實現所有的抽象步驟。 如有必要還需重寫一些步驟 (但這一步中不包括模板方法自身)。
認真的去閱讀上面這段話:你就會發現他說將 演演算法進行分解,最後在模板中依次呼叫:
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
if
、else if
、else
這不就是所謂的將演演算法分塊提煉了出來嗎?然後我們只需要去刻畫doGet()
、doPost()
等方法,程式的主框架是不變的,只是其中的細節需要我們自己去實現。