日期:2014-05-20  浏览次数:20834 次

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