me too。不知道直接用class有什么缺点。
解决方案 »
- Runtime.getRuntime().exec(command) 如何把多条命令绑在一起执行?
- 为什么在jsp中写${pageContext.request.contextPath }失效了
- 求jsp做的登录用户之间可以在线交流功能(简单的,基于浏览器的)的代码
- 在线等,急!JSP分页问题:jsp+MySQL分页用javabean还是用前台分页要好些?
- 急……做好个网站用ssh做的买了个域名没买主机呢 接下来流程谁帮忙讲讲
- 急用,在线等,hibernate hql查询
- 高手指点一下“http通讯和tuxedo通讯的比较(特点,不同点)”,谢谢!回答就有分
- 如何得到网站的IP地址?
- 问个mysql数据库连接问题
- 郁闷了好几天
- 单独用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开发是比较有好处的,例如一个按钮。