我在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)
答案 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
方法有request
和response
参数作为参数。
_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。
中使用其名称之前声明该beanJSP.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的位置(请求属性)中获取它。