Web服务工作原理概览

web服务器的作用本质是提供内容。一开始只是将静态的内容(文件)传送出去,后来CGI技术允许动态的内容的出现。

web容器是web服务器中管理servlet组件的一部分,是servlet的运行时环境。在Java里web容器就是servlet容器。servlet容器有管理servlet的生存周期,为servlet匹配url等作用。

Servlet

在Java中,开发者使用servlet来生成动态内容。Servlet接口在javax.servlet package中被定义。有3个重要的生存期方法,分别是init(), service(), and destroy()。这些方法在这些时候被调用:

  • 在Servlet生命周期的初始化阶段,web容器通过调用init()方法来初始化Servlet实例,并且可以传递一个实现 javax.servlet.ServletConfig 接口的对象给它。这个方法在Servlet实例的生命周期里只调用一次。
  • 初始化后,Servlet实例就可以处理客户端请求了。web容器调用Servlet的service()方法来处理每一个请求。
  • 最后,web容器调用destroy()方法来终结Servlet。如果想在Servlet的生命周期内关闭或者销毁一些文件系统或者网络资源,可以调用这个方法来实现。destroy() 方法和init()方法一样,在Servlet的生命周期里只能调用一次。

Servlet类通过懒惰装载和预先装载这两种方式被装载到容器中,一个实例可以为多个线程服务。卸载时由JVM进行垃圾回收。
ServletContext定义了Servlet和容器之间交流的方法,在web应用装载时有Servlet容器创建出来。同时,在web.xml中定义的Servlet, Filter and Listener都会被创建出一个类的实例。

创建一个Servlet需要注意以下几点:

  • MyServlet类需要继承了HttpServlet。Servlet类要么是继承了javax.servlet.GenericServlet的普通Servlet,要么是继承了 javax.servlet.http.HttpServlet的HTTP Servlet。
  • 重载 doGet() 和 doPost() 方法。这两个方法都已在 HttpServlet 类里定义了。当一个GET或POST请求到来时,它就会被映射到相应的方法里。例如,如果你向这个servlet发送一个HTTP GET请求,doGet()方法就会被调用。如:
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        //Do some other work
    }
  • HttpServletRequest 和 HttpServletResponse 是所有doXXX()方法的默认参数。

Servlet容器和web服务器连接在一起,web服务器在特定的端口处(80)监听HTTP请求。当client(浏览器)发送一条HTTP请求时,Servlet容器创建了HttpServletRequest和HttpServletResponse各一个实例,然后匹配事先创建好的filter、servlet实例与请求的url,再把Request、Response传递给匹配实例的方法。requst实例的作用是处理HTTP请求的信息(HTTP头,请求主体);response实例的作用是帮助控制发送HTTP响应。

在web应用中,要获取请求参数,需要调用 HttpServletRequest 对象的 getParameter() 方法,并且传递你要获取的输入参数的id给该方法。

String value1 = req.getParameter("param1");
String value1 = req.getParameter("param2");

使用RequestDispatcher.forward()转发请求到另一个Servlet:有时候,你的应用需要把一个Servlet要处理的请求转让给另外的Servlet来处理并完成任务。而且,转让请求时不能重定向客户端的URL。即浏览器地址栏上的URL不会改变。在 ServletContext 里已经内置了实现上面需求的方法。当你获取了 ServletContext 的引用,你就可以简单地调用getRequestDispatcher()方法去获取用来转发请求的 RequestDispatcher 对象。当调用getRequestDispatcher()方法时,需要传递包含servlet名的字符串,这个Servlet就是你用来处理转让请求的Servlet。获取 RequestDispatcher 对象后,通过传递 HttpServletRequest 和HttpServletResponse 对象给它来调用转发方法。转发方法负责对请求进行转发。如下:

RequestDispatcher rd = servletContext.getRequestDispatcher("/NextServlet");
rd.forward(request, response);

使用HttpServletResponse.sendRedirect()重定向请求到另一个Servlet:
当应用内的特定URL被访问时,你想把浏览器的URL重定向到另外一个。要实现这种功能,你需要调用 HttpServletResponse 对象的sendRedirect()方法。

httpServletResponse.sendRedirect("/anotherURL");

ps:请求转发和重定向区别

Session和Cookie

client第一次访问web应用时,或HttpSession通过request.getSession()获得时,servlet会生成一个长而独特的ID( session.getId()),然后存在内存里,再在response中设置一个Cookie,JSESSIONID作为Cookie名,ID值作为Cookie的值。在Http Cookie验证阶段,client回送有效的Cookie,servlet容器会使用Cookie的值来从内存中获取HttpSession。 HttpSession默认存活30分钟,client30分钟内没有访问web应用就会被销毁。client用新的browser实例去访问会创建一个新的HttpSession。

线程安全

public class MyServlet extends HttpServlet
{
    private Object thisIsNOTThreadSafe; //Don't to this
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Object thisIsThreadSafe;
 
        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
    }
}

这段代码很好的解释了如何规避线程不安全的行为。一个Servlet实例能为多个请求服务,如果多个请求共用一个变量就会造成线程不安全。

参考

ps:JSP技术参考:javaweb入门笔记(6)-JSP技术

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,169评论 11 349
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,396评论 0 10
  • 什么是Servlet Servlet的作用是为Java程序提供一个统一的web应用的规范,方便程序员统一的使用这种...
    Rick617阅读 10,763评论 2 48
  • 一 servlet概述 狭义的Servlet指javax.servlet包中的一个接口,而广义的Servlet则是...
    静慎独阅读 447评论 0 0
  • 1、 摔门的那一刹那间,听见母亲萋萋的哭声,我知道我这次玩大了…眼睛湿润了… "让你相亲就这么难吗?能不能像对待工...
    Ply坤阅读 881评论 0 0