如何在JSP页面上迭代所有模型属性?

时间:2017-01-13 19:54:37

标签: spring jsp input jboss model

我正在使用Spring 3.2.11.RELEASE和JBoss 7.1.3.Final和Java 6.我在控制器中有这个方法

@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");

注意我如何在模型中添加属性。我的问题是,在这个页面所服务的JSP页面上,我如何迭代模型中的所有属性并将它们输出为HIDDEN输入字段,其中INPUT的名称是属性名称,值是我插入的使用该属性的模型?

编辑:在回答给出的答案时,这是JSP解决方案的输出。请注意,那里没有模型属性。

        <input type='hidden' name='javax.servlet.jsp.jspRequest' value='org.springframework.web.context.support.ContextExposingHttpServletRequest@7a0a4c3f'>

        <input type='hidden' name='javax.servlet.jsp.jspPageContext' value='org.apache.jasper.runtime.PageContextImpl@3939794a'>

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

        <input type='hidden' name='javax.servlet.jsp.jspResponse' value='org.owasp.csrfguard.http.InterceptRedirectResponse@722033be'>

        <input type='hidden' name='javax.servlet.jsp.jspApplication' value='io.undertow.servlet.spec.ServletContextImpl@14c1252c'>

        <input type='hidden' name='org.apache.taglibs.standard.jsp.ImplicitObjects' value='javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects@23c27a49'>

        <input type='hidden' name='javax.servlet.jsp.jspOut' value='org.apache.jasper.runtime.JspWriterImpl@b01a1ba'>

        <input type='hidden' name='javax.servlet.jsp.jspPage' value='org.apache.jsp.WEB_002dINF.views.lti.launch_jsp@1dcc48bf'>

        <input type='hidden' name='javax.servlet.jsp.jspConfig' value='io.undertow.servlet.spec.ServletConfigImpl@3fd40806'>

5 个答案:

答案 0 :(得分:2)

模型属性是“请求范围”对象 你可以做以下(我使用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>

由于没有过滤器,您将拥有所有请求范围对象,我按照我们要检查的模型属性进行过滤

我使用此代码测试:

@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";
        }
    }

这就是我看到的输出(我省略了不相关的打印但请注意你将打印所有请求范围对象:

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

我希望这可以提供帮助

安吉洛

答案 1 :(得分:2)

为了避免使用Spring和Servlet容器添加参数的头痛,最好将单独的map用于传递值到模型中。只需使用@ModelAttribute,Spring就会创建并自动将其添加到模型中:

@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
}

现在您可以在JSP中迭代此地图:

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

此外,您可以访问下一个地图的每个项目:

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

如果您不需要某些参数可迭代,请将其添加到原始ModelMap中,而不是单独的地图。

答案 2 :(得分:1)

本质上,您只需要对所有页面属性进行迭代。取决于你在jsp上使用的内容(scriptlets,jstl,或像hme的thymeleaf一样):

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>

答案 3 :(得分:0)

您只需使用Jstl的 foreach 标记进行迭代。

 <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>

来自spring框架和Servlet的请求属性都有前缀,您不需要在请求属性中添加前缀。

相反,您可以忽略所有具有前缀&#34; org.springframework&#34;的属性。或&#34; javax。&#34;。

答案 4 :(得分:-1)

你可以试试这个:

@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);

然后在JSP中,您可以遍历paramNames列表,并使用varStatus.index获取当前迭代循环的索引,并使用它从paramValues列表中提取相应param值的值。像这样 -

 <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>

您可以根据需要向表单添加其他输入元素,但上面应为您在模型中设置的每个参数生成所有隐藏的输入元素。