java EE開發之Servlet第八課:MVC模式 (基本理解)

新夢想IT發表於2023-03-27



##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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章