`
yzl495
  • 浏览: 54212 次
  • 性别: Icon_minigender_1
  • 来自: 赣州
文章分类
社区版块
存档分类
最新评论

深入理解Servlet和JSP原理

 
阅读更多

一、什么是Servlet?      

Servlet是由Sun公司制定的服务器端组件规范。它不但指定了作为一个Servlet组件的特征,同时也指定了作为运行Serlvet的系统(称之为Servlet容器)应具备的特征。     Servlet组件运行在Servlet容器下,由Servlet容器负责诸如“实例化并管理Servlet对象”、“调用Servlet生命周期方法”、“解析及封装特定协议的请求和响应”等工作。    Servlet类应实现javax.servlet.Servlet接口并实现其生命周期方法。其中最主要的是    public void service(ServletRequest request, ServletResponse response)         throws ServletException, IOException {        ... ... ...    }     

容器收到请求后即会调用该方法。面对大量的用户访问,Servlet容器一般采用“单实例,多线程”的方式管理Servlet,即Servlet容器只会创建一个Servlet实例,针对不同的用户访问将开启不同的线程运行service方法,Servlet容器一般会维护一个线程池去管理这些线程。鉴于Servlet容器的这种管理方式,对于service方法而言应注意线程安全的问题。    一般在实际中常常使用的是基于HTTP协议的Servlet,作为基于HTTP协议的Servlet可以通过继承javax.servlet.HttpServlet得到。HttpServlet类实现了Servlet接口,并在service方法中根据不同的请求(get或post等)调用相应的方法(doGet或doPost)。一般情况下,作为HttpServlet的子类可以重写其doGet方法用于处理Get请求,重写doPost方法用于处理Post请求。 另外HttpServlet可以重写init()和destory()方法 init()方法用于定义初始化逻辑,Servlet一创建后即会被调用。  destory()方法将在Servlet实例销毁前调用。     一个HttpServlet需要有特定的部署描述符(web.xml,置于应用的/WEB-INF中)指定其特征:其定义如下:    

<servlet>       <servlet-name>Tst</servlet-name>       <servlet-class>test.TestServlet</servlet-class>       <init-param>         <param-name>someKey</param-name>         <param-value>someValue</param-value>       </init-param>       <load-on-startup>0</load-on-startup>     </servlet>       <servlet-mapping>        <servlet-name>Tst</servlet-name>        <url-pattern>/test</url-pattern>     </servlet-mapping> 子元素指定Serlvet的名称,作为该Servlet的唯一标识。  子元素用于指定Servlet的类名。  的子元素用于定义所谓基于键-值对的初始化参数,Servlet对象可以通过调用ServletConfig对象的getInitParameter(String name)获取制定指定键的对应值。 可以有多个元素,用于定义Servlet在工作时要获取的某些初始化信息(如:要读取的某些属性文件的路径等 )。 的子元素用于指定是在Servlet容器启动时即创建该Servlet对象,还是在Serlvet容器接收到针对该Servlet的请求后再实例化该Servlet对象。的值为负数时采取后一种策略,的值为0或正数时采取前一种策略。web.xml中可能会定义多个为正数的Servlet,Servlet容器会根据其值得大小决定其实例化顺序,值小的先实例化,值大的后实例化。       元素用于把特定的Servlet映射到一个URI地址,当Servlet容器收到针对该地址发出的请求时即会实例化相应的Servlet对象,并调用其特定方法。例如某个Servlet的url-pattern为"/test"则当在浏览器的地址栏输入".../应用名/test"时,Servlet容器将会访问 该Servlet。     作为Tomcat服务器,还可以通过其他的方式访问Servlet,在其安装目录的conf子目录下有也有一个web.xml该web.xml中定义了一些Servlet,这些Servlet属于Tomcat内置的Servlet,在Tomcat服务器一启动时即会实例化这些Servlet对象。    其中InvokerServlet的配置信息如下:     

<servlet>         <servlet-name>invoker</servlet-name>         <servlet-class>           org.apache.catalina.servlets.InvokerServlet         </servlet-class>         <init-param>             <param-name>debug</param-name>             <param-value>0</param-value>         </init-param>         <load-on-startup>2</load-on-startup>     </servlet>       <servlet-mapping>         <servlet-name>invoker</servlet-name>         <url-pattern>/servlet/*</url-pattern>     </servlet-mapping>       该Servlet用于访问其他的Servlet,其默认的url-pattern配置为/servlet/*。当我们在浏览器的地址栏输入“.../servlet/其他Servlet的类名” 时,则Tomcat容器将通过InvokerServlet访问该Servlet(即使该Servlet没有在web.xml进行定义)    例如:在浏览器的地址栏输入".../应用名/servlet/servet.TestServlet时,Servlet容器即会对test.TestServlet进行访问。这种访问方式将便于对Servlet的测试。    我们可以关注Tomcat另外的一个内置Servlet:DefaultServlet可以用于列出应用下某个目录的内容,该Servlet的配置信息如下:       <servlet>         <servlet-name>default</servlet-name>         <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>         <init-param>             <param-name>debug</param-name>             <param-value>0</param-value>         </init-param>         <init-param>             <param-name>listings</param-name>             <param-value>true</param-value>         </init-param>         <load-on-startup>1</load-on-startup>     </servlet>       更改其配置信息的名为listings的初始化参数值为true时,当输入某个应用的目录时DefaultServlet可以用下图的方式列出该目录中的内容并可实现链接导航。这样的功能会对测试有一定的帮助。     

二、什么是JSP?      准确的说,JSP就是Servlet,JSP是一个标准的文本文件,在第一次访问时,Servlet会将该文件“翻译”成Servlet,然后再实施调用。不同的应用服务器会有不同的翻译方式。     针对于Tomcat服务器而言,我们可以在conf/web.xml中关注定义的另外一个内置Servlet:JspServlet,该Servlet的功能在于“翻译”JSP并对其实施访问,该Servlet的定义如下:        <servlet>         <servlet-name>jsp</servlet-name>         <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>         <init-param>             <param-name>fork</param-name>             <param-value>false</param-value>         </init-param>         <init-param>             <param-name>xpoweredBy</param-name>             <param-value>false</param-value>         </init-param>         <load-on-startup>3</load-on-startup>     </servlet>     <servlet-mapping>         <servlet-name>jsp</servlet-name>         <url-pattern>*.jsp</url-pattern>     </servlet-mapping>     注意该Servlet的url-pattern为“*.jsp”及所有后缀为“.jsp”等请求将会访问该Servlet,例如:在浏览器地址栏输入“.../应用名/test.jsp”将访问该Servlet     而该Servlet将首先获取名为test.jsp文件的内容将其编译成并实施调用。     可以做一个小的实验,在conf/web.xml中替换JspServlet对应的url-pattern(例如:改成hey),重启Tomcat服务器,访问内容如下所示的hello.jsp(地址为".../应用名/hello.jsp")      <html>      <head>        <title>hello.jsp</title>        </head>        <body>        <%         for (int i = 0; i <= 100; i++) {           out.println("helloworld");         }        %>       </body>     </html>     通过在浏览器中"单击右键->查看源文件"的方式可以看到浏览器你收到的内容为:      <html>        <head>          <title>hello.jsp</title>        </head>        <body>        <%         for (int i = 0; i <= 100; i++) {           out.println("helloworld");         }        %>       </body>     </html>     可见该jsp并没有被解析,而是以静态文本的方式原样输出。     在Tomcat安装目录下的\work\Catalina下可以找到JSP经过“翻译”后的Java源文件和编译后类文件,对于上面hello.jsp而言,“翻译”后的Servlet源文件为:\work\Catalina\localhost\tst\org\apache\jsp\hello_jsp.java 该文件的主要内容如下: package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase     implements org.apache.jasper.runtime.JspSourceDependent {   ... ... ...   public void _jspService            (HttpServletRequest request, HttpServletResponse response)             throws java.io.IOException, ServletException {     JspFactory _jspxFactory = null;     PageContext pageContext = null;     HttpSession session = null;     ServletContext application = null;     ServletConfig config = null;     JspWriter out = null;     Object page = this;     JspWriter _jspx_out = null;     PageContext _jspx_page_context = null;      try {       ... ... ...       out.write("<html>\r\n");       out.write("\t<head>\r\n");       out.write("\t\t<title>hello.jsp</title>\r\n");       out.write("\t</head>\r\n");       out.write("\r\n");       out.write("\t<body>\r\n");       out.write("\t\t");        for (int i = 0; i <= 100; i++) {         out.println("helloworld");      }          out.write("\r\n");       out.write("\t</body>\r\n");       out.write("</html>");       ... ... ...     } }     可以看出hell.jsp经过“翻译”后的类名为hello_jsp 该类继承了org.apache.jasper.runtime.HttpJspBase类,而HttpJspBase类又是HttpServlet的子类。HttpJspBase在其service方法中调用了_jspService方法,针对特定的jsp页面,Tomcat的JSP引擎将其“翻译”成HttpJspBase的子类并重写其_jspService方法。该类的很多初始化内容有JSP引擎完成。     在上面的_jspService方法中可以看到hello.jsp的“影子”,在JSP中使用<%...%>所书写的Java代码被原样的置于_jspService方法中;另外在JSP中的HTML脚本通过流对象out原样输出...当然,JSP的“翻译”不可能如此简单,因为JSP页面还可能写有指令、标签等复杂的结构。     从上面的_jspService方法还可以看出,所谓JSP内建对象(request、reponse、application、session等)其实并不神秘,它们或是_jspService方法的参数变量,或是由JSP引擎在_jspService方法中预先定义好的变量,我们在JSP的<%...%>中可以直接使用

分享到:
评论

相关推荐

    servlet jsp深入了解

    本篇文章将深入探讨Servlet和JSP的关系、工作原理以及如何将它们有效地结合起来。 Servlet是一种Java编程接口,它是Java平台上的服务器端组件,用于接收并处理客户端(如浏览器)发送的HTTP请求,然后生成相应的...

    servlet和jsp学习指南

    《servlet和jsp学习指南》是一本专为Java Web开发初学者量身定制的书籍,它以细致入微的讲解和实例操作,带领读者深入理解Servlet和JSP的基本原理和应用方法。本书将从以下几个方面展开知识点的讲解: 1. Servlet...

    Servlet 和 Jsp 学习指南+ 代码

    这份"Servlet 和 Jsp 学习指南+ 代码"资源包显然旨在帮助开发者深入理解和掌握这两项技术。 Servlet是Java提供的一种用于扩展服务器功能的接口,它允许开发者编写Java代码来处理HTTP请求。Servlet生命周期包括加载...

    《Servlet和JSP学习指南》源码

    这份源码将帮助读者理解Servlet和JSP的内部工作原理,通过实际代码示例加深对这些概念的理解,进一步提升Web开发技能。同时,它还可能包含一些常见问题的解决方案和最佳实践,对于开发者解决实际问题具有很高的参考...

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

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

    servlet和jsp模板

    - 学习Servlet和JSP,首先需要掌握Java基础,然后深入理解HTTP协议和Web容器的工作原理。 - 掌握Servlet和JSP后,可以进一步学习MVC设计模式和相关Web框架,提升开发效率。 9. **最佳实践**: - 遵循单一职责...

    Servlet和Jsp学习指南源代码.rar

    这份"Servlet和Jsp学习指南源代码.rar"压缩包很可能包含了一系列示例代码,帮助初学者理解这两种技术的工作原理和实际应用。 Servlet是Java语言编写的服务端组件,主要负责处理HTTP请求,并生成响应。它提供了对...

    Servlet Jsp 技术概述

    Servlet和JSP(JavaServer ...通过阅读这些PDF文档和代码示例,你可以逐步深入理解和掌握Servlet和JSP技术,提升你的Java Web开发能力。在学习过程中,记得理论与实践相结合,多动手实践,才能更好地消化所学知识。

    JSP+Servlet讲解MVC实现原理

    通过分析和运行这些源码,你可以更深入地理解JSP和Servlet如何协同工作,实现MVC模式。 总结来说,JSP和Servlet结合使用,能够在Java Web应用中实现MVC架构,提高代码的可维护性和复用性。了解并熟练掌握这两项技术...

    Head First Servlet And JSP

    《Head First Servlet And JSP》一书旨在帮助读者深入理解并熟练掌握 Servlet 和 JSP 的使用技巧。 #### 标签解读: - **HeadFirst**:表示这是 Head First 系列的一本书籍。 - **Servlet**:指出书籍的重点之一是 ...

    servlet与JSP学习指南代码

    本学习指南的源代码提供了丰富的示例,帮助开发者深入理解这两门技术。以下是对这两个概念的详细解析。 **Servlet概述** Servlet是Java编程语言的一个接口,由Java Servlet API提供,它允许程序员扩展Web服务器的...

    Servlet-JSP.rar_jsp sock_lottery_servlet jsp_servlet jsp

    本资源"Servlet-JSP.rar"包含了关于这两项技术的一些源代码示例,可以帮助我们深入理解它们的工作原理和应用。 Servlet是Java编程语言的一个接口,由Java Servlet API提供,用于扩展服务器的功能。Servlet主要负责...

    韩顺平Servlet和JSP用户管理源码

    【标题】"韩顺平Servlet和JSP用户管理源码"是针对初学者的一个实践项目,旨在教授如何使用Servlet和JSP技术实现用户管理系统。这个项目由知名IT教育人士韩顺平提供,包括了数据库建表的SQL脚本、源代码以及带有详细...

    JavaEE Servlet JSP 源码

    通过查看和学习这些源码,开发者可以深入理解HTTP请求的处理流程、Servlet生命周期、JSP的编译过程等核心概念。 在"javaee源码"这个压缩包中,我们可以期待找到以下内容: 1. Servlet容器的核心源码:包括请求解析...

    Servlet JSP和SpringMVC初学指南

    对于JSP,重点在于理解其工作原理和如何与Servlet协作。最后,学习SpringMVC,理解MVC模式以及SpringMVC中的各种组件和注解。 在实际开发中,常常使用SpringMVC作为控制器层,Servlet和JSP则作为辅助工具。...

    纯servlet+jsp后台管理 无任何框架1

    开发者需要解压并理解这个eshop目录下的各个文件和目录,以了解系统的工作原理和流程。 总结来说,这个项目是一个基础的Java Web应用程序,适合学习和理解Servlet和JSP的基本原理以及它们如何协同工作。开发者需要...

    Servlet+JSP实现简单购物车

    在本文中,我们将深入探讨如何使用Servlet和JSP来实现一个简单的购物车功能,并结合Cookie技术来存储用户的选择。...在这个过程中,了解和掌握Servlet、JSP、JSTL以及Cookie的工作原理和使用方法是非常重要的。

    Servlet和JSP(JAVAEE基础).zip

    了解和掌握Servlet与JSP的基本原理和使用方法,是成为一名合格的Java EE开发者所必须的。通过熟练运用这两项技术,开发者能够构建出高效、可维护的Web应用程序,满足各种业务需求。在学习过程中,结合实际项目实践和...

Global site tag (gtag.js) - Google Analytics