me too。不知道直接用class有什么缺点。

解决方案 »

  1.   

    从大队数据上分析我做不来
    从项目开发上来看,项目经理写bean,其他程序员只需要调用bean和排页面,
    加上bean重复利用的程度还是相当高的,所以开发周期缩短了
    我以前喜欢vb+asp,自从用了 jsp后,感觉上是刚起步真难,转个字符串都得自己去写,但从测试阶段来看,速度果然快很多,所以呢我还是坚定地选择jsp,
    是不是越难的东西越牛,敲个关键字跟出属性和方法到底有什么不好,为什么java的开发工具就不能这样呢?
    我爱记事本,写html我都用他,白底黑字保护我的眼睛
      

  2.   

    深有同感,请高人指点bean的好处到底在哪里?
      

  3.   

    在页面中包含引入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。当然,这只是我现在的想法,我还没有完全按照这个模式进行开发。
      

  4.   

    BEAN集成了内部动作,对外只提供了方法,属性,事件。是个模块化组件。
    用的时候不必理会他是如何完成任务的,只要明白如何调用他就可以了。
    用起来比较方便。
    可以重复利用。
      

  5.   

    awing_feeling(飞翔的思绪) :
    问题还是有点没搞清楚,是不是说如果我在A页面中定义了一个范围为session的Bean,那么在这个session中的所有页面都可以用到Bean中的数据,只要开始时申明为同一个id?
    怎么我试的好像得不到呢?
      

  6.   

    <jsp:usebean.....>.......等这些东西]是给不会java的写网页的人用的。
    当然也包括struct......
    会java就不用会那些垃圾了。-----------不过 会总比不会好
      

  7.   

    比如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);
      }
    }这是最主要的区别地方.
      

  8.   

    解释一下,也就是说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多么失败啊.
      

  9.   

    自己好好学学
    使用usebean的tag创建一个bean的实例是在服务器第一次编译这个jsp时,
    而且除非jsp改变,以后不需要再创建该实例。
    使用import,并在jsp中声明一个类(bean)实例,则每次访问这个页面时都要重新创建一个实例。
    两者的效率是不一样的。
    另外若使用如下的tag:
    <jsp:usebean id="data" class="com.xxxValueBean" scope="page"/>
    <jsp:setProperty name="data" property="*"/>
    能够非常方便的提交页面form中的对象值。
      

  10.   

    自己好好学学
    使用usebean的tag创建一个bean的实例是在服务器第一次编译这个jsp时,
    而且除非jsp改变,以后不需要再创建该实例。
    使用import,并在jsp中声明一个类(bean)实例,则每次访问这个页面时都要重新创建一个实例。
    两者的效率是不一样的。
    另外若使用如下的tag:
    <jsp:usebean id="data" class="com.xxxValueBean" scope="page"/>
    <jsp:setProperty name="data" property="*"/>
    能够非常方便的提交页面form中的对象值。
      

  11.   

    晕阿
    csdn的服务器就是有毛病
    怎么提交了两次
      

  12.   

    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的关系是什么样的?
      

  13.   

    首先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值。
      

  14.   

    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;
        }
    }
      

  15.   

    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               目前没有将变量存入data
    request               session               目前没有将变量存入data
    session               request               目前没有将变量存入data
    session               session               目前存入data的变量
    也就是说必须都设置为session才有效
    另外id也必须都相同,否则也得不到bean中的值,这也就说明如果想这样用,必须在<jsp:useBean.../>中有完全一样的定义,对吧?
      

  16.   

    我不知道你是如何运行这个例子的
    但是我用weblogic服务+jsp
    只需要在TestScopeJspFir.jsp中定义data
    TestScopeJspSec.jsp中不必定义可以直接调用data
    并且若在TestScopeJspSec.jsp中定义data则会出现jsp编译错误
    提示该data已经定义过...请具体描述你的platform,以及运行该例子的详细步骤。
      

  17.   

    poppop(光盘) :另外,关于你说的‘使用usebean的tag创建一个bean的实例是在服务器第一次编译这个jsp时,而且除非jsp改变,以后不需要再创建该实例。
    使用import,并在jsp中声明一个类(bean)实例,则每次访问这个页面时都要重新创建一个实例。两者的效率是不一样的。’我觉到倒应该是使用import时是公用一个实例,因为jsp被转换成servlet了,它服务于多个请求,不知道对不对。
      

  18.   

    我用的是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变成了一个全局变量?有点难以理解!到底是哪个地方不对头?
      

  19.   

    data是一个bean的实例之一。
    若在别的页面也需要该bean,可以建个新的实例。
    若你要使用data这个实例,就不必新建了。
    所以你说的问题并难明。我这里没有tomcat,谁有的话可以一起讨论一下。
    我马上出差了
    估计有段时间回不来,可能也没时间上网。
      

  20.   

    我在win98+resin下面试了一下,结果跟 f117_fujin(阿富汗的土) 的一样,也是在第二个页面出现data没有定义的错误。难道这个还跟服务器有关系?
      

  21.   

    对于bean的理解:
        我们用代码来编写程序,就好像用砖块开建房子。那么bean在中间起什么作用呢?bean就好像是墙,我们先用砖块搭起墙,或是门,窗什么的,然后再用墙,门,窗来建房子。这样有什么好处呢,首先我们只需要建一次墙,而多次利用它,其次方便修改
      

  22.   

    还有谁知道这个东西到底该怎么解释?不同的服务器难到真的要用不同的jsp代码?不可能呀!!!
      

  23.   

    看到上面的讨论,让我有比较多的收获.首先感谢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 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的规范,但是怎样实现这种支持却是各家有各家的东东,所以各个服务器都提供了一系列以自己名称作为开头的包,如果真的想在此上探幽索源,我想则可以针对某一种服务器下功夫.可惜我本人一直找不到这方面的资料,希望各位朋友能够推荐,恳求.
      

  24.   

    在web应用上使用的JavaBean根本不是完整的JavaBean
    我觉得JavaBean是为了实现类似于VB的那种属性表单、事件控制等功能的
    以下是《J2EE构建企业系统》的一段话:
    JavaBean组件模型为开发人员提供了一个标准方式,定义Java类以便其组件在JavaBean容器环境内操作。JavaBean组件根据各种属性定义模型对外提供其属性、事件及内视信息,它允许设计工具的定制,达到在设计时bean自身定制的目的。通过部署遵守JavaBean组件模型的类,使高级设计时定制组件达到可重用的目的。
    我觉得JavaBean用在GUI开发是比较有好处的,例如一个按钮。