jsp设置变量变量名

The*_*ams 5 java jsp scriptlet

我一直在寻找如何正确执行此操作,但找不到有关如何执行此操作的明确指南。

我知道您不能在标签内使用表达式,但我不确定我还应该如何处理它。

我已经看到了很多答案,但没有太多解释或帮助。

本质上我希望像下面这样的东西能够工作,但显然不行。

<c:forEach items="${dataposition.rows}" var="lineposition" begin="0" varStatus="status">
    <c:set var="name_${status.count}" value="${lineposition.value}" scope="session"/>
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

确切的错误消息是

“根据标记文件中的 TLD 或属性描述符,属性 var 不接受任何表达式”

实现这一目标的正确方法是什么?

(我从实际代码中更改了变量名称,但希望您仍然明白)

如果我需要创建 java 对象或其他东西,我对此很满意,但我需要知道如何将它们包含在我的项目中以及如何在代码中使用它们。像列表这样的东西听起来不错。

我创建了一个对象来保存我的价值观。

<jsp:useBean id="myid" class="myclass" scope="session"/>
Run Code Online (Sandbox Code Playgroud)

我想使用它,但不确定如何使用:

<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>
Run Code Online (Sandbox Code Playgroud)

Eri*_*pie 4

使用 MVC 框架将设置数据的代码与您想要的呈现方式分开将是理想的方法。如果您有一个在 JSP 呈现之前在服务器上执行的任何类型的控制器,那么我建议将您的逻辑放在那里。除了控制器是准备此类数据的更合适的地方之外,语法几乎肯定看起来比您可以放在 JSP 上以实现此工作的任何内容都更干净。

如果您没有控制器并且只使用 JSP,那么我想我会建议编写一个标记来替换 <c:set>。这不是最干净的方法,但如果 JSP 是您所坚持的,那么对我来说这似乎是一个不错的妥协(我认为这比 scriptlet 和破解 JSTL 核心 TLD 以允许“var”属性中的表达式更好)。它会执行与 <c:set> 相同的所有操作,除了可以编写 TLD 以允许“var”属性中的表达式。

MyTag.java

package example;

import org.apache.taglibs.standard.tag.rt.core.SetTag;

public class MySetTag extends SetTag { }
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

行命名器.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>
Run Code Online (Sandbox Code Playgroud)