初学Servlet

什么是Servlet?
Servlet是小的服务程序,它是运行在web服务器上的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet被Web服务器加载和调用。该服务器必须包含支持Servlet的Java虚拟机。

一个简单的Servlet例子

//设置访问或者调用这个servlet的路径
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");//让输出页面支持中文
        PrintWriter out = response.getWriter();//获得输出对象
        out.println("Hello Servlet!");//向请求端输出信息
    }
}

当我们在浏览器中输入http://localhost:8080/TestServlet时我们就可以看到Hello Servlet。

1.1 Servlet的工作原理
Servlet的运行需要Servlet容器的支持,Servlet容器即Servlet运行时所需要的运行环境。Servlet容器接收客户的Servlet的调用请求,调用相应的Servlet,并把结果返回给用户。Servlet容器一般由Java Web Service实现,如常用的TomCat。
具体调用:
首先Web服务器在启动时会启动Servlet容器,当客户通过浏览器向Web服务器发送Servlet请求时,Web服务器接到请求后,对请求进行判断,如果请求为Servlet请求就将Servlet请求交给Servlet容器处理。Servlet容器首先判断是否是第一次对此Servlet进行访问,如果是第一次访问就对该Servlet进行加载,实例化和初始化等操作并将Servlet实例添加到Servlet容器中,如果不是第一次访问,那么直接根据Servlet的请求方式调用Servlet实例的doGet或者doPost方法完成Servlet功能,并将返回结果保存到response参数中交给Servlet容器进行处理。Servlet容器将返回结果从response参数中提取出来交给Web服务器,Web服务器将返回结果通过Http协议发回给请求访问的浏览器,最后浏览器将返回结果进行显示。

1.2 Servlet的生命周期
Servlet的运行状态完成由Servlet容器维护和管理,一个Servlet的生命周期一般有初始化,提供服务和销毁三个阶段。当Servlet容器接受到客户的Servlet请求时,容器首先进行判断此Sevlet是否是第一次被访问,如果是第一次被访问,容器创建Servlet对象,并调用init()方法对Servlet进行初始化,而后调用service()方法为客户提供服务。Servlet实质上是以单例的形式被实现的,它在初始化后一直在内存中活动,后续客户请求该Servlet服务时将不再创建新的Servlet对象,只是新建一个线程调用service()方法提供服务。当服务器重新启动时,所有以及创建的Servlet对象需要被销毁,这时候容器会调用Servlet的destroy()方法,然后把内存中的Servlet对象销毁。

2 Servlet共享变量
在servlet中进行变量的共享可以通过Servlet容器中存在的ServletContext,HttpSession和HttpServletRequest的实例来实现。这三种方式共享变量和获取变量的方法都是一致的,只是在变量的作用域,也就是共享的范围上有所不同。
ServletContext范围最大,应用程序级别的,整个应用程序都能访问(同一个Web项目)HttpSession其次,会话级别的,当前浏览器中都能访问(同一个浏览器)。HttpServletRequest范围最小,请求级别,请求结束(一次http请求),变量的作用域也就结束了

代码演示:
这个是生成共享变量的Servlet

package com.yf.Servlet.Demo;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/share")
public class shareSharingServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        request.setCharacterEncoding("utf-8");
        //使用ServletContext共享变量
        ServletContext sc = this.getServletContext();
        sc.setAttribute("全局","Context");
        //使用HttpSession共享变量
        HttpSession session = request.getSession();
        session.setAttribute("浏览器","Session");
        //使用HttpResqust共享变量
        request.setAttribute("每次Http请求","Request");
        //就在这个Servlet中读取共享变量
        String s1 = (String) sc.getAttribute("全局");
        String s2 = (String) session.getAttribute("浏览器");
        String s3 = (String) request.getAttribute("每次Http请求");

        PrintWriter printWriter =  response.getWriter();
        printWriter.println(s1);
        printWriter.println(s2);
        printWriter.println(s3);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

结果为:
Context
Session
Request

下面是在一个新的Servlet中访问上面的共享变量

package com.yf.Servlet.Demo;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/GetSharingVarsServlet")
public class GetSharingVarsServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        request.setCharacterEncoding("utf-8");
        ServletContext sc = this.getServletContext();
        HttpSession session = request.getSession();

        String s1 = (String) sc.getAttribute("全局");
        String s2 = (String) session.getAttribute("浏览器");
        String s3 = (String) request.getAttribute("每次Http请求");

        PrintWriter printWriter = response.getWriter();
        printWriter.println(s1);
        printWriter.println(s2);
        printWriter.println(s3);


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

运行结果为:
Context
Session
null

下面例子是一个Servlet转发跳转到另外一个Servlet时共享变量的情况

package com.yf.Servlet.Demo;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/ShareAndDispatchServlet")
public class ShareAndDispatchServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setCharacterEncoding("utf-8");
        request.setCharacterEncoding("utf-8");
        //使用ServletContext共享变量
        ServletContext sc = this.getServletContext();
        sc.setAttribute("全局","Context");
        //使用HttpSession共享变量
        HttpSession session = request.getSession();
        session.setAttribute("浏览器","Session");
        //使用HttpResqust共享变量
        request.setAttribute("每次Http请求","Request");
        //使用转发跳转处理
        request.getRequestDispatcher("/GetSharingVarsServlet").forward(request,response);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

运行结果:
Context
Session
Request

最后一个例子是重定向跳转处理的Servlet

package com.yf.Servlet.Demo;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/ShareAndRedirectServlet")
public class ShareAndRedirectServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        request.setCharacterEncoding("utf-8");
        //使用ServletContext共享变量
        ServletContext sc = this.getServletContext();
        sc.setAttribute("全局","Context");
        //使用HttpSession共享变量
        HttpSession session = request.getSession();
        session.setAttribute("浏览器","Session");
        //使用HttpResqust共享变量
        request.setAttribute("每次Http请求","Request");
        //使用重定向跳转处理
        response.sendRedirect("/GetSharingVarsServlet");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

运行结果如下:
Context
Session
null

当我们先用一个浏览器访问shareSharingServlet这个浏览器,然后用这个浏览器访问GetSharingVarsServlet,然后再用另外一个浏览器访问GetSharingVarsServlet时,我们会发现结果如下:
Context
Session
null
这和我们上面所说的相符合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值