JSP中Bean的问题 很晕~

结贴是美德 2012-02-08 11:57:15
一个Bean类,再简单不过了:


package com.example;

public class MyZQB {
private String bi = "rrr";

public MyZQB() {

}

public MyZQB(String bi) {
this.bi = bi;
}

public String getBi() {
return bi;
}

public void setBi(String bi) {
this.bi = bi;
}

}


用到上面Bean的JSP页面,只贴的body部分,其他部分和平常一样:


<body>
<%
pageContext.setAttribute("MyBean", new MyZQB("abc"));
%>

<jsp:useBean id="MyBean" scope="request" class="com.example.MyZQB" />

<jsp:getProperty property="bi" name="MyBean" />
</body>


bi默认是rrr,我这个<jsp:useBean>标签设置的是request范围,按说应该新建一个bean,bi应该是默认的rrr。可是<jsp:getProperty>取到的值却是abc。貌似是pageContext中重名的那个。

然后我把<jsp:useBean id="MyBean" scope="request" class="com.example.MyZQB" />这一行删了,其他部分不动,运行的时候却是编译错误。

这<jsp:getProperty>标签到底是什么查找范围。。。求解答~
...全文
458 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
pjwtheking 2014-04-21
  • 打赏
  • 举报
回复
a、用pageContext创建的MyBean,这个MyBean允许的访问范围是本页面。 b、使用useBean创建对象时,就会查找到a中创建的MyBean,就不会再创建一个新实例。 c、useBean中的scope只是限制该useBean创建对象的访问范围,和a中的pageContex没有关系。
陈字文 2012-02-08
  • 打赏
  • 举报
回复
看错了...
RE:
当JavaBean被创建后,通过<jsp:setProperty>标签与<jsp:getProperty>标签调用时,将会按照page、request、session和application的顺序来查找这个JavaBean实例,直至找到一个实例对象为止,如果在这4个范围内都找不到JavaBean实例,则抛出异常。
陈字文 2012-02-08
  • 打赏
  • 举报
回复
pageContext.setAttribute("MyBean", new MyZQB("abc"));

上面你建立的这个MyZQB对象,把bi赋值为abc覆盖了rrr
结贴是美德 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cai5 的回复:]

看看javabean的查找作用域顺序

JavaBean的作用域

JavaBean的生命周期存在于4种范围之中,分别为page、request、session、application,它们通过<jsp:useBean>标签的scope属性进行设置。这4种范围虽然存在很大的区别,但它们与JSP页面中的page、request、session、application范围相对应。

p……
[/Quote]

pageContext.setAttribute("MyBean", new MyZQB("abcd"));这句算是往page作用域放一个Bean么?
五哥 2012-02-08
  • 打赏
  • 举报
回复
看看javabean的查找作用域顺序

JavaBean的作用域

JavaBean的生命周期存在于4种范围之中,分别为page、request、session、application,它们通过<jsp:useBean>标签的scope属性进行设置。这4种范围虽然存在很大的区别,但它们与JSP页面中的page、request、session、application范围相对应。

page范围:与当前页面相对应,JavaBean的生命周期存在于一个页面之中,当页面关闭时JavaBean被销毁。

request范围:与JSP的request生命周期相对应,JavaBean的生命周期存在于request对象之中,当request对象销毁时JavaBean也被销毁。

session范围:与JSP的session生命周期相对应,JavaBean的生命周期存在于session会话之中,当session超时或会话结束时JavaBean被销毁。

application范围:与JSP的application生命周期相对应,在各个用户与服务器之间共享,只有当服务器关闭时JavaBean才被销毁。

这4种作用范围与JavaBean的生命周期是息息相关的,当JavaBean被创建后,通过<jsp:setProperty>标签与<jsp:getProperty>标签调用时,将会按照page、request、session和application的顺序来查找这个JavaBean实例,直至找到一个实例对象为止,如果在这4个范围内都找不到JavaBean实例,则抛出异常。

结贴是美德 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ilovefzq 的回复:]

<%@ page language="java" import="com.aa.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>



<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ht……
[/Quote]

我c 我这边出异常啊 怪了。。。。。。。。。。
ilovefzq 2012-02-08
  • 打赏
  • 举报
回复
<%@ page language="java" import="com.aa.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>



<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<body>

<%
pageContext.setAttribute("MyBean", new MyZQB("abcd"));
%>
<jsp:getProperty property="bi" name="MyBean" />
</body>
</html>

我运行了,这样是可以显示abcd的,没出错啊
安心逍遥 2012-02-08
  • 打赏
  • 举报
回复
呵呵,好像很多时候都不用这个东西的
Java高知社区 2012-02-08
  • 打赏
  • 举报
回复
LUGUO D
结贴是美德 2012-02-08
  • 打赏
  • 举报
回复
谢谢楼上两位

不过如果getProperty的查找范围是对应的useBean标签决定的。那为何我在没有删<jsp:useBean id="MyBean" scope="request" class="com.example.MyZQB" />这行的时候会输出abc??这abc的Bean可不是在request作用域里啊,他在page里面啊。。。

很晕
Java18 2012-02-08
  • 打赏
  • 举报
回复
我觉得
<%
pageContext.setAttribute("MyBean", new MyZQB("abc"));
%>
new MyZQB("abc") 调用了MyZQB的有参构造方法

public MyZQB(String bi) {
this.bi = bi;
}

所以你再获取bi,bi="abc"了
至于<jsp:getProperty>标签到底是什么查找范围 应该看<jsp:useBean id="MyBean" scope="request" class="com.example.MyZQB" />
蛋黄车 2012-02-08
  • 打赏
  • 举报
回复
scope就是它的查找范围啊

你的是request,所以查找范围是request作用域

你删掉之所以报错,是因为下面的name为MyBean的没有找到

另外,你new MyZQB("abc")的过程,是调用如下构造函数的:
public MyZQB(String bi) {
this.bi = bi;
}
NewMoons 2012-02-08
  • 打赏
  • 举报
回复
我晕,还好很久没有纯用jsp写代码了。这个“bug”太隐晦了。
虽然是开源,但我觉得apache的tomcat开发小组还是太不人道了。如果你不兼容以前的写法,至少应该给个编译警告过渡下吧。这样以前的很多业务软件因为升级到新的tomcat版本就不能用了,实在让人挠头。
看来正式项目还是花钱用websphere或weblogic好了。
https://issues.apache.org/bugzilla/show_bug.cgi?id=48701
结贴是美德 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 lrbyantai 的回复:]

首先,你用的tomcat可能是比较新的版本,之前的版本就没有这样的问题。(比如我的6.0.16就没有)

tomcat之所以抛这样的异常,是因为你的这种写法是不符合jsp2.0规范的,所以抛异常也是应该

所以养成一个好的习惯,还是写上吧

给你一个链接,虽然有点长,原因都写明白了~http://hi.baidu.com/sai5d/blog/item/d0d71a2a4b987c2……
[/Quote]

您搜索能力真强
蛋黄车 2012-02-08
  • 打赏
  • 举报
回复
首先,你用的tomcat可能是比较新的版本,之前的版本就没有这样的问题。(比如我的6.0.16就没有)

tomcat之所以抛这样的异常,是因为你的这种写法是不符合jsp2.0规范的,所以抛异常也是应该

所以养成一个好的习惯,还是写上吧

给你一个链接,虽然有点长,原因都写明白了~http://hi.baidu.com/sai5d/blog/item/d0d71a2a4b987c21d42af198.html
结贴是美德 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ziwen00 的回复:]

楼主应该使用的TOMCAT 6.x的版本,如果你没有指定scope的话,默认是page范围里面的.这个问题之前碰到过Name was not previously introduced as per JSP.5.3 ,在Tomcat 6.x之前的版本应该不会有此问题,如果给scope指定一个page以上的范围,request或者session或者application就可以避免这个问题了.

……
[/Quote]

确实是tomcat的版本问题!!!我换回6.x就好了。。求安慰
陈字文 2012-02-08
  • 打赏
  • 举报
回复
楼主应该使用的TOMCAT 6.x的版本,如果你没有指定scope的话,默认是page范围里面的.这个问题之前碰到过Name was not previously introduced as per JSP.5.3 ,在Tomcat 6.x之前的版本应该不会有此问题,如果给scope指定一个page以上的范围,request或者session或者application就可以避免这个问题了.
结贴是美德 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lrbyantai 的回复:]

不会啊,请把异常信息贴出来看看
[/Quote]

15楼 我把顶楼中useBean那行删了,剩下的保留。
我的异常信息:


2012-2-8 16:17:01 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [jsp] in context with path [/Beer] threw exception [file:/Test.jsp(16,4) jsp:getProperty for bean with name 'MyBean'. Name was not previously introduced as per JSP.5.3] with root cause
org.apache.jasper.JasperException: file:/Test.jsp(16,4) jsp:getProperty for bean with name 'MyBean'. Name was not previously introduced as per JSP.5.3
at org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1104)
at org.apache.jasper.compiler.Node$GetProperty.accept(Node.java:1126)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2428)
at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2434)
at org.apache.jasper.compiler.Node$Root.accept(Node.java:475)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
at org.apache.jasper.compiler.Generator.generate(Generator.java:3490)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:250)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:644)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:358)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:261)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1773)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
owen10000 2012-02-08
  • 打赏
  • 举报
回复
你在创建bean的时候 已经给他的id属性赋值abc了, <jsp:getProperty property="bi" name="MyBean" />你这是再输出id的值所有才会出现abc,也就是说abc已经覆盖原来的值,如果你用无参构造函数去创建bean对象那么它会输出初始值,。。。。。。。。id是bean的属性,而abc又是id的值所有bean在request了它自然也就在了,还有你在页面中为什么要实例化这个类两次而且名字还写一样的,你是想验证<jsp:getProperty />的工作原理么
蛋黄车 2012-02-08
  • 打赏
  • 举报
回复
不会啊,请把异常信息贴出来看看
加载更多回复(3)

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧