如果我们只需要在视图中使用列表,如何避免使用scriptlet

时间:2014-03-16 12:55:57

标签: java jsp model-view-controller jstl freemarker

我正在开发一个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>

3 个答案:

答案 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函数也应该运行良好。