2023年3月

Servlet 简介

  • Servlet

    sun
    公司提供的一门用于开发动态
    web
    资源的技术。
  • Sun
    公司在其
    API
    中提供了一个
    servlet
    接口,用户若想用发一个动态
    web
    资源
    (
    即开发一个
    Java
    程序向浏览器输出数据
    )

需要完成以下
2
个步骤:

编写一个
Java
类,实现
servlet
接口。

把开发好的
Java
类部署到
web
服务器中。

  • 编写一个
    Java
    程序,向浏览器输出“
    hello servlet
    ”。
  • 编写这个程序需要解决的
    2
    个问题:


Java
程序中,如何才能向
IE
浏览器输出数据?

输出
hello servlet

java
代码应该写在程序的哪个方法内?

阅读
Servlet API
,解决以上两个问题。

要查看帮助文件请到 JAVAEE的chm文件中看 ,如《java_ee_api_中英文对照版.chm》;jdk 帮助文件中没有 servlet帮助信息。



=====5第五天-servlet开发和ServletConfig与ServletContext对象\10-ServletContext对象方法的应用场景.avi;

一个web中有很多个servlet,web.xml中可以单独为每一个servlet配置信息,

如:数据库配置等,可以通过ServletConfig对象 获取到;
用<init-param>标签

但是 也可以通过配置可以让所有servlet 通用一个配置,就是用
<context-param>标签

====之前讲过
重定向
(请求两次,用得不多),现在讲
servle
t
转发

(相对客户来说只是请求一次,开发中用到超级多)

======

利用ServletContext对象读取资源文件。

  • .properties文件(属性文件):没有关系的放到此文件
  • xml配置文件:有关系的放到xml,比如复杂的嵌套关系必须用xml

普通类的静态属性
,当被多个线程访问时,就有线程安全问题:


Servlet
也一样

当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能
引发线程安全
问题。

  • 如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法。

SingleThreadModel接口中没有定义任何方法(
标记接口

,只要在Servlet类的定义中增加实现SingleThreadModel接口的声明即可。

  • 对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象。
  • 实现SingleThreadModel接口并不能真正解决Servlet的线程安全问题,因为
    Servlet引擎会创建多个Servlet实例对象
    ,而真正意义上解决多线程安全问题是指一个Servlet实例对象被多个线程同时调用的问题。
  • 事实上,在Servlet API 2.4中,已经将SingleThreadModel标记为Deprecated(过时的)。

解决并发出现的问题,可以采用以下方式:

  • 使用Java同步机制对多线程同步:运行效率低
  • 使用SingleThreadModel接口
  • 合理决定在Servlet中定义的变量的作用域

Applet、Scriptlet与Servlet - 青春念邵的博客 - 博客频道 - CSDN.NET
http://blog.csdn.net/mo_fan_qing_wa/article/details/50016575


小应用程序Applet


Applet简介

Applet是一种特殊的java程序,它本身不能单独运行(因为本身没有main()),需要嵌入在一个HTML文件中,借助浏览器或者appletviewer来解释执行。Applet不能直接用java命令运行,需要先编译成字节码文件

当用户访问这样的网页时,Applet被下载到用户的计算机上执行,但前提是用户使用的是支持Java的网络浏览器。由于Applet是在用户的计算机上执行的,所以它的执行速度不受网络带宽或者Modem存取速度的限制,用户可以更好地欣赏网页上Applet产生的多媒体效果。

Applet 小应用程序的实现主要依靠java.applet 包中的Applet类。与一般的应用程序不同,Applet应用程序必须嵌入在HTML页面中,才能得到解释执行;同时Applet可以从Web页面中获得参数,并和Web页面进行交互。

含有Applet的网页的HTML文件代码中必须带有<applet>和</applet>这样一对标记,当支持Java的网络浏览器遇到这对标记时,就将下载相应的小程序代码并在本地计算机上执行该Applet小程序。


Applet的执行的流程

1.建立applet文件。比如文件命名为Shao.java

2.进入doc。(假设Shao.java存放在E盘的applet\src中) 开始->运行->cmd-> e:->cd applet\src->javac  Shao.java

javac.exe会把Shao.java文件编译成字节码文件。

3.此时 E:\applet\src中新生成了Shao.class文件。然后在E:\applet\src中建立1.html文件。

其中1.html文件中的代码为:

<applet code=Shao.class height=300width=300></applet>

4. 在cmd中输入appletviewer 1.html便可以看见你的applet了或直接把这个1.html拖入浏览器运行


Applet的演化

java早年在Web领域唯一的卖点就是Applet,有一段时间非常流行Applet做的动画、聊天室和游戏,那时的浏览器包括IE、Netscape都是包含JVM的。sun原来是和微软推applet的,后来因为一些原因,sun公司与微软闹翻了,IE中也就不再内嵌JVM了,而是把applet下降到插件级别,从此以后sun再也没把心思放到桌面设计,更多因素考虑企业设计,jre也越做越大,桌面用户也越来月不愿意装这个插件了(例如需要:装jre,下载applet本身的类,运行所需的其它类也得下载,这个下载过程越来越慢直接导致Applet失去了用户群)(后来微软以那个虚拟机技术为基础,搞了J++,后来J++不行,就从borland挖来Anders Hejlsberg,直接导致微软C#的诞生和delphi的没落)。正好此时,flash出现了。

你点一个网页提示你要安装个几M的ActiveX控件,可以接受flash和java applet各由一家公司控制,虽然他基本支持所有的浏览器,但毕竟还要安装一套运行库。在AJAX技术提出之后,javascript制作APP的能力被重新发现,不需要另外安装一套运行库就能运行良好就是最大的好处。 (特别是一些前端框架的兴起如:Jquery,Extjs等)很快的Flash被淘汰了

运行applet 需要安装java环境,这个对用户来说成本很高。不过flash也需要插件,但是由于flash的推广很成功,基本上有浏览器的都装了flash插件。html5则完全不用插件,浏览器支持!

在因特网上,
ActiveX
插件
软件
的特点是:一般软件需要用户单独下载然后执行安装,而ActiveX插件是当用户浏览到特定的网页时,IE浏览器即可自动下载并提示用户安装。 ActiveX插件安装的一个前提是必须经过用户的同意及确认


Applet运行状态控制的基本方法

Applet类中的四种基本方法用来控制其运行状态:init()、start()、stop()、destroy()
init()方法

这个方法主要是为Applet的正常运行做一些初始化工作。当一个Applet被系统调用时,系统首先调用的就是该方法。通常可以在该方法中完成从网页向Applet传递参数,添加用户界面的基本组件等操作。
start()方法

系统在调用完init()方法之后,将自动调用start()方法。而且,每当用户离开包含该Applet的主页后又再返回时,系统又会再执行一遍
start()方法。这就意味着start()方法可以被多次执行,而不像init()方法。因此,可把只希望执行一遍的代码放在init()方法中。可
以在start()方法中开始一个线程,如继续一个动画、声音等。
stop()方法

这个方法在用户离开Applet所在页面时执行,因此,它也是可以被多次执行的。它使你可以在用户并不注意Applet的时候,停止一些耗用系统资源的工作以免影响系统的运行速度,且并不需要人为地去调用该方法。如果Applet中不包含动画、声音等程序,通常也不必实现该方法。

destroy()方法

与对象的finalize()方法不同,Java在浏览器关闭的时候才调用该方法。Applet是嵌在HTML文件中的,所以destroty()方法不关心何时Applet被关闭,它在浏览器关闭的时候自动执行。在destroy()方法中一般可以要求收回占用的非内存独立资源。(如果在
Applet仍在运行时浏览器被关闭,系统将先执行stop()方法,再执行destroy()方法。


小脚本程序(Scriptlet = Script + Applet)

Live Connect提供了Java与javascript的接口,可以允许在Java
Applet小程序中使用javascript。具体步骤如下:
1) 在HTML脚本中使用〈APPLET〉标志的MAYSCRIPT属性,以允许Java
Applet小程序访问脚本;
2) 将netscape. javascript包导入Java Applet小程序;
3) 在Java
Applet小程序中用JSObject类的getWindow( )方法创建javascript窗口的句柄;
4) 在Java
Applet小程序中用JSObject类的getMember( )方法访问javascript对象;
5) 在Java
Applet小程序中用JSObject类的eval( )方法调用javascript方法。《这个不详细解释》


小服务程序(Servlet = Server + Applet)

Servlet是一种
服务器
端的Java应用
程序
,具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求(Web浏览器或其他HTTP客户
程序
)与
服务器
响应(HTTP服务器上的
数据库
或应用程序)的中间层。 Servlet是位于Web
服务器
内部的服务器端的Java应用
程序
,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java
虚拟机

servlet是在
服务器
上运行的小
程序
。这个词是在Java
applet
的环境中创造的,Java
applet是一种当作单独文件跟网页一起发送的小
程序
,它通常用于在服务器端运行,结果得到为用户进行运算或者根据用户互作用定位图形等服务。

服务器
上需要一些
程序
,常常是根据用户输入访问
数据库

程序
。这些通常是使用
公共网关接口
(CGI(Common GatewayInterface))应用
程序
完成的。然而,在
服务器
上运行Java,这种
程序
可使用Java编程语言实现。在通信量大的服务器上,
Java
servlet的优点在于它们的执行速度更快于CGI
程序
。各个用户请求被激活成单个
程序
中的一个线程,而无需创建单独的进程,这意味着
服务器
端处理请求的
系统开销
将明显降低。

Servlet的主要功能在于交互式地浏览和修改数据,生成动态Web内容。这个过程为:

客户端
发送请求至
服务器
端;

服务器
将请求信息发送至Servlet,Servlet生成响应内容并将其传给
服务器
。响应内容动态生成,通常取决于客户端的请求
服务器
将响应返回给客户端

Servlet看起来像是通常的Java
程序
。Servlet导入特定的属于Java
ServletAPI的包。因为是对象
字节码
,可动态地从网络加载,可以说Servlet对Server就如同Applet对Client一样,但是,由于Servlet运行于Server中,它们并不需要一个
图形用户界面
。从这个角度讲,Servlet也被称为FacelessObject。

一个servlet就是Java编程语言中的一个类,它被用来扩展
服务器
的性能,
服务器
上驻留着可以通过“请求-响应”编程模型来访问的应用
程序
。虽然servlet可以对任何类型的请求产生响应,但通常只用来扩展Web
服务器
的应用程序。

详解Java Servlet与Applet比较 - yasi_xi的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/yasi_xi/article/details/22071099

Java Servlet与Applet相似之处:

◆它们不是独立的应用程序,没有main()方法。

◆它们不是由用户或程序员调用,而是由另外一个应用程序(容器)调用。

◆它们都有一个生存周期,包含init()和destroy()方法。

Java Servlet与Applet不同之处:

◆Applet具有很好的图形界面(AWT),与浏览器一起,在客户端运行。

◆Servlet 则没有图形界面,运行在服务器端。

Java Servlet 与 CGI(Common Gateway Interface) 的比较:

与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资。在未来的技术发展过程中,Servlet有可能彻底取代CGI。

◆高效

在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而在Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。

在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。在性能优化方面,Servlet也比CGI有着更多的选择。

◆方便

Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。

◆功能强大

在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如,Servlet能够直接和Web服务器交互,而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。

◆可移植性好

Servlet用Java编写,Servlet API具有完善的标准。因此,为IPlanet Enterprise Server写的Servlet无需任何实质上的改动即可移植到Apache、Microsoft IIS或者WebStar。几乎所有的主流服务器都直接或通过插件支持Servlet。

◆节省投资

Java Servlet与Applet不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用,而且对于现有的服务器,如果它不支持Servlet的话,要加上这部分功能也往往是免费的(或只需要极少的投资)。

Java Servlet 与 JSP(JavaServer Pages) 的比较:

JavaServer Pages(JSP)是一种实现普通静态HTML和动态HTML混合编码的技术,JSP并没有增加任何本质上不能用Servlet实现的功能。但是,在 JSP中编写静态HTML更加方便,不必再用println语句来输出每一行HTML代码。更重要的是,借助内容和外观的分离,页面制作中不同性质的任务可以方便地分开:比如,由页面设计者进行HTML设计,同时留出供Servlet程序员插入动态内容的空间。

Java Servlet API 2.2 简介

Java Servlet API 2.2 的类和接口组成两个Java 包,即:javax.servlet 和 javax.servlet.http(还包括javax.servlet.jsp包,不在本篇文章讨论范围之内)。

javax.servlet 包提供了控制 Servlet 生命周期所必需的 Servlet 接口,是编写 Servlet 时必须要实现的。

javax.servlet.http 包提供了从Servlet 接口派生出的专门用于处理 HTTP 请求的抽象类和一般的工具类。所有的Servlet 对象都要实现Servlet 接口,大多数情况下是作为已经实现了Servlet 接口的javax.servlet.GenericServlet 和 javax.servlet.http.HttpServlet 这两个抽象类的子类来间接实现Servlet 接口。

\第五天-servlet开发和ServletConfig与ServletContext对象\12-WEB应用中的普通Java程序如何读取资源文件.mp4;

多层时,DAO为了得到资源文件中的配置参数;

servlet 中的 doGet方法中获得Servletcontext
Servletcontext context = this.getServletContext();
然后将context 对象传到 DAO中使用,这样的话耦合就高了,不合理。

所以:要通过
类加载器
的方式

这个Properties 被多处使用,一般放在静态代码块中:

有异常,要用try包住,不可以抛出;最终改成:

此视频的10:28秒时 ,为什么说这个异常不可以直接抛,要try  catch掉;区别是什么?

但是上面的方法有缺点:不可以获取得到实时更新的配置数据,【类加载器是在类创建的时候,只加载一次】


字节流可以写任何数据 getOutStream
字符流只可以写字符串