我一直在寻找如何正确地做到这一点,但无法找到关于如何处理的明确指南。
我知道你不能在标签中使用表达式,但我不确定我是怎么想接近它的。
在没有太多解释或帮助的情况下,我已经看到了很多答案。
基本上我想要像下面这样的东西工作,但显然不会。
<c:forEach items="${dataposition.rows}" var="lineposition" begin="0" varStatus="status">
<c:set var="name_${status.count}" value="${lineposition.value}" scope="session"/>
</c:forEach>
确切的错误消息是
&#34;根据标签文件中的TLD或属性durective,属性var 不接受任何表达&#34;
实现这个目标的正确方法是什么?
(我从实际代码中更改了变量名称,但希望您仍然可以理解)
如果我需要创建java对象或其他东西我很好,但我需要知道如何将它们包含在我的项目中以及如何在代码中使用它们。像列表一样的东西听起来是正确的。
我创建了一个对象来保存我的价值观。
<jsp:useBean id="myid" class="myclass" scope="session"/>
我想用它,但不确定如何:
<c:forEach items="${dataposition.rows}" var="lineposition" begin="0" varStatus="status">
<%
myid.add_position(lineposition.var1, lineposition.var2, lineposition.var3, lineposition.var4, lineposition.var5);
%>
</c:forEach>
答案 0 :(得分:4)
使用MVC框架分离代码以将数据设置为您想要呈现的方式将是理想的方式。如果在呈现JSP之前在服务器上执行任何类型的控制器,那么我建议将逻辑放在那里。除了控制器是准备这类数据的更合适的地方之外,语法几乎肯定会比你在JSP上使用的任何东西看起来更干净。
如果您没有控制器并且您只使用JSP,那么我想我会建议编写一个标签来替换&lt; c:set&gt;。这不是最干净的方法,但如果JSP是你所坚持的,那么对我来说这似乎是一个不错的妥协(我认为它比scriptlet更好,并且攻击JSTL核心TLD以允许表达式在&中#34; var&#34;属性无论如何)。它会做与&lt; c:set&gt;相同的所有事情。除了可以写入TLD以允许表达式在&#34; var&#34;属性。
<强> MyTag.java 强>
package example;
import org.apache.taglibs.standard.tag.rt.core.SetTag;
public class MySetTag extends SetTag { }
<强> WEB-INF / my.tld 强>
<taglib>
<tag>
<name>set</name>
<tag-class>example.MySetTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>var</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
...
</tag>
</taglib>
<强> rownamer.jsp 强>
<%@ taglib prefix="my" uri="WEB-INF/my.tld"%>
<c:forEach items="${dataposition.rows}" var="lineposition" begin="0" varStatus="status">
<my:set var="name_${status.count}" value="${lineposition.value}" scope="session"/>
</c:forEach>