运行在Web服务器的小型java程序servlet引擎
1. 生命周期:客户端请求Servlet——加载Servlet类到内存——实例化并调用init方法初始化Servlet——web容器接收请求调用service方法——调用destroy销毁容器
1. 加载Servlet类到内存
○ web容器使用反射的class.forname()获取servlet类的对象,所以servlet必须有一个空的构造方法,如果没有,则java编译器会自动构造。
2.实例化并调用init方法初始化Servlet
○ servlet初始化有两种(web容器启动时初始化;第一次被访问时用注解的方法或xml文件指定初始化,当web容器第一次接收到请求时初始化就是延迟加载,这种方式可以加快容器的启动,但是用户第一次请求响应的时间会长一点)。
3.web容器接收请求调用service方法
○ 此时web容器完成准备工作,创建HTTPServletRequest和HttpServletRequest接口的类的对象,
创建线程来调用service(),然后对请求数据处理后响应给客户端。
请求的数据放在HTTPServletRequest对象中
3.销毁Servlet实例
○ 在调用destroy()方法前,容器会等待其他执行Servlet的service()的线程结束比如初始化时连接数据库的线程等
2. 请求结构:
处理请求:客户端向服务器发出的请求叫http请求
请求行:方法名post/get,请求资源的URL,http版本
请求头:指定请求使用的浏览器信息,字符编码信息和客户能处理的页面类型等
然后是空行,后面是请求的数据,但是get方法没有数据
1. 发送http请求的方式: method=" "
▪ 在浏览器地址栏输入URL并按下enter(get)
http://localhost:8080/a1/logServlet?uname=2$uid=3
▪ 用户单击HTML页面中的超链接(get)
<a href="/a1/logServlet?uname=2$uid=3">登录</a>
▪ 使用表单提交请求信息(post)
2. 处理http请求
用doXxx()的方法处理请求响应的数据
如果在doGet中处理数据,则也重写一个doPost的方法中调用doGet(request,response)实现既能用get也能用post方式
3. 检索请求参数:
4. 客户端请求的数据和浏览器信息都封装在HTTPServletRequest对象中,所以可以调用这个对象的getParameter(String name)得到请求的数据,就是前端表单name的值,这个能返回String,Sring[],Map
请求转发:请求的数据和数据库数据一样就转发到其他页面,通过请求对象getRequestDispatcher(Sring path) 得到RequestDispatcher对象,然后调用这个对象的forward(request,response)完成 请求转发
3. 发送响应:
服务器端Servlet对请求处理完成后向客户端发送两种响应:
直接使用输出流发送数据到客户端页面 响应重定向告诉客户端到哪个地址去
状态行:http版本,状态码,描述状态码的信息
响应头:服务器给客户端的一些服务器状态信息和对页面操作的一些控制命令,比如让页面多久刷新一个啥的
响应数据:输出流有这个数据,重定向没有重定向是在响应头中添加URL地址给客户端跳转response.cendRedirect(String url);
注意:在服务器响应中,响应被提交,就是已经向客户端响应一个输出流了就不能使用重定向cendRedirect(),这两个是冲突的,会抛出java.lang.IllegalStateException异常。
请求转发:客户端发来的请求服务器做出处理后不会直接向客户端发出响应,而是把请求转发到目标资源,由目标资源(jsp或servlet)向客户端发送响应,服务器端只是做了一个控制权的转移,而且客户端的URL地址栏不会显示新转发的地址。
响应重定向:服务器端不会对请求做处理,只是立马响应一个响应头带有302的地址给客户端,由客户端自己连接到目标资源。
注意:使用重定向方式给的地址不能给服务器端WEB-INF目录下的地址,这个文件里面的资源是给服务器访问的。
数据共享,使用请求转发可以在转发的目标页面中使用前一个页面的数据状态信息用request.setAttribute()来分享信息,但是重定向的页面不能使用前页面信息,除非使用会话,request.getSession().setAttribute()。
状态码:状态码可以由服务器自动抛出,也可以自己设置
100~199 表示信息
200~299 请求成功,但是请求内容在不在就另说
300~399 重定向 重定向的页面在不在另说
400~499 客户端错误,页面有,但是可能不能访问,比如外国网站
500~599 服务器端错误,处理错误等
4. 部署描述文件 配置文件
web应用程序中的组件用注解或配置文件配置,用来初始化web应用程序,web容器在启动的时候读取配置文件来配置应用程序,实例化这些应用程序,比如servlet,页面过滤,编码过滤。
配置文件声明:xml版本和使用的字符集
<?xml version="1.0" encoding="UTF-8"?>
所有配置都在<web-app 中
xmlns:xsi= 指定了命名空间实例
xmlns=" 声明了xml文件命名空间xml模式文档的位置
xsi:schemaLocation 指定了模式的位置
metadata-complete 属性指定配置文件是否完整配置,如果true就是完整就是不能使用servlet注解,用false就是web容器会检查文件的注解
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
配置描述文件中定义的元素
description 对应用程序的简短描述
context-param 定义应用程序的初始化参数
servlet 定义Servlet
servlet-mapping Servlet映射
session-config 定义会话时间
filter 过滤器
filter-mapping 过滤器映射
security-constraint web应用程序的安全约束