03.xmlns="
04.xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
05.xsi:
schemaLocation="
06.
07.
08.helloServlet
09.web.HelloServlet
10.
11.
12.helloServlet
13./sayHi
14.
15.
步骤四:
部署
将整个firstweb文件夹拷贝到c:
\java\tomcat7.0\webapps
步骤五:
启动Tomcat,并访问Servlet
在命令提示符下输入“startup”命令启动Tomcat,启动成功后,打开浏览器,在地址栏中输入“http:
//localhost:
8080/firstweb/sayHi“回车,得到第一个Web应用程序的运行结果。
1.4.常见错误及解决方法
1.4.1.404错误产生原因及解决方法
404产生的原因为Web服务器(容器)根据请求地址找不到对应资源,以下情况都会出现404的错误提示:
1.输入的地址有误(应用名大小写不正确,名称拼写不正确)
2.在web.xml文件中和中的两个不一致
3.没有将工程部署到Tomcat的webapps下面
4.Web工程部署时的结构没有遵循Servlet的规范
具体的解决办法就是根据上面提到的4种情况,逐条进行检查。
1.4.2.容器如何找到service()方法
当在浏览器中输入http:
//localhost:
8080/firstweb/sayHi这个地址后,容器是如何找到HelloServlet.class这个文件并执行的呢?
首先容器会根据firstweb这个应用名找到位于webapps下面对应的文件夹,然后根据地址中的“/sayHi”到web.xml文件中寻找与之匹配的节点,找到匹配的节点后会找到与该节点紧邻的节点,获取名称并在此寻找与该名称相等的节点,找到相等的节点后,搜寻该节点下面紧邻的节点,于是获取到了与该地址相对应的类名,借助于ClassLoader加载该类文件,创建对象并调用service()方法,客户端即看到了与该地址匹配的运行结果。
1.4.3.405错误产生原因及解决方法
405这个错误的产生原因是容器找不到service方法来处理请求。
以下情况容器都将视为没有找到service()方法
1.service方法名写错,字母顺序不对或大小写错误
2.service方法参数类型与标准不一致,或参数顺序与标准不一致。
一定是先HttpServletRequest,然后是HttpServletResponse类型
3.service方法异常、返回值类型与标准不一致,一定是抛出ServletException、IOException。
返回值类型是void。
解决405错误的方法即检查service方法是否存在,签名(方法名、参数、返回值、异常类型)是否与覆盖的父类中的方法一致。
1.4.4.500错误产生原因及解决方法
500的错误原因是请求的Servlet在执行service方法的过程中出现了错误,程序不能继续运行了。
以下情况容器都将视为500的一种情况,而返回给客户端这个错误说明。
1.Servlet没有继承HttpServlet或实现Servlet接口
2.web.xml文件中的写错,与真正的包名类名不符
3.service方法中的代码运行时抛出异常
解决500的方法为依据上面三种情况依次进行检测,逐条排除。
1.5.HTTP协议
1.5.1.什么是HTTP协议
HTTP协议是HyperTextTransferProtocol的缩写,即超文本传输协议。
是由w3c(万维网联盟)制定的一种应用层协议,用来定义浏览器与web服务器之间如何通信以及通信的数据格式。
因为BS架构中的通信模块就是以HTTP这个协议作为标准协议的,所以对该协议有所了解可以更好的编写程序。
1.5.2.HTTP协议是如何通信的
HTTP协议的通信过程可以分为以下四个步骤:
1.浏览器根据IP地址和端口号与服务器建立连接
2.向Web服务器发送请求数据包
3.Web服务器接收请求数据包后,发送相应的响应数据包
4.浏览器接收响应数据后关闭连接
在这个过程中,一次请求对应一次连接,当浏览器再次发请求给服务器时,Web服务器并不知道这就是上次发请求的客户端,这也是HTTP协议的一个特点-无状态协议。
这种需要时建立连接,使用结束后立即断开连接的方式使得Web服务器可以利用有限的连接为尽可能多的客户提供服务。
也正是具备了这样的特点,才使得BS结构能够承载企业级应用的大量访问。
1.5.3.HTTP协议中的数据格式
在HTTP协议控制的数据走向中,既包括客户端发送给服务器端的请求数据也包括服务器端返回给客户端的响应信息,而具有一定规范的数据格式是保证通信标准的第一要素。
借助于一些浏览器的插件或者浏览器本身内嵌的功能模块,可以实现对请求数据、响应数据的抓取,熟练掌握这些数据的主要部分,可以有利于理解BS模型中的一些处理问题的方式。
通常情况下的请求数据包及响应数据包结
1.5.4.请求数据包组成
请求数据包包含三个部分:
1.请求行,包括请求方式,请求资源路径,以及协议版本
2.消息头是由若干的键值对组成,主要用于传递给Web服务器一些信息。
如,浏览器版本、接受资源的类型等
3.在消息头的下面会跟着一个空白行,这样就可以区分出消息头与实体内容这两个部分。
而在请求数据包中,大部分情况实体内容为空,只有当请求方式为POST时,实体内容才有要提交的表单数据
1.5.5.响应数据包组成
响应数据包也包含三个部分:
1.状态行,包括协议类型、版本、状态码、状态描述
2.消息头(若干),也是多组键值对组成的信息说明。
如返回的Content-Type消息头可以告诉浏览器返回的结果数据类型和字符集
3.实体内容,位于消息头下面的一个空白行之后。
空白行意在通知浏览器消息头的结束以及结果内容的开始,浏览器就从这里开始数据的逐行解析
1.6.Servlet如何处理HTTP协议
1.6.1.如何控制通信数据
HTTP协议在Web容器这端主要表现为通信数据的到达以及响应数据的返回。
于是Web容器将这两部分数据解释为两个对象,一个是与请求数据对应的HttpServletRequest对象,一个是与响应数据对应的HttpServletResponse对象。
对于Servlet来讲,主要的业务逻辑过程就是从请求对象中获取数据,经过加工后将结果附着在响应对象中发送回客户端。
1.6.2.HttpServletRequest对象
借助于HttpServletRequest对象可以实现很多操作,如读取请求行、消息头信息,取得路径信息等。
使用如下代码可以实现相关功能。
01.packageweb;
14.publicclassRequestServletextendsHttpServlet{
16.protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)
17.throwsServletException,IOException{
18.Enumeratione=req.getHeaderNames();
19.while(e.hasMoreElements()){
20.StringheaderName=e.nextElement().toString();
21.System.out.println(headerName+":
"+req.getHeader(headerName));
22.}
23.System.out.println(req.getMethod());
24.System.out.println(req.getProtocol());
25.System.out.println(req.getRequestURI());
26.System.out.println(req.getRequestURL());
27.System.out.println(req.getServletPath());
28.}
29.}
1.6.3.HttpServletResponse对象
HttpServletResponse对象最主要的作用即设置给浏览器的响应内容及浏览器的解码方式,此外设置cookie及重定向也都是响应对象的功能。
这些功能对应的代码实现如下所示。
01.packageweb;
12.publicclassResponseServletextendsHttpServlet{
14.protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)
15.throwsServletException,IOException{
16.resp.setContentType("text/html;charset=gbk");
17.resp.setStatus(404);
18.}
19.
20.}
◆注意:
1)很多事情不需要我们处理
•通信的步骤由浏览器和服务器自动实现
•请求数据中的请求行,消息头由浏览器自动填写
•响应数据中的状态行,消息头通常由服务器自动填写
2.少量事情需要我们处理
•请求数据中的实体内容由我们提供
•响应数据中的实体内容由我们提供
通过request处理请求数据,通过response处理响应数据
◆注册案例:
ØServlet核心(I)
1.1.请求方式
1.1.1.请求方式的种类
请求数据包中的请求行的第一个参数就是请求方式,是客户端向Web服务器发送请求时的意向说明,以此告知服务器该如何处理及解析提交的这些数据,而客户端提交的数据也会因为采用的提交方式不同来处理。
区分请求种类也会为浏览器采用不同的缓存方式处理后续请求提供一个依据,从而提升响应速度。
所以对于编程人员来讲,使用正确的请求方式是Web应用的一个重要方面。
1.1.2.GET请求方式的特点
使用GET提交数据时,form中的数据将编码到URL中。
在使用上,当且仅当请求幂等时使用GET。
重复访问时使用GET方法请求的页面,浏览器会使用缓存处理后续请求。
•GET是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。
•GET传送的数据量较小,不能大于2KB。
•GET安全性非常低
•b=b">跟是一样的,也就是说,action页面后边带的参数列表会被忽视;而b=b">跟是不一样的。
如下情况中浏览器会发送GET类型的请求:
•在地址栏输入一个地址
•点击页面中的链接
•表单的默认提交方式
1.1.3.POST请求方式的特点
POST方式提交的数据是在HTTP协议的Hearder中进行传输的。
在使用上,当请求会改变服务器数据或状态时(更新数据,上传文件)应该使用POST。
从使用经验上有如下总结:
•POST是将表单内各个字段与其内容放置在实体内容中内一起传送到ACTION属性所指的URL地址。
用户看不到这个过程。
•POST传送的数据量较大,一般被默认为不受限制
•POST安全性较高
将表单的Method属性设置为POST时,浏览器会发送POST请求。
1.2.Servlet如何运行
1.2.1.Servlet运行的步骤
Servlet作为Web服务器的补充功能在运行时需要受到Servlet容器的管理,其运行的流程如下:
1.浏览器依据IP建立与容器的连接
2.浏览器将请求数据打包
3.容器解析请求数据包,封装request和response对象
4.容器依据请求资源路径找到Servlet创建对象
5.容器将request和response对象作为参数传入service方法,并调用
6.容器将响应数据打包发给浏览器
7.浏览器取出结果,生成页面
1.3.Servlet如何输出中文
1.3.1.为什么返回的页面会有乱码
Java语言在内存当中保存的每一个字符使用的都是Unicode字符集。
一个中文字在内存中使用2个字节来表示。
编码:
将Unicode字符集对应的字节数组转换成某种本地字符集(比如UTF-8,GBK)对应的字节数组的过程叫做编码
解码:
将某种本地字符集对应的字节数组转换成Unicode字符集对应的字节数组的过程。
如果想输出就涉及到编码问题。
编码和解码使用的字符集不一致就产生了乱码问题。
out.println(“”)这行代码是编码过程。
现在这个out要输出的内容使用的是Unicode字符集,于是转换为默认的iso-8859-1。
之所以使用这个格式是因为tomcat默认是英文的。
所以调用out.println时,容器采用默认情况下的ISO-8859-1字符集去编码带有中文的输出内容时就产生了乱码。
1