<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 第四章 Controller接口控制器詳解(2)——跟著開濤學SpringMVC ## 4.5、ServletForwardingController 將接收到的請求轉發到一個命名的servlet,具體示例如下: ``` package cn.javass.chapter4.web.servlet; public class ForwardingServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("Controller forward to Servlet"); } } ``` ``` <servlet> <servlet-name>forwarding</servlet-name> <servlet-class>cn.javass.chapter4.web.servlet.ForwardingServlet</servlet-class> </servlet> ``` ``` <!— 在chapter4-servlet.xml配置處理器 --> <bean name="/forwardToServlet" class="org.springframework.web.servlet.mvc.ServletForwardingController"> <property name="servletName" value="forwarding"></property> </bean> ``` 當我們請求/forwardToServlet時,會被轉發到名字為“forwarding”的servlet處理,該sevlet的servlet-mapping標簽配置是可選的。 ## 4.6、BaseCommandController 命令控制器通用基類,提供了以下功能支持: 1、數據綁定:請求參數綁定到一個command object(命令對象,非GoF里的命令設計模式),這里的命令對象是指綁定請求參數的任何POJO對象; commandClass:表示命令對象實現類,如UserModel; commandName:表示放入請求的命令對象名字(默認command),request.setAttribute(commandName, commandObject); 2、驗證功能:提供Validator注冊功能,注冊的驗證器會驗證命令對象屬性數據是否合法; validators:通過該屬性注入驗證器,驗證器用來驗證命令對象屬性是否合法; 該抽象類沒有沒有提供流程功能,只是提供了一些公共的功能,實際使用時需要使用它的子類。 ## 4.7、AbstractCommandController 命令控制器之一,可以實現該控制器來創建命令控制器,該控制器能把自動封裝請求參數到一個命令對象,而且提供了驗證功能。 1、創建命令類(就是普通的JavaBean類/POJO) ``` package cn.javass.chapter4.model; public class UserModel { private String username; private String password; //省略setter/getter } ``` 2、實現控制器 ``` package cn.javass.chapter4.web.controller; //省略import public class MyAbstractCommandController extends AbstractCommandController { public MyAbstractCommandController() { //設置命令對象實現類 setCommandClass(UserModel.class); } @Override protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object command, BindException errors) throws Exception { //將命令對象轉換為實際類型 UserModel user = (UserModel) command; ModelAndView mv = new ModelAndView(); mv.setViewName("abstractCommand"); mv.addObject("user", user); return mv; } } ``` ``` <!— 在chapter4-servlet.xml配置處理器 --> <bean name="/abstractCommand" class="cn.javass.chapter4.web.controller.MyAbstractCommandController"> <!-- 也可以通過依賴注入 注入命令實現類 --> <!-- property name="commandClass" value="cn.javass.chapter4.model.UserModel"/--> </bean> ``` ``` <!— WEB-INF/jsp/abstractCommand.jsp視圖下的主要內容 --> ${user.username }-${user.password } ``` 當我們在瀏覽器中輸入“[http://localhost:9080/springmvc-chapter4/abstractCommand?username=123&password=123](http://localhost:9080/springmvc-chapter3/abstractCommand?username=123&password=123)”,會自動將請求參數username和password綁定到命令對象;綁定時按照JavaBean命名規范綁定; ![](https://box.kancloud.cn/2016-05-15_5737edd77aec9.JPG) ## 4.8、AbstractFormController 用于支持帶步驟的表單提交的命令控制器基類,使用該控制器可以完成: 1、定義表單處理(表單的渲染),并從控制器獲取命令對象構建表單; 2、提交表單處理,當用戶提交表單內容后,AbstractFormController可以將用戶請求的數據綁定到命令對象,并可以驗證表單內容、對命令對象進行處理。 ``` @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { //1、是否是表單提交? 該方法實現為("POST".equals(request.getMethod())),即POST表示表單提交 if (isFormSubmission(request)) { try { Object command = getCommand(request); ServletRequestDataBinder binder = bindAndValidate(request, command); BindException errors = new BindException(binder.getBindingResult()); //表單提交應該放到該方法實現 return processFormSubmission(request, response, command, errors); } catch (HttpSessionRequiredException ex) { //省略部分代碼 return handleInvalidSubmit(request, response); } } else { //2、表示是表單展示,該方法又轉調showForm方法,因此我們需要覆蓋showForm來完成表單展示 return showNewForm(request, response); } } ``` **bindOnNewForm**:是否在進行表單展示時綁定請求參數到表單對象,默認false,不綁定; **sessionForm**:session表單模式,如果開啟(true)則會將表單對象放置到session中,從而可以跨越多次請求保證數據不丟失(多步驟表單常使用該方式,詳解AbstractWizardFormController),默認false; **Object formBackingObject(HttpServletRequest request)?**:提供給表單展示時使用的表單對象(form object表單要展示的默認數據),默認通過commandName暴露到請求給展示表單; **Map referenceData(HttpServletRequest request, Object command, Errors errors)**:展示表單時需要的一些引用數據(比如用戶注冊,可能需要選擇工作地點,這些數據可以通過該方法提供),如: ``` protected Map referenceData(HttpServletRequest request) throws Exception { Map model = new HashMap(); model.put("cityList", cityList); return model; } ``` 這樣就可以在表單展示頁面獲取cityList數據。 SimpleFormController繼承該類,而且提供了更簡單的表單流程控制。 ## 4.9、SimpleFormController 提供了更好的兩步表單支持: 1、準備要展示的數據,并到表單展示頁面; 2、提交數據數據進行處理。 第一步,展示: ![](https://box.kancloud.cn/2016-05-15_5737edd79305f.JPG)? 第二步,提交表單: ![](https://box.kancloud.cn/2016-05-15_5737edd7aadfa.JPG) 接下來咱們寫一個用戶注冊的例子學習一下: **(1、控制器** ``` package cn.javass.chapter4.web.controller; //省略import public class RegisterSimpleFormController extends SimpleFormController { public RegisterSimpleFormController() { setCommandClass(UserModel.class); //設置命令對象實現類 setCommandName("user");//設置命令對象的名字 } //form object 表單對象,提供展示表單時的表單數據(使用commandName放入請求) protected Object formBackingObject(HttpServletRequest request) throws Exception { UserModel user = new UserModel(); user.setUsername("請輸入用戶名"); return user; } //提供展示表單時需要的一些其他數據 protected Map referenceData(HttpServletRequest request) throws Exception { Map map = new HashMap(); map.put("cityList", Arrays.asList("山東", "北京", "上海")); return map; } protected void doSubmitAction(Object command) throws Exception { UserModel user = (UserModel) command; //TODO 調用業務對象處理 System.out.println(user); } } ``` **setCommandClass和setCommandName:**分別設置了命令對象的實現類和名字; **formBackingObject和referenceData:**提供了表單展示需要的視圖; **doSubmitAction:**用于執行表單提交動作,由onSubmit方法調用,如果不需要請求/響應對象或進行數據驗證,可以直接使用doSubmitAction方法進行功能處理。 **(2、spring配置(chapter4-servlet.xml)** ``` <bean name="/simpleForm" class="cn.javass.chapter4.web.controller.RegisterSimpleFormController"> <property name="formView" value="register"/> <property name="successView" value="redirect:/success"/> </bean> <bean name="/success" class="cn.javass.chapter4.web.controller.SuccessController"/> ``` **formView:**表示展示表單時顯示的頁面; **successView:**表示處理成功時顯示的頁面;“_redirect:/success_”表示成功處理后重定向到/success控制器;防止表單重復提交; “_/success_”?bean的作用是顯示成功頁面,此處就不列舉了。 **(3、視圖頁面** ``` <!-- register.jsp 注冊展示頁面--> <form method="post"> username:<input type="text" name="username" value="${user.username}"><br/> password:<input type="password" name="username"><br/> city:<select> <c:forEach items="${cityList }" var="city"> <option>${city}</option> </c:forEach> </select><br/> <input type="submit" value="注冊"/> </form> ``` 此處可以使用${user.username}獲取到formBackingObject設置的表單對象、使用${cityList}獲取referenceData設置的表單支持數據; 到此一個簡單的兩步表單到此結束,但這個表單有重復提交表單的問題,而且表單對象到頁面的綁定是通過手工綁定的,后邊我們會學習spring標簽庫(提供自動綁定表單對象到頁面)。 ## 4.10、CancellableFormController 一個可取消的表單控制器,繼承SimpleFormController,額外提供取消表單功能。 **1、表單展示:**和SimpleFormController一樣; **2、表單取消:**和SimpleFormController一樣; **3、表單成功提交:**取消功能處理方法為:onCancel(Object command),而且默認返回cancelView屬性指定的邏輯視圖名。 那如何判斷是取消呢?如果請求中有參數名為“_cancel”的參數,則表示表單取消。也可以通過cancelParamKey來修改參數名(如“_cancel.x”等)。 ![](https://box.kancloud.cn/2016-05-15_5737edd7bed2c.JPG) **示例:** **(1、控制器** 復制RegisterSimpleFormController一份命名為CanCancelRegisterSimpleFormController,添加取消功能處理方法實現: ``` @Override protected ModelAndView onCancel(Object command) throws Exception { UserModel user = (UserModel) command; //TODO 調用業務對象處理 System.out.println(user); return super.onCancel(command); } ``` **onCancel:**在該功能方法內實現取消邏輯,父類的onCancel方法默認返回cancelView屬性指定的邏輯視圖名。 **(2、spring配置(chapter4-servlet.xml)** ``` <bean name="/canCancelForm" class="cn.javass.chapter4.web.controller.CanCancelRegisterSimpleFormController"> <property name="formView" value="register"/> <property name="successView" value="redirect:/success"/> <property name="cancelView" value="redirect:/cancel"/> </bean> <bean name="/cancel" class="cn.javass.chapter4.web.controller.CancelController"/> ``` **cancelParamKey:**用于判斷是否是取消的請求參數名,默認是_cancel,即如果請求參數數據中含有名字_cancel則表示是取消,將調用onCancel功能處理方法; **cancelView:**表示取消時時顯示的頁面;“_redirect:/cancel_”表示成功處理后重定向到/cancel控制器;防止表單重復提交; “_/cancel_”?bean的作用是顯示取消頁面,此處就不列舉了(詳見代碼)。 **(3、視圖頁面(修改register.jsp)** ``` <input type="submit" name="_cancel" value="取消"/> ``` 該提交按鈕的作用是取消,因為name=_"_cancel"__,_即請求后會有一個名字為_cancel的參數,因此會執行onCancel功能處理方法。 **(4、測試:** 在瀏覽器輸入“http://localhost:9080/springmvc-chapter4/canCancelForm”,則首先到展示視圖頁面,點擊“取消按鈕”將重定向到“http://localhost:9080/springmvc-chapter4/cancel”,說明取消成功了。 實際項目可能會出現比如一些網站的完善個人資料都是多個頁面(即多步),那應該怎么實現呢?接下來讓我們看一下spring Web MVC提供的對多步表單的支持類AbstractWizardFormController。 [ 私塾在線學習網](http://sishuok.com/)原創內容([http://sishuok.com](http://sishuok.com/)) 原創內容,轉載請注明私塾在線【[http://sishuok.com/forum/blogPost/list/5254.html](http://sishuok.com/forum/blogPost/list/0/5234.html)】
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看