3.1URL(Uniform Resource Locator)统一资源定位器
URL通常由4部分组成:协议名称、所在主机的DNS名、可选的端口号、和资源的名称
URI(Uniform Resource Identifier)统一资源标识符
在Web应用中分三类型:1、绝对URI 2、根相对URI 3、非根相对URI
URN(Uniform Resource Name)统一资源名称
URN:它唯一标识一个资源但不指定如何访问资源
ISBN:1-930110-59-6是一个URN,因为它唯一地标识某一本书,但它不是URL,因为它没有指定如何检索该书。
4.1
什么是Servlet.
Servlet一般翻译成服务器端小程序,它是使用Servlet API以及相关的类编写的Java程序。主要用来扩展Web服务器的功能。
Servlet技术实际上是CGI技术的一种替代。
什么是Servlet容器。
Web服务器使用一个单独的模块装载和运行Servlet。这个专门用于Servlet管理的单独模块称为Servlet容器(container),或称Web容器。
图1.17显示了各种不同的组件构成的一个示意图。
4.3 Servlet的开发:
开发一个Servlet一般要经过一下4个步骤:编写代码、编译、部署、运行
4.4错误处理
在执行Servlet时,由于各种原因可能会出现错误,下面是最经常出现的错误:
HTTP Status 404 -/helloapp/hello.
The requested resource(/helloapp/hello) is not available.
404错误是最常见的一种错误,它表示请求的资源不可用。有多种原因可导致该错误。你可以从这几方面检查:
查看给定的路径名是否正确(包括大小写);
查看Servlet类文件是否在WEB-INF\classes目录中;
查看web.xml文件内容是否正确;
查看Tomcat服务器是否启动。
4.4servlet的优缺点。
优点:
(1)高效性。每个请求由一个轻量级的Java线程处理
(2)方便性。提供了大量的实用工具例程
(3)功能强大。许多使用传统CGI程序很难完成的任务都可以轻松地完成。
(4)可移植性好 。为一个服务器编写的Servlet无需任何实质上的改动即可移植到其他服务器上。
(5)节省投资 。有许多廉价甚至免费的Web服务器可供个人或小规模网站使用
缺点:
缺点是它经常既包含业务逻辑又包含表示逻辑。
表示逻辑(presentation logic)是展示给用户的信息,在Servlet中产生HTML响应就是表示逻辑。
业务逻辑(business logic)是完成某种数据处理和存储任务的功能。
Sun在推出Servlet技术后不久又推出了JSP技术。有了JSP技术就可以实现业务逻辑和表示逻辑的分离:
Servlet专门处理业务逻辑
用JSP实现表示逻辑。
4.5什么是JSP。
JSP(Java Server Pages)页面是包含Java代码和HTML标签的Web页面。
由主动的JSP标签和被动的HTML标签混合而成的Web页面。
4.6使用servlet还是JSP。
用Servlet可以实现JSP的功能,用JSP也可以实现Servlet的功能 。
请记住下面两点:
JSP页面主要实现可视化的表示逻辑 。
Servlet主要用来实现业务处理和控制逻辑 。
MVC称为模型-视图-控制器(Model View Control,MVC)模式。在这种设计模式中,控制器使用Servlet实现,视图使用JSP实现,而模型使用JavaBeans实现。
第二章:
1.1
Sun的Servlet规范提供了一个标准的、平台独立的框架用来实现在Servlet和Servlet容器之间的通信。该框架是由一组Java接口和类组成的,它们统称为Servlet API。
Servlet API的组成:
javax.servlet
定义了14个接口和11个类。开发独立于协议的服务器小程序的接口和类。
javax.servlet.http
定义了8个接口和7个类。这些接口和类定义了开发采用HTTP协议通信的Servlet。
2.1
1、Servlet接口 :
Servlet API中的核心接口,每个Servlet必须直接或间接实现该接口。
该接口定义了如下5个方法。
public void init(ServletConfig config)
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException
public void destroy()
public ServletConfig getServletConfig()
public String getServletInfo()
2. ServleConfig接口
ServletConfig接口为用户提供了有关Servlet配置信息。Servlet配置包括Servlet名称、Servlet环境(context)对象、Servlet初始化参数名和参数等。
3. GenericServlet类
GenericServlet是一个抽象类,它实现了Servlet接口和ServletConfig接口,它又是HttpServlet类的超类,它们的层次关系如图3.1所示。
4. ServleRequest接口
ServletRequest接口是独立于任何协议的请求对象。它定义了获取客户请求信息的方法。
5. ServleResponse接口
ServletResponse接口是独立于任何协议的响应对象。它定义了向客户发送适当响应的方法。
3.1、servlet接口以及类的层次关系图
1、 HttpServlet类
增加了一个新的service()方法,格式如下:
protected void service (HttpServletRequest,
HttpServletResponse)
throws ServletException, IOException;
该方法是Servlet向客户请求提供服务的一个方法。
编写Servlet可以覆盖该方法。
2. HttpServletRequest接口
该接口扩展了ServletRequest接口;
提供了关于HTTP请求对象的视图;
定义了从请求对象中获取如HTTP请求头、cookies信息的方法。
3. HttpServletResponse接口
该接口扩展了ServletResponse接口;
提供了针对HTTP的发送响应的方式;
定义了为响应设置如HTTP响应头、设置cookies信息的方法;
该方法是Servlet向客户请求提供服务的一个方法。
4.1、servlet的生命周期
1、读取web.xml文件
Servlet 容器启动时,它将查找一组部署文件,这些配置文件描述了所有的 Web 应用程序
每个Web应用程序都有它自己的名为web.xml的部署描述文件,其中包括应用程序所使用的每个Servlet的入口。
一个入口指定了Servlet名称和对应的Java类名称。
2、创建实例
对每个Servlet类,Servlet容器使用
Class.forName(className).newInstance()
方法加载并创建一个实例。
3.1、初始化
一旦容器创建了servlet实例,它将在新创建的实例上调用init(ServletConfig)方法。
ServletConfig对象包含了所有的在web应用程序的DD文件中指定的初始化参数。
在init()方法返回后,servlet就被初始化了。
3.2、预初始化
当servlet第一次被请求时才对它初始化,这叫做延迟加载。
优点 :大大提高servlet容器的启动时间
缺点 :如果在初始化时servlet要完成很多任务,如从数据库中缓存静态数据,则发送第一个请求的客户的响应时间会很长。
servlet规范定义了
在任何请求达到之前装载servlet的过程称为预装载或预初始化。
4、为客户请求服务
在servlet实例正常初始化后,它就准备为客户提供服务。
当容器接收到请求时,都会创建一个新的线程,然后调用
service(ServletRequest,ServletResponse)方法。
service()方法将检查HTTP请求的类型(GET、POST等)并调用相应的doGet()、doPost()等方法。
5、销毁和卸载Servlet
当Servlet容器决定不再需要Servlet实例,它将在Servlet实例上调用destroy()方法,在该方法中,Servlet应该释放资源,如它在init()方法中获得的数据库连接。
在调用destroy()方法之前,容器会等待其他执行Servlet的service()方法的线程结束。
如果Servlet容器关闭,它也将销毁Servlet。
5.1、HTTP请求结构
一个HTTP消息是客户向服务器的请求或服务器向客户的响应。
1. HTTP消息组成:
初始行:指定请求或响应消息的目的
头部区 :指定元信息,如关于消息内容的大小、类型、编码方式。
空行
可选的消息体 :请求或响应消息的主要内容。
5.2、客户向服务器发出的 HTTP 消息叫做HTTP请求(HTTP request)。
下面是一个典型的POST请求:、
请求行 POST /bookstore/selectBook HTTP/1.1
Accept = */*
Accept-Language = zh-cn
Accept-Encoding = gzip, deflate
请求头 User-Agent = Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 5.1;
Host = localhost:8080
Connection = Keep-Alive
空行
数据 name=Java+EE
1.请求行
HTTP 请求行由三部分组成,且由空格分隔:
方法名
请求的资源的局部路径 (URI)
使用的 HTTP 的版本
示例:
POST /bookstore/selectBook HTTP 1.1
这里,POST 是方法名, /bookstore/selectBook是资源的 URI,HTTP/1.1 是请求的 HTTP 的版本。
2.请求头
请求行之后的头行称为请求头
它可以指定
请求使用的浏览器信息
字符编码信息
客户能处理的页面类型等。
示例:
User-Agent: = Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;
Content-Type:application/x-www-form-urlencoded
Content-Length:11
3.常用的请求方法
HTTP 1.1版本共定义了8个方法
GET:请求读取一个Web页面
POST:请求向服务器发送数据
PUT :请求存储一个Web页面
HEAD :请求读取一个Web页面的头部
DELETE :移除Web页面
TRACE :返回收到的请求
OPTIONS :查询特定选项
CONNECT :保留作将来使用
4.GET方法和POST方法
GET方法用来检索资源。它的含义是“获得(get)由该URI标识的资源”。
资源通常是被动资源。
GET也可以用来请求主动资源。
传递一个名为userid参数的请求行。
HTTP方法 查询串 HTTP版本
GET /servlet/helloServlet ? userid=john HTTP/1.1
URL串
查询串(query string),它是由&符号分开的参数名和参数值对组成的,如下所示:
name1=value1&name2=value2&…&nameM=valueM
POST方法
POST请求用来向服务器发送需要处理的数据
POST含义是“将数据发送到由该URI标识的主动资源”。
数据块在消息体中发送。
常常在请求头中还要给出额外的行,如Content-Type与Content-Length。
HTML页面使用POST提交HTML FORM数据。
表单提交所产生的HTTP POST请求
GET方法
资源类型 :主动的或被动的
数据类型 :文本
数据量 :最多255个字符。尽管HTTP协议并没有限制查询串的长度,某些浏览器和web服务器可能不能处理超过255个字符的数据。
可见性 :数据是URL的一部分,在浏览器的URL地址栏中用户可见。
缓存 :数据可以在浏览器的URL历史中缓存。
POST方法
目标资源类型 :主动的
数据类型 :文本或二进制数据
数据量 :没有限制 。
可见性 :数据不是URL的一部分而是作为请求的消息体发送,因此在浏览器的URL地址栏中对用户不可见。 。
缓存 :数据不能在浏览器的URL历史中缓存。
两种方法的使用场合:
使用GET方法
检索HTML文件或图像文件,因为只需要发送文件名。
使用POST方法
发送大量数据。例如,POST方法非常适合于在线调查,因为查询字符串可能超过255个字符。
上传文件。因为文件的大小可能超过255个字符,而且,文件也可能是二进制的文件。
捕获用户名和口令。因为我们需要防止用户从URL中看到口令。
6、发送请求
发送请求的事件:
用户在浏览器的地址栏中输入URL并按回车键;
用户在HTML页面中点击了超链接;
用户在HTML页面中添写一个表单并提交;
其他 :用JavaScript函数在当前文档上调用reload()方法。
在上面的所有事件中,缺省情况下浏览器使用的是HTTP GET方法。
指定POST方法:
下面的HTML表单通过method的属性值使用HTTP的POST方法:
注意:在标签中如果没有指定method属性,浏览器缺省使用GET方法
5.2、处理HTTP请求:
在HttpServlet类中,对每个HTTP方法,都有一个相应的doXXX()方法,它具有下面一般格式:
protected void doXXX(HttpServletRequest,
HttpServletResponse)
throws ServletException, IOException;
所有的doXXX()方法都有两个参数:
HttpServletRequest对象
HttpServletResponse对象。
HTTP方法和doXxx()方法
HTTP方法 doXxx()方法
GET 方法 doGet()方法
POST方法 doPost()方法
HEAD方法 doHead()方法
PUT方法 doPut()方法
DELETE方法 doDelete()方法
OPTIONS方法 doOptions()方法
TRACE方法 doTrace()方法
在HttpServlet类中为每个doXxx()方法提供的是空实现。为实现业务逻辑,应该覆盖这些doXxx()方法。
5.3、分析请求
1. 检索请求参数
请求参数是随请求一起发送到服务器的数据,它是以名/值对的形式发送的。可以使用ServletRequest接口中定义的方法检索由客户发送的参数
public String getParameter(String name)
返回由name指定的请求参数值,如果指定的参数不存在,则返回null值。使用该方法必须确信指定的参数只有一个值。
public String[] getParameterValues(String name)
返回指定的参数name所包含的所有值,返回一个String数组对象,如果指定的参数不存在,则返回null值。该方法适用于参数有多个值的情况。如果参数只有一个值,则返回的数组的长度为1。
public Enumeration getParameterNames()
5.4、请求参数传递的方法
(1)通过表单提供请求参数。
(2)将参数名和值附加在请求的URL后面,这种方法只适用于GET请求。
访问LoginServlet使用的URL:
http://localhost:8080/helloapp/login?username=admin&password=admin
问号后面内容为请求参数名和请求参数值对,称为查询串(query string)
若有多个参数,中间用&符号分隔,参数名和参数值之间用等号(=)分隔。
(3)在超链接中也可以传递请求参数
例如:
“/helloapp/login?username=admin&password=admin”>用户登录
以jsp为前缀的请求参数名都是保留的
下面的用法会产生意想不到的结果,因此不推荐使用。
http://localhost:8080/helloapp/login?jspTest=myTest