一、SERVLET基础
1 .组件是什么?
是符合一定规范,实现了部分功能的软件模块,组件需要部署到相应的容器里面才能运行。
2 容器是什么?
是符合一定规范,提供组件运行环境的程序。
3、什么是servlet?
sun公司制订的一种用来扩展web服务器功能的组件规范。偏重于业务逻辑的实现4、什么是servelet容器?
是符合一定规范,为servlet组件提供运行环境的程序。
5、如何写一个servlet?
step1,写一个java类,要实现Servlet接口或者继承HttpServlet抽象类。
step2,编译。(javac -cp servlet-api.jar -d . 类名.java)
step3,打包。
创建一个符合如下结构的文件夹:
appname (应用名)
WEB-INF
classes(放字节码文件)
lib(可选,放.jar文件)
web.xml(部署描述文件)
注:一般在开发完成之后,交付给用户去使用时,
会使用jar命令将以上文件夹压缩成一个以".war"
为后缀的文件。
step4,部署
将step3创建好的文件夹或者压缩文件(.war文件)
拷贝到servlet容器指定的文件夹下面(比如,
拷贝到tomcat的webapps文件夹)。
step5,访问
http://ip:port/appname/servlet-url
servlet-url在web.xml文件当中有相应的配置。
5、servlet如何运行的?
比如,在浏览器地址栏输入
http://ip:port/web01/hello?name=sally
参考day01的servlet2.jpg图片
步骤如下:
1)在浏览器中输入地址确认,浏览器根据IP地址与port号与服务器建立连接
2)浏览器将请求资源路径与请求参数根据http协议打包,生成一个请求数据包
3)浏览器向服务器发送请求(请求数据包)
4)Servlet服务器收到请求后,根据http协议进行解析(拆包)
5)Servlet服务器创建request和response对象,将解析后的请求数据保存在request对象内
6)Servlet服务器根据请求资源路径和web.xml文件找到对应的servlet类,对其实例化7)Servlet服务器创建ServletConfig对象
8)Servlet服务器调用servlet对象的init()方法,将ServletConfig对象作为参数传入,对servlet对象进行初始化
9)Servlet服务器调用servlet对象的service()方法,并将request对象和response对象作为参数传入进来
10)Servlet对象从request对象中获得请求参数,进行处理
11)将处理后的结果保存到response对象中。
12)Servlet服务器从response对象获得处理后的结果
13)Servlet服务器将获得的结果根据http协议进行打包,生成一个响应数据包
14)Servlet服务器向浏览器发送响应(响应数据包)
15)浏览器收到响应,并对响应数据包解析
16)浏览器根据解析后的数据生成新的页面
17)(服务器关闭或服务器超时)调用destroy()方法销毁实例
6、servelet常见的状态码
404、405、500、200、302
7、http(hypertext transfer protocol)协议是什么?
由w3c制订的一种网络应用层协议,规定了浏览器与web服务器之间如何通信以及相应的数据格式。
“一次请求,一次连接"。
优点:高效(即服务器可以利用有限的连接为尽可能多的客户端服务)。
缺点:状态管理的问题。
1)如何通信
step1,浏览器建立与服务器之间的连接。
step2,浏览器将请求数据打包并发送。
step3,服务器将响应数据打包并发送。
step4,服务器立即关闭连接。
如果浏览器要发送新的请求,需要重新建立新的连接。
2)数据格式
a,请求数据包
请求行: 请求方式请求资源路径协议类型和版本
消息头: 是一些键值对,表示特定的含义,浏览器与服务器之间都可以发
送。比如,浏览器可以发送一个"User-Agent"消息头,告诉服务
器,浏览器的类型和版本。
实体内容:只有当请求方式为post的时候,实体内容才有数据(请求参数),
如果请求方式是get,请求参数会添加到请求资源路径的后面。
b,响应数据包
状态行: 协议及版本状态码状态描述
消息头:服务器也可以发送一些消息头给浏览器,比如"content-type",告
诉浏览器,服务器返回的数据类型和字符集。
实体内容:程序处理的结果。
8、get请求与post请求
1)哪一些情况下,浏览器会发送get请求?
a,直接在浏览器地址栏输入某个地址
b,点击链接
c,表单默认的提交方式
2)get请求的特点
a,会将请求参数添加到请求资源路径的后面,因为请求行最多只能存放2k左右的
数据,所以,get请求只能发送少量的请求参数。
b,会将请求参数显示在浏览器地址栏,不安全。比如,路由器会记录访问地址。
3)哪一些情况,浏览器会发送post请求
设置了表单的method="post"。
4)post请求的特点
a,将请求参数放到实体内容里面,所以,可以提交大量的数据给服务器。
b,不会将请求参数显示在浏览器地址栏,相对安全(不会加密,对于敏感数据,需
要加密)。如果要加密,可以使用https协议
9、servlet如何输出中文?
(1)常识
a,java语言使用unicode字符集来保存字符。
b,编码:将unicode字符集对应的字节数组转换成
某种本地字符集(gbk,utf-8等等)对应的字节数组。
c,解码:某种本地字符集(gbk,utf-8等等)对应的
字节数组转换成unicode字符集对应的字节数组。
(2)乱码问题产生的原因:
out.println输出时,容器默认会使用"iso-8859-1"去编码。
(3)解决方式:
response.setContentType("text/html;charset=字符集");
字符集必须支持中文,比如"gbk","utf-8"
二、SERVLET核心
10、表单处理:
(1)如何获得请求参数值。
a,String request.getParamter(String paramName);
注意:如果参数名写错(paramName与实际的参数名不一致),返回null。
b,String[] request.getParameterValues(String paramName);
注意:当有多个参数名相同,用此方法。
(2)如何读取中文参数值
1)乱码问题产生的原因
表单提交时,浏览器会对表单中的中文参数值进行编码(会使用打开表单所在的
页面时的字符集来编码)。服务器端默认情况下,会使用"iso-8859-1"去解码。
2)解决方式
step1,保证浏览器按照指定的字符集来编码:
step2,服务器端,按照指定的字符集去解码:
方式一: request.setCharacterEncoding("utf-8");
注意:该方法只对post请求有效。
方式二: new String(name.getBytes("iso-8859-1"),"utf-8");
11、servlet输出中文,要注意什么?
response.setContentType("text/html;charset=utf-8");
12、容器如何处理请求资源路径?
比如,在浏览器地址栏输入:http://ip:port/web04_2/abc.html
step1,容器依据应用名("/web04_2")找到应用所在的文件夹。
step2,容器会假设访问的是一个servlet,容器会去web.xml文件当中去查找有没有对应的servlet。
匹配过程:
a,精确匹配:要求
b,通配符匹配:
使用"*"匹配0个或者多个字符。
比如:
c,后缀匹配:
使用"*."开头,后接任意的一个字符串。
比如:
匹配所有的以".do"结尾的请求。
step3,如果没有匹配的servlet,容器会认为访问的是一个文件,然后查找该文件并返回(如果找不到,返回404)。
13、如何让一个servlet处理多种请求?
step1,使用后缀匹配。
比如:
step2,分析请求资源路径,然后依据分析的结果
来进行相应的处理。
//获得请求资源路径
String request.getRequestURI();
14、重定向
1)什么是重定向
服务器通知浏览器向一个新地址发请求。服务器一般会通过向浏览器发送302状态
码及一个Location消息头(值是一个地址,一般称之为重定向地址),浏览器收到之
后,会立即向重定向地址发请求。
2)如何重定向
response.sendRedirect(String url);
url:重定向地址。
3)重定向的特点
a,重定向的地址是任意的。
b,重定向之后,浏览器地址栏的地址会发生变化。
4)重定向之前,容器会先清空response上缓存的数据。
15、转发
1)什么是转发?
一个web组件(servlet/jsp)将未完成的处理交给另外一个web组件继续完成。
最常见的情况:servlet获得数据之后,转发给一个jsp去展现。
2)如何转发?
step1,将数据绑订到request对象上。
request.setAttribute(String name,Object obj);
另外,request对象提供了另外两个方法来配合使用
Object request.getAttribute(String name);
request.removeAttribute(String name);
step2,获得转发器
RequestDispatcher rd = request.getRequestDispatcher(String url);
url:是转发的目的地。
step3,转发
rd.forward(request,response);
3)转发的特点
a,转发的目的地有限制,必须是同一个应用。
b,转发之后,浏览器地址栏的地址不变。
c,转发所涉及的各个web组件会共享同一个request和同一个response对象。16、重定向和转发的区别
1)能否共享request对象
重定向:不行。转发:可以。
说明:重定向是两次请求。当容器收到请求之后,会创建request对象和response 对象,当响应发送完毕,容器会立即删除request和response对象。
2)重定向的地址是任意的,而转发必须是同一个应用内部的某个地址。
3)重定向之后,浏览器地址栏的地址会变,而转发不变。
4)转发是一件事未完成,而重定向是一件事已经做完。
17、servlet的生命周期
1)什么是servlet的生命周期?
servlet容器如何创建servlet对象,如何对刚刚创建的servlet对象进行初始化,如何调
用其方法来处理请求,以及如何销毁servlet对象的整个过程。
(2)生命周期分成哪几个阶段?--》实例化、初始化、就绪、销毁
1)实例化
a,什么是实例化
容器创建servlet对象。
b,什么时候进行实例化
情况1:容器收到请求之后,才会创建servlet对象。
情况2: 容器在启动之后,会立即创建servlet对象。需要给这个servlet
配置
注意:容器在默认情况下,对于某个类型的servlet,只会创建唯一的一个实例。
2)初始化
a,什么是初始化
容器在创建好servlet对象之后,会立即调用该对象的init方法。
b,初始化方法(init)只会执行一次。
c,一般情况下,我们不用写init方法,因为GenericServlet已经提供了init方法的实现;
GenericServlet的init方法是这样实现的:将容器传递进来的ServletConfig对象保存下来,并且提供了一个getServletConfig方法来获得这个对象。
d,可以override init()方法来实现自己的初始化处理逻辑。
注意:该初始化调用的init方法,调用的是init(ServletConfig)方法,在该方法中会去调用无参的init()方法,可以重写无参init()方法来实现自己的逻辑
e,初始化参数
ServletConfig.getInitParameter("company");
3)就绪
a,什么是就绪
容器调用servlet对象service方法来处理请求。
b,HttpServlet已经提供了service方法的实现:
会依据请求类型分别调用doGet或者doPost方法。
所以,我们在写servlet时,有两个选择:
选择1:override HttpServlet的service方法。
选择2: override HttpServlet的doGet/doPost方法。
4)销毁
a,什么是销毁
容器在删除servlet对象之前,会调用该对象的destroy方法。
b,destroy方法只会执行1次。
c,一般不需要写自己的destroy方法,因为GenericServlet已经提供了实现。
可以通过override destroy方法来实现自己的销毁逻辑。
3)1)Servlet接口
a,init(ServletConfig config);
b,service(ServletRequest req,ServletResponse res);
c,destroy();
2)GenericServlet抽象类
实现了init,destroy方法。
3)HttpServlet抽象类
继承GenericServlet,并且实现了service方法
18、路径问题:
(1)什么是路径问题?
链接、表单提交、重定向、转发这几种情况下如何填写路径(地址)。
(2)相对路径:不以"/"开头的路径。
(3)绝对路径:以"/"开头的路径。
(4)如何写绝对路径
链接、表单提交、重定向从应用名开始写;
转发从应用名之后开始写。
不要直接写绝对路径,要使用以下方法获得应用名:
String request.getContextPath();
19、Servlet线程安全问题
(1)为什么说servlet会有线程安全问题?
a,servlet默认是单例(对于某个类型的servlet,容器只会创建一个实例)。
b,容器在收到请求之后,会启动一个线程来处理。比如,有多个请求同时访问某个
servlet,此时,就会有多个线程同时调用该servlet对象的service方法。如果这些
线程修改servlet对象的属性,就有可能发生线程安全问题。
(2)如何解决?
a,加锁可以使用synchronized加锁。
b,让servlet实现SingleThreadModel接口。实现了该接口的servlet,容器会为每一个
请求创建一个对应的实例。不建议使用,因为如果请求过多,可能会产生过多的
servlet实例,影响性能。
三、状态管理
19、什么是状态管理?
将浏览器与web服务器之间多次交互当做一个整体来看待,并且将多次交互所涉及的数据保存下来。
20、如何进行状态管理?
1)客户端的状态管理:将状态保存在客户端(浏览器)。比如cookie技术。
2)服务器端的状态管理:将状态保存在服务器端。比如session技术。
21、cookie技术
1)什么是cookie?
服务器临时保存在浏览器端的少量的数据。
2)cookie的工作原理
当浏览器向服务器发送请求时,服务器会将少量的数据以set-cookie消息头的方式
发送给浏览器,浏览器会将这些数据临时保存下来;当浏览器再次访问服务器时,会将之前保存的数据以cookie消息头的方式发送给服务器。
3)如何添加cookie?
Cookie c = new Cookie(String name,String value);
response.addCookie(c);
4)如何查询cookie?
Cookie[] cookies=request.getCookies();
String name = cookies[i].getName();
String value = cookies[i].getValue();
5)cookie的生存时间
cookie.setMaxAge(int seconds);
注意:
a,单位是秒
b,seconds > 0: 当cookie的生存时间大于指定的秒数,浏览器会删除这个cookie。
浏览器会将cookie保存在硬盘上。
seconds = 0:立即删除cookie。
比如,要删除一个名称为"uid"的cookie:
Cookie c = new Cookie("uid","");
c.setMaxAge(0);
response.addCookie(c);
seconds < 0: 缺省值,浏览器会将cookie保存在内存里面。只要浏览器不关闭,
cookie就一直存在。
6)编码问题
cookie只能保存合法的ascii字符串。如果需要保存中文,需要将中文转换成合法的ascii
字符串的形式。
String URLEncoder.encode(String str,String code);
String URLDecoder.decode(String str,String code);
7)路径问题
a,浏览器在向服务器发请求时,会比较cookie的路径是否与请求地址匹配,只有匹配的cookie才会发送。
b,cookie的路径默认情况下等于添加该cookie的组件的路径,比如:
/web07/biz01/addCookie.jsp添加了一个名叫"userId"的cookie,则该cookie的路径等
于"/web07/biz01/"。
c,要访问的路径(请求地址)必须是cookie的路径或者其子路径,浏览器才会将该cookie 发送出去。
d,可以修改cookie的路径
cookie.setPath(String path);
比如,经常cookie.setPath("/appname");
8)cookie的限制
a,cookie可以被用户禁止。
b,cookie只能保存少量的数据(大约4k)。
c,cookie数量也有限制(浏览器在本地大约能保存300个左右的cookie)。
d,cookie不安全,如果要将敏感数据保存在cookie里面,必须加密。
e,cookie只能保存字符串。
22、session(会话)技术
(1)session是什么?
浏览器访问服务器时,服务器会创建一个对象(该对象称之为session对象,有一个唯一的id号,称之为sessionId),服务器在默认情况下,会将这个sessionId以cookie的方式发送给浏览器;当浏览器再次访问服务器时,会将之前保存的sessionId发送过来,服务器就可以依据sessionId找到之前创建的session对象。
(2)如何获得一个session对象?
1)方式一
HttpSession s = request.getSession(boolean flag);
a,当flag=true时
服务器会检查请求当中有没有sessionId,如果没有sessionId,服务器会创建一个session对象;如果有sessionId,服务器会依据这个sessionId查找对应的
session对象,如果找到了,则返回;找不到,则创建一个新的session对象。
b,当flag=false时
服务器会检查请求当中有没有sessionId,如果没有sessionId,返回null;
如果有sessionId,服务器会依据这个sessionId查找对应的session对象,如果找
到了,则返回;找不到,返回null。
2)方式二
HttpSession s = request.getSession();
等价于request.getSession(true)。
(3)绑订数据相关的方法
setAttribute(String name,Object obj);
Object getAttribute(String name);
removeAttribute(String name);
(4)session的超时
a,服务器会将空闲时间过长的session对象从内存当中删除(为了节省内存空间)。
b,服务器默认的超时限制一般是30分钟。
c,可以修改服务器缺省的超时限制,比如,
可以修改tomcat的配置文件:
conf/web.xml
也可以将以上配置信息放到某个具体的应用所在的
配置文件里面(web.xml),此时,只对这个应用有效。
d, setMaxInactiveInterval(int seconds);
(5)立即删除session对象
invalidate();
23、如果禁止cookie,如何继续使用session?(URL重写)
(1)什么是url重写?
浏览器向服务器上的某个地址(url)发请求时,不能够直接使用这个url,而应该使用添加了sessionId的url(即改写或者重写原来的url)。
(2)如何进行url重写
a,对于链接地址和表单提交地址,使用:response.encodeURL(String url);
b,对于重定向地址,使用response.encodeRedirect(String url);
比如: