Servlet API
定义了若干接口和包,有四个包组成。
Servlet接口
Servlet是Servlet API中的基本接口。
每个Servlet必须直接或间接地实现该接口。该接口定义了五个方法:
void init(ServletConfig config)
//执行一次,创建对象时产生(首先构造方法创建,然后执行init)
void service(ServletRequest request,ServletResponse response)
void destroy()//执行一次,销毁时发生
ServletConfig getServletConfig()
String getServletInfo()
- GenericServlet实现了Servlet接口和ServletConfig接口,提供了除service()方法外的所有方法实现,同时支持日志方法。创建Servlet时可以直接继承GenericServlet类并实现service方法。
- Httpservlet抽象类继承了GenericServlet类,针对HTTP协议Servlet,在HttpServlet类增加了一个新的service()方法。
HTTPServlet针对不同的HTTP请求方法定义了不同的处理方法:
protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
Servlet生命周期
- 生命周期表示一个java对象从最初创建到最终被销毁,经历的所有过程。
- 程序员无权干涉,生命周期(创建–工作–销毁)由web容器管理(Tomcat)。
- 在web容器启动阶段不会被实例化【若希望在web服务器启动阶段实例化需特殊设置】。
需要在web.xml中配置如:在servlet标签加入< load-on-startup >子标签(同时这个位置可以加上自然数配置优先级,自然数越小优先级越高)
- servlet对象是单例,但不符合单例模式。Tomcat支持多线程,所以他的对象是单实例在多线程环境下运行的。那么Servlet对象中若有实例变量,并且实例变量设计到修改操作,那么这个Servlet对象一定讳存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用局部变量。
- web.xml中反射机制创建的对象只创建一次。
- 重要:生命周期的全描述:
- Servlet对象实例化之后:大多数Web容器将该Servlet以及其的 url-mapping存储到Map集合中去了。
举例: Map< String , Servlet >集合
8. 服务器在启动阶段时解析web.xml,将url-pattern和对应类名存储在Map集合中了。
总结:
servlet类的构造方法只执行一次
servlet对象的init方法只执行一次
servlet 的service方法只要用户请求一次,就执行一次
servlet对象的destroy方法只执行一次
Servlet接口中的这些方法中填写什么代码?
void init(ServletConfig config)
/*1,执行一次,创建对象时产生(首先构造方法创建,然后执行init)。
**2,若希望系统在对象创建时执行一段特殊程序,写在init方法中(如果写在构造方法里,有可能存在因为编写了其他有参构**造方法时导致无参构造方法的消失!)。
**3,init时一个专门的初始时刻,会被自动调用。
*/
void service(ServletRequest request,ServletResponse response)
/*1,必须重写,我们通过这个方法完成业务逻辑的处理,请求的处理,以及完成相应。
**2,这个方法里面写业务代码。
*/
void destroy()//执行一次,销毁时发生
/*1,同样的一种特殊时刻,这个特殊时刻被称为对象销毁时刻。
**2,若希望系统在对象销毁时执行一段特殊程序,写在destroy方法中
*/
回顾一下:
类加载时刻执行程序,代码写在静态代码块中。这也可以说是一种特殊时刻吧!
HTTP请求结构与处理
-
怎么发送一个HTTP请求?
*可以通过method属性指定使用GET请求或者POST请求。 -
HTTP请求的种类?
GET:向特定的资源发出请求 POST:向指定资源提交数据进行处理请求
HEAD:向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性。
PUT:向指定资源位置上传其最新内容。 DELETE:请求服务器删除Request-URL所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。 CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- 处理HTTP请求方法?
- 请求参数传递和获取
获取:
请求参数时随请求一起发送到服务器的数据,它以”名/值“对的形式发送。
- POST请求,参数在数据区
- GET请求,参数附加在URI后面
GET请求举例:(直接访问Servlet)
解释:
- ?后面的内容就是 查询串, 由 很多对 名值对组成 名与值之间用(=)分隔开。
- &用来区分多个参数。
请求转发
操作一:
通过请求对象的getRequestDispatcher方法得到转发器对象。
RequestDispatcher getRequestDispatcher(String path)
- 请求对象:使用请求对象处理数据,请求对象是一个作用域对象,可以在其上存储属性实现数据共享。
- 属性:包括属性名和属性值。属性名是一个字符串,属性值是一个对象。
操作二:
调用RequestDispatcher对象的forward()方法。
HTTP请求响应
Servlet使用输出流向客户发送响应。返回一个PrintWriter对象用于向客户发送文本数据。
什么是重定向?
Servlet在对请求进行分析后可能不直接向浏览器发送响应,而是向浏览器发送一个Location响应头,告诉浏览器访问其他资源与,这称为相应重定向。
通过响应对象的 sendRedirect()实现:
public voud sendRedirect(String location)
图片解释:
设置响应头
响应头是随响应数据一起发送到浏览器的附加信息。每个响应头通过“名/值”对的形式发送到客户端。
void setHeader(String name,String value)
void setIntHeader(String name,int value)
void setDateHeader(String name,long date)
response.setHeader("Refresh","5");//每五秒刷新页面
response.setHeader("Refresh","5;URL=http://host/path/");//在五秒后跳转到某一个界面
常见的响应头:
发送状态码
提问:web开发过程中的错误,常见的404,500是什么鬼?
回答:404,500是HTTP协议状态码,是由W3C制定的,所有浏览器和服务器都必须遵守。
正常相应的HTTP响应码:200 【ok】
一个典型的状态行:
解释:
状态码200是系统自动设置的,Servlet一般不需要指定该状态码。
对于其他状态码,可以由系统自动设置,也可以用相应对象的setStatus()设置,格式为:
public void setStaus(int sc)
状态码含义:
总结:
404:可能是路径写错了
500:服务器内部java程序出问题了
解决:在web.xml文件中可以加入如下信息,进行处理。
部署描述文件
- 每个Web应用都应该由一个 部署描述文件(Deployment Descriptor 简称DD文件)(Web.xml)它用来部署web应用中的所有包含的组件,如Servlet等。
- 从Servlet3.0开始,有些组件可以用注解配置。
什么是注解?
@WebServlet和@WebInitParam
注解就是符合一定格式的语法 @xxxx ,给JVM看的。
注解优点:开发效率高 成本低 。
注解缺点:耦合性大 并且不利于后期维护。
@WebServlet注解:
包含多个属性,与web.xml中对应元素等价。
@WebInitParam注解
主要是为Servlet或者Filter制定初始化参数,它等价于Web.xml中< servlet >和< filter >元素的< init - param >子元素。
举例:
@WebServlet(name="ConfigDemoServlet",urlPatterns={"/config-demo"},initParams = {@WebInitParam(name = "email",value= "webmaster@163.com")})