Java MVC三層架構在各框架中的特征

jopen 10年前發布 | 181K 次閱讀 MVC Web框架

整理源生的jsp+servlet框架、struts1、struts2、springMVC這幾個框架,激動之中未免有些不足,在這些框架里面要想從整體的角度考慮,就必須把客戶端到服務器端所有的東西理清晰。

1.基于web開發中最原始的jsp+Servlet
  圖形化理解jsp+servlet結構:

Java MVC三層架構在各框架中的特征

1.從結構上分析jsp+servlet圖解原理:

     在基于mvc設計模式下的最原始的jsp+Servlet框架,在某種程度上是不能夠達到mvc最直觀的體現。當客戶端發送請求到服務器時,服務器會將從客戶端接收到的信息通過封裝技術進行解析,在交給web容器,web容器會通過一篇web.xml的配置文件去找與之相匹配的servlet,此時servlet會開啟一個線程,只要是符合web.xml中所配置的某一個servlet時,該servelt就會啟動,然后servlet在去調用service或者service的接口實現類,serviceimpl)在去調用dao(impl),dao通過從數據庫(Database)那獲取到數據,在封裝到model實體類中去。Servlet在完成這一系類的動作后,最終將為我們返回一個jsp頁面,最后該頁面在返回到客戶端展示給客戶。

2.web.xml配置上:

<?xml version="1.0"?>
<web-app> 
  <servlet>
        <servlet-name>TextSerevlet</servlet-name>
        <servlet-class>com.lh.serivlet.UserSerivlet</servlet-class>
   </servlet>
   <servlet-mapping>
        <servlet-name>TextSerevlet</servlet-name>
         <url-pattern>/accessServlet</url-pattern>
  </servlet-mapping>
 </web-app>

注:需要用到的每一篇servlet都要寫入它的配置文件。Web.xml的配置量大,繁雜。從性能優異的角度考慮,它的運行性能是最快的,但是開發性能就很有難度。

3.控制器:

Jsp+servlet的控制器是:工程中的每一個xxxServlet就充當一個控制器,但是必須去extends HttpServlet,并重寫
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    doPost(request, response); 
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {  
}

4.作用域對象

ServletContext(上下文),也叫全局的作用域對象。

Session(會話)服務器的一次會話中或者服務器超時。

Request(請求)在一次請求的過程中。

Respones(響應)

5.數據綁定:沒有,只能通過數組去獲取頁面的數據。

6.類型轉換:jsp頁面的數據轉換為String類型。也可以是基本數據類型。但是要進行強制轉換。

7.有效性驗證:可以在某一個需要用到Servlet的類中用java代碼進行驗證。也可以在jsp頁面書寫ajax代碼進行驗證或者是定義function()函數,在函數中用正則表達式加以判斷。

8.操作業務層對象調業務方法:在某一個XxxServletextends HttpServlet并重寫doPost()doGet()方法,我們只需在doGet()或者doPost()中用request.getParameter()方法來得到頁面的數據。如果我們要操作到業務層我們只需在當前的這個類中實例化出業務層的類,即XxxService dao = new XxxServiceImpl();然后獲取實體Bean對象中的屬性。最后在我們需要用到數據訪問層的哪一個具體的業務實現方法就用實例化出的dao調用所需方法即可。

9.返回:可以返回對象,也可以返回具體要跳轉的哪個頁面。

10.js頁面做顯示:EL表達式,JSP腳本表達式

11.標簽:HTML標簽,JSP自定義標記庫,JST L標準標記庫。

12.文件上傳:頁面需要怎樣獲取?<form action=file method=post enctype=multipart/form-data>

             服務器怎么獲得?1.必須導入文件上傳的jar包。2.

13.過濾器:我們自己定義的一個類XxxFilter 必須implements Filter接口,并實現它的三個方法,destroy()doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException init(FilterConfig arg0)。在doFilter()中調用chain.doFilter(request, response)方法,表示將請求交給下一個組件。

Java MVC三層架構在各框架中的特征

1.從結構上分析Struts1圖解原理:

    客戶端發送請求到服務器,服務器將收到的信息傳給web容器,這時,web容器會通過到web.xml配置文件中去查找那篇符合命名規范的action屬性中的*.do,在交給ActionServlet(中央核心控制器),通過該配置,web容器將信息傳給具體的某一個XxxAction,XxxAction會繼承Action,并重寫它的

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
........
                  }

方法,同時,我們可以在該XxxAction中去調用JavaBean中的實體對象。但是,需要注意的是,在ActionServletAction這一過程中,我們是通過Form組件技術來對jsp頁面的信息來進行了一次封裝,達到了前端頁面(jsp)和后臺的實體Bean對象之間的一次數據的綁定。最后再是到Struts-config.xml文件中進行進行配置,通過正確的配置找到所需的jsp.

2web.xml配置上:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    
    <!-- 主配置文件,param-name的值為config -->
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-lx.xml,/WEB-INF/struts-zh.xml</param-value>
    </init-param>
    <!-- 子配置文件,param-name的值只能以config/開頭 
    <init-param>
      <param-name>config/m1</param-name>
      <param-value>/WEB-INF/struts-zh.xml</param-value>
    </init-param>
    -->
    
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>
com.lovo.struts.filter.CharsetFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

注:從上面的配置中我們可以看出,servlet的配置是必不可少的。

3.控制器:ActionServletstruts1的中央核心控制器,它在web.xml中配置成自動啟動的Servlet,在啟動時中央核心控制器會讀取配置文件(struts-config.xml)的配置信息,為struts中不同的模塊初始化相應的對象。

6.類型轉換:LoginForm loginF = (LoginForm)form;

7.有效性驗證:驗證框架,不能重寫Validate方法。也可以自定義驗證規則,但是必須做配置。

9.返回:Action將業務處理的不同結果返回一個目標響應對象給中央核心控制器,或者返回一個頁面mapping.findForward("success")

10.js頁面做顯示:EL表達式,自定義標簽庫,直接在jsp頁面上寫java代碼。

11.標簽:                   

Java MVC三層架構在各框架中的特征

</tbody>

</table>

 

3.基于web開發中Struts2框架的結構圖:


Java MVC三層架構在各框架中的特征

1.從結構上分析Struts2圖解原理

      Struts2的思想是基于JOPO(簡單的老的Java對象)的一種新思想而產生的。一度影響了重量級的容器。它的實現是靠用簡單的javabean對象去完成各種復雜的功能。我們也可以把這一實現的過程稱為JOPO

Struts2中是沒有容器的。當客戶端發送一個請求時,在服務器上會經過層層過濾器,最后到達FilterDispatcher(Struts2中的中央核心控制器),中央核心控制器在通過層層的攔截器去找相應的Action,最后Action返給我們一個所訪問的頁面,由于在Struts2中的攔截器是上下文相互環繞的,所以,在當Action中的Resulet返給我們一個頁面的同時還會在次進行后期的攔截器處理,就這樣一層層的攔截,直到將最終所取得的信息傳給HttpServletResponse,在接著就是HttpServletResponse會將得到的信息響應給HttpServletRequest.但在這個響應的過程中也再次經過了過濾器的過濾。直到信息完整的到達HttpServletRequest

2web.xml配置上:

  <?xml version="1.0" encoding="UTF-8"?>
  <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
        </filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

3.控制器:核心控制器:FilterDispatcher在web應用中負責攔截所有的用戶請求如果用戶的請求以 .ation結尾,則該請求被struts2框架處理業務控制器: Action(在struts2中起作用的實際上不是用戶自定義的Action,而是系統自動生成的action代理,但該代理是以用戶自定義的action為目標的)

4.作用域對象:有前面的struts1中我們可以從Action的execute方法中將請求和響應當做參數傳遞給了Action,但是在Struts2中我們會發現Action的execute方法是沒有任何的參數,所以也就無法得到作用域對象。那么,Struts2又是如何得到作用域對象的呢?分析:Struts2的過濾器啟動的時候,首先就會初始化一個叫做ServletActionContext的類。它掌管著所有的作用域對象。代碼展示如下:

import org.apache.struts2.ServletActionContext;
public class ContextAction implements Action {
    public String execute() throws Exception {
        //獲得請求       
HttpServletRequest request = ServletActionContext.getRequest();
        //獲得會話        
HttpSession session = request.getSession();
        //獲得上下文對象       
ServletContext application = ServletActionContext.getServletContext();
      }
}

10.js頁面做顯示:OGNL

11.標簽:OGNL表達式、EL表達式、Struts2框架自身提供的標簽庫、html標簽。

Java MVC三層架構在各框架中的特征

1.從結構上分析springMVC圖解原理:

      springMVC的出現是在struts2的發展上而興起的。SpringMVC的設計思想被評委教科書式的框架,它是最能體現出MVC設計模式中的分離與互用的極致。所以,基于springMVC的原理我們是非常有必要進行掌握并深入理解的。我們必須清楚的了解Spring的MVC框架主要由DispatcherServlet、處理器映射、處理器、視圖解析器、視圖組成瀏覽器發送請求到spring容器,spring容器通過在web.xml配置文件中找到中央核心控制器(DispatcherServlet)的url配置,并且在web.xml中還必須要配置一個初始化的加載參數(詳見下面2),當DispatcherServlet接收到一個請求后,它會通過請求的HandlerMapping處理映射路徑去找到在Spring-servlet.xml配置文件中的一個處理器(Controller),該處理器會找到具體的某一個Xxxservlet,Xxxservlet會將所獲取到的信息間接的傳給DispatcherServlet,在這一個過程中會有一個ModelAndView的對象產生(體現出了SpringMVC分離的思想)。當DispatcherServlet得到這個ModelAndView后會將信息傳給ViewResolver,這時ViewResolver會將符合格式的view返回出來,最后再將符合格式的數據響應到瀏覽器端。

2web.xml配置上:

 <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>mySpring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/mySpring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mySpring</servlet-name>
<url-pattern>*.spring</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
      </web-app>
注:<init-param>參數的配置是必不可少的。必須是在/WEB-INF目錄下的classes子目錄下的我們自己定義的
哪一篇xxx-servlet.xml文件。

3.控制器DispatcherServlet,該控制的作用是將請求轉發到相應的應用控制器。      

4.作用域對象:SpringMVC中不推薦使用。

5.數據綁定:springMVC支持的數據綁定有6種,1.有基本數據類型綁定(StringString[])。2.簡單對象類型綁定(類似與struts中的ActionForm)。3.List類型綁定(必須創建ArrayList對象來進行綁定)4.Set類型綁定(必須在Set對象中Add相應的數量的模型對象)。5.Map類型綁定(必須依靠Bean對象)。6.復合數據類型綁定(要求在自己定義的Bean對象上的某個屬性也必須是一個Bean對象)。

6.類型轉換:SpringMVC中有兩種類型轉換的方式.1.屬性編輯器(propertyEditor,屬性編輯器是我們最傳統的做法。我們只需要通過一個@InitBider注解來完成,方法中的參數是WebRequestDateBinder或者WebDateBinder。在這個方法中,我們可以通過重寫PropertyEditorSupport中的setAsText()來定義自己的轉換規則。

2.類型轉換器(Converter),相對于第一種屬性編輯器它的功能更大,它可以對任何類型的數據進行轉換。我們在編寫一個類型轉換器時,一定要去implements它的Converter接口。

7.有效性驗證:通過注解的形式來注入@pattern@valid來進行有效性驗證,這也是我們常用到的驗證注入。

1.導包

2.書寫配置springMVC自己提供的文件上傳的配置。 

<bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 <property name="maxUploadSize" value="100000000">
 </property>
</bean>

3.jsp頁面,注意文件上傳的<form>表單里面的屬性。

         <form action="upload.spring" name="uploadForm" 
           method="post" enctype="multipart/form-data">
           ............
         </form>

4.書寫控制器UploadController在控制器的方法處理中,從作用域中獲取file文件,通過path路徑和文件名將文件存入到當前工程的文件夾下。

package com.lh.controller;
 
import java.io.File;
 
import javax.servlet.http.HttpServletRequest;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
@Controller
public class UploadController {
@RequestMapping("/upload")
public String upload(HttpServletRequest request
,@RequestParam("file")CommonsMultipartFile file){
//從作用域中獲取文件的path路徑,通過request.getSession().getServletContext().getRealPath("upload")。
String path = request.getSession().getServletContext().getRealPath("upload");
//通過file來獲取文件名。
String name = file.getOriginalFilename();
try {
file.getFileItem().write(new File(path+"/"+name));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "upload";
}
return "success";
} 
}

5.測試文件是否上傳成功。

在springMVC中實現攔截器,調用它的3個方法。:

1.書寫攔截器有兩種方式:
1-1繼承HandlerInterceptorAdaptor類,代碼展示如下:
package com.lh.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class Interceptor1 
extends HandlerInterceptorAdapter
 {

   //在控制器傳遞到攔截器將數據交給DisPacheServlet的過程中將資源清理。
    public void 
afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    System.out.println("The Main of claening....");
    }
   //在方法之后
    public void 
postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView)
 throws Exception {
        System.out.println("The Main of after...");       
    }
//在方法之前
public boolean 
preHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler)
 throws Exception {
    System.out.println("The Main of Before....");
    return true;
}
}

1-2.實現HandlerInterceptor接口 代碼展示如下:

package com.lh.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class Interceptor2 
implements HandlerInterceptor
{
   //在控制器傳遞到攔截器將數據交給DisPacheServlet的過程中將資源清理。
    public void afterCompletion(HttpServletRequest arg0,
            HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("The Mian of cleaning2.....");       
    }
   //在方法之后
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2, ModelAndView arg3) throws Exception {
    System.out.println("The Mian of After...");       
    }
    //在方法之前
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2) throws Exception {
        System.out.println("The Mian of Befor.....");
        return true;
    }
}

2. 在xml中配置攔截器:

  <mvc:interceptors>
      <mvc:interceptor>
        <mvc:mapping path="/register.spring"></mvc:mapping>
        <bean class="com.lh.interceptor.Interceptor1"></bean>
      </mvc:interceptor>    
  </mvc:interceptors>

  注:如果有多個攔截器就需要配置攔截器棧(先進后出)。
3.在tomcat服務器上發布,測試攔截效果是否達到。

來自:http://my.oschina.net/win199176/blog/208171

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
  • sesese色