目录
前言
接着上一篇文章 java服务器端开发-servlet:1、认识Servlet,如:web开发背景、什么是servlet、如何开发一个servlet等
我们继续对servlet的知识点进行介绍
二、Servlet执行过程介绍
1、servlet是如何运行的?
比如在浏览器地址栏输入:
http://ip:port/web01/hello
step1,建立链接
浏览器依据ip,port建立与servlet容器
(servlet容器也是一个简单的web服务器)之间的连接。
step2,打包
浏览器将请求参数、请求资源路径等等打包
(要按照http协议的要求)。
step3,发请求
浏览器将请求数据包发送给servlet容器。
step4,拆包,创建request、response对象
容器收到请求之后,对请求数据包进行解析(
拆包),然后将解析之后的结果封装到request对象上,
同时,容器还会创建一个response对象。
step5,创建Servlet对象
容器依据请求资源路径("/web01/hello")找到
应用所在的文件夹,然后依据web.xml找到对应的
servlet配置(servlet的类名),然后容器创建该servlet
对象。
step6,调用service方法
容器调用servlet对象的service方法(会将事先
创建好的request,response作为参数传递进来)。
step7, 获得请求参数,并进行处理
servlet可以通过request对象获得请求参数,
进行相应的处理,然后将处理结果缓存到response对
象上。
step8,处理结果,打包发送给浏览器
容器从response对象上获取之前处理的结果,
然后打包发送给浏览器。
step9,浏览器拆包,生成页面
浏览器拆包(解析容器返回过来的响应数据包)
,依据获取的数据生成相应的页面。
http://ip:port/web02/hello?name=jetty
"?"表示后面是请求参数,"name"是请求参数名,
"jetty"是请求参数值。
2、常见错误及解决方式
(1)404
a,错误原因:
依据请求资源路径找不到对应的资源。
b,解决方式:
依据http://ip:port/appname/servlet-url
检查你的请求地址。
检查<servlet-name>是否一致。
(2)500
a,错误原因:
系统错误
b,解决方式:
检查servlet类有没有继承HttpServlet。
检查<servlet-class>的“包名.类名”是否正确。
检查程序是否正确(比如在没有检查请求参数
的情况下就做类型转换)。
(3)405
a,错误原因
容器找不到service方法。
b,解决方式
检查service方法的签名(方法名、返回类型、
参数类型、异常类型)。
3、http协议(了解)
(1)什么是http(超文本传输控制协议)协议
由w3c制订的一种网络应用层协议,用来规范
浏览器与web服务器之间通信的过程及数据格式。
1)通信的过程:
step1,浏览器建立与web服务器之间的连接。
step2,浏览器将请求数据打包并发送给web服务器。
step3,服务器将响应数据打包并发送给浏览器。
step4,服务器关闭连接。
如果浏览器要再发请求,必须重新建立一个新的连接。
2)特点
“一次请求,一次连接”,优点是web服务器可以
利用有效的连接个数为尽可能多的客户端(浏览器)服务。
(2)数据包的结构
1)请求数据包
a,请求行:请求方式(get/post) 请求资源路径
协议的类型和版本
b,消息头: 是一些key,value对,由w3c定义,
可以由通信的双方彼此发送,比如,浏览器
可以发送一个"user-agent"消息头给服务器,
告诉服务器,浏览器的类型和版本。
c,实体内容:
只有发送post请求时,实体内容才会有
数据(即请求参数)。如果发送的是get请求,
请求参数会添加到请求资源路径的后面。
2)响应数据包
a,状态行: 协议类型和版本 状态码 状态描述
状态码:是一个三位数字,由w3c定义的,表示服务器处理请求的一种状态。
200:正常
500:系统异常
404:依据请求资源路径找不到对应的资源
b,消息头:
服务器也可以发送一些消息头给浏览器,
比如"content-type",告诉浏览器,服务器返回
的数据类型和编码。
c,实体内容:
程序处理的结果
4、get请求与post请求
(1)哪一些情况下,浏览器会发送get请求?
a,直接在浏览器地址栏输入某个地址。
b,点击链接
c,表单默认的提交方式
(2)哪一些情况下,浏览器会发送post请求?
a,设置表单method="post"。
(3)get请求的特点
a,请求参数会添加到请求资源路径的后面,只能添加
少量的参数(因为请求行只有一行,大约只能存放2K
左右的数据)。
b,请求参数会显示在浏览器地址栏)路由器会记录
请求地址)。
(4)post请求的特点
a,请求参数添加到实体内容里面,可以添加大量的
参数。
b,相对安全,但是,post请求不会对请求参数进行
加密处理(可以使用https协议来保证数据安全)。
5、如何获得请求参数值?
1) String request.getParameter(String paramName);
注意:
如果paraName对应的值不存在,返回null。
2) String[] request.getParameterValues(String
paramName);
当有多个参数名相同的时候,用该方法。
6、编码相关的问题
(1)servlet如何输出中文?
a,乱码问题产生的原因
默认情况下,out.println会使用"iso-8859-1"
来进行编码。
b,解决方式
response.setContentType("text/html;charset=utf-8");
注意,编码格式只要支持中文即可,比如,还可以设置为 gbk。
这行代码的作用有两个:
作用1:生成一个消息头(content-type),告诉
浏览器,服务器返回的数据类型和编码格式
作用2:也设置了out.println在输出时使用的编码格式。
(2)表单有中文参数,如何处理?
a,乱码问题产生的原因
当表单提交时,浏览器会对表单中的中文使用
浏览器打开表单所在的页面时的编码格式进行编码。
b,解决方式:
方式一:
step1,要保证表单所在的页面按照指定的
编码格式打开。
<meta http-equiv="content-type"
content="text/html;charset=utf-8">
step2,让服务器按照指定的编码格式进行解码。
request.setCharacterEncoding("utf-8");
只对post请求有效。
方式二:
step1,同上。
step2,
name = new String(
name.getBytes("iso-8859-1"),"utf-8");
7、常识:
a,java语言在内存当中以unicode编码格式(字符集)来保存一个字符。
b,编码:将unicode编码格式对应的字节数组
转换成某种本地编码格式(gbk,utf-8,gb2312)对应的字节数组。
c,解码:将某种本地编码格式对应的字节数组转换成
unicode编码格式对应的字节数组。
8、练习:
9、初学-注意点:
- 改Servlet里面代码,无需重启tomact,需重新部署
- 修改项目名:项目名,Properties,MyEclipse,Web,Web Context-root,“/当前项目名”
- 测试地址,多在浏览器上尝试。不要在MyEclipse上
- Open With,System Editor,即会打开“光影看图”等软件【方便查看编辑、复制粘贴】
- Web项目中:包名里面有汉字和下划线,并没有报错