iNeo

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  30 Posts :: 8 Stories :: 2 Comments :: 0 Trackbacks

#

J2EE学习者越来越多,其本身技术也在不断的发展,涌现出各种概念。作为Web服务的重要平台,本文将从一种容易理解的角度对这些概念向初学者进行解释,以便掌握学习J2EE学习方向。

  首先我们需要知道Java和J2EE是两个不同概念,Java不只是指一种语言,已经代表与微软不同的另外一个巨大阵营,所以Java有时是指一种软件系统的流派,当然目前主要是.NET和Java两大主流体系。

  J2EE可以说指Java在数据库信息系统上实现,数据库信息系统从早期的dBase、到Delphi/VB等C/S结构,发展到B/S(Browser浏览器/Server服务器)结构,而J2EE主要是指B/S结构的实现。

  J2EE又是一种框架和标准,框架类似API、库的概念,但是要超出它们。如果需要详细了解框架,可先从设计模式开始学习。

  J2EE是一个虚的大的概念,J2EE标准主要有三种子技术标准:WEB技术、EJB技术和JMS,谈到J2EE应该说最终要落实到这三个子概念上。

  这三种技术的每个技术在应用时都涉及两个部分:容器部分和应用部分,Web容器也是指Jsp/Servlet容器,你如果要开发一个Web应用,无论是编译或运行,都必须要有Jsp/Servlet库或API支持(除了JDK/J2SE以外)。

  Web技术中除了Jsp/Servlet技术外,还需要JavaBeans或Java Class实现一些功能或者包装携带数据,所以Web技术最初裸体简称为Jsp/Servlet+JavaBeans系统。

  谈到JavaBeans技术,就涉及到组件构件技术(component),这是Java的核心基础部分,很多软件设计概念(设计模式)都是通过JavaBeans实现的。

  JavaBeans不属于J2EE概念范畴中,如果一个JavaBeans对象被Web技术(也就是Jsp/Servlet)调用,那么JavaBeans就运行在J2EE的Web容器中;如果它被EJB调用,它就运行在EJB容器中。

  EJB(企业JavaBeans)是普通JavaBeans的一种提升和规范,因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制,这样能保证企业系统平滑发展,而不是发展到一种规模重新更换一套软件系统。

  至此,JavaBeans组件发展到EJB后,并不是说以前的那种JavaBeans形式就消失了,这就自然形成了两种JavaBeans技术:EJB和POJO,POJO完全不同于EJB概念,指的是普通JavaBeans,而且这个JavaBeans不依附某种框架,或者干脆可以说:这个JavaBeans是你为这个应用程序单独开发创建的。

  J2EE应用系统开发工具有很多:如JBuilder、Eclipse等,这些IDE首先是Java开发工具,也就是说,它们首要基本功能是可以开发出JavaBeans或Java class,但是如果要开发出J2EE系统,就要落实到要么是Web技术或EJB技术,那么就有可能要一些专门模块功能(如eclipse需要lomboz插件),最重要的是,因为J2EE系统区分为容器和应用两个部分,所以,在任何开发工具中开发J2EE都需要指定J2EE容器。

  J2EE容器分为WEB容器和EJB容器,Tomcat/Resin是Web容器;JBoss是EJB容器+Web容器等,其中Web容器直接使用Tomcat实现的。所以你开发的Web应用程序可以在上面两种容器运行,而你开发的Web+EJB应用则只可以在JBoss服务器上运行,商业产品Websphere/Weblogic等和JBoss属于同一种性质。

  J2EE容器也称为J2EE服务器,大部分时它们概念是一致的。

  如果你的J2EE应用系统的数据库连接是通过JNDI获得,也就是说是从容器中获得,那么你的J2EE应用系统基本与数据库无关,如果你在你的J2EE应用系统耦合了数据库JDBC驱动的配置,那么你的J2EE应用系统就有数据库概念色彩,作为一个成熟需要推广的J2EE应用系统,不推荐和具体数据库耦合,当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。

  衡量J2EE应用系统设计开发水平高低的标准就是:解耦性;你的应用系统各个功能是否能够彻底脱离?是否不相互依赖,也只有这样,才能体现可维护性、可拓展性的软件设计目标。

共2页。
posted @ 2005-12-05 08:56 只牵这只狗 阅读(260) | 评论 (0)编辑 收藏

         如果要问做什么事是最有吸引力,那就是创建Web应用。毕竟,上次你听到有人称赞某产品的交互设计是什么时候的事了?(除了iPod之外) 它们都很cool, 而且都是很创新的项目。

抛开这些不管,Web设计者们对设计交互式的Web没有什么更好的办法,却对我们做桌面软件的同事投去少许羡慕的目光.桌面应用程序有丰富的界面以及对于Web程序来说无法比拟的响应能力。同样,Web的快速发展,在我们所提供的体验和用户从桌面应用程序所得到的体验间产生巨大的差距

而如今差距正在消失。请看看“Google建议(Google Suggest)”. 观察它按你的输入显示建议条目的更新速度,几乎是立即更新的。再看看"Google Maps". 放大,用你的鼠标搬动和滚动。这些动作几乎是立即响应的,不用等待页面刷新。

"Google Suggest"和"Google Maps" 是采用Ajax技术的两个典型例子。Ajax是Asynchronous JavaScript and XML的简称,它表现出一个Web开发上的根本转变,那就是,Web上可能做些什么. Ajax的定义

Ajax不是一个技术,它实际上是几种技术,每种技术都有其独特这处,合在一起就成了一个功能强大的新技术。Ajax包括:

  • XHTML和CSS
  • 使用文档对象模型(Document Object Model)作动态显示和交互
  • 使用XML和XSLT做数据交互和操作
  • 使用XMLHttpRequest进行异步数据接收
  • 使用JavaScript将它们绑定在一起

传统的web应用模型工作起来就象这样:大部分界面上的用户动作触发一个连接到Web服务器的HTTP请求。服务器完成一些处理---接收数据,处理计算,再访问其它的数据库系统,最后返回一个HTML页面到客户端。这是一个老套的模式,自采用超文本作为web使用以来,一直都这样用, 但看过《The Elements of User Experience》的读者一定知道,是什么限制了Web界面没有桌面软件那么好用。

图1: 传统Web应用模型(左)与Ajax模型的比较(右).

这种旧的途径让我们认识到了许多技术,但它不会产生很好的用户体验。当服务器正在处理自己的事情的时候,用户在做什么?没错,等待。每一个动作,用户都要等待。

很明显,如果我们按桌面程序的思维设计Web应用,我们不愿意让用户总是等待。当界面加载后,为什么还要让用户每次再花一半的时间从服务取数据?实际上,为什么老是让用户看到程序去服务器取数据呢? Ajax如何不同凡响

通过在用户和服务器之间引入一个Ajax引擎,可以消除Web的开始-停止-开始-停止这样的交互过程. 它就像增加了一层机制到程序中,使它响应更灵敏,而它的确做到了这一点。

不像加载一个页面一样,在会话的开始,浏览器加载了一个Ajax引擎---采用JavaScript编写并且通常在一个隐藏frame中。这个引擎负责绘制用户界面以及与服务器端通讯。Ajax引擎允许用异步的方式实现用户与程序的交互--不用等待服务器的通讯。所以用户再不不用打开一个空白窗口,看到等待光标不断的转,等待服务器完成后再响应。

图 2: 传统Web应用的同步交互过程(上)和Ajax应用的异步交互过程的比较(下).

通常要产生一个HTTP请求的用户动作现在通过JavaScript调用Ajax引擎来代替. 任何用户动作的响应不再要求直接传到服务器---例如简单的数据校验,内存中的数据编辑,甚至一些页面导航---引擎自己就可以处理它. 如果引擎需要从服务器取数据来响应用户动作---假设它提交需要处理的数据,载入另外的界面代码,或者接收新的数据---引擎让这些工作异步进行,通常使用XML, 不用再担误用户界面的交互。 谁在使用Ajax

在采用Ajax的开发上面,Google做了巨大的投资。去年Google所有主要的产品都用了这项技术---Orkut, Gmail, 以及最近的beta版的Google Groups, Google Suggest和Google Maps---它们全是Ajax的应用。(要想了解更多这些Ajax实际的技术细节,请看它们的分析文章:Gmail, Google Suggest, Google Maps). 其它的像:Flickr, 采用许多人们喜欢的Ajax特性,还有Amazon的A9.com搜索引擎也采用类似的技术。

这些项目证明了Ajax不只是学术上的,也有许多真实世界成功应用。这不是什么实验室里的技术。Ajax的应用可大可小,从非常简单的,像单一功能的Google Suggest到非常复杂的Google Maps.

Ajax:Web应用开发新理念

如果要用“充满魅力”一词来形容当前流行的交互设计,那么首推创建Web应用程序。毕竟,当你最终听到某人倾倒于产品的交互设计,难道不是在网上?(Okay,我承认iPod除外)。所有追求酷,追求创新的新项目都是联机应用的。

尽管如此,Web交互设计人员还是不可避免地对创建桌面应用软件的同事怀有一丝妒忌。桌面应用程序所拥有的功能丰富性和响应能力似乎是Web目前无法达到的。简单地让Web应用程序迅速蔓延,会在我们所提供的体验和用户从桌面应用程序获取的体验之间形成一道鸿沟。

但现在,这道鸿沟正被逐渐填平。让我们看看Google Suggest。根据您输入的内容,相关的条目便几乎立即更新。我们再看Google Maps。利用光标,在刻度线上移动来放大地图或者缩小,所有的一切几乎都是即时的,完全不用等待页面的刷新。

Google Suggest和Google Maps就是这种新型Web应用程序的两个例子,我在Adaptive Path上把这种理念称为 Ajax。也就是Asynchronous JavaScript + XML的简写,它预示着Web可能发生一次重大的变革。

Ajax的定义

Ajax并不是一种新技术,它实际上是几种已经在各自领域大行其道的技术的强强结合。Ajax由以下内容组成:

· 基于标准化的XHTML和CSS;

通过DOM(Document Object Model)实现动态显示和交互;
· 通过XML和XSLT来进行数据交换和处理;

使用XMLHttpRequest通过异步方式获取数据;
使用JavaScript来整合以上所有的技术
经典的Web应用程序模型工作方式如下:大多数用户动作在界面上激发一个HTTP请求到web服务器。服务器做一些处理——获取数据,处理数字,与现有的应用系统进行沟通——最后返回HTML到客户端。这样的模型适合于以超文本为基础的Web应用程序,但作为一个强调用户体验的狂热分子(The Elements of User Experience一书的拥护者),我们认为超文本造就Web成功的东西,却并不一定满足软件应用程序的要求。

传统的Web应用程序模型技术上来说意义非凡,但它并不适用于创建完美的用户体验。当服务器在做数据处理的时候,用户在干什么呢?没错,他们在等待。一个任务所需的步骤越多,用户需要等待的次数也越多。

显然,当我们设计Web应用程序的时候,我们不应该让用户傻等。界面一旦加载完成,为什么还要因为程序需要从服务器传输一些东西而中断用户交互呢?实际上,用户为什么要看到程序与服务器的联系?

为什么Ajax与众不同

Ajax应用程序摒弃了“开—关—开—关”的交互形式,在用户与服务器之间引入了一个中间件——Ajax引擎。看上去在应用程序上添加一个层面会减少响应,但事实上恰好相反。

不同于加载一个网页是,用户会话一旦建立,浏览器就加载一个Ajax引擎——由JavaScript编写并通常放置在一个隐藏帧内。引擎的责任包括构造用户操作界面以及与服务器的沟通。Ajax引擎允许用户与应用程序的交互异步进行——无须直接访问服务器。所以用户永远不会在服务器处理数据期间瞪眼面对一个白屏和沙漏图标。



用户动作的处理由传统的表单提交来激发一个HTTP请求,变为Javascript调用Ajax引擎。给用户的回应不用等到服务器处理后返回——比如简单的数据校验,在内存中编辑数据,甚至一些导航功能——都直接由引擎来处理。如果引擎需要从服务器获取些数据——提交数据给服务器处理,加载额外的界面代码,或者获取新数据——引擎通常以XML格式激发一个异步的请求,用户端完全没有被中断的感觉。

谁在使用Ajax

Google在Ajax开发上投入了巨大的精力。去年Google推出的几大产品——Orkut、Gmail、Google Groups最终测试版、Google Suggest和Google Maps——都是基于Ajax的应用。其他还包括:有着很多备受人们赞誉特性的Flickr(http://www.flickr.com/)基于Ajax,Amazon的A9.com搜索引擎也使用了类似的技术。

这些项目证实Ajax并不是一个技术性的实验品,它可以实践在现实世界的应用中。它也不是一种只能在实验室中运用的技术。Ajax适用于从简单的单函数Google Suggest到非常复杂的Google Maps等各种规模的应用程序。

在Adaptive Path,我们已经基于Ajax的理念工作了好几个月,我们意识到我们也仅仅是接触到Ajax所能带来的非凡体验的一点皮毛。Ajax是Web应用程序的一个重要发展,并且其重要性还在逐步增长。因为许多开发人员已经熟悉Ajax所包含的技术,我们期望看到更多的组织能够像Google那样通过Ajax获得更大的竞争优势。

更进一步

创建Ajax应用程序所面临的最大挑战并不在技术上。Ajax的核心技术是成熟的,稳定并被广泛应用着。这些挑战在于:应用设计人员忘掉所有我们所熟知的网络限制,去想像更宽广、更深远的可能情况。

接下来会很有趣。

Ajax Q&A

2005年3月13日:自从Jesse发表了该文,他收到了不计其数的咨询Ajax问题的信件,Jesse回复了其中有代表性的问题并整理成Q&A。

Q:是Adaptive Path还是Google发明了Ajax?Adaptive Path是否协助开发了Google的Ajax应用程序?
A:Ajax并不是由Adaptive Path或者Google发明的。Google最新的产品是Ajax应用程序最具代表性的例子。Adaptive Path没有参与Google的开发,但我们在为其他的一些客户做一些与Ajax相关的工作。

Q:Adaptive Path会出售Ajax组件或者注册Ajax这个商标吗?我从哪里可以下载到它?
A:Ajax并不是一个具体的软件或程序,它是一种理念——关于用合理的技术构建Web应用程序架构的思考。Ajax这个名称和它的理念都不是Adaptive Path私有的。

Q:Ajax只不过是XMLHttpRequest的别名吗?
A:不是。XMLHttpRequest只是Ajax的一个组成部分。XMLHttpRequest让客户端与服务器的异步通讯成为可能;Ajax是本文描述的一个整体理念,它不仅依赖于XMLHttpRequest,还包括CSS、DOM和其他技术等等。

Q:为什么你会起这么个名字?
A:我们需要一个简短的表示“Asynchronous JavaScript+CSS+DOM+XMLHttpRequest”的新词来与客户谈我们的理念。

Q:与服务器异步通讯的技术产生很多年了,Ajax何以称为新理念?
A:Ajax包含的技术被大量应用在现实世界中以至于改变了Web的基础交互模式是一个新现象。Ajax是针对现在而言,因为这些技术离工业化应用还需要很多时间去开发。

Q:Ajax是一个技术平台或者架构吗?
A:都是。Ajax是一系列技术的无缝集合。

Q:Ajax最适合于什么样的应用?
A:我也不知道。因为这是一个相当新的理念,就我们的理解而言,Ajax应用还处于初期阶段。有时候传统的Web应用程序模型可能更为适合。

Q:是否可以理解为Adaptive Path就是取代anti-Flash?
A:完全不是。Macromedia是Adaptive Path的客户之一,并且我们长期为Flash技术做技术支持。待Ajax成熟后,我认为对于具体的问题,Ajax有时候会是一个更好的解决方案,同样有时候Flash也许做得更好。我们也有兴趣探讨两者的结合。(比如Flickr,它结合了两者)。

Q:Ajax在易用性和浏览器兼容性上是否有限制?Ajax是否会与后退按钮冲突?Ajax与REST(雷达电子扫描技术)兼容吗?Ajax的开发有哪些安全考虑?Ajax能为那些禁止Javascript运行的用户工作吗?
A:所有这些问题的答案,我只能说“可能”。已经有很多的开发者着手这些方面的工作。要评估Ajax的所有限制,我想还需要做很多工作,我们希望Ajax开发社区能揭示更多的信息。

Q:你所提到的Google的一些应用中实际上并没有使用XML。我一定要在Ajax应用中使用XML或XSLT吗?
A:不是,对于Ajax客户端,XML作为数据交换的载体是支持最为完善的(XMLHttpRequest,DOM支持)。当然,你没有理由不接受可以达到同样效果的技术,例如JavaScript Object Notation(http://www.crockford.com/JSON/)或者其他类似的数据交换的格式。

Q:Ajax应用比传统的Web应用程序方便开发吗?
A:也不尽然。Ajax的应用不可避免要在客户端运行复杂的JavaScript脚本。编写复杂并且高效稳定的脚本并不是一件容易的事情,优秀的开发工具和框架能帮助我们接受这一挑战。

Q:Ajax应用程序总比传统的Web应用程序程序更友好吗?
A:不一定,Ajax给交互设计人员更多的灵活性。能力越大,责任也越大。我们必须小心使用Ajax去改善用户体验,而不是把它弄得更糟。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=542160

posted @ 2005-12-05 08:29 只牵这只狗 阅读(277) | 评论 (0)编辑 收藏

<%
out.println("Protocol: " + request.getProtocol() + " ");
out.println("Scheme: " + request.getScheme() + " ");
out.println("Server Name: " + request.getServerName() + " " );
out.println("Server Port: " + request.getServerPort() + " ");
out.println("Protocol: " + request.getProtocol() + " ");
out.println("Server Info: " + getServletConfig().getServletContext().getServerInfo() + " ");
out.println("Remote Addr: " + request.getRemoteAddr() + " ");
out.println("Remote Host: " + request.getRemoteHost() + " ");
out.println("Character Encoding: " + request.getCharacterEncoding() + " ");
out.println("Content Length: " + request.getContentLength() + " ");
out.println("Content Type: "+ request.getContentType() + " ");
out.println("Auth Type: " + request.getAuthType() + " ");
out.println("HTTP Method: " + request.getMethod() + " ");
out.println("Path Info: " + request.getPathInfo() + " ");
out.println("Path Trans: " + request.getPathTranslated() + " ");
out.println("Query String: " + request.getQueryString() + " ");
out.println("Remote User: " + request.getRemoteUser() + " ");
out.println("Session Id: " + request.getRequestedSessionId() + " ");
out.println("Request URI: " + request.getRequestURI() + " ");
out.println("Servlet Path: " + request.getServletPath() + " ");
out.println("Accept: " + request.getHeader("Accept") + " ");
out.println("Host: " + request.getHeader("Host") + " ");
out.println("Referer : " + request.getHeader("Referer") + " ");
out.println("Accept-Language : " + request.getHeader("Accept-Language") + " ");
out.println("Accept-Encoding : " + request.getHeader("Accept-Encoding") + " ");
out.println("User-Agent : " + request.getHeader("User-Agent") + " ");
out.println("Connection : " + request.getHeader("Connection") + " ");
out.println("Cookie : " + request.getHeader("Cookie") + " ");
out.println("Created : " + session.getCreationTime() + " ");
out.println("LastAccessed : " + session.getLastAccessedTime() + " ");

%>

运行结果:

Protocol: HTTP/1.1
Scheme: http
Server Name: 192.168.0.1
Server Port: 8080
Protocol: HTTP/1.1
Server Info: JavaServer Web Dev Kit/1.0 EA (JSP 1.0; Servlet 2.1; Java 1.2; Windows NT 5.0 x86; java.vendor=Sun Microsystems Inc.)
Remote Addr: 192.168.0.106
Remote Host: abc
Character Encoding: null
Content Length: -1
Content Type: null
Auth Type: null
HTTP Method: GET
Path Info: null
Path Trans: null
Query String: null
Remote User: null
Session Id: To1010mC466113890241879At
Request URI: /c.jsp
Servlet Path: /c.jsp
Accept: */*
Host: 192.168.0.1:8080
Referer : null
Accept-Language : zh-cn
Accept-Encoding : gzip, deflate
User-Agent : Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
Connection : Keep-Alive
Cookie : SESSIONID=To1010mC466113890241879At
Created : 965764522168
LastAccessed : 965775587088。

posted @ 2005-12-01 13:55 只牵这只狗 阅读(971) | 评论 (1)编辑 收藏

Tomcat5的web应用启动顺序详解

cleverpig 发表于2005-11-29 作者:cleverpig 来自:Matrix 评价:3/1 评论数:0 点击数:211 [收藏]
摘要:
应用Tomcat对于我们来讲实在是司空见惯了,但是对于每个使用者来讲,应该了解其运转的机制也是必不可少的,本人在维护"apache开源项目"论坛时遇到此问题,并略作研究,望与大家共讨、分享。


本文Matrix永久镜像:http://www.matrix.org.cn/resource/article/44/44001_Tomcat5_web_start.html
说明:本文可能由Matrix原创,也可能由Matrix的会员整理,或者由
Matrix的Crawler在全球知名Java或者其他技术相关站点抓取并永久
保留镜像,Matrix会保留所有原来的出处URL,并在显著地方作出说明,
如果你发觉出处URL有误,请联系Matrix改正.
Tomcat5的web应用启动顺序详解

作者:cleverpig


版权声明:本文可以自由转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
作者:cleverpig(http://blog.matrix.org.cn/page/cleverpig)
原文:[http://www.matrix.org.cn/resource/article/43/43987_JGroups.html]http://www.matrix.org.cn/resource/article/43/43987_JGroups.html[/url]
关键字:tomcat,web,启动顺序

摘要:

   应用Tomcat对于我们来讲实在是司空见惯了,但是对于每个使用者来讲,应该了解其运转的机制也是必不可少的,本人在维护"apache开源项目"论坛时遇到此问题,并略作研究,望与大家共讨、分享。

一、配置自动部署时的web应用加载顺序:

   当tomcat的server.xml中对虚拟主机(Host)配置中autoDeploy=true和unpackWARs=true时,如:
server.xml

...
<Host name="localhost" debug="0" appBase="webapps"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
...


   下面的部署顺序在Tomcat启动时发生:

   1。任何具有上下文描述符(Context Descriptors)的web应用首先被部署,tomcat在$CATALINA_HOME/conf/[enginename]/[hostname]/目录中罗列出所有的以xml为结尾的文件,将其作为web应用的上下文描述符,并按照文件名排序逐一部署。

   注意作为上下文描述符的文件名可以不为web应用名,因为tomcat会读取其中的内容来判断,但是改变上下文描述符的文件名会使部署的顺序发生变化。

如:
$CATALINA_HOME\conf\Catalina\localhost\devoffer.xml


<?xml version='1.0' encoding='utf-8'?>
<Context docBase="E:/eclipse3.1RC3/workspace/devOfferProject/web" path="/devoffer" useNaming="false" workDir="work\Catalina\localhost\devoffer">
</Context>


上面的上下文描述符说明了devoff这个web应用的docBase和部署的path以及其工作目录。

   2。另外,位于$CATALINA_HOME/webapps/[webappname]/META-INF/目录中的context.xml也作为上下文描述符使用,在处理了上文所说的位于$CATALINA_HOME/conf/[enginename]/[hostname]/目录中的上下文描述符后,tomcat将部署这些在web应用的META-INF目录中的context.xml。加载顺序按照应用名的字母顺序。

   3。没有上下文描述符的已经被展开的web应用将按照其应用名顺序逐个被部署,如果其中的一个web应用关联着一个在appBase(一般为"$CATALINA_HOME/webapps"目录)中的WAR文件,则当WAR文件比相对应的被展开的web应用新时,那个被展开的web应用将被删除,tomcat将WAR文件展开并部署作为替换旧的web应用。

   4。在执行了1-3步后,tomcat将部署在appBase中的WAR文件。

   请注意:在每个应用被部署后,tomcat为没有上下文描述符的web应用建立上下文描述符。


二、非自动部署配置下的应用加载顺序:

   此时完全按照在tomcat manager中人工部署顺序。

三、参考资源:
       http://tomcat.apache.org/tomcat-5.5-doc/deployer-howto.html

四、参加讨论:
http://www.matrix.org.cn/thread.shtml?topicId=32324&forumId=17
posted @ 2005-11-30 16:28 只牵这只狗 阅读(288) | 评论 (0)编辑 收藏

你能过关吗?J2EE面试题集锦(附答案)
出处:CSDN[ 2005-11-24 10:00:55 ] 作者:metaphy 责任编辑:xietaoming

/**
 * By metaphy 2005-11-12
 * Version: 0.01
 * 注:题目答案来源于metaphy过去的知识或网络,metaphy不能保证其正确或完整性,仅供参考
**/

一、基础问答

  1.下面哪些类可以被继承?

   java.lang.Thread (T)
   java.lang.Number (T)
   java.lang.Double (F)
   java.lang.Math  (F)
   java.lang.Void  (F)
   java.lang.Class  (F)
   java.lang.ClassLoader (T)

  2.抽象类和接口的区别

  (1)接口可以被多重implements,抽象类只能被单一extends
  (2)接口只有定义,抽象类可以有定义和实现
  (3)接口的字段定义默认为:public static final, 抽象类字段默认是"friendly"(本包可见)

  3.Hashtable的原理,并说出HashMap与Hashtable的区别

  HashTable的原理:通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),将此值解释为该节点的存储地址.
HashMap 与Hashtable很相似,但HashMap 是非同步(unsynchronizded)和可以以null为关键码的.

  4.forward和redirect的区别

  forward: an internal transfer in servlet
  redirect: 重定向,有2次request,第2次request将丢失第一次的attributs/parameters等

  5.什么是Web容器?

  实现J2EE规范中web协议的应用.该协议定义了web程序的运行时环境,包括:并发性,安全性,生命周期管理等等.

  6.解释下面关于J2EE的名词

  (1)JNDI:Java Naming & Directory Interface,JAVA命名目录服务.主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能.
  (2)JMS:Java Message Service,JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播.
  (3)JTA:Java Transaction API,JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可.
  (4)JAF: Java Action FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的个性安全控制策略.
  (5)RMI:Remote Method Interface,远程方法调用

  7.EJB是基于哪些技术实现的?并说 出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别.

  EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现.

  SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件.EntityBean被用来代表应用系统中用到的数据.对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑;EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体.

  Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean .这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体.Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method.换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行.从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态.

  8.XML的解析方法

  Sax,DOM,JDOM

  9.什么是Web Service?

  Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。
Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等,所以Web Service可以在任何支持这些标准的环境(Windows,Linux)中使用。

  注:SOAP协议(Simple Object Access Protocal,简单对象访问协议),它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下,软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性,这有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。

  优势:

  (1).跨平台。
  (2).SOAP协议是基于XML和HTTP这些业界的标准的,得到了所有的重要公司的支持。
  (3).由于使用了SOAP,数据是以ASCII文本的方式而非二进制传输,调试很方便;并且由于这样,它的数据容易通过防火墙,不需要防火墙为了程序而单独开一个“漏洞”。
  (4).此外,WebService实现的技术难度要比CORBA和DCOM小得多。
  (5).要实现B2B集成,EDI比较完善与比较复杂;而用WebService则可以低成本的实现,小公司也可以用上。
  (6).在C/S的程序中,WebService可以实现网页无整体刷新的与服务器打交道并取数。

  缺点:

  (1).WebService使用了XML对数据封装,会造成大量的数据要在网络中传输。
  (2).WebService规范没有规定任何与实现相关的细节,包括对象模型、编程语言,这一点,它不如CORBA。

  10.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

  答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
  同步的实现方面有两种,分别是synchronized,wait与notify

  11.JSP中动态INCLUDE与静态INCLUDE的区别?

  动态INCLUDE用jsp:include动作实现

<jsp:include page="included.jsp" flush="true"/>

  它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数

  静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面

  <%@ include file="included.htm" %>

二、Java编程与程序运行结果

  1.Java编程,打印昨天的当前时刻

public class YesterdayCurrent{
  public void main(String[] args){
    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.DATE, -1);
    System.out.println(cal.getTime());
  }
}

  2.文件读写,实现一个计数器

  public int getNum(){
        int i = -1;
        try{
            String stri="";
            BufferedReader in = new BufferedReader(new FileReader(f));
            while((stri=in.readLine())!=null){
                i = Integer.parseInt(stri.trim());
            }
            in.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        return i;
    }
    public void setNum(){
        int i = getNum();
        i++;       
        try{
            PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(f,false))); 
            out.write(String.valueOf(i));            //可能是编码的原因,如果直接写入int的话,将出现java编码和windows编码的混乱,因此此处写入的是String
            out.close() ;
        }catch(Exception e){
            e.printStackTrace();
        }
    }

  3. 指出下面程序的运行结果:

class A{
    static{
        System.out.print("1");
    }
    public A(){
        System.out.print("2");
    }
}
class B extends A{
    static{
        System.out.print("a");
    }
    public B(){
        System.out.print("b");
    }  
}
public class Hello{
    public static void main(String[] ars){
        A ab = new B(); //执行到此处,结果: 1a2b
 ab = new B(); //执行到此处,结果: 1a2bab
    }
}

  注:类的static 代码段,可以看作是类首次加载(被虚拟机加载)执行的代码,而对于类的加载,首先要执行其基类的构造,再执行其本身的构造

  4.写一个Singleton模式的例子

public class Singleton{
 private static Singleton single = new Singleton();
 private Singleton(){}
 public Singleton getInstance(){
  return single;
 }
}

三、数据库

  1.删除表的重复记录

  如果记录完全相同才算重复记录,那么:  (sql server2000下测试通过)

select distinct * into #tmpp from tid
delete from tid    
insert into tid select * from #tmpp
drop table #tmpp

  如果有id主键(数字,自增1的那种),那么:(sql server2000下测试通过)

delete from tableA where id not in
(select id = min(id) from tableA group by name)

  2.delete from tablea & truncate table tablea的区别

  truncate 语句执行速度快,占资源少,并且只记录页删除的日志;
  delete 对每条记录的删除均需要记录日志

posted @ 2005-11-29 12:33 只牵这只狗 阅读(238) | 评论 (0)编辑 收藏

Eclipse 运行命令行参数大全  
  包括英文版本和中文版本两种的说明, 特别需要值得一提的是那个 -nl 参数, 可以指定程序启动时所使用的语言. 例如:
eclipse -nl en_US
将启动英文语言, 这个特性在安装了国际化语言包以后特别有用, 可以方便的切换各个语言的版本. 注意 IBM WSAD v5.1 也支持这个功能.

运行 Eclipse
将 Eclipse 驱动程序安装(解压缩)到某个目录(例如,c:\eclipse)中之后,通过运行顶级安装目录中的 Eclipse 可执行文件来启动"工作台"。在 Windows 系统上,该可执行文件称为 eclipse.exe,而在 Linux 系统上称为 eclipse。注意:下列讨论描述 Windows 系统上的设置。Linux 上的设置是相似的。

如果您没有另行指定,则平台将缺省工作区目录创建为可执行文件的兄弟目录(例如 c:\eclipse\workspace)。此工作区目录用作项目的缺省内容区,还用于保存任何必需的元数据。要进行共享安装或多工作区安装,应明确指出工作区的位置而不是使用缺省值。有两种控制工作区位置的方法:使用当前工作目录或使用 -data 命令行自变量。

将工作区位置设置为在当前工作目录内
在此方案中,工作区位置将是当前工作目录中称为 workspace 的目录。

实现此目的最容易的方法可能是使用下列步骤来创建快捷方式:

导航到 Windows 资源管理器中的 eclipse.exe 并使用右键拖动来创建 eclipse.exe 的快捷方式。
编辑快捷方式的属性,以使启动位置:字段标识工作区位置的父目录(例如,c:\users\robert)。
关闭属性对话框并双击快捷方式(如果提供的目录为 c:\users\robert,则工作区位置将为 c:\users\robert\workspace)。
当然,您也可以使用命令提示符(通过将目录切换为工作区父目录然后运行 eclipse.exe)来获得同样的效果。

使用 -data 设置工作区的特定位置
要使用 -data 命令行自变量,只要将 -data your_workspace_location(例如,-data c:\users\robert\myworkspace)添加至快捷方式属性中的目标字段或显式地将它包括在命令行上。

使用 -vm 设置 java VM
建议显式指定在运行 Eclipse 时要使用哪个 Java VM。使用 -vm 命令行自变量(例如,-vm c:\jre\bin\javaw.exe)可以实现此目的。如果不使用 -vm,则 Eclipse 将使用在 O/S 路径上找到的一个 Java VM。当安装其它产品时,它们可更改您的路径,导致在下一次启动 Eclipse 时使用另一 Java VM。

运行 Eclipse 中的高级主题
Eclipse 可执行文件及平台本身提供了人们感兴趣的开发或调试 Eclipse 各部件的许多执行选项。运行 Eclipse 可执行文件的一般格式是:

eclipse [platform options] [-vmargs [Java VM arguments]]
Eclipse 启动参数  命令 描述  原因
-arch architecture
定义 Eclipse 平台在其上运行的处理器体系结构。Eclipse 平台通常使用 Java os.arch 属性的常用值来计算最佳设置。如果在此处指定该项,则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOSArch() 用于插件。示例值有:"x86"、"sparc"、"PA-RISC"和"ppc"。 2.0
-application applicationId
要运行的应用程序。应用程序由向 org.eclipse.core.runtime.applications 扩展点提供扩展的插件来声明。通常不需要此自变量。如果指定了此项,则该值会覆盖配置提供的值。如果不指定此项,则会运行"Eclipse 工作台"。 1.0
-boot bootJarURL
(建议不使用;用 -configuration 代替;支持 1.0 兼容)。Eclipse 平台的引导插件代码(boot.jar)的位置,表示为 URL。如果指定此项,则会用它来为装入 Eclipse 平台引导程序类装入器的类装入器设置类路径。仅当更改 startup.jar 和 boot.jar 的相对位置时才需要它。注意,不允许使用相对 URL。  *1.0
-classloaderproperties [file]
如果指定的话,则使用给定位置处的类装入器属性文件来激活平台类类装入器增强。文件自变量可以是文件路径或 URL。注意,不允许使用相对 URL。单击此处以获得更多详细信息。 2.0.2
-configuration configurationFileURL
Eclipse 平台配置文件的位置,表示为 URL。配置文件确定 Eclipse 平台、可用插件集和主要功能部件的位置。注意,不允许使用相对 URL。当安装或更新 Eclipse 平台时配置文件被写至此位置。  2.0
-consolelog
将 Eclipse 平台的错误日志镜像到用来运行 Eclipse 的控制台。与 -debug 组合时很方便使用。 1.0
-data workspacePath
要运行 Eclipse 平台的工作区的路径。工作区位置也是项目的缺省位置。相对于从中启动 eclipse 的目录来解释相对路径。 1.0
-debug [optionsFile]
将平台置于调试方式,并从给定位置处的文件装入调试选项(如果指定的话)。此文件指示哪些调试点可用于插件以及是否已启用它们。如果未给出文件位置,则平台在启动 eclipse 的目录中查找称为".options"的文件。URL 和文件系统路径都可作为文件位置。 1.0
-dev [classpathEntries]
将平台置于开发方式。将可选类路径条目(用逗号分隔的列表)添加至每个插件的运行时类路径。例如,当工作区包含要开发的插件时,指定 -dev bin 会为每个插件项目的名为 bin 的目录添加类路径条目,允许在其中存储最新生成的类文件。除去了冗余或不存在的类路径条目。 1.0
-endsplash params
用于在 Eclipse 平台启动并运行时关闭闪屏的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0
-feature featureId
主要功能部件的标识。主要功能部件为 Eclipse 的已启动实例提供了产品个性,并确定使用的产品定制信息。 2.0
-keyring keyringFilePath
磁盘上授权数据库(或"密钥环"文件)的位置。此自变量必须与 -password 选项配合使用。相对于从中启动 eclipse 的目录来解释相对路径。 1.0
-nl locale
定义 Eclipse 平台在其上运行的语言环境的名称。Eclipse 平台通常自动计算最佳设置。如果在此处指定该项,则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getNL() 用于插件。示例值有:"en_US"和"fr_FR_EURO"。 2.0
-nolazyregistrycacheloading
取消激活装入优化的平台插件注册表高速缓存。缺省情况下,仅当需要时才从注册表高速缓存(可用时)中装入扩展的配置元素,以减少内存占用。此选项将在启动时强制完全装入注册表高速缓存。 2.1
-noregistrycache
绕过读写内部插件注册表高速缓存文件。 2.0
-nosplash
运行平台而不显示闪屏。 1.0
-os operatingSystem
定义 Eclipse 平台在其上运行的操作系统。Eclipse 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项,则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOS() 用于插件,并用于解析插件清单文件中提及的路径中 $os$ 变量的出现。示例值有:"win32"、"linux"、"hpux"、"solaris"和"aix"。 1.0
-password password
授权数据库的密码。与 -keyring 选项配合使用。 1.0
-perspective perspectiveId
启动时要在活动工作台窗口中打开的透视图。如果没有指定该参数,则将打开关闭时活动的透视图。 1.0
-plugincustomization          propertiesFile
包含插件首选项缺省设置的属性文件的位置。这些缺省设置覆盖在主要功能部件中指定的缺省设置。相对于从中启动 eclipse 的目录来解释相对路径。 2.0
-plugins pluginsFileURL
(建议不使用;用 -configuration 代替;支持 1.0 兼容)。 指定 Eclipse 平台查找插件的文件的位置,表示为 URL。该文件为属性文件格式,其中键是任意用户定义名称,值是指向 plugin.xml 文件的显式路径或指向包含插件的目录的路径的用逗号分隔的列表。注意,不允许使用相对 URL。如果指定此项,则此选项会导致创建适当的临时配置。 *1.0
-refresh
启动时执行工作区的全局刷新的选项。这将使从上次平台运行以来在文件系统中所做的任何更改一致。 1.0
-showlocation
用于在窗口标题栏中显示工作区的位置的选项。在发行版 2.0 中,此选项仅与 -data 命令行自变量一起使用。 2.0
-showsplash params
用于显示闪屏(由可执行的 Eclipse 平台启动器执行)的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0
-vm vmPath
要用来运行 Eclipse 平台的"Java 运行时环境"(JRE)的位置。如果不指定此项,则 JRE 位于 jre(它是 Eclipse 可执行文件的兄弟目录)。相对于从中启动 eclipse 的目录来解释相对路径。 1.0
-ws windowSystem
定义 Eclipse 平台在其上运行的 Windows 系统。Eclipse 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项,则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getWS() 用于插件、用于配置 SWT 以及用于解析插件清单文件中提及的路径中 $ws$ 变量的出现。示例值有:"win32"、"motif"和"gtk"。 1.0

将 -vmargs 条目后面的所有自变量(但不包括 -vmargs)作为虚拟机自变量(即,在要运行的类的前面)直接传递到所指示的 Java VM。注意:如果 Eclipse 启动在 Java vm 自变量(-vmargs)之后提供的自变量(例如,-data),则 Eclipse 将不会启动并且您将接收到"JVM 已终止。出口代码为 1"的错误。

在不同的 VM 上运行
在 J9 上运行 Eclipse
当在 J9 版本 1.5 上运行 Eclipse 时,建议使用以下 VM 选项:

eclipse.exe [eclipse arguments] -vm path_to_j9w.exe             -vmargs -ms:32 -mm:2048 -mo:32768 -moi:32768 -mca:32 -mco:128 -mx:2000000
当在 J9 版本 2.0 上运行 Eclipse 时,J9W 选择的缺省自变量应为合适的选项。但是,要覆盖 Eclipse 可执行文件以内部方式自动设置的参数,必须指定 -vmargs 不带任何参数,如下所示:

eclipse.exe [eclipse arguments] -vm path_to_j9w.exe -vmargs
有关进一步信息,参考 J9 VM 文档和帮助。

在 IBM Developer Kit, Java(TM) Technology Edition VM 上运行 Eclipse
IBM Developer Kit, Java(TM) Technology Edition 1.3 Linux 的缺省 VM 设置适合进行初期研究工作,但在进行大型开发时是不够的。对于大型开发,应修改 VM 自变量以使有更多的堆可用。例如,下列设置将允许 Java 堆增大为 256MB:

-vmargs -Xmx256M
posted @ 2005-11-28 15:20 只牵这只狗 阅读(467) | 评论 (0)编辑 收藏

程序被BS了...咳...

posted @ 2005-11-27 18:59 只牵这只狗 阅读(210) | 评论 (0)编辑 收藏

头好晕,发现又到周末了。
好好休息一下吧!!!
posted @ 2005-11-25 16:18 只牵这只狗 阅读(213) | 评论 (0)编辑 收藏

下午做业务联合系统测试,结果问题一大堆,流程跑了一半跑不下去了,真有些丢人。
问题总结:
1. 程序写的太马虎。其中一位师兄(比我进公司早)写的那几支问题最多,当然,这也和他负责的那支程序复杂程度有关(比我写的那几支要复杂),不过只怕主要还是他自己的问题——平时这位师兄就经常对工作满腹牢骚,但人还是蛮不错的。
2. 内部测试没有做到位。组内的测试马马乎乎就过了,不知道做的目的究竟是为了自己还是为了别人。
3. 领导也催的太急。快到月底了,为了绩效催的紧,迫的我们这些日子天天加班。虽然我并不介意加班,但也不能把我们当机器人吧。——我现在就是在加班的时间,抽空更新一下BLOG,气死他。
这次测试,都还没跑到我的那几支,不过自我感觉良好,哈!
posted @ 2005-11-24 19:24 只牵这只狗 阅读(244) | 评论 (0)编辑 收藏

昨天申请的BLOG开通了,在准备写点东西的时候,我负责的系统却发生了一个异常。所以,不得不去处理。刚吃完饭,想了想就把这个问题写上来好了。
今天系统出现了一个奇怪的错误,令我奇怪的不是这个错误本身,而是这个异常在发生的时候竟然没有被抛出。后来才发现,这个被调用的方法在上一个系统中自己处理了异常而没有throws出来,结果让程序带错继续跑了下去,结果,错误发生到我的系统上了。真糟糕!
今天还有一个收获,那就是终于知道错误日志的记录规则。汗...因为接这个系统不久,所以很多都还没认真看过...以后一定要多把各个方面都多看一下...
[code]
COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0413N  Overflow occurred during numeric data type conversion.  SQLSTATE=22003

 at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.throw_SQLException(SQLExceptionGenerator.java(Compiled Code))
 at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.throw_SQLException(SQLExceptionGenerator.java(Inlined Compiled Code))
 at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.check_return_code(SQLExceptionGenerator.java(Compiled Code))
 at COM.ibm.db2.jdbc.app.DB2Statement.execute2(DB2Statement.java(Compiled Code))
 at COM.ibm.db2.jdbc.app.DB2Statement.executeUpdate(DB2Statement.java(Compiled Code))
 at com.ibm.ws.rsadapter.jdbc.WSJdbcStatement.pmiExecuteUpdate(WSJdbcStatement.java(Compiled Code))
 at com.ibm.ws.rsadapter.jdbc.WSJdbcStatement.executeUpdate(WSJdbcStatement.java(Compiled Code))
 ........................[/code]

posted @ 2005-11-24 12:51 只牵这只狗 阅读(1818) | 评论 (0)编辑 收藏

仅列出标题
共3页: 上一页 1 2 3