1

我在 jsp 页面中声明了一个请求范围的 bean,并尝试在另一个页面中访问它。我能够使用scriptletas well访问另一个页面上的 bean EL,但是如果使用它会出现异常jsp;getProperty。下面是两个页面的代码。

PageScope.jsp(首页):

   <jsp:useBean id="taskBean" class="com.mybean.TaskBean" scope="request" />
    <jsp:setProperty name="taskBean" property="multiplier" value="55" />
    <jsp:setProperty name="taskBean" property="multiplicand" value="<%= dd %>" />

<%
        System.out.println("Forwarding request to other page.");
        RequestDispatcher dispatcher = request.getRequestDispatcher("RequestScope.jsp");
        dispatcher.forward(request, response);
%>

RequestScope.jsp(另一页):

     <%
            out.println("Accessing request scoped bean");
            TaskBean taskBean = (TaskBean) request.getAttribute("taskBean");
            out.println(taskBean.getMultiplier());
        %>

        ${taskBean.multiplier}

        <jsp:getProperty name="taskBean" property="multiplier" />
         //THE ABOVE LINE THROWS EXCEPTION.

是否可以使用 jsp:getProperty 访问 bean。请让我知道我错了。谢谢。

编辑:下面是堆栈跟踪。

org.apache.jasper.JasperException: file:/RequestScope.jsp(28,4) jsp:getProperty for bean with name 'taskBean'. Name was not previously introduced as per JSP.5.3
    org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1104)
    org.apache.jasper.compiler.Node$GetProperty.accept(Node.java:1126)
    org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
    org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2428)
    org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2434)
    org.apache.jasper.compiler.Node$Root.accept(Node.java:475)
    org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
    org.apache.jasper.compiler.Generator.generate(Generator.java:3489)
    org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:250)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.apache.jsp.PageScope_jsp._jspService(PageScope_jsp.java:109)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
4

3 回答 3

4
Name was not previously introduced" indicates that you haven't told your JSP about this bean as of yet.

您需要添加

<jsp:useBean id="taskBean" class="com.mybean.TaskBean" scope="request" />

在您使用访问属性之前jsp:getProperty

还,

的“name”属性jsp:getProperty应该与声明的 bean 的“id”属性匹配。

然后访问

<jsp:getProperty name="taskBean" property="multiplier" />

使用 Scriptlet 时

TaskBean taskBean = (TaskBean) request.getAttribute("taskBean");

检查您已经在<%@page import="com.mybean.TaskBean"%>J​​SP 中添加了语句。

因此,当 JSP 页面被编译为RequestScope_jsp.java.

首先,它有你的 bean 的 import 语句其次,_jspService方法有requestresponse参数作为参数。

_jspService(HttpServletRequest request, HttpServletResponse response)

因此,您可以使用转发的 JSP 页面访问它们scriptlets。同样的事情也发生在EL.

Remember thumb rule

: 当你使用 访问 bean 属性时jsp:getProperty,你需要添加<jsp:useBean>用于定位和实例化一个 bean 类

于 2013-04-17T07:44:38.847 回答
0

我相信标签

<jsp:useBean id="taskBean" type="com.mybean.TaskBean" scope="request" />

RequestScope.jsp 文件中将需要它,因为它已经创建并存在于范围中。可能在 servlet 中创建 takeBean 更好,并且 servlet 创建 taskBean 并设置值,然后执行 dispatch.forward 而不是从另一个 jsp 页面执行。

于 2013-04-09T18:52:56.970 回答
0

1. 您需要在 jsp:getProperty 中使用它的名称之前声明 bean。

JSP.5.3

jsp:setProperty 和 jsp:getProperty 中 name 属性的值将引用一个对象,该对象是通过 pageContext 对象的 findAttribute 方法获取的。

以该名称命名的对象必须已使用 jsp:useBean 操作或具有该名称关联的 VariableInfo 条目的自定义操作“引入”到 JSP 处理器。如果对象不是以这种方式引入的,则建议(但不是必需)容器实现来引发翻译错误,因为页面实现违反了规范。

您可以在此处阅读有关 PageContext 的信息:http : //docs.oracle.com/javaee/5/api/javax/servlet/jsp/PageContext.html pageContext 隐式对象的另一个参考在JSP.2.4 Implicit Objects部分。

由于您转发到另一个 JSP,因此会有新的 PageContext。

使用相同的指令是安全的,规范说如果存在相同名称(在目标范围内)的 bean,则不会重新创建它:

JSP.5.1

jsp:useBean 动作非常灵活;它的确切语义取决于给定的属性。基本语义尝试使用 id 和范围查找现有对象。如果找不到对象,它将尝试使用其他属性创建对象。

因此,将与 PageScope.jsp 中相同的标记添加到第二个 JSP (RequestScope.jsp):

 <jsp:useBean id="taskBean" class="com.mybean.TaskBean" scope="request" />

2. 关于为什么它可以通过 EL 访问,JSP 规范在JSP.2.9 Resolution of Variables and their Properties. 您最好自己看一下,这是该部分的示例

${产品}

此表达式将查找名为 product 的属性,搜索页面、请求、会话和应用程序范围,并将返回其值。如果未找到该属性,则返回 null。

3. 关于为什么它可以通过 scriptlet 访问是显而易见的

jsp 1:

<jsp:useBean id="taskBean" class="com.mybean.TaskBean" scope="request" />

jsp 2:

TaskBean taskBean = (TaskBean) request.getAttribute("taskBean");

jsp:useBean您只需从第一次调用放置 bean 的位置(请求属性)获取它。

于 2013-04-15T07:57:06.697 回答