1. 程式人生 > >關於SpringMVC中Controller接口的三種實現類的使用與說明

關於SpringMVC中Controller接口的三種實現類的使用與說明

resolv term strac editor 服務 xml配置 數據加載 edi add

要說Controller接口的實現類使用與說明之前,先簡要說明一下SpringMVC的工作原理。

①客戶端發出一個請求,web服務器接受了這個請求後,就會與web.xml中配置的DispatcherServlet中的映射路徑相匹配,如果有對應的匹配路徑存在,那麽這個請求將會交給DispatcherServlet處理(這個Dispatcher Servlet也是SpringMvc的核心);

②DispactherServlet接受請求後,根據URL尋找恰當的處理器映射來處理這個請求;

③處理器處理完之後,就會返回一個ModelAndView對象給DispatcherServlet,這個ModelAndView對象封裝了模型數據信息以及視圖圖邏輯名(視圖邏輯名常指跳轉的jsp頁面);

④但是ModelAndView對象封裝的只是視圖邏輯名,而不是一個真正的視圖對象,所以DispatcherServlet需要通過ViewResolver來進行對視圖邏輯名的解析;

⑤解析得到視圖對象後,DispatcherServlet將模型數據交給View對象進行渲染;

⑥最後將結果返回到客戶端,這個結果可以是一個頁面,也可以是一個Excel這類的視圖形式。

  換句話說,DispatcherServlet是SpringMVC的核心,在web.xml裏面配置DispatcherServlet:

<servlet>
      <servlet-name>spring</servlet-name><!-- 這裏的取servlet名字為spring,意味著解析時,服務器會找到WEB-INF目錄下的一個叫做spring-servlet.xml的文件 -->
      <servlet-class
>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
spring-servlet.xml的文件是用來配置處理器映射、控制器的定義、視圖解析器等。
SpringMVC的控制器基礎時org.springframework.web.servlet.mvc.Controller接口,spring提供的Controller實現類有三個:AbstractCommandController、SimpleFormController和MultiActionController。
下面是講解這三個控制器類在使用上的區別:
一、AbstractCommandController(命令控制器):
使用命令控制器時的spring-servlet.xml配置主要分了3個步驟:
①處理器映射配置,這裏使用org.springframework.web.servlet.SimpleUrlHandlerMapping;
②定義控制器(這裏是配置自定義控制器,因為自定義控制器已經繼承了SpringMVC提供的控制器)
③配置視圖解析器,這裏使用org.springframework.web.servlet.view.InternalResourceViewResolver
自定義一個控制器類繼承AbstractCommandController後,下面的代碼是在spring-servlet.xml的配置,
   <!--配置處理器映射-->
  <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="login.do">loginController</prop>  <!--key值表示url的值,如果兩者匹配,則處理交給id為loginController的類處理--> </props> </property> </bean> <!--配置控制器--> <bean id="loginController" class="com.controller.LoginController">  <!--配置自定義控制器類,這裏的id值對應上面的id值,換句話說,上面的處理操作交給這裏對應的LoginController類--> <property name="commandClass" value="com.entity.Users"></property>  <!--配置註入類--> </bean>
  <!--配置視圖解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean>
public class LoginController extends AbstractCommandController {

    @Override
    protected ModelAndView handle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, BindException arg3)
            throws Exception {
        Users user = (Users) arg2;
    //指定視圖邏輯名 ModelAndView mav
= new ModelAndView("success"); mav.addObject("user", user); return mav; } }

當LoginController執行結束後,就會將ModelAndView對象返回給InternalResourceViewResolver解析,視圖解析器類就會根據mav裏面的指定視圖邏輯名進行渲染,以這裏為例子,就是找到success.jsp的文件,然後跳轉。


二、SimpleFormController(表單控制器):
自定義控制器類繼承SimpleFormController後,在spring-servlet.xml裏的配置主要有兩個步驟:
①配置處理器映射
②配置控制器
  
  <!--配置處理器映射-->
  <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="reg.do">regController</prop> </props> </property> </bean> <!--配置控制器--> <bean id="regController" class="com.controller.RegController"> <property name="commandClass" value="com.entity.Users"></property> <property name="formView" value="register.jsp"></property>  <!--指定表單數據加載後,跳轉的頁面--> <property name="successView" value="show.jsp"></property>  <!--指定表單執行成功後跳轉的頁面--> </bean>
public class RegController extends SimpleFormController {
    protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, 
            Object command, BindException errors)throws Exception{
        Users user = (Users)command;
        
        ModelAndView mav = new ModelAndView("show.jsp");
        mav.addObject("user", user);
        return mav;
    }
    
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) 
            throws Exception{
        binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
    }
    
    protected Map referenceData(HttpServletRequest request) throws Exception{
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("hobbyList", new String[]{"Swimming", "Running"});
        return model;
    }
}
從上面兩段代碼可以知道,當url的值為reg.do的時候,DispatcherServlet就會將處理請求交給id=regController的類(即RegController)處理,此時並不是執行onSubmit()方法,而是執行referenceData()方法,因為沒有點擊submit按鈕。因為此方法
裏面沒有指定視圖邏輯名,所以當referenceData()執行結束後,就會找到配置控制器<property name="formView" value="register.jsp"></property>這條語句,這裏的value=register.jsp,即下一步會跳轉到register.jsp頁面,相應的數據也會加載到
register.jsp頁面上。當在register.jsp頁面上點擊submit按鈕時,又會將請求交給RegController處理(因為form標簽的action=reg.do),此時就會執行onSubmit()方法.
  對比AbstractCommandController和SimpleFormController的配置,就會發現,SimpleFormController少了配置視圖解析器,而且自定義控制器類裏指定視圖邏輯名是用了“.jsp”後綴。其實這是成對出現的,配置視圖解析器,就不需要後綴,因為後綴已經在視圖解析器
裏有配置好,兩種方法效果一樣。
三、MultiSimpleController(多動作控制器):
多動作控制器是為了減少大量的定義控制器類,可以實現多個動作在同一個類裏面操作,實現功能集成。
MultiSimpleController的配置相對簡單一點:
①配置處理器映射
②配置自定義控制器
③配置自定義控制器的響應策略
  <!--配置處理器映射-->
  <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="user.do">userController</prop> </props> </property> </bean>
  <!--配置自定義控制器--> <bean id="userController" class="com.controller.UserController"> <property name="methodNameResolver" ref="methodNameResolver"></property> </bean>
  <!--配置自定義控制器響應策略--> <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="paramName" value="method"></property> </bean>

上面同樣的也沒有配置視圖解析器,所以自定義控制類的視圖邏輯名要加上後綴(即使用路徑+文件全名).

在自定義控制器的配置裏面,相對於AbstractCommandController和SimpeFormController來說,這裏不需要配置封裝類“commandClas”,因為使用了ParameterMethodNameReslover策略,作用是根據url請求匹配自定義控制器類裏的方法名字,進而

進行動作處理。

  當使用基於配置來實現SpringMVC的的動作響應時,就會發現AbstractCommandController和SimpleFormController被顯示為已過期,因為SpringMVC框架是推薦使用註解的形式。

關於SpringMVC中Controller接口的三種實現類的使用與說明