java EE开发之Servlet第八课:MVC模式 (基本理解)
##1,為什么需要MVC模式?
為什么需要MVC模式,以前簡單的JSP頁面處理不好嗎?MVC有什么好處呢?
答:MVC就是常說的:
- 模型(Model):POJO(Plain Old Java Object普通類)
- 視圖(View):Jsp
- 控制Controller):Servlet Filter
它把業(yè)務處理和Jsp頁面分開了。而以前的Jsp頁面是把所有的代碼都寫在Jsp 頁面中,那樣不利于維護,MVC模式的目的就是實現Web系統(tǒng)的職能分工。
####MVC模式的好處:
#####1.各施其職,互不干涉
在MVC模式中,三個層各施其職,所以如果一旦哪一層的需求發(fā)生 了變化,就只需要更改相應的層中的代碼而不會影響到其它層中的
代碼。
#####2.有利于開發(fā)中的分工
在MVC模式中,由于按層把系統(tǒng)分開,那么就能更好的實現開發(fā)中
的分工。網頁設計人員可以進行開發(fā)視圖層中的JSP,對業(yè)務熟悉的開
發(fā)人員可開發(fā)業(yè)務層,而其它開發(fā)人員可開發(fā)控制層。
#####3.有利于組件的重用
分層后更有利于組件的重用。如控制層可獨立成一個能用的組件, 視圖層也可做成通用的操作界面。
##2.MVC的基本原理是怎樣的呢?
每個層之間的關系又是怎樣的,它們是怎樣執(zhí)行的?
答:基本原理是:
每一步代表的意思是:
#####1,jsp頁面,通過請求到配置文件中然后到Struts2Filter
#####2,a,在Struts2Filter中 通過頁面的請求Action=“XXX.action”
#####3,返回一個相對應的類的名稱
//去CLASS類中找類名為 classname的類 Class c=Class.forName(classname); //找到后再調Class類的構造方法 Object obj=c.newInstance(); //因為obj是實現了Action接口的,所以 Action action=(Action)obj;#####4,找到類后再去調類中的方法,
//然后再調Action中的execute方法 返回一個String字符串 String result = action.execute(request, response); action.execute(request, response);//主要是用來調用Dao層的方法的#####**5,因為類都實現了Action的接口,所以再第三步中可以中接口來作為類型 **
//接口是一個業(yè)務員要工作的一組規(guī)范 //參數是:請求對象 和響應對象 //返回是:String 最終頁面跳轉的路徑 public String execute(HttpServletRequest request,HttpServletResponse response)throws Exception;#####6,因為方法的返回類型是 String對象,這個字符串代表的就是最終跳轉的和頁面,但是有一個問題,就是跳轉的方式有重定向和轉發(fā)這里,我們不做判斷,默認就用轉發(fā)
//重定向:通過request.getContextPath()得到上下文路response.sendRedirect(request.getContextPath()+"/"+path);//轉發(fā) request.getRequestDispatcher("/"+path).forward(request, response);##3.具體實現
(1)開發(fā)一個Struts2Filter(公司),要求能夠接收所有的.action請求。(即配置web.xml文件達到要求)
(2)開發(fā)一個業(yè)務員的接口Action接口,要求定義一個行為,即execute方法,傳入請求與響應對象,返回一個結果頁面的jsp文件名。
public class MaleAction implements Action {public String execute(HttpServletRequest request,HttpServletResponse response) {String uname = request.getParameter("uname");request.setAttribute("uname", uname);System.out.println(uname+"你好,劉教授為你看病...");return "maleOk.jsp";} }(3)在WEB-INF目錄上加一個屬性文件,文件名:actionConfig.properties,此文件是一個注冊了請求的URI與業(yè)務員類的對應關系。
#資源文件 #男科 = 專家劉教授 #內科 = 主任孫教授male.do = com.kz.action.MaleAction #female.do = com.accp.action.FemaleAction query.do = com.kz.action.QueryAction del.do = com.kz.action.DelAction(4)在Struts2Filter類的init方法中將屬性文件actionConfig.properties文件內容加載到一個屬性對象中。
public void init(FilterConfig filterConfig) throws ServletException {//讀取本地資源配置文件InputStream is =filterConfig.getServletContext().getResourceAsStream("/WEB-INF/config.properties");//把配置文件讀入到內存中ps = new Properties();try {ps.load(is);//關閉is.close();} catch (IOException e) {e.printStackTrace();}}(5)在Struts2Filter的服務方法首先對所有的請求參數進行編碼。
//System.out.println("訪問到了ActionServlet"); HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response=(HttpServletResponse)res; request.setCharacterEncoding("utf-8");(6)在Struts2Filter的服務方法中根據請求的URI得到對應的業(yè)務員對象。
//1.獲取客戶端收送的請求類型(具體的請求信息:male.action // female.action ....) // /mvc/male.action String uri = request.getRequestURI(); //巧用文件對象,獲取具體的male.action File file = new File(uri); String type = file.getName(); System.out.println(type);//2.根據請求類型,找到對應的負責處理請求的類 //發(fā)出的是一個看男科的請求,就需要找到對應的男科醫(yī)生 String className = ps.getProperty(type); if(className!=null){//根據具體的類名,獲取其Class類型的對象Class c = Class.forName(className);//根據 c對象,創(chuàng)建其具體的ActionAction action = (Action)c.newInstance(); }(7)在Struts2Filter的服務方法中得到業(yè)務員對象后,調用業(yè)務員execute方法,開始工作,并接收業(yè)務員返回的結果頁面的jsp文件名,在Struts2Filter的服務方法中接收到業(yè)務員返回的結果頁面jsp名字后后,將頁面轉發(fā)或者是重定向到結果頁面去。
//調用action的執(zhí)行方法(看病的行為,會有一個結果返回) try{String url = action.execute(request,response);//根據結果,執(zhí)行頁面的跳轉(默認是轉發(fā))request.getRequestDispatcher(url).forward( request, response);//放行---在最后放行if(url==null){chain.doFilter(request, response);}else{return ;}遺留問題:不能確定設置重定向或者轉發(fā)?
超全面的測試IT技術課程,0元立即加入學習!有需要的朋友戳:
騰訊課堂測試技術學習地址
總結
以上是生活随笔為你收集整理的java EE开发之Servlet第八课:MVC模式 (基本理解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 720 全景 krpano php 去
- 下一篇: 蓝桥杯练习系统[C++]