:: 首頁 ::  :: 聯系 :: 聚合  :: 管理

          Spring技術手冊筆記(五):Spring MVC 中

          Posted on 2009-11-16 15:49 codingliyi 閱讀(1087) 評論(0)  編輯  收藏 所屬分類: Java EE

          Controller實現類

          AbstractController:使用Template Method模式,包括了對緩存標頭的處理、檢驗對請求方法(POSTGET)的支持,Session的取得與同步化等。

          使用方式:繼承AbstractController類,覆蓋handleRequestInternal()方法。

          MultiActionControllerParameterMethodNameResolver

          在一個Controller類中定義多個方法,并根據使用者的請求來執行當中的某個方法,相當于StrutsDispatcherAction

          使用MultiActionController需要配個一個MethodNameResolver實例,默認使用ParameterMethodNameResolver,他會根據所給的網址中,最后請求的文件名稱來判斷執行Controller中的哪一個方法,示例:

          multiMethodController.java
           1public class MultiMethodController extends MultiActionController {
           2    private String viewPage;
           3    
           4    public ModelAndView add(HttpServletRequest request, HttpServletResponse response){
           5        return new ModelAndView(viewPage, "method""add");
           6    }

           7    
           8    public ModelAndView delete(HttpServletRequest request, HttpServletResponse response){
           9        return new ModelAndView(viewPage, "method""delete");
          10    }

          11    
          12    public ModelAndView update(HttpServletRequest request, HttpServletResponse response){
          13        return new ModelAndView(viewPage, "method""update");
          14    }

          15    
          16    public void setViewPage(String viewPage){
          17        this.viewPage = viewPage;
          18    }

          19}
          applicationContext.xml
           1 <bean id="urlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
           2     <property name="mappings">
           3         <props>
           4             <prop key="/sayHello.do">sayHelloController</prop>
           5             <prop key="/method.do">multiMethodController</prop>
           6             <prop key="/login.do">loginController</prop>
           7             <prop key="/wizard.do">wizardController</prop>
           8         </props>
           9     </property>
          10 </bean>
          11 
          12 <bean id="parameterMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
          13     <property name="paramName" value="action" />
          14     <property name="defaultMethodName" value="add" />
          15 </bean>
          16     
          17<bean id="multiMethodController" class="SpringMVC.MultiMethodController">
          18    <property name="methodNameResolver" ref="parameterMethodResolver" />
          19    <property name="viewPage" value="multiMethodTest" />
          20</bean>

          PatameterizableViewController

          可以直接在Bean文件中定義,設定它的viewName屬性,當這個Controller執行時,會根據viewName的設定直接導向指定的網頁,使用它的好處是可以用來避免直接對JSP頁面請求。

          AbstractCommandController

          繼承該類,并提供一個Command對象(如常見的User類),當請求來時,AbstractCommandController會試著對比請求參數名稱與Command上的Setter方法名稱,設定請求參數值。

          SimpleFormController

          SimpleFormController繼承自AbstractFormController,對于簡單的表單可以直接繼承這個類,并重新定義onSubmit()doSubmitAction()方法處理請求。以下是一個簡單的登錄頁面示例:

          LoginController.java
           1public class LoginController extends SimpleFormController {
           2
           3    public LoginController(){
           4        this.setCommandClass(LoginForm.class);
           5    }

           6
           7    protected ModelAndView onSubmit(Object command) throws Exception {
           8        LoginForm form = (LoginForm)command;
           9        if("codingliyi".endsWith(form.getUsername()) &&
          10                "123456".endsWith(form.getPassword())){
          11            return new ModelAndView(getSuccessView(), "username", form.getUsername());
          12        }
          else return new ModelAndView(getFormView());
          13    }

          14}

          15

          applicationContext.xml

          1<bean id="loginController" class="SpringMVC.LoginController">
          2    <property name="successView" value="loginSuccess" />
          3    <property name="formView" value="login" />
          4</bean>

          login.jsp

          1<form name="loginForm" action="login.do" method="POST">
          2    用戶名:<input type="text" name="username"/><br/>
          3    密碼:<input type="text" name="password"/><br/>
          4    <input type="submit" value="登錄" />
          5</form>

           

          AbstractWizardFormController

          AbstractWizardFormController用于設計多頁表單。

          可以繼承該類,并重寫processFinish()方法。一個多頁表單的示例如下:

          WizardController.java

           1public class WizardController extends AbstractWizardFormController {
           2
           3    private String viewPage;
           4    
           5    public WizardController(){
           6        this.setCommandClass(LoginForm.class);
           7    }

           8    @Override
           9    protected ModelAndView processFinish(HttpServletRequest arg0,
          10            HttpServletResponse arg1, Object command, BindException arg3)
          11            throws Exception {
          12        LoginForm form = (LoginForm)command;
          13        Map model = new HashMap();
          14        model.put("username", form.getUsername());
          15        model.put("password", form.getPassword());
          16        return new ModelAndView(viewPage, model);
          17    }

          18
          19    public void setViewPage(String viewPage){
          20        this.viewPage = viewPage;
          21    }

          22}

          applicationContext.xml

           1<bean name="wizardController" class="SpringMVC.WizardController">
           2    <property name="viewPage" value="wizardResult"/>
           3    <property name="pages">
           4        <list>
           5            <value>question1</value>
           6            <value>question2</value>
           7        </list>
           8    </property>
           9    <property name=""></property>
          10</bean>

          question2.jsp

          1<form action="wizard.do" method="POST">
          2    你的密碼:<input type="text" name="password" /><br/>
          3    <input type="submit" value="previous" name="_target0" />
          4    <input type="submit" value="finish" name="_finish" />
          5</form>

          也可以在問卷中涉及一個cancel按鈕,在按下該按鈕后,送出"_cancel"請求參數,當請求中帶有"_cancel"參數時,會執行processCancel()方法。

          ThrowawayController

          ThrowawayController并不在Controller的繼承架構中,而是一個獨立的接口定義。實現該接口的類不是以單例的方式產生并重復使用。ThrowawayController在每一次請求中都會產生新的對象,而且用了就丟,不會重復使用。

          在設定Bean定義文件中,ThrowawayController必須將"singleton"屬性設為false



          主站蜘蛛池模板: 张掖市| 桓台县| 山阴县| 平顺县| 丘北县| 合阳县| 水富县| 边坝县| 子洲县| 泸定县| 峡江县| 阿鲁科尔沁旗| 遂平县| 榆树市| 柳林县| 来宾市| 白城市| 腾冲县| 临汾市| 左贡县| 牙克石市| 广河县| 桐庐县| 渝中区| 秀山| 宁海县| 井冈山市| 措美县| 长武县| 金昌市| 收藏| 永定县| 井冈山市| 宣恩县| 达孜县| 华池县| 巫溪县| 吉安县| 砀山县| 大丰市| 大同市|