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