java中的Servlet基础

11 篇文章 0 订阅

Servlet 简介

什么是Servlet

Servlet 是一个符合特定规范的Java程序,是一个基于Java技术的Web组件。Servlet运行在服务端,由Servlet容器所管理,用于处理客户端,并作出响应。
Servlet运行于服务器端。说明:Serlvet容器:Servlet容器也称为Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务。管理和运行Servlet/JSP的容器也称为Web容器,我自己介绍的web容器,Servlet容器,和web容器是同义的。
Servlet容器主要用于生成动态的内容。它可以接受和处理请求,并动态生成HTML内容对客户端进行响应,其工作过程如下。

在这里插入图片描述

Servlet与JSP的关系

Servlet与JSP都可以在页面上动态显示数据,两者之间存在什么样的关系?
在使用JSP技术开发Web程序时,我们所要做的是在JSP中写入Java代码,当服务器运行JSP时,将JSP转化成为Java类并编译执行,动态获取数据生成HTML代码,最终显示在客户端浏览器上。整个过程如下。

在这里插入图片描述
此流程中的将Java翻译成Java源代码这一步骤揭示了JSP的技术根源。
当部署项目并运行后,在Tomcat安装目录的\work\Catalina\localhost\store\org\apache\jsp下会生成一个内容。

打开运行后编译成的类,我们可以看到就是一个java程序,这个xxx_jsp类继承自org.apache.jasper.runtime.HttpJspBase类,而HttpJspBase又继承自一个重要的Servlet类HttpServlet,由此可以得出一个结论:JSP在运行时会被编web容器翻译成为一个Servlet,动态响应内容是通过运行这个Serlvet类产生的。Servlet是Java Web动态交互技术的关键组件,也是JSP的技术基础,容器在运行JSP时,需要先将其内容翻译成Servlet的语法,在安装Serlvet的方式运行。

JSP实际上就是为了简化Serlvet的开发而产生的,避免了编写繁杂的输出方法,更加适用于开发带有页面内容的表示层组件。

Servlet API

初步了解Serlvet的功能和特点,但是Servlet到底是什么?符合哪些规范?实际上就是按照Servlet规范编写一个java类。下面就了解下开发Servelt需要用到的主要接口和类,也就是Servlet API。
Servlet API 包含在两个包内,javax.servlet包中的类和接口是通用的不依赖协议的Servlet API,包括servlet,ServletResponse,ServletConfing,ServletContext 接口及抽象类GebericServlet。javax.servlet.http包中的类和接口使用于支持HTTP协议的Servlet API。

Servlet 接口

Servlet接口定义了所有Servlet需要实现的方法,它常用的方法如下。

方法名称功能描述
public abstract void init(ServletConfing config)由Servlet容器调用,用于完成Servlet对象在处理客户请求前的初始化工作
public abstract void service(ServletRequest req,ServletRseponse res)由Servlet容器调用,用于处理客户端的请求
public abstract void destroy()由Servlet容器调用,释放servlet对象所使用的的资源
public abstract ServletConfing getServletConfig()返回ServletConfig 对象,该对象包含此Servlet的初始化和启动参数。返回ServletConfig对象是传递给init()方法的对象
public abstract String getServletInfo()返回有关Servlet的信息,如作者,版本,和版权。返回的字符串是纯文本,而不是任何种类的标记(如HTML,XML等)

GebericServlet抽象类

GebericServlet抽象类实现了Servlet接口和ServletConfig接口,给出除了service()方法外的其他方法的简单实现,定义了通用的,不依赖协议的Servlet。它常用的方法如下。

方法名称功能描述
public void init(ServletConfig config)对Servlet接口中 init(ServletConfig config)方法的实现,并将ServletConfig实例进行保存以备用。此方法还有一个无惨的重载方法init(),可用于子类中重写,以实现用户订制的初始化工作
public String getInitParameter(String name)通过调用ServletConfig的getInitParameter(String name)方法获取web.xml中设置的以name命名的初始化参数值
public ServletContext getServlet()返回ServletContext对象的引用

经验:通常只需要重写不带参数的init()方法,如果重写init(ServletConfig config)方法,则应该包含super.init(config)代码。
如果要编写一个通用的Servlet,只要继承自GenericServlet类,实现servlet()方法即可。

HttpServlet 抽象类

大多数的网络应用是通过HTTP协议访问服务器资源的,因此我们编写的Servlet大多数也是应用于处理HTTP协议的请求和响应。抽象类HttpServlet 继承自GenericServlet类,具有与GenericServlet类似的方法,并提供了与HTTP相关的实现,支持对HTTP的POST,GET等请求方式进行差异化处理。开发中如果需要编写Servlet,主要就是继承HttpServlet抽象类。

方法名称功能描述
public void service(ServletRequset req,ServletResponse res)GenericServlet 类中service()方法的实现,将请求分发给protected void service(HttpServletRequest req,HttpServletResponse res) 方法
protected void service(HttpServletRequest req,HttpServletResponse res)接收HTTP请求,并将它们分发给此类中定义的doXxx()方法
protected void doXxx(HttpServletRequest req,HttpServletResponse res)根据请求方式的不同分别定义的处理方法,如doGet().doPost()等

经验:HttpServet的service(HttpServletRequest req,HttpServletResponse res)方法相当于一个分发器,可以根据请求方法的类型,调用响应的doXxx()方法。所以在编写Servlet时只需要根据应用的需要,重写doGet() 或者doPost()方法。

ServletConfig接口

Servlet容器使用ServletConfig接口的实例在Servlet初始化期间向其传递配置信息,ServletConfig接口定义的方法如下。

方法名称功能描述
public String getInitParameter(String name)获取web.xml中设置的以name命名的初始化参数值
public ServletContext getServletContext()返回Servlet的上下对象引用

ServletContext 接口

一个ServletContext接口的实例表示一个Web 应用的上下文,Servlet使用ServletContext接口定义的方法与它的Servlet容器进行通信。JSP内置对象application就是ServletContext的实例。
Servlet容器厂商负责提供ServletContext接口的实现,容器在应用程序加载时创建ServletContext对象,ServletContext对象被Servlet容器中的所有Servlet共享。

方法名称功能描述
public String getInitParameter(String name)获取系统范围的名称为name的初始化参数值,系统范围的初始化参数可以在部署描述符中使用元素定义
public void setAttribute(String name,Object object)设置名称为name
public Object getAttribute(String name)获取名称为name的属性
public String getRealPath(String path)返回参数所代表目录的真是路径
public void log(String message)记录一般日志信息

ServletRequset 和HttpServletRequset 接口

1.ServletRequset接口
当客户请求时,有Servlet容器创建ServletRequset 对象用于封装客户的请求信息,这个对象将被容器作为service()方法的参数之一传递给Servlet,Servlet能够利用ServletRequset对象获取客户端的请求数据。
ServletRequset常用的接口

方法名称功能描述
public abstract Object getAttribute(String name)获取名称为name的属性值
public abstract void setAttribute(String name,Object object)在请求中保存名称为name的属性
public abstract void removeAttribute(String name)清楚请求中名字为name的属性
public abstract String getCharactEncoding()返回请求体所使用的字符编码
public abstract void setCharacterEncodig()返回请求体的字符编码
public abstract String getParameter(String name)返回请求的参数的值
public abstract String[] getParamterValue(String name)返回指定参数的全部值
public abstract RequestDispatcher getRequestDispatch(String path)返回指向指定路径的请求分发对象

2.HttpServletRequest接口
HttpServletRequest 位于javax.servlet.http包中,继承自ServletRequest接口,通过该接口同样可以获取请求中的参数。HttpServletRequset接口除了继承ServletRequset接口中的方法,还增加了一些用于读取请求信息的方法。

方法名称功能描述
public abstract String getContextPath()返回请求URL中表示请求上下文的路径,上下文路径是请求URL的开始部分
public abstract Cookie[] getCookies()返回客户端在此请求中发送的所有cookie对象
public abstract HTTPSession getSession()返回和此次请求相关联的session,如果没有给客户端分配session,则创建一个新的session
public abstract String getMethod()返回此次请求所使用的HTTP方法的名字,如GEt,POST
public abstract String getHeader()获取指定的请求头信息

ServletResponse 和HttpServletResponse接口

1.ServletResponse接口
Servlet容器在接受客户请求时,除了创建ServletRequset对象用于封装客户的请求信息外,还创建了一个ServletResponse对象,用于响应数据,并且同时将两个对象一并作为参数传递给Servlet。Servlet利用ServletRequset对象获取客户端的请求数据,经过处理后由ServletResponse对象发送响应数据。

方法名称功能描述
public abstract PrintWriter getWriter()返回PrintWriter对象,用于向客户端发送文本
public abstract String getCharacterEncodig()返回在响应中发送的正文所使用的字符编码
public abstract void setCharacterEncodig(String charset)设置发送到客户端的响应的字符编码
public abstract void setContentType(String type)设置发送到客户端响应的内容类型,此时响应的状态属于尚未提交

2.HttpServletResponse接口
于HttpServletRequset对象类似,HttpServletResponse也是集成ServletResponse接口,用于客户端的响应。它除了具有ServletResponse接口的常用的方法外,还添加了新的方法。

方法名称功能描述
public abstract void addCookie(Cookie cookie)增加一个cookie到响应中,这个方法可以多次调用,设置多个cookie
public abstract void addHeader( String name,String value)将一个名称为name,值为value的响应报头添加到响应中
public abstract void sendRedirect·(String location)发送一个临时的重定向响应到客户端,以便客户端访问新的URL
public abstract void encodeURL(String url)使用session ID 对用于重定向的URL进行编码
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值