zoukankan      html  css  js  c++  java
  • J2EE学习笔记

    J2EE到底是什么?

    目前所有的B/S系统应用可以分为:有状态(statefull)和无状态(stateless)两大类别。 有状态是指在整个系统的处理过程中要保留记住一些信息,而无状态则相反,每次request都是独立的连接,不需要在每个request之间共享数据等等。

    对于这两种应用,通常第一考虑是性能要最优,性能是我们选择IT技术的主要依据之一。

    为达到最大化的性能,对于Java系统,以前通常的作法是使用对象池,这样节约对象生成时的性能开销,也就是说系统启动时,预先生成一定数目的对象实例在内存中,需要使用时,从对象池中取出实例,用完,归还对象池,对于有状态的应用,可以使用相关持久化(persistence)策略来保存状态。

    下一步,如何并行访问对象池将是非常重要,java的多线程技术为我们提供了实现可能,线程的创建销毁也是可能非常耗时的,那么,无疑象使用对象池一样,我们必须使用线程池来实现多线程并行计算的最优化。

    使用线程池和对象池,每次客户端请求发生一次就从线程池中借用一个线程,处理完这个请求就将线程返回线程池,同样,使用线程快速的访问对象,对象也是从对象池中借用,用完就还回对象池。 整个这样的架构设计在性能上是最优的。

    有了性能保证,安全机制、事务机制、集群(cluster)技术也将是选择IT技术的主要依据。

    J2EE就是这样一个实现上述多种考量的综合标准框架系统,在具体使用中,也许我们对所有这些考量的要求并不都一样重视,比如:如果纯粹追求性能是第一,可以忽视事务机制,那么,完整的J2EE技术也许就并不适合你。

    那么我们先看看J2EE是如何从性能上保证我们的应用系统以最快速度运行的,也就是说J2EE中必然应该有上述线程池和对象池的实现技术,servlet实际是基于线程池的更好的线程容器;EJB是基于对象池的更好的对象容器。

    看看Servler的架构图:

     

    当client1发生请求时servlet容器会从线程池中分配一个线程给这个request.


    再看看EJB的架构图:



    instance Pool作为一个对象实例池,维持着EJB实例,当然这个对象池是用生命周期的,简单的说 EJB=对象池+远程对象池

    但是,EJB还整合了相当的其它增强功能,如安全 事务机制等,这些对于一般应用都是必需的,当然你还必须根据你的需要来选择是否使用J2EE,如果你的应用对安全 事务机制没有要求,直接使用线程池和对象池技术肯定获得最好的性能。

    所以,根据Servler和EJB的原理,我们已经可以规划我们的应用,什么可以放在servlet,或什么需要放在EJB中实现:

    线程的本质决定了servlet只适合一些轻量的应用,如分析简单XML文档, 通过JDBC访问数据源,使用JMS或JavaMail处理简单的信息Message,或使用JTS/JTA处理简单的事务机制,注意这些用词都是"简单"的,一旦复杂了,就要使用EJB了。

    下面从客户端和服务器端两个方面来具体考量这两个技术的使用,这里的客户端不一定是指最终客户端,因为J2EE是多层结构,中间层可能在多个服务器上实现,如果一个服务器上的服务是供另外一个服务器上的应用访问的,那么后者我们也称为客户端。

    根据应用的复杂程度和要求不同,分下列情况:

    1.在WEB层可以实现的一些应用

    如果你的系统没有很复杂的事务处理,或访问很多企业原有的资源,那么可以借助javabean这样的一些Help性质的类来实现你的应用,但是,这样的方案不是最干净clean, 最有效efficient, 或最有扩展性的scalable。

    否则,将所有核心计算放置入EJB中。

    2.所有的复杂商务计算核心都在EJB中完成

    如果你的客户端和服务器端之间有防火墙,那么目前能够无障碍通过防火墙的协议只有Http了(Web Service也是基于http就是这个道理),既然使用http了,而Servlet是基于Http协议的,那么就需要通过servlet来访问EJB,这是我们最普遍的应用情况。

    但是,如果你的客户端和服务器端可以放置在一个网络内,之间没有防火墙,那么就不必使用Servlet,直接使用Java调用RMI来访问EJB,这样性能是最好的,这时的Servlet大概只有用于控制Jsp的页面的输出了(MVC模式中的控制作用)。

    如果是非java客户端,可以通过CORBA组件来访问EJB。

    3.如果你的应用对速度要求很高,要求非常快,对于事务处理等方面几乎无要求

    直接使用J2SE,加上线程池和对象池技术,将会使你的java系统性能发挥极致。Jakarta.Apache.org有这两种技术的源码,线程池可以从Servlet容器Tomcat的源码中发现。

    一、准备篇

    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。
    你可以一个一个的学。

    3 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 听你说了这么多,我想学着玩玩。
    答:除非你想靠它当饭吃或者作为技术储备,否则请不要浪费你的时间。
    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正式规范。

  • 相关阅读:
    C#与C++与互操作
    WPF GridView动态添加项并读取数据
    C#使用消息队列(MSMQ)
    使用代码浏览WPF控件模版
    PowerShell将运行结果保存为文件
    opencv + ffmpeg
    vmware
    HttpComponents Downloads
    pytorch 安装
    opencv 3.4.0 的编译
  • 原文地址:https://www.cnblogs.com/yaksea/p/1237840.html
Copyright © 2011-2022 走看看