java EE開發之Servlet第八課:MVC模式 (基本理解)
##1,為什麼需要MVC模式?
為什麼需要MVC模式,以前簡單的JSP頁面處理不好嗎?MVC有什麼好處呢?
答:MVC就是常說的:
模型(Model):POJO(Plain Old Java Object普通類)
檢視(View):Jsp
控制Controller):Servlet Filter
它把業務處理和Jsp頁面分開了。而以前的Jsp頁面是把所有的程式碼都寫在Jsp 頁面中,那樣不利於維護,MVC模式的目的就是實現Web系統的職能分工。
####MVC模式的好處:
#####1.各施其職,互不干涉
在MVC模式中,三個層各施其職,所以如果一旦哪一層的需求發生 了變化,就只需要更改相應的層中的程式碼而不會影響到其它層中的
程式碼。
#####2.有利於開發中的分工
在MVC模式中,由於按層把系統分開,那麼就能更好的實現開發中
的分工。網頁設計人員可以進行開發檢視層中的JSP,對業務熟悉的開
發人員可開發業務層,而其它開發人員可開發控制層。
#####3.有利於元件的重用
分層後更有利於元件的重用。如控制層可獨立成一個能用的元件, 檢視層也可做成通用的操作介面。
##2.MVC的基本原理是怎樣的呢?
每個層之間的關係又是怎樣的,它們是怎樣執行的?
答:基本原理是:
這裡寫圖片描述
每一步代表的意思是:
#####1,jsp頁面,透過請求到配置檔案中然後到Struts2Filter
#####2,a,在Struts2Filter中 透過頁面的請求Action=“XXX.action”
//獲得要請求的路徑 列印uri的結果是 :/MVCTest1/reg.action
String uri=request.getRequestURI();
//獲得請求的檔名:列印requstname 的結果是:reg.action
String reqeustname=uri.substring(uri.indexOf("/",1)+1);
//透過要請求的檔名到屬性檔案中去找相對應的類的名稱
String classname= ps.getProperty(reqeustname);
#####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的介面,所以再第三步中可以中介面來作為型別 **
//介面是一個業務員要工作的一組規範
//引數是:請求物件 和響應物件
//返回是:String 最終頁面跳轉的路徑
public String execute(HttpServletRequest
request,HttpServletResponse response)throws Exception;
#####6,因為方法的返回型別是 String物件,這個字串代表的就是最終跳轉的和頁面,但是有一個問題,就是跳轉的方式有重定向和轉發這裡,我們不做判斷,預設就用轉發
//重定向:透過request.getContextPath()得到上下文路response.sendRedirect(request.getContextPath()+"/"+path);
//轉發 request.getRequestDispatcher("/"+path).forward(request, response);
##3.具體實現
(1)開發一個Struts2Filter(公司),要求能夠接收所有的.action請求。(即配置web.xml檔案達到要求)
public class Struts2Filter implements Filter{
public void destroy() {
}
........
public void doFilter(ServletRequest req,
ServletResponse res,FilterChain chain)
throws IOException, ServletException {
}
}
(2)開發一個業務員的介面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與業務員類的對應關係。
#資原始檔
#男科 = 專家劉教授
#內科 = 主任孫教授
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得到對應的業務員物件。
//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.根據請求型別,找到對應的負責處理請求的類
//發出的是一個看男科的請求,就需要找到對應的男科醫生
String className = ps.getProperty(type);
if(className!=null){
//根據具體的類名,獲取其Class型別的物件
Class c = Class.forName(className);
//根據 c物件,建立其具體的Action
Action action = (Action)c.newInstance();
}
(7)在Struts2Filter的服務方法中得到業務員物件後,呼叫業務員execute方法,開始工作,並接收業務員返回的結果頁面的jsp檔名,在Struts2Filter的服務方法中接收到業務員返回的結果頁面jsp名字後後,將頁面轉發或者是重定向到結果頁面去。
//呼叫action的執行方法(看病的行為,會有一個結果返回)
try{
String url = action.execute(request,
response);
//根據結果,執行頁面的跳轉(預設是轉發)
request.getRequestDispatcher(url).forward(
request, response);
//放行---在最後放行
if(url==null){
chain.doFilter(request, response);
}else{
return ;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69940641/viewspace-2941885/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java EE開發之Servlet第五課:xml解析JavaServletXML
- java EE開發之Servlet第一課:servlet的建立方式JavaServlet
- java EE開發之Servlet第二課:Servlet的三個hashMapJavaServletHashMap
- java EE開發之Servlet第四課:監聽器(Listener)JavaServlet
- java EE開發之Servlet第十一課:反射基礎三JavaServlet反射
- JAVA網路程式設計基本功之Servlet與Servlet容器Java程式設計Servlet
- Jsp+JavaBean模式,Jsp+Servlet模式,MVC模式介紹JSJavaBean模式ServletMVC
- Java之ServletJavaServlet
- MVC設計模式深入理解MVC設計模式
- 分散式架構原理解析,Java開發必修課分散式架構Java
- Java基礎 第一節 第八課Java
- 傳統的MVC開發模式和前後端分離開發模式MVC模式後端
- The prefix “mvc“ for element “mvc:default-servlet-handler“ is not bound.MVCServlet
- 第2,8章 servlet 開發技術(12課時)Servlet
- Java匹馬行天下之J2EE框架開發——Spring—>Spring框架知多少Java框架Spring
- 使用MVC模式實現區塊鏈開發MVC模式區塊鏈
- 架構師對MVC設計模式的理解架構MVC設計模式
- J2EE開發筆記(一)—— J2EE開發環境配置筆記開發環境
- Java SE, Java EE, Java MEJava
- JavaWeb開發Servlet之getParameter和getAttribute的區別,JavaWebServlet
- java基礎學習:JavaWeb之ServletJavaWebServlet
- org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodExceptionSpringFrameworkWebServletMVCException
- Servlet 到 Spring MVC 的簡化之路ServletSpringMVC
- 甲骨文真的要開放Java EE?Java
- Java設計模式之開篇Java設計模式
- J2EE 核心模式模式
- iOS開發-MVCiOSMVC
- J2EE模式-傳輸物件模式模式物件
- 關於servlet的理解Servlet
- 基於jsp和servlet簡單的java web開發(idea)JSServletJavaWebIdea
- Servlet開發-day05Servlet
- 第80節:Java中的MVC設計模式JavaMVC設計模式
- java EE 8u1 SDK 包和 java EE 8 API 文件包JavaAPI
- 【Java面試】說說你對Spring MVC的理解Java面試SpringMVC
- 深入理解MVCMVC
- Day91.Servlet基本內容① -Servlet、jsp和表示式ServletJS
- 【Java EE】從零開始寫專案【總結】Java
- Java第八課. 物件導向特徵3-多型&抽象類Java物件特徵多型抽象