眾所周知現在的前端模板有很多,像JSP,FreeMarker,Velocity等。
物件導向的程式設計要遵守六大設計原則之一的開閉原則,即對擴充開放——對修改關閉。
所以view層的代碼,在我這裡的核心在於策略模式的實現。
首先,我們寫一個view層的介面
package viewTemplate;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import modelWrapper.Model;public interface IView { void viewRender(Model m,HttpServletRequest req,HttpServletResponse resp);}
然後,依照策略模式,我們需要定義一個“錦囊”來放置各種策略。
package viewTemplate;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import modelWrapper.Model;public class ViewContext { //這裡用來放置需要的view private IView view; //屬性注入 public ViewContext(IView view){ this.view=view; } public void render(Model m,HttpServletRequest req,HttpServletResponse resp){ view.viewRender(m,req, resp); }}
接下來,我們書寫JSP的view形式的代碼
package viewTemplate;import java.io.IOException;import java.util.Set;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import modelWrapper.Model;public class Jsp implements IView { @Override public void viewRender(Model model,HttpServletRequest req, HttpServletResponse resp) { if(model!=null){ Set<String> keys=model.getModel().keySet(); for(String key:keys){ req.setAttribute(key, model.getModel().get(key)); } } try { req.getRequestDispatcher(model.getView()).forward(req, resp); } catch (ServletException | IOException e) { e.printStackTrace(); } }}
然後,是FreeMarker和velocity的代碼。我懶得去寫了,你們自己填空吧,當然也可以自己去擴充IView介面去實現其他你們喜歡的模板,哈哈。
package viewTemplate;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import modelWrapper.Model;public class FreeMarker implements IView { @Override public void viewRender(Model m,HttpServletRequest req, HttpServletResponse resp) { }}
package viewTemplate;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import modelWrapper.Model;public class Velocity implements IView { @Override public void viewRender(Model m,HttpServletRequest req, HttpServletResponse resp) { }}
最後還沒完,我們需要建立一個工廠來維護這些類
package viewTemplate;public class ViewFactory {//原廠模式 public static ViewContext getView(IView view){ return new ViewContext(view); } public static Jsp getJsp(){ return new Jsp(); } public static FreeMarker getFreeMarker(){ return new FreeMarker(); } public static Velocity getVelocity(){ return new Velocity(); }}