2014-01-20 51 views
-1

首先與在servlet HttpServletResponse的處理,我使用的命令模式與此接口佰:有使用命令模式

public CommandResponse execute(HttpServletRequest req) 
      throws CommandException; 

這是我服務的方法:

public void service(HttpServletRequest req, HttpServletResponse res) 
      throws ServletException, IOException { 
     try { 
      Command cmd = lookupCommand(req.getParameter("cmd")); 
      CommandResponse next = cmd.execute(req, res); 
      CommandToken.set(req); 

      if (next != null) { 
       if (!req.getHeader("X-Requested-With").equals("XMLHttpRequest")) { 
        if (next.isRedirect()) { 
         redirect(next, res); 
        } else if (next.isForward()) { 
         forward(next, req, res); 
        } 
       } else { 
        ajaxCall(next, res); 
       } 
      } 
     } catch (CommandException e) { 
      res.sendError(HttpServletResponse.SC_BAD_REQUEST, e.toString()); 
     } 
    } 

正如你可以看到我的服務方法對待重定向和轉發的邏輯,我的接口沒有訪問HttpServletResponse對象。但對於我的servlet的某些操作,我需要處理響應以添加一些內容,如xml或cookie。實現了更明顯的方法是修改我的界面:

public CommandResponse execute(HttpServletRequest req, HttpServletResponse res) 
       throws CommandException; 

現在的問題:

1)在我看來上述解決方案將破壞代碼的elengacy和安全性,因爲我現在的行動有權訪問響應,並可以重定向和轉發,甚至可以將內容添加到響應中,並讓服務方法使用sendRedirect,但我們知道這將不起作用。我對嗎?爲了解決這個我這樣做:

public class CommandResponse { 

    private boolean redirect; 
    private boolean forward; 
    private String page; 
    private String contentType; 
    private String outContent; 
    private HashMap headers; 
    private List<Cookie> cookies; 
    ... 
    public void mapToResponse(HttpServletResponse res) { 
     ... 
    } 
} 

也就是說,我創建了一個僞造的響應,當我回來的動作的執行方法,我映射這個僞造應對真正的HTTP響應(只是如果我有一個正向或ajax調用)。

2-)那好?這說得通?我不應該使用它嗎?

3-)有更好的方法嗎?

謝謝。

+2

一般來說Command模式,我會說,使用像JAX-RS或Spring MVC的框架幾乎總是比手寫servlet邏輯更好。 – chrylis

+0

是的,但是一個大學項目,我不能使用一個。其實,我想了解更多關於我可以使用的可能模式, –

回答

0

爲什麼不通過一個強大的緩衝區來捕獲您的後續鏈可能要添加的任何內容?這樣你就不會混淆組件的責任。正常情況下,httpresponse預計會像任何人所期望的那樣行事。

但是,我想聽聽這個設計背後的原因。

+0

這是一個大學項目,很快別人應該在我的發展中佔據我的位置。我想確保這個人可以使用我創建的結構,並且不會搞砸。你能澄清一下:「正常情況下,httpresponse預期會像任何人所期望的那樣行事」 –

+0

正常行爲是,當組件(在你的鏈中下面)調用http response.send重定向時,應該發生重定向。既然你不打算支持這一點,我看不出有任何理由在接口中保留該方法。創建一個接口,將有您將支持的方法。 – javadevg

+0

那麼你認爲從服務方法中取代「重定向」和「轉發」的邏輯並將「動作」處理與它一起有意義嗎?實際上,我嘗試擴展一個servlet的實現,我在Duane K.Field,Mark A.Kolb,Shawn Bayern的書中看到 –