`
DoubleEO
  • 浏览: 158154 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

servlet的文章

    博客分类:
  • j2ee
阅读更多
最开始的时候,我并没有系统地学过Servlet,因为第一次看的时候觉得它好简单,然后就直接学了Struts 2。但问题也就因为我没有系统地学过Servlet而产生了,在Struts 2中很多东西都被封装好了,但实现的机制还是用的Servlet,而我就有些东西无法理解了,于是决定回过头来好好学了下Servlet。

    说实话,目前市面上好多讲Servlet的书都讲得相当浅,一般都是随便讲一下应用就带过了,然后就是搞几个所谓的实际项目来凑下字数。很幸运,我找到一本很不错的书,孙鑫老师写的《Servlet/JSP深入详解》,个人感觉讲得非常不错,看完之后,收获还是蛮大的。于是,决定把一些一般的书中很少讲到但很重要的细节拉出来总结一下。

    第一点被我拉出来的就是Servlet的线程安全问题了,明确说明一下:Servlet不是线程安全的。在Servlet规范定义中,在默认情况下(Servlet不是在分布式的环境中部署),Servlet容器对声明的每一个Servlet只创建一个实例。如果有多个客户请求同时访问这个 Servlet,Servlet采用多线程的方式来处理这些请求,Servlet容器维护了一个线程池来服务请求。线程池实际上是等待执行代码的一组线程,这些线程叫做工作者线程(WorkerThread),Servlet窗口使用一个调度者线程(Dispatcher Thread)来管理工作者线程。当容器收到一个访问Servlet的请求时,调度者线程从线程池中选取一个工作者线程,将请求传递给该线程,然后由这个线程执行Serlvet的service()方法。

    Servlet的线程安全问题也就因此产生,假设一个Servlet中有一个实例变量name,当两个用户同时访问一个Servlet时,Servlet 中name这个实例变量还是安全的吗?答案是否定的。问题出在name是个实例变量,原因我想大家都明白了。解决的办法有两个:一个就是把name这个实例变量定义为本地变量,这个每一个线程就都将拥有这个变量的拷贝,线程对自己栈中的本地变量的改变不会影响到其他线程的本地变量的拷贝,因此,在请求处理过程中,变量name的值也就不会被别的线程所改变。在Servlet的开发中,本地变量总是线程安全的。第二种解决办法就是把方法(如 doGet(),doPost()等)进行同步处理,这样肯定也是可以解决问题的,但产生的负使用就是访问同一个Servlet的请求将排队,一个线程处理完请求后,才能执行另一个线程,带来的性能问题也就不好怎么说了。

    同样的思考方法,可以得到下面的结论:ServletContext属性的访问也不是线程安全的,HttpSession由于其本身的特性(只能在处理属于同一个Session的请求的线程中被访问)决定了它是线程安全的,ServletRequest对象只在一个线程中被访问,故而也是线程安全的。


    第二点就是Servlet的异常处理机制,较少看到有书专门讲这个的,有兴趣的朋友可以找点资料看一下下,我没怎么弄懂,也不太清楚有哪些地方要使用。


    第三点是Servlet的会话跟踪技术,在Servlet规范中,有三种机制用于会话跟踪:1.SSL(安全套接字层)会话;2.Cookies;3.URL重写。

    SSL是一种运行在TCP/IP之上的像HTTP这种应用协议之下的加密技术,SSL可以让采用SSL的服务器认证采用SSL的客户端,并且在客户端和服务器之间保持一种加密的连接。Cookies是在响应报头和请求报头中被传送的,不与传送的内容混淆在一起,所以Cookies的使用对于用户来说是透明的,如果用户禁用Cookies,那么Web服务器就无法利用Cookies来跟踪用户的会话了,而要采用URL重写机制。URL重写就是在URL中附加标识用户的SessionID,Servlet容器解释URL时取出SessionID,根据SessionID将请求与特定的Session关联。

  

    第四点是Cooikes与Session的对比,两者的最大区别在于:Session在服务器端保存信息,Cookies在客户端保存信息。为了跟踪用户的会话,服务器端在创建Session后,需要将SessionID交给客户端,在客户端下次请求时,将这个ID随请求一起发送回来,可以采用 Cookies或URL重写的方式,将SessionID发送给客户端。另外,保存SessionID的Cookies在关闭浏览器后就删除了,不能在多个浏览器进程间共享。如果需要对Session进行持久化,则需要将内存中Session对象保存到持久存储设备中,可通过对象序列化的技术来实现,当需要重新加载Session对象时,通过对象反序列化的技术在内存中重新构造Session对象。这就要求HttpSession的实现类要实现 Serializable接口,同时Session中保存的对象所属的类也要实现该接口。



    学到目前,虽然自己没有学出个什么名堂,但我终于明白了所谓的MVC框架的意义,像Struts、Struts 2、SpringMVC其实并不难,而且谁也无法保证它们会火多久,自己以后会不会用到它们,但无论怎样,基础是永远都不会变的。所以,不论这些东西学得怎么样,Servlet跟JSP这些基础一定要学好,有了这些基础,感觉学这些框架还是蛮好上手的,至少我个人现在是这种想法。
分享到:
评论

相关推荐

    jsp+servlet文章管理系统

    当前各类数据库内容提供商针对零散用户抱怨数据库内容收费太高的情况,推出了一种以浏览文章扣除相应金额的推销方式,该方式吸引了许多仅浏览少量收费信息的用户,扩充了内容提供商的收入来源。本业务就是制作一个...

    基于servlet+jsp 的文章管理系统.zip

    基于servlet+jsp 的文章管理系统基于servlet+jsp 的文章管理系统 基于servlet+jsp 的文章管理系统基于servlet+jsp 的文章管理系统 基于servlet+jsp 的文章管理系统基于servlet+jsp 的文章管理系统 基于servlet+jsp ...

    jakarta-servletapi-4-src.zip servlet源码

    本篇文章将围绕jakarta-servletapi-4-src.zip这个源码包,深入剖析Servlet API 4.0的关键特性与实现原理。 一、Servlet接口与生命周期 Servlet接口是所有Servlet的基础,它定义了Servlet的主要方法,如`init()`, `...

    文章管理系统(JSP+Servlet+sql server 2000)

    《文章管理系统:基于JSP+Servlet+SQL Server 2000的技术实现》 在Web开发领域,构建一个高效、易用的文章管理系统是常见的需求。本文将深入探讨一个基于JSP(JavaServer Pages)、Servlet以及SQL Server 2000...

    基于jsp+servlet的博客

    - **发表文章**:用户填写文章标题、内容、分类等信息后,通过Servlet将这些数据存储到数据库中,并在前端用JSP展示新的文章列表。 - **评论文章**:用户可以在文章下方提交评论,Servlet处理评论的保存,JSP则负责...

    基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统.zip

    基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统 基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统 基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统 基于JavaWeb Servlet+JSP+MYSQL+Bootstrap ...

    [转]Servlet3特征 异步Servlet

    在这篇文章中,我们将深入探讨Servlet3的一个关键特性——异步Servlet处理,以及它如何改变了传统的请求-响应模型。 首先,让我们了解传统Servlet的工作方式。在Servlet2.x时代,每个HTTP请求都会创建一个新的线程...

    Servlet3.0新特性,Servlet3新特性,Servlet3注解,Servlet3异步处理【蕃薯耀】

    在本篇文章中,我们将深入探讨Servlet3.0的主要新特性,包括注解、异步处理、容器初始化参数以及模块化部署等。 首先,Servlet3.0最显著的特征之一是广泛使用注解(Annotation)。传统的Servlet配置通常需要在web....

    servlet容器工作原理

    文章中提到的`PrimitiveServlet`是一个简单的Servlet示例,它实现了`javax.servlet.Servlet`接口。具体来看: 1. **`init(ServletConfig config)`**:此方法在Servlet首次初始化时被调用,用于完成初始化操作。 2. ...

    文章管理系统 java+servlet+jsp

    本系统采用Java技术栈,结合Servlet和JSP进行开发,具备基础的用户交互和文章操作功能。下面将详细阐述这个系统的技术实现和核心知识点。 1. **Java**: Java是一种面向对象的、跨平台的编程语言,其特性包括简洁性...

    servlet练习项目pdf与代码

    `SQL文件`可能用于创建数据库表或者填充初始数据,与Servlet项目中的数据存储部分有关,例如用户信息、文章数据等。 通过这个练习项目,学习者可以全面掌握Servlet的使用,包括编写Servlet类、处理HTTP请求、与...

    应用Servlet实现购物车

    本篇文章将详细讲解如何利用Servlet技术来实现一个购物车功能,以此来帮助开发者理解Servlet在实际应用中的工作原理以及如何进行相关开发。 首先,我们需要了解Servlet的基本工作流程。Servlet生命周期包括加载、...

    如何编译运行servlet

    这篇博客文章“如何编译运行servlet”将引导我们了解如何从源码开始,通过一系列步骤来编译和运行一个Servlet。 首先,我们需要一个Java开发环境,比如Java Development Kit (JDK),它包含了编译Java代码所需的...

    jsp servlet 博客项目

    在"jsp servlet 博客项目"中,MySQL很可能用于存储博客文章、用户信息等数据。它的优点包括高效、稳定、开源以及支持多种操作系统。通过Java的JDBC(Java Database Connectivity)API,我们可以与MySQL数据库进行...

    servlet原理

    本篇文章将深入探讨Servlet的原理,包括其生命周期、执行流程以及如何在实际开发中使用。 首先,我们来了解Servlet的生命周期。Servlet的生命周期分为三个主要阶段:初始化、服务和销毁。在初始化阶段,Servlet容器...

    jsp+servlet头像上传功能

    本篇文章将深入探讨如何利用`JSP`和`Servlet`来创建一个头像上传功能。 首先,`JSP`是一种基于Java的服务器端脚本语言,它允许开发者在HTML页面中嵌入Java代码,以实现动态网页效果。在头像上传的场景中,`JSP`通常...

    Jsp/Servlet3.0 ppt和代码

    【描述】提到的个人博客链接指向了一个详细的讲解文章,该文章详细阐述了JSP和Servlet 3.0的重点内容,并且以实际的代码示例为主。这表明我们可以期待学习到关于这两项技术的实际应用和编程实践。 在Servlet 3.0中...

    Jsp+servlet个人博客小项目

    Servlet会与SQL Server进行交互,执行CRUD(Create, Read, Update, Delete)操作,如添加新文章到数据库、查询用户发布的文章等。 6. 整体流程: 用户在浏览器中访问博客,请求被发送到Servlet,Servlet处理请求,...

Global site tag (gtag.js) - Google Analytics