一、准备篇
1 什么是J2EE?它和普通的Java有什么不同?
答:J2EE全称为Java2 Platform Enterprise Edition。
“J2EE平台本质上是一个分布式的服务器应用程序设计环境——一个Java环境,它提供了:
·宿主应用的一个运行基础框架环境。
·一套用来创建应用的Java扩展API。”(引自《J2EE服务器端高级编程》)
2 J2EE好学吗?
答:J2EE是很多技术的集合体,并且还在成长中。
你会遇到很多专有名词:比如(X)HTML,Servlet/JSP,JDBC,JMS,JNDI,EJB,XML,Web Service……。
尤其是XML和Web Service正在快速成长。幸运的是,你不需要等到学会所有技术后再开始编程。
大体上J2EE可以分成3个主要应用:Servlet/JSP,EJB,XML/Web Service 和一些支撑技术例如JDBC和JNDI。
你可以一个一个的学。
什么是J2EE. 为什么需要J2EE.
3 J2EE有什么用?
答:J2EE用来建设大型的分布式企业级应用程序。或者用更时髦的名词说就是“电子商务”应用程序。
这些企业可能大到拥有中心数据库服务器,Web服务器集群和遍布全国的办公终端,也可能小到只不过想做一个网站。
4 学J2EE有前途吗?
答:在这一市场目前只有一种技术可以和J2EE竞争,那就是Microsoft的.NET。
相对来说.NET要“新”一些而J2EE要“老”一些。
但是.NET只能用于Windows平台(Microsoft声称要开发C#在Linux上的虚拟机但是尚未兑现该诺言),
考虑到Linux的发展势头,你可以相信.NET不会一统天下。
5 据说J2EE的性能不如.NET好,是真的吗?
答:在Sun公司提供的样例程序Pet Store上,Microsoft声称不如相同的.NET程序好。
而Sun公司反驳说这一程序不能真正体现J2EE的性能,并且指责Microsoft在数据库上做了优化。
作者没有学习过.NET因而不能妄下断言。
无论如何,大型分布式程序中的性能瓶颈通常首先来自于错误的设计。
6 听你说了这么多,我想学着玩玩J2EE。
答:除非你想靠它当饭吃或者作为技术储备,否则请不要浪费你的时间。
Flash要好玩得多。计算机游戏就更加好玩了。
7 学习J2EE该怎么开始?
答:首先,下载一个J2EE服务器。其次,去java.sun.com下载J2EE的API。第三,找一本好的参考书。最后,找一个顺手的IDE。
J2EE服务器。你可以用Sun的J2EE SDK(免费),或者Weblogic(性能最好,但是太大,而且作者不推荐盗版行为),或者Jboss(免费,就是文档太少),或者Jrun(开发版免费,作者用这个)。参考书作者感觉Wrox的《J2EE服务器端高级编程》不错,但是太老(作者手头的是2001年中文版)。你还需要去下载一些最新的技术资料(当然肯定是英文的)。
IDE如果你的机器配置够好(内存至少512M以上,256M或以下请勿考虑),可以用IBM的WSAD,不然就继续用Eclipse或者其他。
你也可以经常去水木清华的Java版逛逛,但是在发贴前先看看精华区里有没有你要的答案。
8 我下了一个J2EE服务器但是不会配置。
答:请认真阅读随机指导文档,不同的服务器的配置都不一样,作者爱莫能助。
9 我发现你没有提到Tomcat。
答:Tomcat只是一个Web服务器,更准确地说主要只是一个Web Container。
如果你想要学习EJB的话,Tomcat无法满足你的需要。
二、 Servlet/JSP篇
10 什么是Servlet?
答:一个Servlet是一个Java类。它处理Http(s)请求并作出响应,包括返回一个HTML页面或转交给其他URL处理。
Servlet必须运行在一个Web Container例如Tomcat中。
Servlet必须是javax.servlet.http.HttpServlet的子类,
你可以继承doGet()或者doPost()方法,两者分别对应于Http(s)中的Get请求和Post请求。
11 我怎么获得Http请求里的参数?
答:HttpRequest的getParameter()方法。例如:String paramValue = request.getParameter("paramName");
12 我怎么返回结果?
答:你可以利用相关API打开一个输出流,并向流中直接写入一个HTML页面。
但是作者完全不赞成这样做。一方面这样做会很罗嗦。
另一方面从Model-View-Controller模式(在《J2EE核心模式》中被归为Front Controller模式)的观点来看,
你应当提供一些HTML或者JSP作为视图(view),而Servlet则根据请求参数决定转到哪一个视图。
你可以利用response.sendRedirect(…)方法或request.getDispatcher(…).forward()方法来实现。
13 sendRedirect()和forward()有什么不同?
答:sendRedirect()是向浏览器发送一个redirect通知,浏览器重定向到新的URL。
而forward是在服务器端直接转到新的URL,对于浏览器是透明的。
前者浏览器的地址栏显示的是新的URL,后者浏览器的地址栏显示的是Servlet的URL。
因而当目标URL会自动刷新时,两者会造成一些差别。
14 我写了一个Servlet程序,怎么运行它?
答:开发J2EE程序有一个部署(deploy)的概念,实际上是开发——部署——运行的三部曲。
大多数服务器支持Hot deploy。你只需要在相应的Application目录(具体路径依赖于服务器)下面
建立一个符合WAR或EAR格式(参见16,17)的目录,启动服务器,就可以通过浏览器访问了。
特别的,你的Servlet的class文件应当放在/WEB-INF/classes目录中。
注意J2EE SDK不支持Hot deploy,你需要通过它的deploy tool来部署。
Tomcat只支持WAR格式。
15 EAR和WAR有什么不同?
答:EAR是一个完整的J2EE应用程序,包括Web部分和EJB部分。
WAR只是其中的Web部分。
16 EAR格式是怎样的?
答:一个EAR可以包含任意多个WAR或EJB JAR,并且包含一个META-INF的目录。
在/META-INF中包含了一个application.xml,其中描述了这个EAR包含哪些模块,以及安全性配置。
细节请看参考书。
17 WAR格式是怎样的?
答:一个WAR包含一个WEB-INF的目录,这个目录下包含classes目录,lib目录和web.xml。
/WEB-INF/classes存放按package组织的class文件,/WEB-INF/lib目录存放jar文件,
web.xml描述了很多东西,请读参考书。
18 我的普通HTML文件应当放在哪里?
答:放在除了/WEB-INF以外的其他地方。
19 我访问不到servlet,甚至连HTML文件都访问不到!
答:第一你没启动服务器。第二你敲错了端口。第三你没有正确配置context-path。
第四你的服务器不支持auto reload或者你关闭了这一选项,你得重启服务器。
第五确认你没有把HTML放在/WEB-INF目录下,那是访问不到的。
20 我能访问HTML但是访问不到servlet。
答:请检查你的web.xml文件。确保你正确定义了<servlet>和<servlet-mapping>元素。
前者标识了一个servlet,后者将一个相对于context-path的URL映射到一个servlet。
在Tomcat中你可以通过/context-path/servlet/package/servletname的形式访问servlet,
但是这只是Tomcat的便捷访问方式,并不是正式规范。
细节请看参考书。
21 什么是JSP?它和Servlet有什么区别?
答:你可以将JSP当做一个可扩充的HTML来对待。
虽然在本质上JSP文件会被服务器自动翻译为相应的Servlet来执行。
可以说Servlet是面向Java程序员而JSP是面向HTML程序员的,除此之外两者功能完全等价。
22 我的JSP显示的汉字是乱码。
答:在你的JSP开头加上一行 <%@ page contentType="text/html; charset=gb2312"%>
如果你已经声明了page我想你知道该怎么修改。
23 JSP文件存放在哪里?
答:除了/WEB-INF下的任何地方。
24 在JSP里面怎么引用Java Bean。
答:首先,确认你要引用的类在/WEB-INF/classes下或在/WEB-INF/lib的某个jar内。
其次,在JSP里加一行 <jsp:useBean id="…" scope="…" class="…"/>
具体解释请看参考书。
25 我想在servlet间传递数据。
答:利用session。在Servlet/JSP中,你可以在4个地方保存数据。
1) page,本页面。
2) session,用来存放客户相关的信息,比如购物车,对应接口为javax.servlet.http.HttpSession。
Session机制实际上是cookie和URL Rewrite的抽象,服务器会自动使用cookie或URL Rewrite来实现。
3) request,可以在forward()时传递信息,对应接口为javax.servlet.http.HttpRequest。
4) application,或称context,存放全局信息,对应接口为javax.servlet.ServletContext。
26 怎么调用cookie?
答:作者建议使用session,你总是会遇到某些禁用cookie的用户。这时session会自动使用URL重写来实现。
27 怎么在JSP里面实现文件下载?
答:实际上这是一个HTML的问题。答案是一个超链接<a>。
28 怎么实现文件上传?
答:客户端是HTML问题,在form中设置method为post,enctype为multi-part/form-data,加一个<input type="file">。
而在接收的servlet中只是一个I/O问题。
29 我想让页面自动刷新,比如聊天室。
答:这是一个HTML问题,在<head>部分中加一条<meta http-equiv="refresh" content="5" url="…">。
这是所谓的Clinet-push,客户端刷新技术。
30 我想让用户登录以后才能访问页面。
答:使用声明式安全措施。
你只需要在web.xml中定义安全角色(Role),并定义受保护的URL集合只能由特定Role访问。
大多数服务器支持基于数据库的用户映射,你只要在相应数据库中建立两张表并配置服务器就可以了。
注意J2EE SDK不支持基于数据库的用户映射。
细节请看参考书和服务器文档。
31 我想要能注册用户。
答:参看30。在接受注册请求的Servlet中执行写入数据库操作即可。
32 怎么在JSP中访问数据库?
答:标准做法是使用DAO模式,定义一个Java bean来访问数据库并在JSP中使用。
然而,当你的数据库模式很简单时,你可以使用JSTL中的<sql:query>标签来快速访问。
33 什么是JSTL?
答:JSTL是Jsp Standard Tag Library的缩写。这是一组通用标签并将成为JSP 2.0的一部分。
其中包含赋值<c:set>,分支<c:if>,循环<c:forEach>,查询数据库<sql:query>,更新数据库<sql:update>
等。目前你需要像添加自定义标签库一样来添加JSTL,但是可以预计JSP 2.0会将JSTL作为组成部分。
标签库可以在 http://jakarta.apache.org 下载。注意JSTL需要在支持JSP1.2或更高版本的容器下运行。帮助文件可以阅读sun的JSTL正式规范。
如何才算掌握Java(J2SE篇)?
Java本身是一种设计的非常简单,非常精巧的语言,所以Java背后的原理也很简单,归结起来就是两点:
1、JVM的内存管理
理解了这一点,所有和对象相关的问题统统都能解决
2、JVM Class Loader
理解了这一点,所有和Java相关的配置问题,包括各种App Server的配置,应用的发布问题统统都能解决
时常看到一些人说掌握了Java,但是让他们用Java做一个实际的项目可能又困难重重,在这里,笔者根据自己的一点理解斗胆提出自己的一些对掌握Java这个说法的标准,当然对于新手,也可以提供一个需要学习哪些内容的参考。另外这个标准仅限于J2SE部分,J2EE部分的内容有时间再另说。
1、语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正。
2、命令:必须熟悉JDK带的一些常用命令及其常用选项,命令至少需要熟悉:appletviewer、HtmlConverter、jar、java、javac、javadoc、javap、javaw、native2ascii、serialver,如果这些命令你没有全部使用过,那么你对java实际上还很不了解。
3、工具:必须至少熟练使用一种IDE的开发工具,例如Eclipse、Netbeans、Jbuilder、Jdeveloper、IDEA、Jcreator或者Workshop,包括进行工程管理、常用选项的设置、插件的安装配置以及进行调试。
4、API:Java的核心API是非常庞大的,但是有一些内容笔者认为是必须熟悉的,否则不可能熟练的运用Java,包括:
1)、java.lang包下的80%以上的类的功能的灵活运用。
2)、java.util包下的80%以上的类的灵活运用,特别是集合类体系、规则表达式、zip、以及时间、随机数、属性、资源和Timer。
3)、java.io包下的60%以上的类的使用,理解IO体系的基于管道模型的设计思路以及常用IO类的特性和使用场合。
4)、java.math包下的100%的内容。
5)、java.net包下的60%以上的内容,对各个类的功能比较熟悉。
6)、java.text包下的60%以上的内容,特别是各种格式化类。
7)、熟练运用JDBC。
8)、java.security包下40%以上的内容,如果对于安全没有接触的话根本就不可能掌握java。
9)、AWT的基本内容,包括各种组件事件、监听器、布局管理器、常用组件、打印。
10)、Swing的基本内容,和AWT的要求类似。
11)、XML处理,熟悉SAX、DOM以及JDOM的优缺点并且能够使用其中的一种完成XML的解析及内容处理。
5、测试:必须熟悉使用junit编写测试用例完成代码的自动测试。
6、管理:必须熟悉使用ant完成工程管理的常用任务,例如工程编译、生成javadoc、生成jar、版本控制、自动测试。
7、排错:应该可以根据异常信息比较快速的定位问题的原因和大致位置。
8、思想:必须掌握OOP的主要要求,这样使用Java开发的系统才能是真正的Java系统。
9、规范:编写的代码必须符合流行的编码规范,例如类名首字母大写,成员和方法名首字母小写,方法名的第一个单词一般是动词,包名全部小写等,这样程序的可读性才比较好。
什么是J2EE
J2EE: 电子商务和信息技术的快速发展以及对它们的需求给应用程序开发人员带来了新的压力。
必须以比以前更少的金钱、更少的资源来更快地设计、开发企业应用程序。为了降低成本,并加快企业应用程序的设计和开发, J2EE 平台提供了一个基于组件的方法,来设计、开发、装配及部署企业应用程序。J2EE 平台提供了多层的分布式的应用模型、组件再用、一致化的安全模型以及灵活的事务控制。您不仅可以用比以前更快的速度向市场推出创造性的客户解决方案,而且您的平台独立的、基于组件的J2EE 解决方案不会被束缚在任何一个厂商的产品和API 上。
1. J2EE 规范定义了以下种类的组件
• 应用客户组件。
• Enterprise JavaBeans 组件。
• Servlet及JavaServer Pages(JSP 页面)组件(也被称作Web 组件)。
• Applet。
一个多层的分布式的应用模型意味着应用逻辑被根据功能划分成组件,并且可以在同一个
服务器或不同的服务器上安装组成J2EE 应用的这些不同的组件。一个应用组件应被安装在什么
地方,取决于该应用组件属于该多层的J2EE 环境中的哪一层。这些层是客户层、We b层、业务
层及企业信息系统层( EIS )等。
(1) 客户层
J2EE 应用可以是基于Web 的,也可以是不基于Web 的。在一个基于Web 的J2EE 应用中,用户的浏览器在客户层中运行,并从一个We b服务器下载Web 层中的静态HTML 页面或由J S P或Servlet 生成的动态HTML 页面。在一个不基于Web 的J2EE 应用程序中,一个独立客户程序不运行在一个HTML 页面中,而是运行在其他一些基于网络的系统(比如手持设备或汽车电话)中,Applet 程序,在客户层中运行,并在不经过Web 层的情况下访问Enterprise Beans。这个不基于Web 的客户层可能也包括一个JavaBeans 类来管理用户输入,并将该输入发送到在企业层中运行的Enterprise Beans类来进行处理。根据J2EE 规范,JavaBeans 类不被视为组件。为J2EE 平台编写的JavaBeans 类有实例变量和用于访问实例变量中的数据的“ get 和set 方法”。以这种方式使用的JavaBeans 类在设计和实现上通常都是简单的,但是它们必须符合JavaBeans 规范中列出的命名和设计约定。
(2) Web 层
J2EE Web 组件可以由JSP 页面、基于Web 的A p p l e t以及显示HTML 页面的S e r v l e t组成。调用S e r v l e t或者JSP 页面的HTML 页面在应用程序组装时与Web 组件打包在一起。就像客户层一样,Web 层可能包括一个JavaBeans 类来管理用户输入,并将输入发送到在业务层中运行的Enterprise Beans 类来进行处理。运行在客户层的Web 组件依赖容器来支持诸如客户请求和响应及Enterprise Bean 查询等。
(3) 业务层
作为解决或满足某个特定业务领域(比如银行、零售或金融业)需要的逻辑的业务代码由运行在业务层的Enterprise Beans 来执行。一个Enterprise Bean 从客户程序处接收数据,对数据进行处理(如果需要),再将数据发送到企业信息系统层存储起来。一个Enterprise Beans 还从存储中检索数据,并将数据送回客户程序。运行在业务层的Enterprise Beans 依赖于容器来为诸如事务、生命期、状态管理、多线程及资源存储池等提供通常都非常复杂的系统级代码。业务层经常被称作Enterprise JavaBeans (EJB )层。业务层和Web 层一起构成了3 层J 2 E E应用的中间层,而其他两层是客户层和企业信息系统层。
(4) 企业信息系统层
企业信息系统层运行企业信息系统软件,这层包括企业基础设施系统,例如企业资源计划(E R P)、大型机事务处理( mainframe transactionprocessing )、数据库系统及其他遗留信息系统(legacy informationsystems )。J2EE 应用组件因为某种原因( 例如访问数据库) 可能需要访问企业信息系统。J2EE 平台的未来版本将支持Connector 架构,该架构是将J2EE 平台连接到企业信息系统上的一个标准A P I。
(5) 查询服务
因为一个J2EE 应用程序的组件是单独运行的,并且往往在不同的设备上运行,因此,需要一种能让客户层和Web 层代码查询并引用其他代码和资源的方法。客户层和Web 层代码使用Java 命名和目录接口(JNDI )来查询用户定义的对象(例如Enterprise Beans )、环境条目(例如一个数据库驱动器的位置)、企业信息系统层中用于查找资源的JDBC DataSource对象,以及消息连接。
(6) 安全和事务管理
诸如安全和事务管理这样的应用行为可以在部署时在Web 和Enterprise Beans 组件上进行配置。这个特征将应用逻辑从可能随装配而变化的配置设定中分开了。J2EE 安全模型允许配置一个Web 或Enterprise Beans 组件,使系统资源只能由授权的用户访问。例如,一个Web 组件可以被配置成提示输入用户名和密码。一个Enterprise Beans 组件可以被配置成只让特定团体中的成员调用其某些方法。或者,一个Servlet 组件可以被配置成让某个组织中的所有人都能访问其某些方法,同时只让该组织中的某些享有特权的人访问其中一些方法。同样是该Servlet 组件,可以针对另外一个环境而被配置成让每个人都能访问其所有方法,或者仅让选定的少数人访问其所有方法。
J2EE 事务模型使得能够在部署时定义构成一个单一事务的方法之间的关系,以使一个事务中的所有方法被处理成一个单一的单元。这是我们所希望的,因为一个事务是一系列步骤,这些步骤要么全部完成,要么全部取消。例如,一个Enterprise Beans 可能有一组方法,使我们可以通过从第一个账户借出并存入第二个账户的方式而将钱从第一个账户转移到第二个账户。我们希望全部的操作被作为一个单元对待,这样,如果在借出之后存入之前发生了故障,该借出操作被取消。事务属性是在装配期间定义在一个组件上的。这使得能将来自多个应用组件的方法归到一个事务中,这说明,我们可以轻易变更一个J2EE 应用程序中的应用组件,并重新指定事务属性,而不必改变代码或重新编译。在设计应用组件时,要记住,尽管Enterprise Beans 有一个可使应用组件的容器自动启动多步事务的机制,但是Applet 和应用的客户容器可能并不支持这一点。然而, Applet 和应用客户容器总是能够调用支持这一点的一个Enterprise Beans。还应当注意, JSP 页面和Servlet 没有被设计成是事务的,它们通常应当将事务工作交给一个Enterprise Bean 来完成。然而,如果事务工作在一个JSP 页面或Servlet 中是必须的,那么此种工作也应当是非常有限的。
(7) 可重用应用组件
J2EE 组件(Applet 、应用的客户、Enterprise Beans 、JSP 页面及Servlet )都被打包成模块,并以Java Archive (JAR )文件的形式交付。一个模块由相关的组件、相关的文件及描述如何配置组件的配置描述文件组成。例如,在组装过程中,一个HTML 页面和Servlet 被打包进一个模块之中,该模块包含H T M L文件、Servlet 组件及相关的配置描述文件,并以一个Web Archive(WAR )文件的形式交付,该WAR 文件是一个带.war 扩展名的标准JAR 文件。模块的使用使得利用相同组件中的某些组件来组装不同的J2EE 应用程序成为可能。例如,一个J2EE 应用程序的Web 版可能有一个Enterprise Beans 组件,还有一个JSP 页面组件。该Enterprise Beans 组件可以与一个应用客户组件结合,以生成该应用程序的非Web 版本。这不需要进行额外的编码,只是一个装配和部署的问题。并且,可重用组件使得将应用开发和部署过程划分成由不同的角色来完成成为可能,这样,不同的人或者公司就能完成封装和部署过程的不同部分。
2. J2EE 平台定义了如下角色:
(1) J2EE 产品提供商
设计并使J2EE 平台、API 和在J2EE 规范中定义的其他特征能被其他公司或人购得的公司。
(2) 应用组件提供商
创建用于J2EE 应用程序的Web 组件、Enterprise Beans 组件、Applet 或应用客户程序的公司或个人。在装配过程中,应用组件文件、接口及类被打包进一个JAR 文件中。
(3) 应用程序装配商
从组件提供商获得应用组件JAR 文件,并将它们组装成一个J2EE 应用的Enterprise Archive(E A R)文件的公司或个人,这种文件是一个带. E a r扩展名的标准文件。应用装配商提供与该应用程序相关的整体信息,并使用验证工具来检验EAR 文件的内容是正确的。组装和部署信息存储在一个基于文本的配置描述文件中,此种文件使用XML 标记来标记该文本。应用装配商可以使用一个能通过交互式选择来正确添加XML 标记的装配和配置工具来编辑该配置描述文件。
(4) 部署商
部署( d e p l e y)J2EE 应用程序的公司或个人。其职责包括设定事务控制、安全属性,并根据应用组件提供商提供的指示来标明一个Enterprise Bean 是自己处理自身的存储,还是由一个容器来处理等。部署涉及配置和安装。在配置过程中,部署商遵循应用组件提供商提供的指示来解决外部依赖问题,定义安全设定,以及分配事务属性。在安装过程中,部署商将应用组件安装到服务器上,并生成容器特定的类和接口。
(5) 系统管理员
配置并管理运行J2EE 应用程序的计算环境和网络基础设施,并监督运行环境的人员。
(6) 工具提供商
生产被组件提供商、装配商及部署商使用的用于进行开发、组装和打包的工具的公司或个人。
(7) 设计用户界面和引擎
在为J2EE 应用程序设计用户界面和后端引擎时,需要决定让该程序是基于We b,还是不基于We b。在做出这个决定时,我们可能希望考虑平台配置、下载速度、安全、网络流量和网络服务。
例如,包含有用户界面并且经常被大量用户访问的一个Applet 可能需要花很长的时间才能被下载下来,这让用户沮丧。然而,如果知道该A p p l e t要运行在一个公司的内部网内的受控环境中,那么,在这种情况下,该Applet 将拥有一个完全可接受的下载速度。另一个考虑是,繁重的处理应当在哪里执行。例如,如果客户程序在一个蜂窝电话或呼机中执行,服务器应当完成尽量多的计算和数据处理,而客户程序只应显示结果就可以了。然而,设计在一个强大的台式机平台上运行的大型财务分析系统则应当在客户机上完成其复杂计算。应用的客户程序和A p p l e t用户界面通常都是用Swing API 创建的,该API 可从标准版J a v a 2平台中获得。Swing API 提供了一整套GUI 组件(表格、树形结构、按钮等),这些组件可以被用来实现一种比用一个典型的HTML 页面所能实现的更为交互的体验。Swing 也支持HTML 文本组件,这个组件可以被用来显示来自一个服务器的响应。客户程序可以直接访问Enterprise Beans 层或企业信息系统层。但应谨慎实现这种程序。
绕过EJB 层的程序可以使用JDBC API 来访问一个关系型数据库,但应被限制于对数据库表格进行维护等管理任务上。