如何使用EL躲避复制?

时间:2012-03-10 14:52:45

标签: java jstl el duplicate-removal

我正在将我的。 jsp 从scriplets重写为JSTL / EL,我正面临一个问题。这可能很简单,但我是EL的新手,有点迷失。

这就是我正在做的......

在servlet / controller中:

final List<Person> l = new ArrayList<Person>();
personList.add(...);
.
.
request.setAttribute( "personList", l );

在我的。 jsp

<c:forEach var="person" items="${personList}">
    ${person.name}
</c:forEach>

但我正在复制“personList”,因为我在 setAttribute forEach 中都使用它。我怎样才能摆脱这种重复?

理想情况下,我希望有一个常量,比如 public static final String ,我可以从servlet和 .jsp (使用EL,不是scriptlet)。

显然我想消除这种重复的原因是,如果我决定将 personList 重命名为(带有's'),我目前需要改变两件事,这很容易出错。如果我有一个常数,那么我只需要有一个地方可以做出改变。

编辑有人评论说,使用常量,如果我更改了常量的名称,仍然需要更改两个地方。但是如果我能做到这一点有很大的不同:

request.setAttribute(Constants.PERSON_LIST,l);

然后决定重命名* PERSON_LIST *并输入错字,这会在编译时中断。

如果我错误输入:

request.setAttribute( "persnList", l ); // forgetting an 'o' here

如果 .jsp 使用的是“personList”而不是输入错误的“persnList”,那么在运行时这将完全编译并失败。

3 个答案:

答案 0 :(得分:1)

这是使用遗留/基本JSP / Servlet时的结果。您自己手动执行所有前端控制器任务。

转到真正的MVC框架。例如JSF,Spring MVC,Wicket等。这些框架有一个servlet(或过滤器),它充当前端控制器,完成创建bean的所有讨厌的预处理工作,将它们放在所需的范围内等等。结束操作只使用javabeans作为模型,JSP / Facelets文件作为视图。在例如JSF中,您需要的是以下javabean(它将在JSF本身的“请求范围内”自动“设置):

@ManagedBean
@RequestScoped
public class Persons {

    private List<Person> list;

    @EJB
    private PersonService service;

    @PostConstruct
    public void init() {
        list = service.list();
    }

    public List<Person> getList() {
        return list;
    }

}

这个Facelet视图:

<ui:repeat value="#{persons.list}" var="person">
    #{person.name}
</ui:repeat>

没有重复,当使用体面的IDE工具(例如Eclipse与JBoss Tools)时,它们都相互链接,以便您可以执行 Source&gt;重构&gt;重命名,没有痛苦。

答案 1 :(得分:0)

它真的不重复吗?它只是声明一个变量并在一个范围内访问变量。那很好。如果你编写一个程序并在一行上声明一个变量,那么稍后在程序中你访问变量然后就会遇到同样的问题......如果你改变了声明的变量名,那么必须找到并更改所有的使用。

在您的示例中,范围是请求范围。因此,如果在请求范围中更改变量名称,则必须遍历整个范围并更改对同一变量的所有引用。声明和访问发生在两个不同的文件中的事实应该不是一个大问题。这不是一个需要解决的问题,解决方案可能会导致难以阅读的代码。

答案 2 :(得分:0)

也许我错了,但我认为jsps的一个标准问题是你在页面加载之前看不到错误。即使常量修复了这个问题,你所描述的也不是重复,而是一般的EL变量的缺陷(即它们在运行时被动态查找)