随笔 - 3, 文章 - 152, 评论 - 17, 引用 - 0
数据加载中……

Java的基础问题(二)

目录:

一、准备篇
Q1.1  什么是J2EE?它和普通的Java有什么不同?
Q1.2  J2EE好学吗?
Q1.3 J2EE有什么用?
Q1.4 学J2EE有前途吗?
Q1.5 据说J2EE的性能不如.NET好,是真的吗?
Q1.6 听你说了这么多,我想学着玩玩。
Q1.7 学习J2EE该怎么开始?
Q1.8 我下了一个J2EE服务器但是不会配置。
Q1.9 我发现你没有提到Tomcat。

二、 Servlet/JSP篇
Q2.1 什么是Servlet?
Q2.2 我怎么获得Http请求里的参数?
Q2.3 我怎么返回结果?
Q2.4 sendRedirect()和forward()有什么不同?
Q2.5 我写了一个Servlet程序,怎么运行它?
Q2.6 EAR和WAR有什么不同?
Q2.7 EAR格式是怎样的?
Q2.8 WAR格式是怎样的?
Q2.9 我的普通HTML文件/JSP文件应当放在哪里?
Q2.10 我访问不到servlet,甚至连HTML文件都访问不到!
Q2.11 我能访问HTML但是访问不到servlet。
Q2.12  什么是JSP?它和Servlet有什么区别?
Q2.13  我的JSP显示的汉字是乱码。
Q2.14  为什么使用gb18030而不是gb2312?
Q2.15  在JSP里面怎么引用Java Bean。
Q2.16  我想在servlet间传递数据。
Q2.17  怎么调用cookie?
Q2.18  怎么在JSP里面实现文件下载?
Q2.19  怎么实现文件上传?
Q2.20  我想让页面自动刷新,比如聊天室。
Q2.21  我想让用户登录以后才能访问页面。
Q2.22  我想要能注册用户。
Q2.23  怎么在JSP中访问数据库?
Q2.24  什么是JSTL?

一、准备篇

Q1.1  什么是J2EE?它和普通的Java有什么不同?
答:J2EE全称为Java2 Platform, Enterprise Edition。
“J2EE平台本质上是一个分布式的服务器应用程序设计环境——一个Java环境,它提供了

·宿主应用的一个运行基础框架环境。
·一套用来创建应用的Java扩展API。”(引自《J2EE服务器端高级编程》)

Q1.2  J2EE好学吗?
答:J2EE是很多技术的集合体,并且还在成长中。
你会遇到很多专有名词:比如(X)HTML,Servlet/JSP,JDBC,JMS,JNDI,EJB,XML,Web
Service……。
尤其是XML和Web Service正在快速成长。幸运的是,你不需要等到学会所有技术后再开始
编程。
大体上J2EE可以分成3个主要应用方式:Servlet/JSP,EJB,Web Service 和一些支撑技术
例如JDBC和JNDI。
你可以一个一个的学。

Q1.3 J2EE有什么用?
答:用来建设大型的分布式企业级应用程序。或者用更时髦的名词说就是“电子商务”应
用程序。
这些企业可能大到拥有中心数据库服务器,Web服务器集群和遍布全国的办公终端,也可能
小到只不过想做一个网站。但是你肯定听过“杀鸡焉用牛刀”的古训。

Q1.4 学J2EE有前途吗?
答:在这一市场目前只有一种技术可以和J2EE竞争,那就是Microsoft的.NET。
相对来说.NET要“新”一些而J2EE要“老”一些。这也意味着.NET更易用一点而J2EE更成
熟一点。
但是.NET只能用于Windows平台(Microsoft声称要开发C#在Linux上的虚拟机但是尚未兑现
该诺言)。
在过去几年,.NET的市场份额并不理想。不过Microsoft还有Longhorn这一杀手锏,鹿死谁
手还很难说。

Q1.5 据说J2EE的性能不如.NET好,是真的吗?
答:在Sun公司提供的样例程序Pet Store上,Microsoft声称不如相同的.NET程序好。
而Sun公司反驳说这一程序不能真正体现J2EE的性能,并且指责Microsoft在数据库上做了
优化。
作者没有学习过.NET因而不能妄下断言。
无论如何,大型分布式程序中的性能瓶颈通常首先来自于错误的设计。

Q1.6 听你说了这么多,我想学着玩玩。
答:除非你想靠它当饭吃或者作为技术储备,否则请不要浪费你的时间。
Flash要好玩得多。计算机游戏就更加好玩了。

Q1.7 学习J2EE该怎么开始?
答:首先,下载一个免费的J2EE服务器。其次,去java.sun.com下载J2EE的API。第三,找
一本好的参考书。最后,找一个顺手的IDE。
J2EE服务器。你可以用Sun的J2EE SDK(免费),或者Weblogic(性能最好,但是太大,而
且作者不推荐盗版行为),
或者JBoss(免费,就是文档太少),或者JRun(开发版免费,作者用这个)。
参考书作者感觉Wrox的《J2EE服务器端高级编程》不错,但是太老(作者手头的是2001年
中文版)。
(似乎很多人不喜欢这本书......所以你得自己判断它是否适合你。)
你还需要去下载一些最新的技术资料(当然肯定是英文的)。
IDE如果你的机器配置够好(内存至少512M以上,256M或以下请勿考虑),可以用IBM的WS
AD,不然就继续用Eclipse或者其他。
你也可以经常去水木清华的Java版逛逛,但是在发贴前先看看精华区里有没有你要的答案


Q1.8 我下了一个J2EE服务器但是不会配置。
答:请认真阅读随机指导文档,不同的服务器的配置都不一样,作者爱莫能助。

Q1.9 我发现你没有提到Tomcat。
答:Tomcat只是一个Web服务器,更准确地说主要只是一个Web Container。
如果你想要学习EJB的话,Tomcat无法满足你的需要。

二、 Servlet/JSP篇

Q2.1 什么是Servlet?
答:一个Servlet是一个Java类。它处理Http(s)请求并作出响应,包括返回一个HTML页面
或转交给其他URL处理。
Servlet必须运行在一个Web Container例如Tomcat中。
Servlet必须是javax.servlet.http.HttpServlet的子类,
你可以继承doGet()或者doPost()方法,两者分别对应于Http(s)中的Get请求和Post请求。


Q2.2 我怎么获得Http请求里的参数?
答:HttpRequest的getParameter()方法。例如:String paramValue = request.getPara
meter("paramName");

Q2.3 我怎么返回结果?
答:你可以利用相关API打开一个输出流,并向流中直接写入一个HTML页面。
但是作者完全不赞成这样做。一方面这样做会很罗嗦。
另一方面从Model-View-Controller模式(在《J2EE核心模式》中被归为Front Controlle
r模式)的观点来看,
你应当提供一些HTML或者JSP作为视图(view),而Servlet则根据请求参数决定转到哪一
个视图。
你可以利用response.sendRedirect(...)方法或request.getDispatcher(...).forward()
方法来实现。

Q2.4 sendRedirect()和forward()有什么不同?
答:sendRedirect()是向浏览器发送一个redirect通知,浏览器向新的URL发送一个新的请
求。
而forward是在服务器端直接将请求转到新的URL,对于浏览器是透明的。
换而言之,sendRedirect()应当将共享数据放在session中,forward应当将共享数据放在
request中(当然你也可以放在session中,但放在request中可以有效减小session中的数
据量,从而改善性能)。
前者浏览器的地址栏显示的是新的URL,后者浏览器的地址栏显示的是Servlet的URL。
因而当刷新目标URL时,两者会造成一些差别。

Q2.5 我写了一个Servlet程序,怎么运行它?
答:开发J2EE程序有一个部署(deploy)的概念,实际上是开发——部署——运行的三部
曲。
大多数服务器支持Hot deploy。你只需要在相应的Application目录(具体路径依赖于服务
器)下面
建立一个符合WAR或EAR格式(参见Q2.7,Q2.8)的目录,启动服务器,就可以通过浏览器
访问了。
特别的,你的Servlet的class文件应当放在/WEB-INF/classes目录中。
注意J2EE SDK不支持Hot deploy,你需要通过它的deploy tool来部署。
Tomcat只支持WAR格式。

Q2.6 EAR和WAR有什么不同?
答:EAR是一个完整的J2EE应用程序,包括Web部分和EJB部分。
WAR只是其中的Web部分。

Q2.7 EAR格式是怎样的?
答:一个EAR可以包含任意多个WAR或EJB JAR,并且包含一个META-INF的目录。
在/META-INF中包含了一个application.xml,其中描述了这个EAR包含哪些模块,以及安全
性配置。
细节请看参考书。

Q2.8 WAR格式是怎样的?
答:一个WAR包含一个WEB-INF的目录,这个目录下包含classes目录,lib目录和web.xml。

/WEB-INF/classes存放按package组织的class文件,/WEB-INF/lib目录存放jar文件,
web.xml描述了很多东西,请读参考书。

Q2.9 我的普通HTML文件/JSP文件应当放在哪里?
答:放在除了/WEB-INF以外的其他地方。

感谢antegg网友对于安全性的提醒:
如果你想直接用http://url/***.jsp的方式来访问,就要像上面说得那样放。
但是这样的做法是不安全的,安全的做法是把所有的JSP页面放在/WEB-INF目录下面,并且

通过WEB-CONTAINER来访问。

作者意见:
我更喜欢用filter来做安全性检查。
在MVC模式中,JSP只是一个视图而已,一般无需特别担忧安全性。和普通的html放在一起
也利于维护。

Q2.10 我访问不到servlet,甚至连HTML文件都访问不到!
答:
第一你没启动服务器。
第二你敲错了端口。
第三你没有正确配置context-path。
第四你的服务器不支持auto reload或者你关闭了这一选项,你得重启服务器或重新部署W
AR。
第五确认你没有把HTML放在/WEB-INF目录下,那是访问不到的。

Q2.11 我能访问HTML但是访问不到servlet。
答:请检查你的web.xml文件。确保你正确定义了<servlet>和<servlet-mapping>元素。

前者标识了一个servlet,后者将一个相对于context-path的URL映射到一个servlet。
在Tomcat中你可以通过/context-path/servlet/package/servletname的形式访问servlet

但是这只是Tomcat的便捷访问方式,并不是正式规范。
细节请看参考书。

Q2.12  什么是JSP?它和Servlet有什么区别?
答:你可以将JSP当做一个可扩充的HTML来对待。
虽然在本质上JSP文件会被服务器自动翻译为相应的Servlet来执行。
可以说Servlet是面向Java程序员而JSP是面向HTML程序员的,除此之外两者功能完全等价


Q2.13  我的JSP显示的汉字是乱码。
答:在你的JSP开头加上一行 <%@ page contentType="text/html; charset=gb18030"%>

如果你已经声明了page我想你知道该怎么修改。

Q2.14  为什么使用gb18030而不是gb2312?
答:gb18030是继gb2312之后的下一代汉字编码标准,最终将过渡到Unicode。

Q2.15  在JSP里面怎么引用Java Bean。
答:首先,确认你要引用的类在/WEB-INF/classes下或在/WEB-INF/lib的某个jar内。
其次,在JSP里加一行 <jsp:useBean id="..." scope="..." class="..."/>
具体解释请看参考书。

Q2.16  我想在servlet间传递数据。
答:利用session。在Servlet/JSP中,你可以在4个地方保存数据。
1) page,本页面。
2) session,用来存放客户相关的信息,比如购物车,对应接口为javax.servlet.http.H
ttpSession。
session机制实际上是cookie和URL Rewriting的抽象,服务器会自动使用cookie或URL Re
writing来实现。
3) request,可以在forward()时传递信息,对应接口为javax.servlet.http.HttpReques
t。
4) application,或称context,存放全局信息,对应接口为javax.servlet.ServletCont
ext。

Q2.17  怎么调用cookie?
答:作者建议使用session,你总是会遇到某些禁用cookie的用户。这时session会自动使
用URL重写来实现。

Q2.18  怎么在JSP里面实现文件下载?
答:实际上这是一个HTML的问题。答案是一个超链接<a>。

Q2.19  怎么实现文件上传?
答:客户端是HTML问题,在form中设置method为post,enctype为multi-part/form-data,
加一个<input type="file">。
而在接收的servlet中只是一个I/O问题,你可以使用jakarta的file-upload库。

Q2.20  我想让页面自动刷新,比如聊天室。
答:这是一个HTML问题,在<head>部分中加一条<meta http-equiv="refresh" content="
5" url="...">。
这是所谓的Client-pull,客户端刷新技术。
相对的还有Server-push,服务器端刷新技术,但是这一技术由于要占用服务器端资源而会
在大量访问时出现瓶颈现象,参见http://216.239.33.104/search?q=cache:autUfoakirY
J:www.kfunigraz.ac.at/edvndwww/books/books/javaenterprise/servlet/ch06_03.htm+
server-push+servlet&hl=zh-CN&ie=UTF-8

Q2.21  我想让用户登录以后才能访问页面。
答:使用声明式安全措施。
你只需要在web.xml中定义安全角色(Role),并定义受保护的URL集合只能由特定Role访
问。
大多数服务器支持基于数据库的用户映射,你只要在相应数据库中建立两张表并配置服务
器就可以了。
注意J2EE SDK不支持基于数据库的用户映射。
细节请看参考书和服务器文档。
不过在商业环境中,J2EE所提供的声明式安全措施仍然偏弱。一般商业程序会使用数据库
存储user-role-privilege模型来达到安全性要求,细节请询问你的构架设计师。

Q2.22  我想要能注册用户。
答:参看Q2.21。在接受注册请求的Servlet中执行写入数据库操作即可。

Q2.23  怎么在JSP中访问数据库?
答:标准做法是使用DAO模式,定义一个Java bean来访问数据库并在JSP中使用。
然而,当你的数据库模式很简单时,你可以使用JSTL中的<sql:query>标签来快速访问。

在一般的J2EE项目中,JSP处于表示层(展现层),需要先后通过业务层和集成层才会访问
到数据库,所以这个问题确实只会在很小的程序中才会遇到。

Q2.24  什么是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需要在支持JSP 1.2或更高版本
的容器下运行。
帮助文件可以阅读sun的JSTL正式规范。

posted on 2005-03-05 18:04 阅读(222) 评论(0)  编辑  收藏 所属分类: J2se


只有注册用户登录后才能发表评论。


网站导航: