Servlet学习笔记

1. Servlet简介

Servlet是sun公司提供的一门用于开发动态web资源的技术。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

2.Servlet的运行过程

Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
(1)Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第(4)步,否则,执行第(2)步。
(2)装载并创建该Servlet的一个实例对象。
(3)调用Servlet实例对象的init()方法。
(4)创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
(5)WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
和servlet的运行过程对应的,它的生命周期如下图所示:
(1)通常情况下,服务器会在Servlet第一次被调用时创建该Servlet类的实例对象(servlet出生);一旦被创建出来,该Servlet实例就会驻留在内存中,为后续请求服务;直至web容器退出,servlet实例对象才会被销毁(servl亡)。
(2)在Servlet的整个生命周期内,Servlet的init方法只有在servlet被创建用一次。
(3)而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用XX方法。
(4)servlet被销毁前,会调用destroy() 方法。

3.Servlet的继承结构

servlet是一个接口,这个接口的方法如下:

public interface Servlet {
    //初始化方法
    public void init(ServletConfig config) throws ServletException;
    //获取上下文的方法
    public ServletConfig getServletConfig();
    //运行方法
    public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;
    //获取信息
    public String getServletInfo();
    //销毁方法
    public void destroy();
}

结合上面servlet的生命周期我们可以知道这个servlet的方法调用过程。

Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
其中GenericServlet是一个抽象类。

HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或去而不用重写service方法。

4.servlet的常用对象

在平时的开发中,我们会经常用到servlet中的一些对象,下面我简单介绍一下部分对象及其用法。
(1)ServletConfig
ServletConfig代表servlet配置的对象,可以在web.xml中servlet中配置

    <servlet>
        <servlet-name>Demo5Servlet</servlet-name>
        <servlet-class>cn.itheima.Demo5Servlet</servlet-class>
        <init-param>
            <param-name>data1</param-name>
            <param-value>value1</param-value>
        </init-param>
      </servlet>

然后在servlet中利用this.getServletConfig()获取ServletConfig对象,该对象提供getInitParameter()和getInitParameterNames()方法,可以遍历出配置中的配置项。不想在servlet中写死的内容可以配置到此处。
(2)ServletContext
ServletContext对象代表整个web应用,这个对象的用途如下:
- 作为域对象使用,在不同servlet之间传递数据,作用范围是整个web应用
- 在web.xml可以配置整个web应用的初始化参数,利用ServletContext去获得

<context-param>
        <param-name>param1</param-name>
        <param-value>pvalue1</param-value>
    </context-param>
 this.getServletContext().getInitParameter("param1")
    this.getServletContext().getInitParameterNames()


- 在不同servlet之间进行转发

this.getServletContext().getRequestDispatcher("/servlet/Servlet2").forward(request, response);

(3)Response
- 利用Response据到客户端输出数

response.getOutputStream().write("中文".getBytes())输出数据,这是一个字节流,是什么字节输出什么字节,而浏览器默认用平台字节码打开服务器发送的数据,如果服务器端使用了非平台码去输出字符的字节数据就需要明确的指定浏览器编码时所用的码表,以防止乱码问题。response.addHeader("Content-type","text/html;charset=gb2312")
response.getWriter().write(“中文”);输出数据,这是一个字符流,response会将此字符进行转码操作后输出到浏览器,这个过程默认使用ISO8859-1码表,而ISO8859-1中没有中文,于是转码过程中用?代替了中文,导致乱码问题。可以指定response在转码过程中使用的目标码表,防止乱码。response.setCharcterEncoding("gb2312");
  • 利用Response 设置 content-disposition头实现下载
    设置响应头content-disposition为“attachment;filename=xxx.xxx”
  • refresh头控制定时刷新
设置响应头Refresh为一个数值,指定多少秒后刷新当前页面
设置响应头Refresh3;url=/Day05/index.jsp,指定多少秒后刷新到哪个页面
可以用来实现注册后“注册成功,3秒后跳转到主页”的功能
在HTML可以利用<meta http-equiv= "" content="">标签模拟响应头的功能。
  • Response实现请求重定向
    response.sendRedirect("URL");

    (4)Request
  • 获取客户机信息

    getRequestURL方法返回客户端发出请求完整URL
    getRequestURI方法返回请求行中的资源名部分,在权限控制中常用
    getQueryString 方法返回请求行中的参数部分
    getRemoteAddr方法返回发出请求的客户机的IP地址
    getMethod得到客户机请求方式
    getContextPath 获得当前web应用虚拟目录名称
  • 获取请求头信息

    getHeader(name)方法 --- String ,获取指定名称的请求头的值
    getHeaders(String name)方法 --- Enumeration<String> ,获取指定名称的请求头的值的集合,因为可能出现多个重名的请求头
    getHeaderNames方法 --- Enumeration<String> ,获取所有请求头名称组成的集合
    getIntHeader(name)方法  --- int ,获取int类型的请求头的值
    getDateHeader(name)方法 --- long(日期对应毫秒) ,获取一个日期型的请求头的值,返回的是一个long值,从从1970年1月1日0时开始的毫秒值
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值