2017-01-13 36 views
5

Tôi đang sử dụng Spring 3.2.11.RELEASE với JBoss 7.1.3.Final và Java 6. Tôi có phương pháp này trong một bộ điều khiểnLàm cách nào để lặp qua tất cả các thuộc tính mô hình trên trang JSP của tôi?

@RequestMapping(value = "/method", method = RequestMethod.GET) 
public String myMethod(final Model model, 
         final HttpServletRequest request, 
         final HttpServletResponse response, 
         final Principal principal) 

... 
    model.addAttribute("paramName", "paramValue"); 

Chú ý làm thế nào tôi thêm các thuộc tính vào mô hình của tôi. Câu hỏi của tôi là, trên trang JSP mà trang này phục vụ, làm cách nào để lặp qua tất cả các thuộc tính trong mô hình của tôi và xuất chúng dưới dạng các trường đầu vào HIDDEN với tên của INPUT là tên thuộc tính và giá trị là giá trị tôi chèn vào mô hình bằng cách sử dụng thuộc tính đó?

Chỉnh sửa: Để trả lời câu trả lời nhất định, đây là đầu ra cho giải pháp JSP. Lưu ý không có thuộc tính mô hình trong đó.

 <input type='hidden' name='javax.servlet.jsp.jspRequest' value='org.spring[email protected]7a0a4c3f'> 

     <input type='hidden' name='javax.servlet.jsp.jspPageContext' value='[email protected]'> 

     <input type='hidden' name='appVersion' value='???application.version???'> 

     <input type='hidden' name='javax.servlet.jsp.jspResponse' value='[email protected]'> 

     <input type='hidden' name='javax.servlet.jsp.jspApplication' value='io.undertow.servlet.[email protected]'> 

     <input type='hidden' name='org.apache.taglibs.standard.jsp.ImplicitObjects' value='[email protected]c27a49'> 

     <input type='hidden' name='javax.servlet.jsp.jspOut' value='[email protected]'> 

     <input type='hidden' name='javax.servlet.jsp.jspPage' value='[email protected]'> 

     <input type='hidden' name='javax.servlet.jsp.jspConfig' value='[email protected]'> 

Trả lời

2

Thuộc tính mô hình là đối tượng "phạm vi yêu cầu" bạn có thể thực hiện các thao tác sau (tôi sử dụng JSTL):

<c:forEach items="${requestScope}" var="par"> 
     <c:if test="${par.key.indexOf('attrName_') > -1}"> 
      <li>${par.key} - ${par.value}</li> 
     </c:if> 
    </c:forEach> 

Kể từ khi không có bộ lọc bạn sẽ có tất cả các đối tượng yêu cầu phạm vi, tôi lọc bởi mô hình thuộc tính chúng ta muốn kiểm tra

Tôi đã thử nghiệm bằng cách sử dụng mã này:

@RequestMapping(method = { RequestMethod.GET }, value = { "/*" }) 
    public String renderPage(Model model) throws Exception 
    { 
     String requestedUrl = req.getRequestURI(); 
     int indice = requestedUrl.lastIndexOf('/'); 
     String pagina = requestedUrl.substring(indice + 1); 
     try 
     { 
      String usernameUtente = "default username utente"; 
      if (StringUtils.hasText(getPrincipal())) 
      { 
       usernameUtente = getPrincipal(); 
      } 
      model.addAttribute("usernameUtente", usernameUtente); 
      model.addAttribute("webDebug", webDebug); 
      for(int i = 0; i<10; i++) 
      { 
       model.addAttribute("attrName_"+i, "attrValue_"+i); 
      } 
      return pagina; 
     } 
     catch (Exception e) 
     { 
      String message = "Errore nell'erogazione della pagina " + pagina; 
      logger.error(message, e); 
      return "genericError"; 
     } 
    } 

Và đây là những gì tôi xem là đầu ra (tôi bỏ qua các bản in không liên quan nhưng xin lưu ý rằng bạn sẽ in TẤT CẢ các đối tượng phạm vi yêu cầu:

attrName_0 - attrValue_0 
attrName_1 - attrValue_1 
attrName_2 - attrValue_2 
attrName_3 - attrValue_3 
attrName_4 - attrValue_4 
attrName_5 - attrValue_5 
attrName_6 - attrValue_6 
attrName_7 - attrValue_7 
attrName_8 - attrValue_8 
attrName_9 - attrValue_9 

Tôi hy vọng điều này có thể giúp

Angelo

+0

Điều này có vẻ thực sự tốt. ONe câu hỏi, trong giải pháp của bạn làm tất cả các thuộc tính phải bắt đầu với một tiền tố đặc biệt để cho điều này để làm việc? Điều gì khác rác sẽ được in vào trang nếu tôi không lọc bởi một tiền tố? – Dave

+0

Tất cả các thuộc tính đều có khóa riêng; Thật đáng buồn là tôi không biết tất cả các thuộc tính vì một số ứng dụng có thể được thêm vào bởi Máy chủ ứng dụng, một số khác do khung ứng dụng (ví dụ mùa xuân) và các ứng dụng khác của bạn ... Vì vậy, điều tốt nhất có thể là đặt tiền tố cho tất cả các thuộc tính của bạn và chỉ lọc những cái này –

+0

Không có cách nào để biết cái nào được JBoss và Spring thêm vào? – Dave

-1

Bạn có thể thử này:

@RequestMapping(value = "/method", method = RequestMethod.GET) 
public String myMethod(final Model model, 
         final HttpServletRequest request, 
         final HttpServletResponse response, 
         final Principal principal) 

... 
    //Create list for param names and another list for param values 
    List<String> paramNames = new ArrayList(); 
    List<String> paramValues = new ArrayList(); 
    paramNames.add("paramName1"); 
    paramValues.add("paramValue1"); 
    paramNames.add("paramName2"); 
    paramValues.add("paramValue2"); 
    //paramValue1 is the value corresponding to paramName1 and so on... 
    //add as many param names and values as you need 
    ... 
    //Then add both lists to the model 
    model.addAttribute("paramNames", paramNames); 
    model.addAttribute("paramValues", paramValues); 

Sau đó, trong JSP, bạn có thể duyệt qua danh sách paramNames, và sử dụng varStatus.index để có được những chỉ số của vòng hiện lặp lại và sử dụng nó để kéo giá trị của giá trị param tương ứng từ danh sách paramValues. Như thế này -

<form id='f' name='myform' method='POST' action='/path/to/servlet'> 
    <c:forEach items="${paramNames}" var="paramName" varStatus="status">  
    <input type='hidden' name='${paramName}' value='${paramValues[status.index]}'> 
    </c:forEach> 
</form> 

Bạn có thể thêm các yếu tố đầu vào khác vào biểu mẫu cho mỗi tham số mà bạn đã đặt trong Mô hình.

+0

Điều này đòi hỏi phải có cấu trúc dữ liệu bổ sung, do đó, mỗi khi tôi thêm thuộc tính mô hình mới, tôi cũng phải thêm tên param của nó vào cấu trúc dữ liệu mới là đúng không? – Dave

+0

Như được hiển thị trong câu trả lời ở trên, bạn sẽ cần phải thêm tên param và giá trị param trong hai danh sách riêng biệt. Bạn chỉ cần thêm tên và giá trị param đó vào danh sách mà bạn muốn tạo phần tử đầu vào bị ẩn cho. Vì bạn đang thêm các danh sách đó vào các thuộc tính mô hình như được hiển thị ở trên nên bạn không cần thêm trực tiếp các tên param vào các thuộc tính mô hình. Hãy thử nếu ví dụ trên làm việc cho bạn tại là cho thấy làm thế nào để làm điều đó và sau đó làm thế nào để lặp qua hai danh sách để tạo ra các yếu tố đầu vào với loại trường ẩn. – lazyPanda

+0

Ý tưởng là tôi chỉ phải thêm các cặp tên-giá trị đó một lần, ở một nơi. Tôi muốn các đầu vào ẩn chính xác là mọi thứ được lưu trữ trong mô hình của tôi. Nếu tôi sẽ duy trì một danh sách riêng biệt, tôi cũng có thể chỉ cần thêm một đầu vào mới trên trang mỗi lần tôi thêm một cái gì đó vào mô hình của mình. – Dave

1

Về bản chất, tất cả những gì bạn cần là làm giảm tất cả các thuộc tính của trang. Tùy thuộc vào những gì bạn sử dụng trên jsp của bạn (scriptlets, JSTL, hoặc smthing như thymeleaf cho html):

Scriptlet:

<form> 
    <% Session session = request.getSession(); 
    Enumeration attributeNames = session.getAttributeNames(); 
    while (attributeNames.hasMoreElements()) { 
     String name = attributeNames.nextElement(); 
     String value = session.getAttribute(name); 
    %> 
     <input type='hidden' name="<% name %>" value="<% value %>"> 
    <% 
     } 
    %> 
</form> 

JSTL:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 

<h3>Page attributes:</h3> 
<form> 
    <c:forEach items="${pageScope}" var="p"> 
     <input type='hidden' name='${p.key}' value='${p.value}'> 
    </c:forEach> 
</form> 

Thymeleaf:

<form> 
    <input th:each="var : ${#vars}" type='hidden' name="${var.key}" value="${var.value}"> 
</form> 
+0

Tôi đã thử giải pháp JSTL của bạn (đầu ra có trong câu hỏi của tôi). Tôi muốn chắc chắn rằng bạn hiểu câu hỏi của tôi trước khi tôi thực hiện bất kỳ hành động phát ban nào. Tôi đang tìm các thuộc tính mô hình. Đầu ra là gì không phải là thuộc tính mô hình. Điều đó có ý nghĩa? – Dave

0

Đơn giản chỉ cần bạn có thể lặp lại sử dụng foreach thẻ của JSTL.

<c:forEach items="${requestScope}" var="var"> 
    <c:if test="${ !var.key.startsWith('javax.') && !var.key.startsWith('org.springframework')}"> 
     <input type="hidden" name="${var.key}" value="${var.value}" /> 
    </c:if> 
</c:forEach> 

Yêu cầu thuộc tính từ khung mùa xuân và từ Servlet có tiền tố, bạn không cần thêm tiền tố vào thuộc tính yêu cầu của mình.

Thay vào đó bạn có thể bỏ qua tất cả các thuộc tính có tiền tố "org.springframework" hoặc "javax".

2

Để tránh đau đầu với các tham số được thêm vào bởi thùng chứa Spring và Servlet, tốt hơn nên sử dụng bản đồ riêng cho các giá trị truyền vào mô hình. Chỉ cần sử dụng @ModelAttribute và mùa xuân sẽ tạo ra và thêm nó vào các mô hình tự động:

@RequestMapping(value = "/method", method = RequestMethod.GET) 
public String myMethod(final Model model, @ModelAttribute("map") HashMap<String, Object> map) { 

    map.put("paramName1", "value1"); 
    map.put("paramName2", "value2"); 
    //...and so on 
} 

Bây giờ bạn có thể lặp lại bản đồ này trong JSP:

<c:forEach items="${map.keySet()}" var="key"> 
    <input type="hidden" name="${key}" value="${map[key]}"/> 
</c:forEach> 

Ngoài ra bạn có thể truy cập vào tất cả các mục của bản đồ đường tiếp theo:

<c:out value="${map.paramName1}"/> 
<c:out value="${map.paramName2}"/> 
... 

Nếu bạn không cần tham số có thể lặp lại, hãy thêm thông số vào bản gốc riêng ModelMap.

Các vấn đề liên quan