2015-10-22 54 views
2

我正在努力尋找可以呈現部分的正確實現。目前,我希望在提交發布操作後呈現/更新部分內容。使用Spring MVC和Thymeleaf處理部分問題

因爲我來自.NET背景,在Spring MVC中我發現它非常困難。

使用ASP.NET MVC我可以有一個局部控制器,它會返回一個可以通過Ajax調用的局部視圖。 在Spring MVC中,似乎我需要Spring Webflow,並且看起來像使用百里香和應用程序的其餘部分設置一團糟。除了需要用xml編寫Spring Webflow之外。 我目前的寵物項目純粹是在Java配置

是否有更有效的替代方案?也許使用異步控制器之類的東西,或者可以模仿ASP.NET使用我喜歡的partials的東西。如果可能的話。 與Razor甚至Laravels Blade引擎相比,我確實發現Java視圖引擎非常薄弱。 Thymleaf肯定會朝着正確的方向發展,但他們管理分部和模板並不清楚和混亂。

我可能不知道它有多簡單,因此我想要一個很好的指導如何設置它。在視圖中使用Spring MVC我沒有真正的信心。

===================

編輯

爲了給什麼,我想實現一些代碼示例。

主要觀點:

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org" lang="en" 
     xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" 
     layout:decorator="layout/master"> 
<head> 
    <meta charset="UTF-8"/> 
    <title>Manage Account</title> 
</head> 
<body> 
<div layout:fragment="header"></div> 

<div th:object="${account}" class="col-md-12" id="content" layout:fragment="body"> 

    <section id="manage" class="col-md-8 col-md-offset-3"> 
     <form id="manageForm" action="#" th:object="${account}" th:action="@{/account/user/account/{id}/manage/update(id=${account.getAccount().getId()})}" method="post"> 
      <div id="accountDisplay" th:replace="account/accountDisplay"> 

      </div> 

      <div class="form-group"> 
       <button id="submit" class="col-md-2 btn btn-primary form-control" th:type="submit" value="Submit">Submit</button> 
      </div> 
     </form> 
    </section> 
    <div> 

    </div> 

    <script> 
     $().ready(function() { 
      var form = $("#mangeForm").serialize(); 

      $('#submit').click(function (e) { 
       e.preventDefault(); 
       acId = $('#acId').val(); 
       updateView(form, acId); 
      }); 

      function updateView(form, acId) { 
       $.ajax({ 
        url: '/user/account/' + acId + '/manage/update', 
        data: form /* add other additional parameters */, 
        cache: false, 
        dataType: "json", 
        type: "POST", 
        success: function (data, textStatus, XMLHttpRequest) { 

         alert("success"); 
        } 
       }); 
      } 
     }); 
    </script> 
</div> 
</body> 
</html> 

這是 「父」 頁,其中是調用部分

部分

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org"> 

<body> 
    <div id="accountDisplay" th:fragment="accountDisplay" class="col-md-6"> 

     <input id="acId" class="form-control" type="hidden" th:field="${account.account.id}"/> 
     <div class="form-group"> 
      <span>Name :</span> <span th:text="${account.getAccount().getName()}"></span> 
     </div> 

     <div class="form-group"> 
      <label class="control-label" th:text="${account.getAccount().getBalance()}">Balance :</label> 
      <label class="control-label" th:for="${account.amount}">Amount :</label> 
      <input class="form-control" type="text" th:field="*{amount}"/> 
     </div> 

    </div> 
</body> 
</html> 

現在這部分沒有被呈現時,問題是當我嘗試通過上面顯示的ajax調用進行調用時。

正在調用的控制方法有:

@RequestMapping(value = "/user/account/{id}/manage/update", method = RequestMethod.POST) 
    public String postTransaction(@ModelAttribute("account") final OperationObject account, BindingResult result, HttpServletRequest request) { 
     if (result.hasErrors()) { 
      return "redirect:/account/mange"; 
     } 
     else { 
      System.out.println("New Thread Established"); 
        Account thisAccount = accountService.findById(account.getAccount().getId()); 
        thisAccount.withdraw(account.getAmount()); 
        accountService.update(thisAccount); 

        return "redirect:account/accountDisplay"; 
     } 
    } 

    @RequestMapping(value = "/user/account/{id}/manage/update", method = RequestMethod.GET) 
    public String updateManageView(@PathVariable Long id, Model model) { 

     Account account = accountService.findById(id); 
     model.addAttribute("Account", account); 
     return "account/accountDisplay"; 
    } 

我怎樣才能得到這個設置的工作?我錯過了什麼,應該使用哪些佈局/片段? 我希望這給了一些細節給我一個正確的援助。

回答

2

在我可以進一步解釋任何事情之前,你必須瞭解百里香佈局的概念。 Thymeleaf默認支持兩種佈局選項。有關詳細信息請參閱文檔http://www.thymeleaf.org/doc/articles/layouts.html

  1. 包括風格佈局

解決方案:創建新的視圖,並跳過通過使用th:include包括頁眉和頁腳

  • 分層樣式佈局 - 以ASP爲例。淨在那裏你有主頁面佈局。
  • 解決方案:創建一個新的視圖,其中不包括layout:decorator="_layout/some_layout"在根節點。

    我相信你正在使用他上面的一個。

    無論如何,如果您需要加載ajax請求的部分視圖以獲取渲染,您必須通過您的controller中的此類請求發送它。

    @RequestMapping(value = "/some_action") 
    public String ajaxAction(..){ 
        return "new_view_name_with_layout"; 
    } 
    
    @RequestMapping(value = "/some_action", headers = "x-requested-with=XMLHttpRequest") 
    public String ajaxAction(..){ 
        return "new_view_name_without_layout"; 
    } 
    
    相關問題