我正在开发一个java webapp。在视图中,如果我可以创建只有视图知道的列表/序列,那将是很好的。
但是JSTL不能(据我所知)不能创建列表,但只能给出一个列表。但是我们经常需要一个动态创建的列表,只有jsp知道(控件和模型应该不知道)。这是一个简单的模拟示例,其中我使用scriplet创建一个稍后将由JSTL循环的列表。
以下是不良做法吗?如何做到这一点,因为我们经常需要的列表只是视图的一部分,而不是模型或控件。我已经习惯了Freemarker,并定期创建仅用于视图的序列,如何在JSTL中执行此操作而不使用scriplet,任何想法?我知道应该避免使用scriplets,但是人们对这种情况的看法是什么(因为FreeMarker中包含这样的东西?
<% // this code could go at the top or in an imported header
ArrayList<String> colors = new ArrayList<String>();
colors.add("red");
colors.add("green");
colors.add("blue");
colors.add("orange");
request.setAttribute("colors", colors);
%>
<c:forEach items="${colors}" var="color">
color= ${color} </br>
</c:forEach>
答案 0 :(得分:0)
确实应该避免使用Scriplets。 这个问题可以通过涉及一点点MVC结构/想法来解决 您可以使用servlet创建列表,然后将列表保存到请求对象。 在您的servlet中:
ArrayList<String> colors = new ArrayList<String>();
colors.add("red");
colors.add("green");
colors.add("blue");
colors.add("orange");
request.setAttribute("colors", colors);
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("yourPage.jsp");
dispatcher.forward(request, response);
return;
在“yourpage.jsp”中,您可以使用EL和jstl像您一样显示列表。 请注意,您仍然需要对如何创建servlet进行一些研究,但这很容易学习。
答案 1 :(得分:0)
JSTL没有任何工具来声明列表,但您可以使用fn:split
从字符串创建数组:
<c:set var="colors" value="${fn:split('red,green,blue,orange', ',')}" />
然而,在我看来,这不是一个很好的做法,因为它不是很易读,我认为如果在模型中定义列表,维护会更容易。
答案 2 :(得分:0)
我很欣赏我收到的答案,但我会回答问题(尽管我愿意接受更多反馈)。
看来JSTL确实提供了通过字符串创建列表的基本方法。以下将创建一个逗号分隔列表(排序)并将其存储在页面范围中。
<c:set var="colors" scope="page" value="red,green,blue,orange"/>
然后可以使用以下
循环此列表<c:forEach var="color" items="${colors}">
<LI>${color} <br/>
</c:forEach>
这不需要使用split函数,并在循环中自动处理。虽然&#39;,&#39;是默认的delim。我认为这很干净,可以处理UI的大多数情况。
我不喜欢在servlet中构建UI相关列表的想法,因为这似乎违反了MVC而不是简单的scriplet,但上面似乎有效,并且如果需要,split函数也应该运行良好。