2013-04-09 2 views
1

jsp 페이지에서 요청 범위 콩을 선언하고 다른 페이지에 액세스하려고했습니다. EL뿐만 아니라 scriptlet을 사용하여 다른 페이지에서 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:useBean>를 추가해야 사용하여 빈 속성에 액세스 할 때? – leonbloy

+0

@leonbloy 예, PageScope.jsp의 RequestDispatcher 구문을 참조하십시오. –

+0

죄송합니다. 죄송합니다 .... 예외 스택 트레이스에 유용한 것은 없습니까? – leonbloy

답변

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

당신은 당신이 또한 jsp:getProperty

,

는 "이름" jsp:getProperty의 속성의 "ID"속성과 일치해야합니다 사용하여 속성에 액세스하기 전에

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

를 추가해야 선언 된 bean. 당신이

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

당신은 이미 JSP에 <%@page import="com.mybean.TaskBean"%> statemement을 추가 한 확인 사용할 때

그런 다음 스크립트 릿으로

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

에 액세스 할 수 있습니다.

그래서

, JSP 페이지가 RequestScope_jsp.java처럼 컴파일 도착합니다.

첫째, 그것은 여러분의 빈 초 동안 수입의 문이 _jspService 방법은 인수로 requestresponse 매개 변수가 있습니다.

_jspService(HttpServletRequest request, HttpServletResponse response) 

따라서, 당신은 JSP 페이지는 그들을 scriptlets를 사용하여 액세스 전달 할 수 있습니다. EL도 마찬가지입니다.

Remember thumb rule 

: 당신이 jsp:getProperty, 당신은 모두 같은 요청의 일부로 호출 JSP 있습니까 찾아 빈 클래스

0

나는 태그가 이미 생성하고 해당 범위에 존재하는 수이기 때문에

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

가의 RequestScope.jsp 파일에 필요한 것을 생각한다. 아마도 takeBean은 서블릿에서 더 잘 생성되고 servlet은 taskBean을 생성하고 값을 설정 한 다음 다른 JSP 페이지 대신 dispatch.forward를 수행합니다.

0

1. jsp : getProperty에서 이름을 사용하기 전에 bean을 선언해야한다.

JSP.5.3

JSP의 name 속성의 값 : setProperty는 JSP 등 getProperty에 는 findAttribute 방법을 통하여 개체의 pageContext 로부터 획득 된 객체를 참조한다.

이름으로 명명 된 객체는 JSP 프로세서에 "jsp : useBean"액션 또는 과 연관된 VariableInfo 항목이있는 사용자 정의 액션을 사용하여 "도입"되어 있어야합니다. 객체가이 방식으로 도입 된 이 아닌 경우 구현이 사양을 위반했기 때문에 컨테이너 구현은 변환 오류를 발생 시키려면 (반드시 필요하지는 않음) 을 권장합니다. 당신은 여기 PageContext에 대해 읽을 수 있습니다

: 내장 객체를 PAGECONTEXT하는 http://docs.oracle.com/javaee/5/api/javax/servlet/jsp/PageContext.html 또 다른 참조가 JSP.2.4 Implicit Objects 섹션에 있습니다.

다른 JSP로 전달할 때 새로운 PageContext가 생길 것입니다.

JSP.5.1

:

동일한 명령을 사용하는 것이 안전 할 것이다는 사양이 존재하는 경우 (대상 범위) 같은 이름을 가진 bean이 다시 생성되지 않는다는 것을 말한다

jsp : useBean 액션은 매우 유연합니다. 그 정확한 의미는 주어진 속성에 에 달려있다. 기본 의미론은 ID와 범위를 사용하여 기존 개체를 찾으려고 시도합니다.객체가 발견되지 않으면 다른 속성을 사용하여 객체를 만들려고 시도합니다 ( ).

그래서 두 번째 JSP (RequestScope.jsp)에 PageScope.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 호출.

관련 문제