访问请求范围的bean

时间:2013-04-09 16:26:39

标签: java jsp javabeans

我在jsp页面中声明了一个请求范围的bean,并试图访问另一个页面。 我能够使用scriptlet以及EL访问另一个页面上的bean,但是如果使用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)

3 个答案:

答案 0 :(得分: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

访问属性之前

此外,

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

然后访问

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

使用Scriptlet时使用

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

检查您已在JSP中添加了<%@page import="com.mybean.TaskBean"%> statemement。

所以,当JSP页面被编译为RequestScope_jsp.java时。

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

_jspService(HttpServletRequest request, HttpServletResponse response)

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

Remember thumb rule

:使用jsp:getProperty访问bean属性时,需要添加用于查找和实例化bean类的<jsp:useBean>

答案 1 :(得分:0)

我相信标签

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

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

答案 2 :(得分:0)

1。您需要在jsp:getProperty。

中使用其名称之前声明该bean
  

JSP.5.3

     

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

     

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

您可以在此处阅读有关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的位置(请求属性)中获取它。