深入HttpServlet与ServletContext
在很多时候我们并不需要知道HttpServlet这个类是怎么构建的,只要知道它把你需要的东西给你封装好了,你只要去重写就好了。
在宏观上来,servlet是这样子工作的:写好一个servlet,抛给tomcat,tomcat调用servlet的方法(doget、dopost),执行重写的逻辑(往页面上返回处理结果)就大功告成了。
你可以这样子去理解,但我不建议你仅仅满足于此。你应该打开HelloServlet的源码看一下,而不是把它作为一个黑盒来使用。举个例子:一个人想要看电视,而这个人一点都不懂技术,那他的做法是买一个,按下开关就能看电视了;对于生产线的工人,他要看电视,他的做法是组装一台电视,只需要知道一点接口的知识,简单又便宜;对于一个工程师来说,它的做法是设计出一台价格合适、性能高、私人订制的电视。如果你的目标是成为一名工程师,那么你就需要达到第三种的水平,即了解原理。我能保证了解原理后,你能在这个领域游刃有余!
HttpServlet
介绍
-
Servlet是Sun公司开发的一门用于开发动态Web的语言
-
我们把实现了Servlet接口Java的程序叫做Servlet
-
HttpServlet在实现Servlet接口的基础上,重写了GenericServlet的里的抽象方法Service,
实现了针对不同的Http请求,自动判断选择调用不同的处理方法,省去了判断请求方法的这一步,
对HTTP协议的封装,简化了操作,HttpServlet由此得名
类之间的继承关系
HelloServlet.png实现步骤:
-
定义类继承HttpServlet
-
复写doGet();dopost();方法
实现流程:
HTTPServlet实现流程.jpgServletContext
ServletContext是什么
Web容器在启动时,它会为每个web程序创建一个对应的ServletContext对象,它代表了当前的web应用
ServletContext翻译过来是上下文的意思,是在所用Servlet之上的一个对象,为所有的Servlet共享
“上下文”可以理解为环境,这个环境中可能会包含很多的信息,例如变量、数据等信息。
它们的关系如下图: ServletContext.jpgServletContext能干什么
-
共享数据
我在这个Servlet中保存的数据,可以在另外一个servlet中拿到
-
获取初始化参数
-
请求转发
测试用例如下:
demo1:存取数据
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
ServletContext servletContext = this.getServletContext();
String name = "hwx";
servletContext.setAttribute("name",name);
}
demo2:获取初始化参数
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
res.setContentType("text/html");
res.setCharacterEncoding("utf-8");
PrintWriter writer = res.getWriter();
writer.print("name:"+this.getServletContext().getAttribute("name"));
writer.print("url:"+this.getServletContext().getInitParameter("url"));
}
demo3:请求转发
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
ServletContext servletContext = this.getServletContext();
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/index");
requestDispatcher.forward(req,res);
}
web.xml:
<webapp>
<context-param>
<param-name>url</param-name>
<param-value>www.baidu.com</param-value>
</context-param>
</webapp>