2013-04-09 75 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