我正在使用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'>
答案 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>
您可以根据需要向表单添加其他输入元素,但上面应为您在模型中设置的每个参数生成所有隐藏的输入元素。