`
alex.Lin
  • 浏览: 65857 次
  • 性别: 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  
不错,理的挺清楚。支持。

相关推荐

    servlet/jsp深入详解源代码

    这个名为“servlet/jsp深入详解源代码”的资料集合可能包含了他在Servlet和JSP领域的深入讲解,以及相关的源代码示例。 Servlet是Java平台上的一个标准接口,它允许开发者编写可被Web服务器调用的Java代码来处理...

    servlet/jsp深入详解 基于tomcat的web开发

    在本文中,我们将深入探讨Servlet和JSP技术,以及如何基于Tomcat服务器进行Web应用程序的开发。Servlet和JSP是Java EE(企业版)平台中用于构建动态网页的关键技术,而Tomcat则是一个广泛使用的开源Java Servlet容器...

    servlet/JSP + mysql BBS项目

    综上所述,这个servlet/JSP + mysql BBS项目是一个综合运用Java Web技术和数据库管理的实例,通过Servlet处理业务逻辑,JSP展现用户界面,MySQL存储数据,共同构建了一个交互式的在线论坛系统。

    servlet /jsp

    Servlet和JSP是Java Web开发中的核心技术,它们用于构建动态Web应用程序。Servlet是Java编程语言中的一个接口,它允许服务器扩展其功能,处理HTTP请求并返回响应。JSP(Java Server Pages)则是一种视图技术,它将...

    韩顺平servlet/jsp ppt

    韩顺平servlet/jsp 知识详尽 重点突出 适合初学者学习 结合韩老师的视频会有非常好的效果

    javax.servlet.jar下载

    javax/servlet/jsp/resources/web-jsptaglibrary_1_2.dtd javax/servlet/jsp/resources/web-jsptaglibrary_2_0.xsd javax/servlet/jsp/resources/jspxml.dtd javax/servlet/jsp/resources/jsp_2_0.xsd javax/servlet...

    java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/ConditionalTagSupport 问题-附件资源

    java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/ConditionalTagSupport 问题-附件资源

    基于servlet/jsp的学生信息录入查询系统

    【基于Servlet/JSP的学生信息录入查询系统】 这个项目是一个典型的Web应用程序,主要目的是帮助初学者理解和实践Servlet和JSP在构建动态网站时的作用。Servlet是Java服务器端编程的基础,而JSP则是为了简化HTML和...

    北大青鸟6.0课件S2使用JSP/Servlet/Ajax技术开发新闻发布系统2

    北大青鸟6.0课件S2使用JSP/Servlet/Ajax技术开发新闻发布系统2,,我只能上传小于50M的文件,所以分了2次上传,下载使用JSP/Servlet/Ajax技术开发新闻发布系统1后就是全部的了。如有问题加Q:329139513.注明来意

    Servlet/jsp网上书城

    Servlet/jsp网上书城是一个基于Java Web开发的项目,它运用了Servlet和JSP(JavaServer Pages)技术来构建一个基本的在线购物平台,用于展示、购买书籍并管理订单。这个项目的核心目标是提供一个用户友好的界面,让...

    servlet/jsp聊天室

    该功能可以对所有人发言,也可以单独对某一个人发言。运用到的技术servlet/jsp.

    Servlet/jsp编写的网上书城

    本项目“Servlet/jsp编写的网上书城”显然是一款基于这两项技术实现的在线图书销售平台。接下来,我们将深入探讨Servlet、JSP以及它们在构建书城系统中的应用。 **Servlet简介** Servlet是Java提供的一种服务器端的...

    servlet/jsp 入门教程

    配置Servlet/JSP运行环境** 为了运行Servlet和JSP,我们需要安装和配置Servlet容器,比如Apache Tomcat 6.0。Tomcat是一个开源的Servlet容器,符合Servlet和JSP规范,能提供运行Java Web应用的环境。 **5-17. 编写...

    servlet/jsp(jtds)实例

    标题中的“servlet/jsp(jtds)实例”可能是指一个教学项目或案例,展示了如何在Servlet和JSP中使用jtds驱动程序访问SQL Server数据库。jtds是一个开源的JDBC驱动程序,专门用于与Microsoft SQL Server和Sybase ASE...

    servlet/jsp--API

    Servlet和JSP(JavaServer Pages)是Java Web开发中的核心技术,它们构成了Web应用程序的基础。在Java API中,Servlet和JSP API提供了处理HTTP请求、动态生成响应内容以及与数据库交互的能力。这篇详述将深入解析这...

    Servlet JSP深入详解 基于Tomcat的Web开发

    ### Servlet与JSP深入详解:基于Tomcat的Web开发 #### 一、Servlet技术概述 Servlet是一种用Java编写的服务器端应用程序接口(API),它扩展了Java Web开发的功能。Servlet可以响应HTTP请求,并且能够处理复杂的...

    JSP与Servlet核心技_.rar_CSAJSP chapter 16_Servlet/JSP_jsp+servlet_se

    **JSP(Java Server Pages)与Servlet是Java Web开发中的两个关键组件,它们共同构建了动态Web应用程序的基础。** **JSP技术:** JSP是一种服务器端的技术,它允许开发者在HTML页面中嵌入Java代码,以实现动态内容...

    jsp-servlet-javaBean.zip_Servlet/JSP_javabean_javabean servlet_j

    本教程通过"jsp-servlet-javaBean.zip"压缩包,旨在帮助开发者深入理解并熟练运用Servlet、JSP(JavaServer Pages)以及JavaBean,实现经典的MVC(Model-View-Controller)设计模式。以下将详细介绍这三个核心概念...

    servlet/jsp自定义错误页面

    在`error.jsp`页面中,开发者可以获取`request`对象中包含的错误信息,如状态码(`javax.servlet.error.status_code`)、错误消息(`javax.servlet.error.message`)和异常类型(`javax.servlet.error.exception_...

    javaEE/servlet/jsp api;参考文档

    Servlet和JSP(JavaServer Pages)是Java EE中两个核心的组件,它们在Web应用程序的开发中起着至关重要的作用。 Servlet是一种Java类,它被设计用来扩展服务器的功能,尤其是Web服务器。Servlet API提供了处理HTTP...

Global site tag (gtag.js) - Google Analytics