2013-04-09 72 views
1

我在jsp页面中声明了请求作用域bean,并试图访问它另一页。 我能够使用scriptlet以及EL访问另一个页面上的bean,但是如果使用jsp;getProperty,它会得到一个异常。 下面是这两个页面的代码。访问请求作用域bean

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访问bean:的getProperty。请让我知道我错了。 谢谢。

编辑: 以下是堆栈跟踪。

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) 
+0

都调用JSP作为同一请求的一部分bean的属性? – leonbloy 2013-04-09 16:31:34

+0

@leonbloy是的,请参阅PageScope.jsp的RequestDispatcher语法 – 2013-04-09 16:34:51

+0

oops,对不起....在异常堆栈跟踪中没有用处? – leonbloy 2013-04-09 16:47:44

回答

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属性应匹配的 “id” 属性的属性之前声明的bean。

然后访问

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

随着Scriptlet中当您使用

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

检查你已经在你的JSP添加<%@page import="com.mybean.TaskBean"%> statemement。

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

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

_jspService(HttpServletRequest request, HttpServletResponse response) 

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

Remember thumb rule 

:当您访问使用jsp:getProperty,你需要添加<jsp:useBean>这是用来定位和实例化一个bean类

0

我相信

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

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

0

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

JSP.5.3

在JSP的名称属性的值:的setProperty和jsp:的getProperty 将指从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。

这将是安全使用相同的指令,该规范指出具有相同名称的豆(在目标范围内)不会被重新创建,如果它存在:

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中对此进行了描述。你最好看看你自己,这里是从横截面的样品

$ {产品}

这个表达式将查找属性命名的产品, 搜索页面,请求,会话和应用范围,并会 返回它的值。如果找不到该属性,则返回null。

3。至于为什么它与小脚本访问是显而易见的

JSP 1:

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

JSP 2:

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

你只是把它从地方(请求属性),其中以豆放在通过第一次调用jsp:useBean