<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    推薦淘寶秋冬男裝熱賣網店

    追求無止境

    我的程序人生
    隨筆 - 31, 文章 - 2, 評論 - 20, 引用 - 0
    數據加載中……

    Spring MVC 框架學習之AbstractFormController以及AbstractFormControll

    在看完BaseCommandController和AbstractCommandController之后,我們再看BaseCommandController的另一個實現AbstractFormController,以及AbstractFormController的具體實現SimpleFormController。

    先看看AbstractFormController對handleRequestInternal的實現:

    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
    throws Exception {
    // Form submission or new form to show?
    if (isFormSubmission(request)) {
    // Fetch form object from HTTP session, bind, validate, process submission.
    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) {
    // Cannot submit a session form if no form object is in the session.
    if (logger.isDebugEnabled()) {
    logger.debug("Invalid submit detected: " + ex.getMessage());
    }
    return handleInvalidSubmit(request, response);
    }
    }
    else {
    // New form to show: render form view.
    return showNewForm(request, response);
    }
    }
    這個方法,首先判斷是不是Form提交,判斷方法是:
    protected boolean isFormSubmission(HttpServletRequest request) {
    return "POST".equals(request.getMethod());
    }
    如果是form提交的話,系統首先創建一個Command,然后對數據進行綁定和驗證,之后調用processFormSubmission方法。showNewForm則調用showForm。
    在AbstractFormController中里面有兩個抽象方法:

    protected abstract ModelAndView processFormSubmission(
    HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
    throws Exception;
    protected abstract ModelAndView showForm(
    HttpServletRequest request, HttpServletResponse response, BindException errors)
    throws Exception;



     

     

    好了,看完AbstractFormController之后,再看看SimpleFormController是如何實現:

    protected ModelAndView processFormSubmission(
    HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
    throws Exception {

    if (errors.hasErrors()) {
    if (logger.isDebugEnabled()) {
    logger.debug("Data binding errors: " + errors.getErrorCount());
    }
    return showForm(request, response, errors);
    }
    else if (isFormChangeRequest(request, command)) {
    logger.debug("Detected form change request -> routing request to onFormChange");
    onFormChange(request, response, command, errors);
    return showForm(request, response, errors);
    }
    else {
    logger.debug("No errors -> processing submit");
    return onSubmit(request, response, command, errors);
    }
    }
    在上面的方法中,如果有錯誤,調用showForm,來顯示form。沒有錯誤的話,則調用onSubmit方法。
    protected final ModelAndView showForm(
    HttpServletRequest request, BindException errors, String viewName, Map controlModel)
    throws Exception {

    // In session form mode, re-expose form object as HTTP session attribute.
    // Re-binding is necessary for proper state handling in a cluster,
    // to notify other nodes of changes in the form object.
    if (isSessionForm()) {
    String formAttrName = getFormSessionAttributeName(request);
    if (logger.isDebugEnabled()) {
    logger.debug("Setting form session attribute [" + formAttrName + "] to: " + errors.getTarget());
    }
    request.getSession().setAttribute(formAttrName, errors.getTarget());
    }

    // Fetch errors model as starting point, containing form object under
    // "commandName", and corresponding Errors instance under internal key.
    Map model = errors.getModel();

    // Merge reference data into model, if any.
    Map referenceData = referenceData(request, errors.getTarget(), errors);
    if (referenceData != null) {
    model.putAll(referenceData);
    }

    // Merge control attributes into model, if any.
    if (controlModel != null) {
    model.putAll(controlModel);
    }

    // Trigger rendering of the specified view, using the final model.
    return new ModelAndView(viewName, model);
    }
    在showForm中,設置屬性,放在model中,然后在viewName進行設置。
    FormController就是上面的過程。具體的執行過程和詳細信息會在以后的博客中具體介紹。

    posted on 2009-11-25 17:31 追求無止境 閱讀(2448) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费一区二区视频| 亚洲精品中文字幕麻豆| 久久精品视频亚洲| 亚洲午夜在线播放| 久久久久久精品成人免费图片| 国产成人免费a在线资源| 久久久亚洲精品国产| 中文字幕av免费专区| 成人A级毛片免费观看AV网站| 亚洲女久久久噜噜噜熟女| 国产婷婷综合丁香亚洲欧洲| 曰批视频免费30分钟成人| 亚洲制服丝袜第一页| 成人毛片免费视频| 国产精品亚洲色图| 久久久久亚洲AV成人网人人软件 | 99久久免费国产香蕉麻豆 | 最好免费观看韩国+日本| 亚洲色大成网站www| 日韩亚洲国产综合久久久| 永久免费无码日韩视频| 国产免费av片在线看| 成人婷婷网色偷偷亚洲男人的天堂 | 亚洲第一综合天堂另类专| 日批日出水久久亚洲精品tv| 免费看一区二区三区四区| 亚洲欧洲精品一区二区三区| 美女啪啪网站又黄又免费| 成人免费一区二区三区在线观看| 亚洲国产精品网站在线播放| 亚洲情侣偷拍精品| 最近免费2019中文字幕大全| 久久精品亚洲综合| 无码中文字幕av免费放| 无忧传媒视频免费观看入口| 亚洲国产精品久久久天堂| 久久WWW色情成人免费观看| 久草免费福利在线| 精品久久久久久亚洲精品| 国产精品白浆在线观看免费| 亚洲国产精品张柏芝在线观看|