1.Servlet是Java Web技术的核心基础,是CGI(公共网关接口)的一种替代,用于实现动态Web文档的Java解决方案。(Servlet和JSP运行在Web容器(Tomcat)里面,Servlet属于容器中的一个组件)
2. Servlet API定于了若干接口和类:
Servlet API组成:javax.servlet包(定义了开发与协议无关的接口和类)、javax.servlet.http包(定义了开发采用HTTP协议的接口和类)、javax.servlet.annotation包、javax.servlet.descriptor包
3.javax.servlet.Servlet接口是Servlet AP中的基本接口,每个Servlet接口都必须直接或间接使用该接口,其重要方法:
public void init(ServletConfig config):完成Servlet初始化,准备提供服务。
public void service(ServletRequest req,ServletResponse res):对每个客户请求调用一次该方法,允许Servlet为请求提供响应。
public void destroy():指示Servlet清除本身、释放请求的资源,并准备结束服务。
4.GenericServlet类:javax.servlet.GenericServlet抽象类实现了Servlet接口和ServletConfig接口,提供Servlet接口之中除service()外所有的方法得实现。
5.HttpServlet类:javax.servlet.http包中定义了使用HTTP协议创建的Servlet所需要的接口和类。
HttpServlet抽象类:用于创建支持HTTP协议的Servlet。
HttpServletRequest接口:基于HTTP协议的请求对象,继承了ServletRequest接口。(继承ServletRequest接口并提供了针对HTTP请求的操作方法,如定义了从请求对象中获取HTTP请求头、Cookie等信息的方法)
HttpServletResponse接口:基于HTTP协议的响应对象,继承了ServletReponse接口。(提供针对HTTP的发送响应的方法,定义了为响应设置如HTTP头、Cookie等信息的方法)
HttpSession接口:实现会话管理的接口,用来存储用户的信息。
Cookie类:创建Cookie对象的一个实现类。
6.Servlet生命周期:Servlet作为一种在容器中运行的组件,有一个从创建到销毁的过程,此过程称之为Servlet的生命周期。
生命周期包括以下几个阶段:加载和实例化Servlet类(Web容器使用Class.forName对其加载和实例化,要求Servlet类中有一个不带参数的构造方法,如果没有定义任何构造方法,Java编译器将添加默认的构造方法)、初始化Servlet(使用init(ServletConfig)进行初始化)、为客户提供服务(初始化后, 点击超链接或者直接提交表单向容器请求访问Servlet容器,当容器收到请求之后,容器根据请求中的URL找到正确的Servlet,创建两个对象,一个是HttpServletRequest请求对象,一个是HttpServletResponse响应对象,随后创建线程,随后调用service()将请求对象和响应对象作为参数传递给该方法(有多少请求将创建多少线程),接下来service()将根据HTTP请求类型(GET/POST)来决定调用Servlet的doGet()方法还是doPost()方法,使用响应对象获得输出流对象那个,调用有关方法将响应发送给客户浏览器,随后线程将被销毁,请求对象和响应对象因为离开其作用域也将被销毁 )、销毁和卸载Servlet。
7.处理请求:
请求:客户向服务器发出的消息称之为请求,由请求行(方法名、请求资源的URI、HTTP版本)、请求头(浏览器信息、字符编码信息、客户能处理的页面类型等)、HTTP请求方法(客户请求服务器完成的动作(8个方法))三部分组成
GET方法:请求读取一个Web页面
POST方法:请求向服务器发送数据
GET和POST方法区别:
特征 | GET方法 | POST方法 |
资源类型 | 静态或动态 | 动态 |
数据类型 | 文本 | 文本或者二进制数据 |
数据量 | 一般不超过255个字符 | 没有限制 |
可见性 | 数据是URL的一部分,在浏览器中对于用户 可见 | 不是URL的一部分 在地址栏中不可见 |
数据缓存 | 可以在浏览器的URL历史中缓存 | 不能缓存 |
发送HTTP请求事件:在浏览器地址栏中输入URL并回车、单击HTML页面的超链接、在HTML页面填写表单并进行提交
处理HTTP请求:除却servie()为客户提供服务外,还针对每个HTTP方法定义了对应的doXxx()法。
8.ServletRequest接口中有关请求参数的方法:
public String getParameter(String name):返回由name指定的请求参数值,保证指定的参数只有一个。
public String[] getParameterValues(String name):返回指定参数name所包含的所有值,返回值是一个String数组,适用于参数有多个值的情况(如多选框)。
*如果希望Servlet既能处理POST请求又能处理GET请求,可以添加下面的doGet()并在其中调用doPost()
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServeletException,IOException{
doPost(request,respose)
}
9.请求转发:需要将一个请求转发到另外一个页面,为了实现请求转发一般使用getRequestDispacher()得到RequestDispacher对象,方法格式为:RequestDispacher getRequestDispacher(String path)此时path用来指定要转发到的资源路径(可以是绝对路径(以“开头,相对于当前应用程序的文档根目录)也可以是相对路径)
getRequestDispacher接口定义了以下两个方法:
public void forward(ServletRequest request,ServletResponse reponse):将请求转发到另外服务器上另外一个动态或静态资源(Servlet、JSP页面或HTML页面)
public void include(ServletRequest request,ServletResponse reponse):将控制暂时转发到其他指定资源,并将其包含到当前输出中。
10.使用请求对象存储数据:请求对象是一个作用域(scope)对象,可以在其上存储属性(包括属性名和属性值,属性名是一个字符串,属性值是一个对象)实现数据共享,ServletRequest接口中有关于属性存储的方法有四个:
public void setAttribute(String name,Object obj):将指定名称name的对象obj作为属性值存储到请求对象之中。
public Object getAttribute(String name):返回请求对象中存储的指定名称的属性值,如果指定名称的属性不存在,返回Null,必要时需要作类型转换。
public Enumeration getAttributeNames():返回一个Enumeration对象,它是请求对象中包含所有属性名的枚举。
public void removeAttribute(String name):从请求对象中删除指定名称的属性。
11.表单数据的处理:
表单空间元素;form(action属性表示指定处理表单数据的服务器端程序)、text、password、button、radio(单选按钮、name相同时属于同一个组)、checkbox(复选框,name相同时属于同一组)、组合框和列表框,通过下拉列表为用户列出各个选项供用户选择、文件上传控件
表单页面创建:使用对应的控件进行页面创建即可。
表单数据处理:表单数据作为请求参数传递到服务器端,在服务器端的Servlet中使用请求对象的getParameter()方法(单个值)和getParameterValue()方法(多个值)来获取表单数据。
12.发送响应:
HTTP响应结构:状态行(HTTP版本、响应状态码、描述状态码的短语)、响应头、响应数据
13.输出流与内容类型
public PrintWriter getWriter():返回一个PrintWriter对象用于向客户发送文本数据
public ServletOutputStream getOutputStream() throws IOException:返回一个输出流对象可以向客户发送二进制数据
PrintWriter对象:
PrintWriter out=response.getWriter();
out.println("......");
ServletOutputStream:
ServletOutputStream sos = response.getOutputStream();
14.部署描述文件(WML文件):
第一行是声明:version属性:XML版本、encoding:所使用的字符集
其余内容均在<web-app>和</web-app>元素中,它是部署描述文件的根元素,其余所有元素均应在此元素之中
<web-app>元素5个属性
xmlns | web.xml文件命名空间的XML模式文档的位置 |
xmlns:xsi | 命名空间的实例 |
xsi:schemaLocation | 模式的位置 |
version | 模式的版本 |
metadata-complete | 指定部署描述文件是否是完整的,若值为true则Web容器忽略Servlet注解,若为false或不存在,则容器将检查类文件中的注解 |
Servlet元素5个子元素
<servlet-name> | 定义Servlet名称(必备项,名称应该唯一),可以通过ServletConfig的getServletName()检索Servlet名 |
<servlet-class> | 指定Servlet类的完整名称,需要带包的名称,如,com.demo.HelloServlet。容器将使用该类创建Servlet实例 |
<init-param> | 定义向Servlet传递的初始化参数,在一个<servlet>元素中可以定义任意多个<init-param>元素,每个<init-param>元素有且仅有一组<param-name>和<param-value>子元素,<param-name>定义参数名,<param-value>定义参数值,Servlet可以通过ServletConfig接口的getInitParameter()检索初始化参数 |
<load-on-startup> | 指定是否在Web应用程序启动时载入该Servlet,该元素值为一个整数,若是负数将根据需要决定何时装入Servlet,如果是正数,则在Web应用程序启动时载入该Servlet,对于不同的Servlet可以根据其值大小决定装入顺序,值小的先进行装入 |
<Servlet-mapping>元素
定义一个映射,指定哪个URL模式被该Servlet处理。容器使用这些映射根据实际的URL访问合适的Servlet,该元素包括<servlet-name>(使用<servlet>元素定义的Servlet名)和<url-pattern>(与该Servlet关联的模式字符串)两个子元素
15.@WebServlet和@WebInitParam注解
在servlet3.0中可以使用@WebServlet注解,而不需要在web.xml文件中定义Servlet(该注解属于javax.servlet.annotation包,因此在定义Servlet时需进行导入)
eg:@WebServlet(name="HelloServlet",urlPatterns={"/hello-action"})
name属性指定Servlet名称;urlPatterns属性指定访问该Servlet文件的URL;value等价于urlPatterns但是两个元素不能同时使用;loadOnStartup指定Servlet加载顺序,等价于web.xml文件中<load-on-startup>元素;initParams指定Servlet的一组初始化参数,等价于<init-param>;