MVC三層架構在各框架中的特徵

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

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

     在基於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配置上:java

<?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的配置量大,繁雜。從性能優異的角度考慮,它的運行性能是最快的,可是開發性能就頗有難度。web

3.控制器:ajax

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(上下文),也叫全局的做用域對象。spring

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

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

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包。

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

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

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.標籤:                   


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



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

      Struts2的思想是基於POJO(簡單的老的Java對象)的一種新思想而產生的。一度影響了重量級的容器。它的實現是靠用簡單的javabean對象去完成各類複雜的功能。咱們也能夠把這一實現的過程稱爲POJO

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標籤。

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

      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.簡單對象類型綁定(相似與struts1中的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服務器上發佈,測試攔截效果是否達到。

相關文章
相關標籤/搜索