JSP中Bean的问题 很晕~
一个Bean类,再简单不过了:
Java code
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部分,其他部分和平常一样:
HTML code
<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>标签到底是什么查找范围。。。求解答~
------解决方案--------------------<%@ 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的,没出错啊
------解决方案--------------------看错了...
RE:
当JavaBean被创建后,通过<jsp:setProperty>标签与<jsp:getProperty>标签调用时,将会按照page、request、session和application的顺序来查找这个JavaBean实例,直至找到一个实例对象为止,如果在这4个范围内都找不到JavaBean实例,则抛出异常。
------解决方案--------------------对的,6楼那样也不会报异常的。
<jsp:getProperty property="bi" name="MyBean" />
对于MyBean,它会按照一定的顺序在page,request,session,application作用域中依次查找。
而pageContext.setAttribute("MyBean", new MyZQB("abc"));这句已经在page作用域中,查找到后返回
你可以做个实验验证一下,将pageContext.setAttribute("MyBean", new MyZQB("abc"));改成session.setAttribute("MyBean", new MyZQB("abc"));
然后使用<jsp:useBean id="MyBean" scope="request" class="com.example.MyZQB" />
这样得到的结果是默认的rrr
------解决方案--------------------你在创建bean的时候 已经给他的id属性赋值abc了, <jsp:getProperty property="bi" name="MyBean" />你这是再输出id的值所有才会出现abc,也就是说abc已经覆盖原来的值,如果你用无参构造函数去创建bean对象那么它会输出初始值,。。。。。。。。id是bean的属性,而abc又是id的值所有bean在request了它自然也就在了,还有你在页面中为什么要实例化这个类两次而且名字还写一样的,你是想验证<jsp:getProperty />的工作原理么
------解决方案--------------------楼主应该使用的TOMCAT 6.x的版本,如果你没有指定scope的话,默认是page范围里面的.这个问题之前碰到过Name was not previously introduced as per JSP.5.3 ,在Tomcat 6.x之前的版本应该不会有此问题,如果给scope指定一个page以上的范围,request或者session或者application就可以避免这个问题了.
------解决方案--------------------首先,你用的tomcat可能是比较新的版本,之前的版本就没有这样的问题。(比如我的6.0.16就没有)
tomcat之所以抛这样的异常,是因为你的这种写法是不符合jsp2.0规范的,所以抛异常也是应该
所以养成一个好的习惯,还是写上吧
给你一个链接,虽然有点长,原因都写明白了~http://hi.baidu.com/sai5d/blog/item/d0d71a2a4b987c21d42af198.html