JSP应用技术
本课程主要介绍Java在表现层的两项技术:Java Servlet与Java Server Pages。它们是重要的Java技术,对这两项技术的深入了解,对学习Java Web框架技术有极大的帮助。
第一章 Servlet
在JSP技术问世之前,Servlet和Applet分别是Java在服务器端和客户端所推广的解决方案,两者相辅相成,各占有重要的地位。JSP的出现,弥补了Servlet
在开发Web系统不足的地方。要想对JSP有更深入的了解,Servlet是最基本的内容,只要能够把Servlet学好,就更能够理解JSP技术底层运作的方式。
第一节 Servlet简介
自1997年3月Sun Microsysttems公司所组成的JavaSoft部门将Servlet API定案以来,推出了Servlet API 1.0。就当时功能来说,Servlet所提供的功能包含了当时的CGI与Netscape Server API(NSAP)之类产品的功能。
发展至今,Servlet API的最新版本为2.4版。它依旧是一个具有跨平台特性、纯Java的服务端程序。Servlet不只限于HTTP协议,开发人员可以利用Servlet自定义或延伸任何支持Java的Server。
Servlet有以下优点:
l 可移植性
Servlet是利用Java语言开发的,因此,延伸Java在跨平台上的表现,Servlet
在任何平台上执行。借助于Servlet的优势,就可以真正达到Write once,Run Anywhere的境界。
l 强大的功能
Servlet能够完全发挥Java API的威力,包括网络和URL存取、多线程、RMI
等。
l 高性能
Servlet在加载执行之后,其对象实体通常一直驻留在内存中。默认情况下
Servlet是以单实例多线程的方式工作,一个新请求到达后,Servlet实例开启一个新的线程服务这个请求。最后补充一点,就是Servlet在执行时,不是一直留在内存中,服务器会自动将停留时间过长一直没有执行的Servlet从内存中移除,不过有时候也可以自行写程序来控制。至于停留时间的长短通常和选用的服务器有关。
l 安全性
Servlet也有类型检查的特性,并且利用Java的垃圾收集与没有指针的设计,
使得Servlet避免内存管理的问题。
由于在Java的异常处理机制下,Servlet能够安全地处理各种错误,不会因为发生程序上逻辑错误而导致整体服务器系统的毁灭。
第二节 第一个Servlet程序
javax.servlet.*、javax.servlet.http.*是必须导入的。
javax.servlet.*:存放与HTTP协议无关的一般性Servlet类。
javax.servlet.http.*:除了继承javax.servlet.*之外,还增加与HTTP协议有关的功能。
所有Servlet都必须实现javax.servlet.Servlet接口,但是通常我们都会从javax.servlet.GenericServlet或javax.servlet.http.HttpServlet选择其一来实现。若写的Servlet程序和HTTP协议无关,那么必须继承GenericServlet类:若有关,就必须继承HttpServlet类。
javax.servlet.*里的ServletRequest和ServletResponse接口提供存取一般的请求和响应;而javax.servlet.http.*里的HttpServletRequest和HttpServletResponse接口,则提供HTTP请求及响应得存取服务。
第三节 Servlet生命周期
Servlet容器可以在同一个JVM上执行所有Servlet,所以,Servlet之间可以有效地共享数据,但是Servlet本身的私有数据亦受Java语言机制保护。
Servlet从创建到销毁的流程如图1-1所示
(1) 产生Servlet,加载到Servlet容器中,然后调用init()方法进行初始化。
(2) 以多线程的方式处理来自客户端的请求。
(3) 调用destroy()来销毁Servlet,进行垃圾收集。
图1-1 Servlet生命周期
1. 加载和实例化
当容器一开始启动,或是客户端发出请求服务时,容器会负责和实例化一个
Servlet。
2. 初始化
Servlet加载并实例化后,容器必须初始化Servlet。初始化的过程主要是读
取配置信息(例如JDBC连接)或其他须执行的任务。我们可以借助ServletConfig对象取得容器的配置信息,例如:
其中ueser为初始化的参数名称:browser为初始化的值。因此,可以在HelloServlet程序中使用ServletConfig对象的getInitParameter(“user”)方法来取得browser。
3. 处理请求
Servlet被初始化后,就可以开始处理请求。每一个请求由ServeletRequest
对象来接受请求;而ServletResponse对象响应该请求。
4. 服务结束
当容器没有限定一个加载的Servlet能保存多长时间,因此,一个Servlet实
例可能只在容器中存活几毫秒,或是其他更长的任意时间。一旦destory()方法被调用时,容器将移除该Servlet,那么它必须释放所有使用中的任何资源,若容器需要再使用该Servlet时,它必须重新建立新的实例。
第四节 Servlet范例程序
为了说明Servlet和网页是如何沟通的,在此举一个范例程序。这个范例程序分为两个部分:MyHtml.html和MyServlet.java。
在MyHtml.html中,用户可以填入姓名,然后按下【提交】后,将数据传到MyServlet.java做处理,而MyServlet.java负责将接收到的数据显示到网页上。
MyHtml.html
MyHtml.html的执行结果如图1-2所示
MyServlet.java
从MyServlet.java的程序中,可以发现Servlet是利用HttpServletRequest类和getParameter()方法来取得由网页传过来的数据。不过数据通过HTTP协议传输时会被转码因此在接收时,必须再做转码的工作,才能够正确地接收到数据。下面这段程序就是做转码的工作:
设定web.xml:
执行,结果如图1-3所示。
图1-3 MyHtml.html按下【提交】后,经过MyServlet.java处理后的结果