`
alex.Lin
  • 浏览: 64990 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Servlet/JSP背后的故事

    博客分类:
  • java
阅读更多

Servlet、JSP对所有JAVA-WEB编程人员来说再熟悉不过了;但大家在使用的时候是否知道他们的关系呢?

 

1       Http协议

略(详见[LXH]Http协议.pdf

 

2       浏览器与服务器连接的过程

AServer端:启动并监听某个端口号(如8080

BClient端:通过浏览器发起对服务端的请求

CS:接收请求,并分配一个线程与之连接并开始相互通讯(HTTP,基于TCP

D、通讯完毕,双方断开连接,回收资源。

(类似Socket的通讯过程,详见[LXH]Java网络编程.pdf

3       SERVLET/JSP

Server端,都是通过java类取数据并返回html格式的字符串给浏览器解析

3.1最早的方式:Servlet

html标签字符串写在servlet类里,最后response给浏览器

                   doGet(…){

                                      Out.println(“<html><head></head><body>”);

                                      ….

                                      Out.println(“</body></html>”)

                                     

}

这样的写法很麻烦,而且每次都要在.java类里修改,重新编译,再发布,不便于修改。

3.1.1                           HttpServlet源码分析

Provides an abstract class to be subclassed to create an HTTP servlet suitable for a Web site. A subclass of HttpServlet must override at least one method, usually one of these: 必须重写至少1个以下方法

  • doGet, if the servlet supports HTTP GET requests
  • doPost, for HTTP POST requests
  • doPut, for HTTP PUT requests
  • doDelete, for HTTP DELETE requests
  • init and destroy, to manage resources that are held for the life of the servlet
  • getServletInfo, which the servlet uses to provide information about itself

service()接收标准HTTP请求,并将其转发给其所要执行的方法(如doGetdoPost),即先执行service()后自动执行其他方法

查看一下HttpServlet.java源码片段(tomcat源码里可以下载到)

protectedvoid service(HttpServletRequest req, HttpServletResponse resp)

        throws ServletException, IOException {

        String method = req.getMethod();

              //往下可以看出,最后还要负责转发原请求

        if (method.equals(METHOD_GET)) {

                     ...

                     doGet(req,resp);

}elseif (method.equals(METHOD_HEAD)) {

            ...

            doHead(req, resp);

        } elseif (method.equals(METHOD_POST)) {

            doPost(req, resp);           

        } elseif (method.equals(METHOD_PUT)) {

            doPut(req, resp);                   

        } elseif (method.equals(METHOD_DELETE)) {

            doDelete(req, resp);           

        } elseif (method.equals(METHOD_OPTIONS)) {

            doOptions(req,resp);           

        } elseif (method.equals(METHOD_TRACE)) {

            doTrace(req,resp);           

        } else {

                ...

resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);

}

}

因此重写service()方法后如果不再调用super.service(req,resp);则不会再做原有的动作了。

 

doGet()方法(默认返回错误,需子类自己重写)

protectedvoid doGet(HttpServletRequest req, HttpServletResponse resp)

        throws ServletException, IOException

    {

        String protocol = req.getProtocol();

        String msg = lStrings.getString("http.method_get_not_supported");

        if (protocol.endsWith("1.1")) {

            resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);

        } else {

            resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);

        }

}

 

doPost()方法(默认返回错误,需子类自己重写)

protectedvoid doPost(HttpServletRequest req, HttpServletResponse resp)

        throws ServletException, IOException {

 

        String protocol = req.getProtocol();

        String msg = lStrings.getString("http.method_post_not_supported");

        if (protocol.endsWith("1.1")) {

            resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);

        } else {

            resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);

        }

    }

3.2Jsp的方式(底层也是基于Servlet的方式)

JSP ParserJSP解析器

              负责将*.jsp文件转换成一个Servlet类,并且编译供Servlet分析器来执行---最后又走到Servlet流程

Jasper.jarjsp-api.jarservlet-api.jar等包(一般java web server都会包含)

我们可以在jsp里把java代码嵌进去

<html><head></head><body>

<% 执行java代码%>

</body></html>

tp

 

 

               (JSP执行过程1)

从上图可以看出,*.jsp通过jsp parser会自动生成一个*.java类,并且编译成*.class文件,供Servlet使用,最后也是走servlet的流程---这个工作一般由web server来完成

 

Tomcat为例

Work文件夹里面会为jsp生成相关的java类,并完成编译供运行调用

              index.jsp------àindex_jsp.java--àindex_jsp.class

              查看如下代码段:

              public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase

implements org.apache.jasper.runtime.JspSourceDependent {

….

                      out.write("<html>\r\n");

    out.write("<head>\r\n");

    out.write("\t<title>\r\n");

        ….

}

          查看HttpJspBase源码

org.apache.jasper.runtime
Class HttpJspBase

        java.lang.Object
         javax.servlet.GenericServlet
                javax.servlet.http.HttpServlet
                        org.apache.jasper.runtime.HttpJspBase
 
   其就是继承HttpServlet,所以说jsp其最终还是走servlet流程

 

 

 

Web Server 执行生成和编译的时机

--------并不是每次调用都执行,而是在文件创建或修改后的第一次调用,才会执行生成和编译操作.

 

 

推荐阅读

 

代码之余轻松一下:当前热门-人民的名义

 

JAVAEE容器如何管理EntityManager和PersistenceContext

2
2
分享到:
评论
1 楼 lishl 2012-02-23  
不错,理的挺清楚。支持。

相关推荐

    setuptools-41.0.0-py2.py3-none-any.whl

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Google Cloud Storage(使用gsutil下载)

    Google Cloud CLI安装包GoogleCloudSDKInstaller.exe

    setuptools-18.3.zip

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    罗兰贝格_xx业务计划与控制体系最终报告gltp.pptx

    罗兰贝格_xx业务计划与控制体系最终报告gltp.pptx

    基于JSP医院在线挂号管理系统源码.zip

    这个是一个JSP医院在线挂号管理系统,管理员角色包含以下功能:管理员登录,医生用户管理,修改密码,科室类别信息管理,医生信息管理,添加医生信息,查询医生信息,注册用户管理,黑名单管理,预约信息管理,查询预约信息,医生预约查询,预约信息统计,科室汇总统计等功能。患者角色包含以下功能:查看首页,患者登录,修改密码,修改个人资料,查看预约信息,查看医生信息,查看科室分类,医生查询,预约医生等功能。… 本项目实现的最终作用是基于JSP医院在线挂号管理系统 分为4个角色 第1个角色为管理员角色,实现了如下功能: - 修改密码 - 医生信息管理 - 医生用户管理 - 医生预约查询 - 查询医生信息 - 查询预约信息 - 注册用户管理 - 添加医生信息 - 科室汇总统计 - 科室类别信息管理 - 管理员登录 - 预约信息管理 - 预约信息统计 - 黑名单管理

    麦肯锡-年月―中国xx集团战略咨询项目建议书gltp.pptx

    麦肯锡-年月―中国xx集团战略咨询项目建议书gltp.pptx

    公开整理-各省碳排放数据集(1990-2022年).xlsx

    详细介绍及样例数据:https://blog.csdn.net/li514006030/article/details/138872006

    Screenshot_2024-05-14-22-47-39-925_com.alibaba.android.rimet.hznu.jpg

    Screenshot_2024-05-14-22-47-39-925_com.alibaba.android.rimet.hznu.jpg

    基于Python+Flask弹幕情感分析的直播高光时刻判断模型设计与系统实现+系统功能说明+全部资料齐全+部署文档.zip

    【资源说明】 基于Python+Flask弹幕情感分析的直播高光时刻判断模型设计与系统实现+系统功能说明+全部资料齐全+部署文档.zip基于Python+Flask弹幕情感分析的直播高光时刻判断模型设计与系统实现+系统功能说明+全部资料齐全+部署文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    Vue开发基于Vue + Node的外卖系统设计与实现【源码+lw+部署文档+讲解】

    内容概要:这个项目是基于Vue.js和Node.js的外卖系统的设计与实现,旨在帮助开发者通过实践掌握Vue.js和Node.js的应用,并了解外卖系统的开发流程和技术选型。该系统旨在提供一个完整的在线订餐平台,包括用户注册登录、浏览商家和菜单、下单支付、配送跟踪等功能,以提升用户的订餐体验。源码包含了前端Vue.js和后端Node.js的代码,部署文档详细介绍了系统的部署步骤和环境配置要求,讲解内容涵盖了系统的功能模块、技术选型理由、设计思路以及使用方法。 适合人群:对Vue.js和Node.js有一定了解,并希望通过实践项目提升技能的开发者。 能学到什么:①掌握Vue.js和Node.js的开发流程;②了解外卖系统的业务逻辑和实现方法;③学习前后端分离的开发模式;④了解部署和维护一个完整项目的流程。 阅读建议:本资源旨在帮助开发者通过实践项目掌握Vue.js和Node.js的应用,并了解外卖系统的开发流程。建议在学习过程中结合部署文档进行实践,并深入理解讲解内容中的技术原理和设计思路。同时,鼓励开发者根据实际需求对项目进行拓展和优化,以提升自己的技术水平。

    基于SSM+jsp的家居商城系统

    大学生毕业设计、大学生课程设计作业

    python企业编码管理的程序(可执行程序+源码).zip

    具体的操作步骤如下: (1)生成6位数字防伪编码。当用户在主程序界面中输入数字“1”菜单项时,将进入“生成6位数字防伪编码 (213563型)”的功能执行任务。此时要求输入生成防伪码的数量,可以根据需要输入生成防伪码的数量,如图2所示。按下<Enter>键,开始批量生成防伪码,生成后系统将提示用户生成了多少个注册码和生成文件的位置信息等,如图3所示。单击“确定”按钮,关闭提示信息。在屏幕上可以看到生成的防伪码信息,如图4所示。生成的文件在程序所在目录下的“codepath”文件夹下,名称为“scode1.txt”,如图5所示。

    Centos7-离线安装redis

    Centos7-离线安装redis

    基于JSP鲜花商城网站系统源码.zip

    这个是一个JSP鲜花商城网站系统,用户角色包含以下功能:用户登录与注册,修改个人信息,查看首页,查看分类,查看热销,查看订单,查看鲜花详情,加入购物车,提交订单等功能。管理员角色包含以下功能:订单管理,客户信息管理,鲜花管理,鲜花类目管理,管理员登录等功能。

    setuptools-3.5.1-py2.py3-none-any.whl

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    备自投动作不成功事故处理tp.pptx

    备自投动作不成功事故处理tp.pptx

    基于JSP户籍管理系统源码.zip

    这个是一个JSP户籍管理系统,管理员角色包含以下功能:管理员登陆,户籍管理,迁入管理,迁出管理,反馈投诉管理等功能。用户角色包含以下功能:用户登陆,户籍信息查看,迁入查询,反馈建议等功能。 本项目实现的最终作用是基于JSP户籍管理系统 分为2个角色 第1个角色为管理员角色,实现了如下功能: - 反馈投诉管理 - 户籍管理 - 管理员登陆 - 迁入管理 - 迁出管理 第2个角色为用户角色,实现了如下功能: - 反馈建议 - 户籍信息查看 - 用户登陆 - 迁入查询

    setuptools-36.4.0-py2.py3-none-any.whl

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Pro Docker/如何使用容器服务进行开发和部署

    如何使用容器服务进行开发和部署

    java班级管理系统.zip

    java班级管理系统

Global site tag (gtag.js) - Google Analytics