servlet小结
(1)Servlet基础
1)什么是Servlet?
sun公司制定的一种用来扩扩展web服务器功能的组件规范。
(1)扩展web服务器功能
注:
早期的web服务器只能处理静态资源的请求,即需要事先将
html文件准备好,并存放到web服务器上面。不能够处理
动态资源的请求(需要计算,动态生成html)。
早期使用CGI(Common Gateway Interface)应用程序来扩展。
CGI程序使用perl,c/c++等语言来编写,编写繁琐,不方便
移值,性能也不是很好,现在用得很少了。
浏览器将请求发送给web server,如果是动态资源的请求,
web server会将请求转交给servlet容器来处理,由容器来
处理网络相关的问题,由servlet处理业务逻辑。
(2)组件规范
1)什么是组件?
符合规范,实现部分功能,并且需要部署到相应的容器里面才能
运行的软件模块。
servlet就是一个组件,需要部署到servlet容器里面才能运行。
2)什么是容器?
符合规范,提供组件运行环境的程序。
servlet容器为servlet提供运行环境。
3)如何开发一个Servlet?
step1,写一个java类,实现servlet接口或者继承HttpServlet抽象类。
注:建议继承HttpServlet抽象类。
step2,编译
step2,打包。
创建一个具有如下规范的文件夹:
appname(应用名)
WEB-INF
classes (.class文件)
lib (可选 .jar文件)
web.xml (部署描述文件)
step4,部署。
将step3创建的文件夹拷贝到容器里面。
注:
可以使用jar命令将step3创建的文件压缩成".war"结尾的文件,然后再拷贝。
step5,启动容器,访问Servlet
http://ip:port/appname/servlet-pattsrn
注:servlet-aptter在web.xml当中定义。
3)什么是Servlet容器?
4)http协议(了解)
a.什么是http协议?
是一种网络应用层协议,规定了浏览器与web服务器之间如何
通信以及数据包的结构。
1)如何通信?
step1. 先建立连接。
step2. 发送请求数据包。
step3. 发送响应数据包。
step4. 关闭连接。
即 一次请求,一次连接。
b.特点
web服务器可以利用有限的链接为尽可能多的客户请求服务。
c.数据包的结构
1)请求数据包
a.请求行 (请求类型 请求资源路径 协议和版本)
b.若干消息头
注:消息头是一些键值对(键和值之间使用": "分隔),
浏览器和服务器之间可以利用消息头传递一些特殊的信息。
比如,浏览器可以发送"user-agent"告诉服务器,浏览器
的类型和版本。
c.实体内容
如果请求类型是get,实体内容为空。
2)响应数据包
a.状态行 (协议和版本 状态码 状态描述)
注:状态码是一个三位数字,表示服务器处理请求的状态。
b.消息头
服务器同样也可以将一些消息头发送给浏览器。比如
可以通过设置content-type消息头,告诉浏览器,服务器
返回的数据类型。
c.实体内容
程序处理的结果。浏览器会解析实体内容中的数据,然后
展现。
d.状态码,消息头
(1)500是状态码,表示系统错误。
1)产生的原因;
a,web.xml文件配置错误。
比如将类名写错。
b,源代码写错
比如,没有继承HttpServlet。
2)
(2)404是状态码,表示依据请求路径找不到对应的资源。
1)产生的原因
a,没有部署运用
b,访问地址写错
(3)405状态码,表示找不到处理方法。
1)产生的原因
a.service方法签名错误(方法名,参数类型,异常类型,返回类型写错)
e.get/post请求
1)get请求
a.哪一些情况下,浏览器会发送get请求?
a1.直接输入某个地址
a2.点击链接
a3.表单默认提交方式
b.特点
b1.会将请求参数放到请求行里面,只能提交少量的数据。
注:因为请求行大约只能存放2k左右的数据。
b2.会将请求参数显示在浏览器地址栏,不安全。
注:比如有些网络设备(路由器)会记录这些地址。
2)post请求
(1)那一些情况下,浏览器发送post请求
设置表单的method=“post”
(2)特点
a,不会将请求参数显示在浏览器地址,相对安全
注:并不会对请求参数加密。
b,会将请求参数添加到实体内容里面。
5)Servlet是如何运行的?
比如,在浏览器地址栏输入http://ip:port/servlet-day01/hello
step1,浏览器依据ip,port建立链接(即与web服务器之间建立网络链接)。
step2,浏览器需要将相关数据打包(即,按照http协议要求,制作一个请求数据包,包含了一
些数据,比如请求资源路径),并将请求数据包发送出去。
step3,web服务器将请求数据包解析出来,并将这些数据 添加到request对象中,同时
还会创建response对象。
step4,web服务器创建servlet对象,然后调用该对象的service方法(会将request和response
作为参数)
注:
在service方法里面,通过request获得请求相关的数据,比如请求参数,
然后将处理结果写到response对象。
step5,web服务器将rseponse中的数据取出来,制作响应数据包,然后发送给浏览器。
step6.浏览器解析响应数据包,然后展现。
(2)Servlet核心
1)读取请求参数值
(1)request提供的getParameter方法。
string getParamater(String parametename);
注:
a,如果请求参数名写错,会返回null值。
b,如果不添任何数据,会获得空字符串。
(2)request提供getParameterValues方法。
string[] getParameterValues(String paramname);
注:
a,当有多个参数请求名相同时,用该方法。
b,多选框,如果不选择任何选项,浏览器不会发送任何数据给服务器。
2)处理表单中文参数值乱码问题
(1)为什么会有乱码?
表单提交时,浏览器会对中文参数值进行编码。服务器端
默认会使用iso-8859-1来解码。
注:
会使用表单所在的页面打开时使用的字符集来编码。
(2)如何解决?
1)情形1 表单提交方式为post
request.setCharacterEncoding("utf-8");
注:要加到所有的request.getParameter方法前面。
2)情形2 表单提交方式为get
设置 <Connector URIEncoding="utf-8"/>
注: 只针对get请求有效。
3)Servlet输出中文乱码问题
(1)为什么会乱码?
out在输出时,默认使用iso-8859-1来编码。
(2)如何解决?
response.setContentType("text/html;charset=utf-8");
这行代码的作用:
作用1.返回content-type消息头,告诉
浏览器,服务器返回的数据类型。
作用2:另外,out在输出时,会使用指定的
字符集来编码。
4)转发与重定向
(1)什么是转发?
一个web组建将未完成的任务交给另外一个web组建继续做。
转发的本质:一个web组件通知容器另外一个web组件。
注:
a,web组件指定是servlet或者jsp。
b,一个servlet将数据转发给一个jsp,有jsp将数据以合适的方式展现出来。
(2)如何获得转发?
step1,将数据绑定到requset。
request.setAttribute(String name,object obj);
step2,获得转发器。
RequestDispatcher rd=requesr.RequestDispatcher(String url);
注:url转发的目的地。
step3,转发
rd.forward(request,response);
(1)什么是重定向?
服务器通知浏览器,向一个新地址发送请求。
注:
服务器可以发送一个302状态码以及一个location消息头(
值是一个地址,称之为重定向地址)给浏览器,浏览器收到之
后,会立即向重定向地址发送请求。
(2)如何重定向?
response.sendRedirect(String url);
注:url就是重定向地址。
重定向之前,容器会清空response对象上存放的所有数据。
也就是说,实体内容里面是没有任何数据的。
(3)重定向特点
a.重定向地址是任意的。
b.重定向之后浏览器地址会发生变化。
5)Servlet的生命周期
1)什么是Servlet的生命周期?
容器如何创建servlet对象,如何对其进行初始化处理,
如果调用其方法来处理请求,以及如何销毁该对象的整个过程。
(即容器如何管理servlet)。
2)分成哪几个阶段?
a.实例化 (load-on-startup) 单例
(1)什么是实例化?
容器创建servlet对象。
(2)什么时候实例化?
情况1;容器收到请求之后才会创建。
情况2;容器启动之后立即创建(需要而外配置)。
注:容器默认情况下只会创建一个实例。
b.初始化 (一次,overrid init方法)
(1)什么是初始化?
实例化之后,容器会调用该实例的init方法。
注:该方法只会执行一次。
(2) GenericServlet的init方法是如何实现的?(了解)
将容器传递过来的ServletConfig对象保存下来了,
并且提供了getServletConfig方法。
(3)如何实现自已的初始化处理逻辑?
override GenericServlet的init方法(不带参的那个)。
(4)初始化参数
step1.配置初始化参数
step2.调用ServletConfig提供的方法
String getInitParameter(String paramName)
c.调用/就绪 (doGet,doPost)
(1)什么是就绪?
容器收到请求之后,会调用servlet实例的service方法。
(2)HttpServlet的service方法是如何实现的?
依据请求类型,分别调用对应的doxxx方法(比如。get请求就调用doGet方法)。
d.销毁
a.什么是销毁?
容器在删除servlet实例之前,会调用该实例的destroy方法。
该方法只会执行一次。
b.可以override GenericServlet提供的init方法来实现
自已的销毁处理逻辑。
3)相关的接口与类 (Servlet,GenericServlet,HttpServlet)
1)Servlet接口
a.init(ServletConfig config)
b.service(ServletRequest req,ServletResponse res)
注:
ServletRequest是一个接口,HttpServletRequest
是其子接口。ServletResponse与之类似。
c.destroy()
2)GenericServlet抽象类
实现了Servlet接口的init和destroy方法。
3)HttpServlet抽象类
继承了GenericServlet,实现了service方法。
6)Servlet上下文
7)线程安全问题
8)容器如何处理请求资源路径?
9)如何让一个Servlet处理多种请求?
10)路径问题
(3)状态管理
1)什么是状态管理?
2)如何进行状态管理?
3)Cookie
a.什么是Cookie?
b.工作原理 (set-cookie消息头,cookie消息头)
c.如何添加Cookie?
d.三个问题(编码问题,生存时间问题,路径问题)
e.如何读取Cookie?
f.Cookie的限制
4)Session
a.什么是Session?
b.工作原理
c.如何获得Session对象 (request.getSession)
d.绑订数据
e.Session超时
f.删除Session
(4)数据库访问
dao
(5)过滤器与监听器
1)什么是过滤器?
2)如何写一个过滤器?
3)初始化参数
4)优先级
5)优点(了解)
6)什么是监听器?
7)如何写一个监听器?
(6)案例
员工管理
登录/注册
session验证
验证码
3. jsp
(1)什么是jsp?
.jsp(html + java代码) —>Servlet
(2)如何写jsp?
1)html (css,js): 直接写
2)java代码:
a.java代码片断: <% %>
b.jsp表达式: <%= %>
c.jsp声明: <%! 变量或者方法 %> (a1.jsp)
3)隐含对象
a.什么是隐含对象?
b.为什么可以使用这些隐含对象?
c.有哪些隐含对象?
out,request,response,session,application
pageContext(page上下文):
c1. 容器会为每一个jsp实例创建唯一的一个符合
PageContext接口要求的对象。
注: 一个jsp实例对应一个pageContext,另外,
只要jsp实例还在,pageContext就在。
c2. 作用 (a2.jsp)
作用1:绑订数据 (setAttribute,getAttribute,removeAttribute
注:可以将pageContext看作是一个“钱包”,
绑订到pageContext上面的数据,只有对应的
jsp实例才能访问。
作用2:获得其它隐含对象
exception(了解)
config(了解 a4.jsp): ServletConfig
page(不用): jsp实例本身(jsp对应的servlet实例)
4)指令
a.什么是指令?
b.指令的格式 <%@ 指令名 属性=值 %>
c.有哪些指令?
c1. page指令
import属性
pageEncoding属性
contentType属性
c2. incude指令
file属性
(3)执行过程
step1. jsp转换成Servlet
html——-> service方法,使用out.write输出。
<% %> —-> service方法 ,照搬。
<%= %> —> service方法,使用out.print输出。
<%! %> —> 为Servlet增加新的属性和方法。
step2. 调用Servlet