Servlet-生命周期与请求,发送,响应技术以及配置文件

Servlet API

定义了若干接口和包,有四个包组成。
在这里插入图片描述

Servlet接口

Servlet是Servlet API中的基本接口。
每个Servlet必须直接或间接地实现该接口。该接口定义了五个方法:

void init(ServletConfig config)
//执行一次,创建对象时产生(首先构造方法创建,然后执行init)
void service(ServletRequest request,ServletResponse response)
void destroy()//执行一次,销毁时发生
ServletConfig getServletConfig()
String getServletInfo()
  1. GenericServlet实现了Servlet接口和ServletConfig接口,提供了除service()方法外的所有方法实现,同时支持日志方法。创建Servlet时可以直接继承GenericServlet类并实现service方法。
  2. 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生命周期

  1. 生命周期表示一个java对象从最初创建到最终被销毁,经历的所有过程。
  2. 程序员无权干涉,生命周期(创建–工作–销毁)由web容器管理(Tomcat)。
  3. 在web容器启动阶段不会被实例化【若希望在web服务器启动阶段实例化需特殊设置】。

需要在web.xml中配置如:在servlet标签加入< load-on-startup >子标签(同时这个位置可以加上自然数配置优先级,自然数越小优先级越高)

  1. servlet对象是单例,但不符合单例模式。Tomcat支持多线程,所以他的对象是单实例在多线程环境下运行的。那么Servlet对象中若有实例变量,并且实例变量设计到修改操作,那么这个Servlet对象一定讳存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用局部变量。
    在这里插入图片描述
  2. web.xml中反射机制创建的对象只创建一次。
    在这里插入图片描述
  3. 重要:生命周期的全描述:
    在这里插入图片描述
  4. 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请求结构与处理

  1. 怎么发送一个HTTP请求?
    在这里插入图片描述
    *可以通过method属性指定使用GET请求或者POST请求。

  2. HTTP请求的种类?

GET:向特定的资源发出请求 POST:向指定资源提交数据进行处理请求
HEAD:向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性。
PUT:向指定资源位置上传其最新内容。 DELETE:请求服务器删除Request-URL所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。 CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

在这里插入图片描述

  1. 处理HTTP请求方法?
    在这里插入图片描述
  2. 请求参数传递和获取
    获取:
    在这里插入图片描述

请求参数时随请求一起发送到服务器的数据,它以”名/值“对的形式发送。
- POST请求,参数在数据区
- GET请求,参数附加在URI后面
GET请求举例:(直接访问Servlet)
在这里插入图片描述
解释:

  • ?后面的内容就是 查询串, 由 很多对 名值对组成 名与值之间用(=)分隔开。
  • &用来区分多个参数。

请求转发

操作一:
通过请求对象的getRequestDispatcher方法得到转发器对象。

RequestDispatcher getRequestDispatcher(String path)
  1. 请求对象:使用请求对象处理数据,请求对象是一个作用域对象,可以在其上存储属性实现数据共享。
  2. 属性:包括属性名和属性值。属性名是一个字符串,属性值是一个对象。
    在这里插入图片描述

操作二:
调用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文件中可以加入如下信息,进行处理。
在这里插入图片描述

部署描述文件

  1. 每个Web应用都应该由一个 部署描述文件(Deployment Descriptor 简称DD文件)(Web.xml)它用来部署web应用中的所有包含的组件,如Servlet等。
  2. 从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")})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值