*************关于JavaBean的理解,请高人谈谈。开始还照着书上用,后来我就把所谓的Bean全部抛弃了。。。 me too。不知道直接用class有什么缺点。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 从大队数据上分析我做不来从项目开发上来看,项目经理写bean,其他程序员只需要调用bean和排页面,加上bean重复利用的程度还是相当高的,所以开发周期缩短了我以前喜欢vb+asp,自从用了 jsp后,感觉上是刚起步真难,转个字符串都得自己去写,但从测试阶段来看,速度果然快很多,所以呢我还是坚定地选择jsp,是不是越难的东西越牛,敲个关键字跟出属性和方法到底有什么不好,为什么java的开发工具就不能这样呢?我爱记事本,写html我都用他,白底黑字保护我的眼睛 深有同感,请高人指点bean的好处到底在哪里? 在页面中包含引入class并生成实例使用并没有什么不好;只是看一下使用的过程:引入,生成实例,使用实例的方法;这和在jsp中使用JavaBean几乎是一样的。但是这只是说在bean是的作用域是page的时候,我们考虑一些如果要是在session或application中怎么办(以session为例):引入class;if(session中有这个属性){ 获取;}else{ 生成实例;}使用;而我们使用usebean标签呢?还是三步。当然,这仅仅是在使用上,可能还有其他的地方我没有说到。我推荐的开发jsp的方法是:jsp中尽量不要有java代码,如果jsp中有一段一段的scriptlet,那将是一件非常恐怖的事情,尤其对于维护人员。如果是和显示控制有关的动态内容,尽量使用tag,网上有很多的的开放源码的tag lib,比如http://jakarta.apache.org等等。如果是和业务部分进行通信,不需要产生页面元素,就可以使用javabean。当然,这只是我现在的想法,我还没有完全按照这个模式进行开发。 BEAN集成了内部动作,对外只提供了方法,属性,事件。是个模块化组件。用的时候不必理会他是如何完成任务的,只要明白如何调用他就可以了。用起来比较方便。可以重复利用。 awing_feeling(飞翔的思绪) :问题还是有点没搞清楚,是不是说如果我在A页面中定义了一个范围为session的Bean,那么在这个session中的所有页面都可以用到Bean中的数据,只要开始时申明为同一个id?怎么我试的好像得不到呢? <jsp:usebean.....>.......等这些东西]是给不会java的写网页的人用的。当然也包括struct......会java就不用会那些垃圾了。-----------不过 会总比不会好 比如tomcat里面自带的numguess程序,可以从work目录里面查看numguess$jsp.java的代码:num.NumberGuessBean numguess = null;synchronized (session) { numguess = (num.NumberGuessBean)pageContext.getAttribute("numguess", PageContext.SESSION_SCOPE); if (numguess == null){ try { numguess = (num.NumberGuessBean)java.beans.Beans.instantiate(this.getClass().getClassLoader(), "num.NumberGuessBean"); } catch (ClassNotFoundException exc) { throw new InstantiationException(exc.getMessage()); } catch (Exception exc) { throw new ServletException("Cannot create bean of class " + "num.NumberGuessBean", exc); } pageContext.setAttribute("numguess", numguess, PageContext.SESSION_SCOPE); }}这是最主要的区别地方. 解释一下,也就是说bean可以允许你在面向对象程序设计时候可以把对象通过session存储起来,然后再到另一个页面取出。而如果只是使用java实现的话你必须重复使用synchronized语句和和繁杂的重复代码。这样是我们不希望的。我实践中感觉到,通常情况不需要使用javabean,因为一般的对象在页面生命周期中使用就足够了,比如接受一个表单提供的信息或者其他什么的。但有一种情况使用bean试很方便的:对象跨越多页面。比如这个简单的numguess程序,如果不是用bean而是使用java实现,我们可能会这样:<%@ page import="example.numguess.*, java.io.*, cai.util.*"%><% Numguess aNumguessGame = null; if (session.getValue("playing") == null) { aNumguessGame = new Numguess(); session.putValue("playing", "true"); } // play // if (end..) { // session.remove("playing"); // }%>这样的代码来表现skin多么失败啊. 自己好好学学使用usebean的tag创建一个bean的实例是在服务器第一次编译这个jsp时,而且除非jsp改变,以后不需要再创建该实例。使用import,并在jsp中声明一个类(bean)实例,则每次访问这个页面时都要重新创建一个实例。两者的效率是不一样的。另外若使用如下的tag:<jsp:usebean id="data" class="com.xxxValueBean" scope="page"/><jsp:setProperty name="data" property="*"/>能够非常方便的提交页面form中的对象值。 自己好好学学使用usebean的tag创建一个bean的实例是在服务器第一次编译这个jsp时,而且除非jsp改变,以后不需要再创建该实例。使用import,并在jsp中声明一个类(bean)实例,则每次访问这个页面时都要重新创建一个实例。两者的效率是不一样的。另外若使用如下的tag:<jsp:usebean id="data" class="com.xxxValueBean" scope="page"/><jsp:setProperty name="data" property="*"/>能够非常方便的提交页面form中的对象值。 晕阿csdn的服务器就是有毛病怎么提交了两次 poppop(光盘):我明白你说的意思,不过我想请教的是假设现在有a.jsp,b.jsp,c.jsp三个页面,a调用b,b调用c,在a中用到:<jsp:usebean id="data" class="com.xxxValueBean" scope="session"/><jsp:setProperty name="data" property="*"/>把相应的值存入到bean中,我要在c中使用这些值该怎么办?是在c中也定义一个id="data"的bean,然后直接用<jsp:getProperty>得到,还是用什么别的办法?如果是这种方法,这两个bean的关系是什么样的? 首先scope="session"指的是该bean的有效范围:用户上网连接开始至连接结束,即一个session会话周期。你不必想太麻烦在a.jsp中提交给data的值除非别的地方使该值改变了,否则在整个会话周期中该值(对象实体)存于session对象中(即jsp内置对象session)。已经在a.jsp中定义的data,只要在一个会话周期中,就可以在c.jsp中直接调用。下面特意给你写了个简单的例子页面TestScopeJspFir.jsp:<%@ page contenttype="text/html; charset=GBK"%><%@ page import="com.test.*"%><jsp:useBean id="data" class="com.test.TestScopeValueBean" scope="session"/><%try{ data.setImp("This");%><html><body><h3>测试scope="session"页面1</h3><% if(data.getImp()!=null && !data.getImp().equals("")) {%><b>目前存入data的变量:</b><%=data.getImp()%><% } else {%><b>目前没有将变量存入data:</b><% }}catch(Exception e){ out.print("error: "+e.getMessage());}%></body></html>页面TestScopeJspSec.jsp:<html><body><h3>测试scope="session"页面2</h3><%try{ if(data.getImp()!=null && !data.getImp().equals("")) {%><b>目前存入data的变量:</b><%=data.getImp()%><% } else {%><b>目前没有将变量存入data:</b><% }}catch(Exception e){ out.print("error: "+e.getMessage());}%></body></html>先执行页面TestScopeJspFir.jsp,然后再执行TestScopeJspSec.jsp看看页面显示的data值。 TestScopeValueBean 代码如下:package com.test;import java.io.Serializable;public class TestScopeValueBean implements Serializable{ private String m_imp = ""; public TestScopeValueBean() { } public String getImp() { return m_imp; } public void setImp(String aImp) { m_imp = aImp; }} poppop(光盘) :感谢你的例子,我差不多已经比较清楚了,不过仍然有一点点的说明1、如果完全照着你的TestScopeJspSec.jsp,编译时会提示"TestScopeJspSec.jsp": Error #: 300 : variable data not found in class TestScopeJspSec_0002ejsp_jsp at line 10然后我加上<jsp:useBean id="data" class="com.test.TestScopeValueBean" scope="session"/>这句话就可以运行了,而且能够看到你说的关于session的执行情况,我估计这个可能是不是你的笔误吧。2、关于scope在两个页面中不同的设置,我的试验结果如下:TestScopeJspFir.jsp TestScopeJspSec.jsp TestScopeJspSec.jsp结果request request 目前没有将变量存入datarequest session 目前没有将变量存入datasession request 目前没有将变量存入datasession session 目前存入data的变量也就是说必须都设置为session才有效另外id也必须都相同,否则也得不到bean中的值,这也就说明如果想这样用,必须在<jsp:useBean.../>中有完全一样的定义,对吧? 我不知道你是如何运行这个例子的但是我用weblogic服务+jsp只需要在TestScopeJspFir.jsp中定义dataTestScopeJspSec.jsp中不必定义可以直接调用data并且若在TestScopeJspSec.jsp中定义data则会出现jsp编译错误提示该data已经定义过...请具体描述你的platform,以及运行该例子的详细步骤。 poppop(光盘) :另外,关于你说的‘使用usebean的tag创建一个bean的实例是在服务器第一次编译这个jsp时,而且除非jsp改变,以后不需要再创建该实例。使用import,并在jsp中声明一个类(bean)实例,则每次访问这个页面时都要重新创建一个实例。两者的效率是不一样的。’我觉到倒应该是使用import时是公用一个实例,因为jsp被转换成servlet了,它服务于多个请求,不知道对不对。 我用的是win2000 server,用jbuilder7.0编译这几个jsp文件,web服务器用的是tomcat4.0如果TestScopeJspSec.jsp中没有重新申明data,jbuilder就提示上面提到的那个错误,说找不到变量data,在加上申明后编译成功.然后启动tomcat,首先显示fir,接着显示sec,在每次更换了scope的值以后都是重新启动并运行,然后得出上面的第2个结论weblogic我没有用过,但是如果用weblogic可以只用定义一次的话,那不是存在这样一个问题,即:只要我在一个jsp文件中定义了data,那么在其他的jsp(或者至少是当前目录里的其他jsp)里面都不能定义这个变量,即使这些jsp根本不会在一个session中出现,甚至毫无关系?也就是把data变成了一个全局变量?有点难以理解!到底是哪个地方不对头? data是一个bean的实例之一。若在别的页面也需要该bean,可以建个新的实例。若你要使用data这个实例,就不必新建了。所以你说的问题并难明。我这里没有tomcat,谁有的话可以一起讨论一下。我马上出差了估计有段时间回不来,可能也没时间上网。 我在win98+resin下面试了一下,结果跟 f117_fujin(阿富汗的土) 的一样,也是在第二个页面出现data没有定义的错误。难道这个还跟服务器有关系? 对于bean的理解: 我们用代码来编写程序,就好像用砖块开建房子。那么bean在中间起什么作用呢?bean就好像是墙,我们先用砖块搭起墙,或是门,窗什么的,然后再用墙,门,窗来建房子。这样有什么好处呢,首先我们只需要建一次墙,而多次利用它,其次方便修改 还有谁知道这个东西到底该怎么解释?不同的服务器难到真的要用不同的jsp代码?不可能呀!!! 看到上面的讨论,让我有比较多的收获.首先感谢f117_fujin(阿富汗的土)提出这个好问题.我自己利用大伙儿的讨论,琢磨了一下,有一些体会,不敢私有,也同时希望通过大家能够得以认证.(1)awing_feeling(飞翔的思绪) 的回答言简意赅,一下子就反映了问题的实质.Justin(兰色梧桐) 第二次回答中的代码部分其实反映的就是awing_feeling(飞翔的思绪) 的意思(当然只反映了awing_feeling(飞翔的思绪)的一部分意思).(2)我的web平台是:win2k server,weblogic 7.0,oracle 8i.对poppop(光盘)给出的实例,在我的环境中通不过,情况和f117_fujin(阿富汗的土)所反映的情况一样:TestScopeJspSec.jsp在编译时出错.cannot resolve symbolsymbol : variable data.因此我采用了f117_fujin(阿富汗的土)的方法:在TestScopeJspSec.jsp中加上这样一行<jsp:useBean id="data" class="com.test.TestScopeValueBean" scope="xxx"/>后(其中"xxx"代表"page","request","session","application"中的一种选择),TestScopeJspSec.jsp可以正常使用.(3)关于scope在两个页面中不同的设置,我的试验结果与f117_fujin(阿富汗的土)的结果一样.如下:TestScopeJspFir.jsp TestScopeJspSec.jsp TestScopeJspSec.jsp结果page xxx 目前没有将变量存入data request xxx 目前没有将变量存入datasession xxx(session除外) 目前没有将变量存入datasession session 目前存入data的变量application xxx(application除外) 目前没有将变量存入data application application 目前存入data的变量 (注明:xxx代表 "page","request","session","application"四个选择中的任何一种选择)(4)还是引用poppop(光盘)的例子:在jsp文件中加入<jsp:useBean id="data" class="com.test.TestScopeValueBean" scope="xxx"/>.现在来看一看weblogic7.0怎样在此jsp文件所对应的java文件(servlet文件)的_jspService()方法中处理对象data的:当scope="page"时: com.test.TestScopeValueBean data = null; data = (com.test.TestScopeValueBean)pageContext.getAttribute("data"); if (data == null) { { data = (com.test.TestScopeValueBean)pageContext.getAttribute("data"); if (data == null) { data = new com.test.TestScopeValueBean(); pageContext.setAttribute("data", data); } }}当scope="request"时: com.test.TestScopeValueBean data = null; data = (com.test.TestScopeValueBean)request.getAttribute("data"); if (data == null) { { data = (com.test.TestScopeValueBean)request.getAttribute("data"); if (data == null) { data = new com.test.TestScopeValueBean(); request.setAttribute("data", data); } } } 当scope="session"时: com.test.TestScopeValueBean data = null;data = (com.test.TestScopeValueBean)session.getAttribute("data"); if (data == null) { synchronized (session) { data = (com.test.TestScopeValueBean)session.getAttribute("data"); if (data == null) { data = new com.test.TestScopeValueBean(); session.setAttribute("data", data); } } } }当scope="application"时: com.test.TestScopeValueBean data = null;data = (com.test.TestScopeValueBean)application.getAttribute("data"); if (data == null) { synchronized (application) { data = (com.test.TestScopeValueBean)application.getAttribute("data"); if (data == null) { data = new com.test.TestScopeValueBean(); application.setAttribute("data", data); } } } }(5)根据上面的代码,可以得到这样的结论:如果在一个jsp文件中引用了javabean,则此jsp文件所对应的java文件的_jspService()方法必然要引用此javabean的一个对象(实例)objectXXX,至于此对象objectXXX是在_jspService()方法中新产生还是通过对象句柄直接引用到一个已经存在的对象上,这得根据scope来确定.结论如下:scope="page"------对象objectXXX肯定是新产生的;scope="request"------对象objectXXX肯定是新产生的;scope="session"------如果在session中已经有对象objectXXX存在,则直接引用;如果session中没有对象objectXXX存在,则新产生一个javabean的对象objectXXX,并且把这个对象objectXXX扔进session中.scope="application"------如果在application中已经有对象objectXXX存在,则直接引用;如果application中没有对象objectXXX存在,则新产生一个javabean的对象objectXXX,并且把这个对象objectXXX扔进application中.(以上结论有点大胆推测的意思,希望得到大家的印证)(6)至于Justin(兰色梧桐) 第一次回答中在tomcat服务器下得到的代码为什么和我在weblogic下得到的代码在调用函数的名称上都有出入,我想是因为:虽然各个服务器都支持j2ee的规范,但是怎样实现这种支持却是各家有各家的东东,所以各个服务器都提供了一系列以自己名称作为开头的包,如果真的想在此上探幽索源,我想则可以针对某一种服务器下功夫.可惜我本人一直找不到这方面的资料,希望各位朋友能够推荐,恳求. 在web应用上使用的JavaBean根本不是完整的JavaBean我觉得JavaBean是为了实现类似于VB的那种属性表单、事件控制等功能的以下是《J2EE构建企业系统》的一段话:JavaBean组件模型为开发人员提供了一个标准方式,定义Java类以便其组件在JavaBean容器环境内操作。JavaBean组件根据各种属性定义模型对外提供其属性、事件及内视信息,它允许设计工具的定制,达到在设计时bean自身定制的目的。通过部署遵守JavaBean组件模型的类,使高级设计时定制组件达到可重用的目的。我觉得JavaBean用在GUI开发是比较有好处的,例如一个按钮。 在linux下, 如何让Tomcat 6 支持远程debug struct2的问题。如何用sendRedirect中止struct2 action的执行 Dojo的一个小问题?????大侠们帮帮忙啊!!!!!!!!!!! 为什么我的struts编码过滤器不起作用? 问一个jsp入门级的问题!!! 使用网络硬盘,还是其他其他好的思想思路? 请教前辈们的就业问题。。。 jsp的中文参数传递问题 如何将键盘、鼠标的复制功能封掉!!请各位高人指点一二!!! Javascript中的switch的bug么?求人解决 单独用tomcat做服务器行不行? 帮我看看这是什么错误啦???数据更新时。。。
从项目开发上来看,项目经理写bean,其他程序员只需要调用bean和排页面,
加上bean重复利用的程度还是相当高的,所以开发周期缩短了
我以前喜欢vb+asp,自从用了 jsp后,感觉上是刚起步真难,转个字符串都得自己去写,但从测试阶段来看,速度果然快很多,所以呢我还是坚定地选择jsp,
是不是越难的东西越牛,敲个关键字跟出属性和方法到底有什么不好,为什么java的开发工具就不能这样呢?
我爱记事本,写html我都用他,白底黑字保护我的眼睛
引入class;
if(session中有这个属性){
获取;
}else{
生成实例;
}
使用;
而我们使用usebean标签呢?还是三步。当然,这仅仅是在使用上,可能还有其他的地方我没有说到。
我推荐的开发jsp的方法是:jsp中尽量不要有java代码,如果jsp中有一段一段的scriptlet,那将是一件非常恐怖的事情,尤其对于维护人员。如果是和显示控制有关的动态内容,尽量使用tag,网上有很多的的开放源码的tag lib,比如http://jakarta.apache.org等等。如果是和业务部分进行通信,不需要产生页面元素,就可以使用javabean。当然,这只是我现在的想法,我还没有完全按照这个模式进行开发。
用的时候不必理会他是如何完成任务的,只要明白如何调用他就可以了。
用起来比较方便。
可以重复利用。
问题还是有点没搞清楚,是不是说如果我在A页面中定义了一个范围为session的Bean,那么在这个session中的所有页面都可以用到Bean中的数据,只要开始时申明为同一个id?
怎么我试的好像得不到呢?
当然也包括struct......
会java就不用会那些垃圾了。-----------不过 会总比不会好
num.NumberGuessBean numguess = null;
synchronized (session) {
numguess = (num.NumberGuessBean)pageContext.getAttribute("numguess", PageContext.SESSION_SCOPE);
if (numguess == null){
try {
numguess = (num.NumberGuessBean)java.beans.Beans.instantiate(this.getClass().getClassLoader(), "num.NumberGuessBean");
} catch (ClassNotFoundException exc) {
throw new InstantiationException(exc.getMessage());
} catch (Exception exc) {
throw new ServletException("Cannot create bean of class " + "num.NumberGuessBean", exc);
}
pageContext.setAttribute("numguess", numguess, PageContext.SESSION_SCOPE);
}
}这是最主要的区别地方.
通过session存储起来,然后再到另一个页面取出。而如果只是使用java
实现的话你必须重复使用synchronized语句和和繁杂的重复代码。这样
是我们不希望的。我实践中感觉到,通常情况不需要使用javabean,因为一般的对象在页面
生命周期中使用就足够了,比如接受一个表单提供的信息或者其他什么的。但有一种情况使用bean试很方便的:对象跨越多页面。比如这个简单的
numguess程序,如果不是用bean而是使用java实现,我们可能会这样:<%@ page import="example.numguess.*,
java.io.*,
cai.util.*"
%>
<%
Numguess aNumguessGame = null;
if (session.getValue("playing") == null) {
aNumguessGame = new Numguess();
session.putValue("playing", "true");
}
// play
// if (end..) {
// session.remove("playing");
// }
%>
这样的代码来表现skin多么失败啊.
使用usebean的tag创建一个bean的实例是在服务器第一次编译这个jsp时,
而且除非jsp改变,以后不需要再创建该实例。
使用import,并在jsp中声明一个类(bean)实例,则每次访问这个页面时都要重新创建一个实例。
两者的效率是不一样的。
另外若使用如下的tag:
<jsp:usebean id="data" class="com.xxxValueBean" scope="page"/>
<jsp:setProperty name="data" property="*"/>
能够非常方便的提交页面form中的对象值。
使用usebean的tag创建一个bean的实例是在服务器第一次编译这个jsp时,
而且除非jsp改变,以后不需要再创建该实例。
使用import,并在jsp中声明一个类(bean)实例,则每次访问这个页面时都要重新创建一个实例。
两者的效率是不一样的。
另外若使用如下的tag:
<jsp:usebean id="data" class="com.xxxValueBean" scope="page"/>
<jsp:setProperty name="data" property="*"/>
能够非常方便的提交页面form中的对象值。
csdn的服务器就是有毛病
怎么提交了两次
我明白你说的意思,不过我想请教的是假设现在有a.jsp,b.jsp,c.jsp三个页面,a调用b,b调用c,在a中用到:
<jsp:usebean id="data" class="com.xxxValueBean" scope="session"/>
<jsp:setProperty name="data" property="*"/>
把相应的值存入到bean中,我要在c中使用这些值该怎么办?是在c中也定义一个id="data"的bean,然后直接用<jsp:getProperty>得到,还是用什么别的办法?如果是这种方法,这两个bean的关系是什么样的?
你不必想太麻烦
在a.jsp中提交给data的值除非别的地方使该值改变了,否则在整个会话周期中该值(对象实体)存于session对象中(即jsp内置对象session)。
已经在a.jsp中定义的data,只要在一个会话周期中,就可以在c.jsp中直接调用。
下面特意给你写了个简单的例子
页面TestScopeJspFir.jsp:
<%@ page contenttype="text/html; charset=GBK"%>
<%@ page import="com.test.*"%>
<jsp:useBean id="data" class="com.test.TestScopeValueBean" scope="session"/>
<%
try
{
data.setImp("This");
%>
<html>
<body>
<h3>测试scope="session"页面1</h3>
<% if(data.getImp()!=null && !data.getImp().equals(""))
{
%>
<b>目前存入data的变量:</b>
<%=data.getImp()%>
<%
}
else
{
%>
<b>目前没有将变量存入data:</b>
<%
}
}
catch(Exception e)
{
out.print("error: "+e.getMessage());
}
%>
</body>
</html>页面TestScopeJspSec.jsp:
<html>
<body>
<h3>测试scope="session"页面2</h3>
<%
try
{
if(data.getImp()!=null && !data.getImp().equals(""))
{
%>
<b>目前存入data的变量:</b>
<%=data.getImp()%>
<%
}
else
{
%>
<b>目前没有将变量存入data:</b>
<%
}
}
catch(Exception e)
{
out.print("error: "+e.getMessage());
}
%>
</body>
</html>
先执行页面TestScopeJspFir.jsp,然后再执行TestScopeJspSec.jsp看看页面显示的data值。
package com.test;
import java.io.Serializable;
public class TestScopeValueBean implements Serializable
{
private String m_imp = "";
public TestScopeValueBean()
{
}
public String getImp()
{
return m_imp;
}
public void setImp(String aImp)
{
m_imp = aImp;
}
}
感谢你的例子,我差不多已经比较清楚了,不过仍然有一点点的说明1、如果完全照着你的TestScopeJspSec.jsp,编译时会提示
"TestScopeJspSec.jsp": Error #: 300 : variable data not found in class TestScopeJspSec_0002ejsp_jsp at line 10
然后我加上<jsp:useBean id="data" class="com.test.TestScopeValueBean" scope="session"/>
这句话就可以运行了,而且能够看到你说的关于session的执行情况,我估计这个可能是不是你的笔误吧。2、关于scope在两个页面中不同的设置,我的试验结果如下:
TestScopeJspFir.jsp TestScopeJspSec.jsp TestScopeJspSec.jsp结果
request request 目前没有将变量存入data
request session 目前没有将变量存入data
session request 目前没有将变量存入data
session session 目前存入data的变量
也就是说必须都设置为session才有效
另外id也必须都相同,否则也得不到bean中的值,这也就说明如果想这样用,必须在<jsp:useBean.../>中有完全一样的定义,对吧?
但是我用weblogic服务+jsp
只需要在TestScopeJspFir.jsp中定义data
TestScopeJspSec.jsp中不必定义可以直接调用data
并且若在TestScopeJspSec.jsp中定义data则会出现jsp编译错误
提示该data已经定义过...请具体描述你的platform,以及运行该例子的详细步骤。
使用import,并在jsp中声明一个类(bean)实例,则每次访问这个页面时都要重新创建一个实例。两者的效率是不一样的。’我觉到倒应该是使用import时是公用一个实例,因为jsp被转换成servlet了,它服务于多个请求,不知道对不对。
如果TestScopeJspSec.jsp中没有重新申明data,jbuilder就提示上面提到的那个错误,说找不到变量data,在加上申明后编译成功.然后启动tomcat,首先显示fir,接着显示sec,在每次更换了scope的值以后都是重新启动并运行,然后得出上面的第2个结论weblogic我没有用过,但是如果用weblogic可以只用定义一次的话,那不是存在这样一个问题,即:只要我在一个jsp文件中定义了data,那么在其他的jsp(或者至少是当前目录里的其他jsp)里面都不能定义这个变量,即使这些jsp根本不会在一个session中出现,甚至毫无关系?也就是把data变成了一个全局变量?有点难以理解!到底是哪个地方不对头?
若在别的页面也需要该bean,可以建个新的实例。
若你要使用data这个实例,就不必新建了。
所以你说的问题并难明。我这里没有tomcat,谁有的话可以一起讨论一下。
我马上出差了
估计有段时间回不来,可能也没时间上网。
我们用代码来编写程序,就好像用砖块开建房子。那么bean在中间起什么作用呢?bean就好像是墙,我们先用砖块搭起墙,或是门,窗什么的,然后再用墙,门,窗来建房子。这样有什么好处呢,首先我们只需要建一次墙,而多次利用它,其次方便修改
(1)awing_feeling(飞翔的思绪) 的回答言简意赅,一下子就反映了问题的实质.Justin(兰色梧桐) 第二次回答中的代码部分其实反映的就是awing_feeling(飞翔的思绪) 的意思(当然只反映了awing_feeling(飞翔的思绪)的一部分意思).
(2)我的web平台是:win2k server,weblogic 7.0,oracle 8i.对poppop(光盘)给出的实例,在我的环境中通不过,情况和f117_fujin(阿富汗的土)所反映的情况一样:TestScopeJspSec.jsp在编译时出错.cannot resolve symbol
symbol : variable data.因此我采用了f117_fujin(阿富汗的土)的方法:在TestScopeJspSec.jsp中加上这样一行<jsp:useBean id="data" class="com.test.TestScopeValueBean" scope="xxx"/>后(其中"xxx"代表"page","request","session","application"中的一种选择),TestScopeJspSec.jsp可以正常使用.
(3)关于scope在两个页面中不同的设置,我的试验结果与f117_fujin(阿富汗的土)的结果一样.如下:
TestScopeJspFir.jsp TestScopeJspSec.jsp TestScopeJspSec.jsp结果
page xxx 目前没有将变量存入data
request xxx 目前没有将变量存入data
session xxx(session除外) 目前没有将变量存入data
session session 目前存入data的变量
application xxx(application除外) 目前没有将变量存入data
application application 目前存入data的变量
(注明:xxx代表 "page","request","session","application"四个选择中的任何一种选择)(4)还是引用poppop(光盘)的例子:在jsp文件中加入<jsp:useBean id="data" class="com.test.TestScopeValueBean" scope="xxx"/>.现在来看一看weblogic7.0怎样在此jsp文件所对应的java文件(servlet文件)的_jspService()方法中处理对象data的:
当scope="page"时:
com.test.TestScopeValueBean data = null;
data = (com.test.TestScopeValueBean)pageContext.getAttribute("data");
if (data == null)
{
{
data = (com.test.TestScopeValueBean)pageContext.getAttribute("data");
if (data == null)
{
data = new com.test.TestScopeValueBean();
pageContext.setAttribute("data", data);
}
}
}
当scope="request"时:
com.test.TestScopeValueBean data = null;
data = (com.test.TestScopeValueBean)request.getAttribute("data");
if (data == null)
{
{
data = (com.test.TestScopeValueBean)request.getAttribute("data");
if (data == null)
{
data = new com.test.TestScopeValueBean();
request.setAttribute("data", data);
}
}
}
当scope="session"时:
com.test.TestScopeValueBean data = null;
data = (com.test.TestScopeValueBean)session.getAttribute("data");
if (data == null)
{
synchronized (session)
{
data = (com.test.TestScopeValueBean)session.getAttribute("data");
if (data == null)
{
data = new com.test.TestScopeValueBean();
session.setAttribute("data", data); }
}
}
}
当scope="application"时:
com.test.TestScopeValueBean data = null;
data = (com.test.TestScopeValueBean)application.getAttribute("data");
if (data == null)
{
synchronized (application)
{
data = (com.test.TestScopeValueBean)application.getAttribute("data");
if (data == null)
{
data = new com.test.TestScopeValueBean();
application.setAttribute("data", data); }
}
}
}
(5)根据上面的代码,可以得到这样的结论:如果在一个jsp文件中引用了javabean,则此jsp文件所对应的java文件的_jspService()方法必然要引用此javabean的一个对象(实例)objectXXX,至于此对象objectXXX是在_jspService()方法中新产生还是通过对象句柄直接引用到一个已经存在的对象上,这得根据scope来确定.
结论如下:
scope="page"------对象objectXXX肯定是新产生的;
scope="request"------对象objectXXX肯定是新产生的;
scope="session"------如果在session中已经有对象objectXXX存在,则直接引用;如果session中没有对象objectXXX存在,则新产生一个javabean的对象objectXXX,并且把这个对象objectXXX扔进session中.
scope="application"------如果在application中已经有对象objectXXX存在,则直接引用;如果application中没有对象objectXXX存在,则新产生一个javabean的对象objectXXX,并且把这个对象objectXXX扔进application中.
(以上结论有点大胆推测的意思,希望得到大家的印证)
(6)至于Justin(兰色梧桐) 第一次回答中在tomcat服务器下得到的代码为什么和我在weblogic下得到的代码在调用函数的名称上都有出入,我想是因为:虽然各个服务器都支持j2ee的规范,但是怎样实现这种支持却是各家有各家的东东,所以各个服务器都提供了一系列以自己名称作为开头的包,如果真的想在此上探幽索源,我想则可以针对某一种服务器下功夫.可惜我本人一直找不到这方面的资料,希望各位朋友能够推荐,恳求.
我觉得JavaBean是为了实现类似于VB的那种属性表单、事件控制等功能的
以下是《J2EE构建企业系统》的一段话:
JavaBean组件模型为开发人员提供了一个标准方式,定义Java类以便其组件在JavaBean容器环境内操作。JavaBean组件根据各种属性定义模型对外提供其属性、事件及内视信息,它允许设计工具的定制,达到在设计时bean自身定制的目的。通过部署遵守JavaBean组件模型的类,使高级设计时定制组件达到可重用的目的。
我觉得JavaBean用在GUI开发是比较有好处的,例如一个按钮。