【问题标题】:useBean class attribute value for list of custom class自定义类列表的 useBean 类属性值
【发布时间】:2014-06-04 15:50:44
【问题描述】:

我刚刚开始学习 JSP 和 servlet。据我所知,我们可以从 servlet 设置会话属性,并使用 jsp:useBean 在 jsp 中使用它。

现在我有一个名为 Environment 的自定义类,它具有某些属性。在 servlet 中,我正在调用一个返回环境对象列表的服务方法。然后我设置会话属性。

List<Environment> environments = eService.fetchEnvironments();
session.setAttribute("environments", environments);

并使用 RequestDispatcher 将请求和响应对象转发到目标 JSP。 现在我想在 JSP 中访问这个属性。所以我在 JSP(target JSP) 中做了以下操作:

<jsp:useBean id="environments" type="java.util.List<test.project.dto.Environment>"
class="java.util.ArrayList<test.project.dto.Environment>" scope="request"></jsp:useBean>

fetchEnvironments() 方法是这样的:

List<Environment> environmentList = new ArrayList<Environment>();
//Usual stuff
//Creating & initializing Connection, Statement, Sql string
//etc
ResultSet environments = st.executeQuery(sql);           

while(environments.next())
{
      Environment environment = new Environment();

      environment.setEnvID(environments.getInt(1));
      environment.setEnvName(environments.getString(2));
      environment.setEnvDescription(environments.getString(3));

      environmentList.add(environment);
}

打开上述 JSP 文件时出现以下错误,

/EnvironmentManager.jsp (line: 31, column: 2) The value for the useBean class attribute java.util.ArrayList<test.project.dto.Environment> is invalid.

所以我的问题是我在这方面犯了什么错误?我给出的“类”和“类型”属性是否正确?

为了使问题更具建设性:当我有一个自定义类的 List 对象(List)时,useBean 的“类”和“类型”属性值应该是什么?

【问题讨论】:

  • 为什么不将列表公开为请求属性并使用 JSTL/JSP EL 访问/迭代它?
  • @DaveNewton 感谢您的回复。是的!有效。显然会话属性也有效,但只有当我使用 scriptlet 将其拉入 jsp 时。仅使用 useBean 有什么方法吗?我知道我在这里遗漏了一些非常简单的东西。可能必须更改“类”和“类型”属性的值,但不知道是什么。

标签: jsp servlets jstl


【解决方案1】:

来自链接here

属性:

class="package.class" 使用 new 关键字和类从一个类实例化一个 bean 构造函数。类不能是抽象的,必须有一个公共的, 无参数构造函数。包名和类名区分大小写。 类型="包.class" 如果 bean 已经存在于作用域中,则给 bean 一个数据类型,而不是 实例化它的类。类型的值必须是 类的超类或类实现的接口。如果你使用类型 没有类或 beanName,没有 bean 被实例化。包名和类名 区分大小写。

尝试不指定类为:

    <jsp:useBean id="environments" type="java.util.List<test.project.dto.Environment>"
    scope="session"></jsp:useBean>

您使用范围作为请求。

最好从 jstl 和 el 开始,而不是 Dave 指出的 jsp:useBean。

在jsp中导入jstl标签为:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

并将列表迭代为:

    <c:forEach items="${environments}" var="environment" varStatus="status1">
           Id: <c:out value="${environment.envId}"/>
           Name: <c:out value="${environment.envName}"/>
    </c:forEach>

【讨论】:

  • 感谢@Prasad。它有帮助。我曾尝试过,但我犯的愚蠢错误是在范围内使用“请求”,而我在“会话”范围内设置属性。另一个菜鸟问题:jsp:useBean 不是 JSTL 的一部分吗?或者换句话说,我可以在没有 jsp:useBean 的情况下在 JSP 中捕获这个“环境”对象吗?
  • 是的,JSTL EL 将查找页面、请求、会话和应用程序范围中指定的属性,并将返回其值。这没有 jsp:useBean 的支持。在您的场景中,如果您与设置列表处于同一会话中,则可以使用 jstl 尝试上述代码并查看输出。更多信息可以在 stackoverflow wiki 上找到:stackoverflow.com/tags/jstl/info
  • 谢谢!感谢帮助。 :)
【解决方案2】:

我解决了以下类似问题:

<dependencies>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    ...
</dependencies>

java中:

request.setAttribute("users", dao.getAllUsers()); // List

jsp

<jsp:useBean id="users" type="java.util.List<net.roseindia.bean.UserBean>" scope="request"/>

<c:forEach var="currentList" items="${users}">
    <tr>
        <td>${currentList.id}</td>
        <td>${currentList.firstName}</td>
        <td>${currentList.lastName}</td>
        <td align="center"><a href="UserHandler?action=editform&userId=${currentList.id}">Update</a></td>
        <td align="center"><a href="UserHandler?action=delete&userId=${currentList.id}">Delete</a></td>
    </tr>
</c:forEach>

我希望它会有所帮助。

这里的所有代码:https://github.com/ashot123/CRUD8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 2013-11-04
    • 2011-11-12
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多