`
lgx2351
  • 浏览: 175996 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

servlet与jsp系统总如之二--servlet基础

阅读更多

由上一章节《servlet与jsp系列总结之一--servlet与jsp技术概述》可知servlet是什么,且它的功用是什么,这一章节我们来说说servlet基础。

 

 

一:servlet的基本结构:

下面的代码给出了一个基本的servlet,它处理get请求。get请求是浏览器请求的常用类型,用来请求web页面。在地址栏输入url,或点链接或提交没有指定method或指定了method="get"的表单时,浏览器都会生成这个请求。

import java.io.*;
import java.servlet.*;
import java.servlet.http.*;

public class ServletTemplate extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
		//use "request" to read incoming HTTP headers(e.g.,cookies) and query data from HTML forms.
		
		//use "response" to specify the HTTP response status code and headers(e.g. the content type,cookies)
		
		PrintWriter out = response.getWriter();
		//use "out" to send content to browser
	}
}

认真看代码,特别是注释部分,应该说,以上代码表明了servlet的基本结构

servlet一般扩展HttpServlet ,并根据数据发送方式的不同(get或post) ,覆盖doGet或doPost方法 。如果要让servlet对get和post请求采用相同的行动,只需要让doGet调用doPost ,反之亦然。

doGet和doPost都接受两个参数HttpServletRequest和HttpServletResponse 。通过HttpServletRequest,可以得到所有的输入数据 ;同时,它提供了相应的方法,通过这些方法可以找出如表单(查询)数据、HTTP请求报头、和客户的主机名等信息 。通过HttpServletResponse可以指定输出信息 。如HTTP状态码(200,404等)和响应报头(Content-Type,Set-Cookie等)更重要 的是:通过HttpServletResponsesk可以获得PrintWriter ,通过PrintWriter可以将文档内容发送给客户 。对于简单的servlet,大部分的工作 就是用在println语句生成所期望的展示页面上。

由于doGet和doPost都抛出两种异常(ServletException和IOException),所以必须要方法声明中抛出它们。最后,注意引入的包:java.io(PrintWriter 等),java.servlet(HttpServlet 等),java.servlet.http(HttpServletRequest和HttpServletResponse )。

 

 

二:生成纯文本的servlet:

 

 

三: 生成HTML的servlet

大多情况下我们生成的不是纯文本的servlet,而是生成HTML的servlet。要生成HTML的servlet,以下在三步:

1)告诉浏览器,即将向它发送HTML。

2)修改println语句,构建合法的web页面。

3)检查生成的html。

第一步是通过将http的Content-Type设置为text/html来完成。如下:

response.setContentType("text/html");

 如上的html是servlet创建最常见的文档类型,但还有其它类型。如:使用servlet来生成excel表格application/vnd.ms-excel ),jpeg图像image/jped )和xml文档(text/xml) ,这三点情况也是很常见 的。

我们一般很少用servlet来构建内容相对固定的html,这种情况下用jsp就好了。

注意的一点是:必须在传送实际的文档之前设定内容的类型。

 

 

四:servlet的生命周期

服务器只创建每个servlet的单一实例 ,每个用户请求都会引发新的线程 ---将用户请求交付给相应的doGet和doPost方法来处理。

首先 创建servlet时,它的init方法 会得到调用,因此,init方法是放置一次性设置代码 的地方。之后 ,对于每个用户请求,都会创建一个线程,线程调用创建的servlet实例的相应方法。多个并发请求一般会导致多个线程同时调用service (尽管可以实现特殊的接口 singleThreadModel ---规定任何时间只允许单个线程运行)。之后,由service方法根据接收到的http请求的类型 ,调用doGet或doPost等方法。最后,如果服务器决定卸载某个servlet,它会首先调用servlet的destroy方法

 

service方法

服务器每次接收到对servlet的请求,都会产生一个新的线程,调用service方法。 service方法里首先检查http请求的类型再来根据相应的类型来调用doGet或doPost等方法。所以,我们99%的时间 都是在处理覆盖了的doGet或doPost方法。

注意的一点是:如果在servlet里要等同地处理get和post,让doGet调用doPost或相反 。而不要覆盖service方法。因为如果这样做,service方法里的其它请求如doPut等方法就乱了。

 

doGet,doPost和doXxx方法

service方法其它我们很少处理,doGet,doPost和doXxx方法是service方法的主体 ,我们关心的也是它们。

 

init方法

如果你希望servlet首次载入时,执行复杂的初始化工作,但不想每个请求都重复做这些工作时,就用init方法。

public void init() throws ServletException{
 //Init code here...
}

 

destory方法

在服务器移除servlet的实例之前,会调用servlet的destroy方法,在这里,我们可以关闭数据库连接、停止后台运行的线程、将cookie列表和点击计数写入磁盘、并执行其它清理工作。但是要注意服务器可能崩溃的情况,所以,可以将需要的数据如点击计数和cookie列表等值定期而主动地写入磁盘。

 

 

五:SingThreadModel接口

servlet只有一个实例,多个请求创建多个线程。如果新的请求到达,而前面的请求还在执行,那么多个线程可能会并发地访问同一个servlet对象。如果没有共享数据还好,但是有话,就要注意了 。doGet和doPost方法必须小心地对字段其它共享数据进行同步 ,因为多个线程可能会同时对这些数据进行访问。注意:多个线程并不共享局部变量,因此不需要保护。

在原则上,我们可以让servlet实现SingleThreadModel接口 ,来阻止多线程访问 ,如下:

public class YourServlet extends HttpServlet implements SingleThreadModel[
 .................
}

这样,就保证不会有多个请求线程同时访问该servlet的单个实例。多个线程请求将排队,一次只将一个请求转给单个servlet实例。

尽管SingleThreadModel能阻止并发的访问,但通常不是好选择,除了对性能(等待时间)造成影响外,还对共享数据产生不安全。所以,不要让高流量的servlet实现SingleThreadModel,明确代码同步要好一些。 在servlet规范的2.4版本就不造成使用SingleThreadModel。

以下有个例子:

import java.io.*;
import java.servlet.*;
import java.servlet.http.*;

public class UserIDs extends HttpServlet{
	private int newxtID = 0;
	public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html><doby>");
		String id = "USER-ID" + nextID;
		out.println("<span>"+id + "</span>");
		nextID = nextID+1;
		out.println("</doby></html>");
	}
}

 注意以上代码构造html内容的写法。

在上面的代码中,如果多几次用户请求就会出现重复的问题。因为可能第一个线程的nextID还没有加1,第二个线程就执行过来了,所以出现重复的nextID,这是很严重的问题,特别是在银行等领域中。

怎么来解决呢?考虑一下有,有以下三种:

1)改少竞争:

nextID = nextID+1;

 改成:

nextID++;

使得单个线程较快执行下来,但只能减少错误发生的可能性,这不能解决问题,。

2)用SingleThreadModel:

public class UserIDs extends HttpServlet implements SingleThreadModel{
}

前面说过,这种方式将产生性能下下降m时,如果服务器通过产生servlet的多个实例来实现SingleThreadModel,这种方式会完全失败,因为每个实例都会拥有自己的nextID字段。

3)明确地同步对代码的访问。

用java的标准同步构造,在首次访问共享数据之前开启一个synchronized块,守成数据的更新之后关闭这个块即可。如下:

synchronized{
 String id = "USER-ID" + nextID;
 out.println("<span>"+id + "</span>");
 nextID = nextID+1;
}

一旦一个线程进入代码块,只有等待它退出为止,其它线程不允许进来。java中常用这种解决方案忘记易于出错且性能低下的SingleThreadModel吧!

 

0
0
分享到:
评论

相关推荐

    jakarta.servlet.jsp.jstl-api-2.0.0.jar

    标题中的"jakarta.servlet.jsp.jstl-api-2.0.0.jar"是一个重要的Java Web开发组件,它属于JavaServer Pages(JSP)标准标签库(JSTL)的一部分,用于提供一套标准的标签来简化HTML或XML文档的生成。JSTL的主要目标是...

    javax.servlet.jsp.jstl-api-1.2.1.jar

    javax.servlet.jsp.jstl-api-1.2.1.jar

    Jsp-Servlet复习笔记-----第3章 Servlet技术 - 堕落天使 - JavaEye技术网站.mht

    Jsp-Servlet复习笔记-----第3章 Servlet技术 - 堕落天使 - JavaEye技术网站.mhtJsp-Servlet复习笔记-----第3章 Servlet技术 - 堕落天使 - JavaEye技术网站.mht

    servlet-api.jar和jsp-api.jar文件

    总结起来,servlet-api.jar和jsp-api.jar是Java Web开发的基础,它们提供了Servlet和JSP的技术支持,使得开发者可以通过Java语言来构建动态、交互式的Web应用。了解并熟练使用这两个库中的API,对于提升Java Web开发...

    javax.servlet.jsp-api-2.3.2-b01.jar.zip

    【javax.servlet.jsp-api-2.3.2-b01.jar.zip】这个压缩包文件包含的是Java服务器页面(JSP)的Servlet API,具体版本为2.3.2-b01。这个API主要用于网络应用程序开发,特别是针对基于Java的Web应用。在JSP中,开发者...

    javax.servlet.jsp-api-2.3.1.jar

    javax.servlet.jsp-api-2.3.1.jar

    Servlet与JSP核心编程(第二版)

    总结一下,《Servlet与JSP核心编程(第二版)》是一本全面、深入讲解Servlet和JSP的书籍,涵盖了从基础到高级的各种主题,对于理解和实践Java Web开发至关重要。通过学习,读者可以系统地理解这两个技术的核心概念,...

    基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统

    基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍...

    javax.servlet---jsp-api jar包

    5. **版本升级与兼容性**: 随着Java EE版本的升级,Servlet和JSP API也有相应的更新,如Servlet 2.x, 3.x, 4.x等,每个新版本通常会引入新的特性和性能优化,并保持向后兼容。开发者需要根据项目需求选择合适的API...

    Servlet与JSP核心编程第二版(含书签)

    ### Servlet与JSP核心编程知识点概述 #### 一、Servlet基础概念 ...以上就是《Servlet与JSP核心编程第二版》中涵盖的主要知识点概览。学习这些内容有助于开发者深入了解基于Java的技术栈构建Web应用的方法和技巧。

    Servlet与JSP核心编程(第二版).pdf

    Servlet与JSP核心编程:综合介绍Servlet与JSP

    servlet-api.jar 和jsp-api

    servlet-api.jar 和jsp-api 工具jar包

    宿舍管理系统-jsp+servlet+mysql

    宿舍管理系统-jsp+servlet+mysql宿舍管理系统-jsp+servlet+mysql宿舍管理系统-jsp+servlet+mysql宿舍管理系统-jsp+servlet+mysql宿舍管理系统-jsp+servlet+mysql宿舍管理系统-jsp+servlet+mysql宿舍管理系统-jsp+...

    Servlet与JSP核心编程(第2卷 第2版)

    - 在web.xml文件中,通过`&lt;servlet&gt;`和`&lt;servlet-mapping&gt;`元素来配置Servlet,指定Servlet类名和URL映射。 - 也可以使用Java Annotation(@WebServlet)进行动态注册,简化配置。 3. **请求与响应处理** - ...

    jsp-api.jar和servlet-api.jar

    **标题与描述解析** ...总结,JSP-api.jar和servlet-api.jar是Java Web开发的基础,理解它们的工作原理和用法,对于构建高效、可扩展的Web应用至关重要。这两个API的版本也反映了不同时间的技术趋势和标准。

    基于jsp-servlet的客户管理系统CRM.zip

    基于jsp-servlet的客户管理系统CRM基于jsp-servlet的客户管理系统CRM 基于jsp-servlet的客户管理系统CRM基于jsp-servlet的客户管理系统CRM 基于jsp-servlet的客户管理系统CRM基于jsp-servlet的客户管理系统CRM 基于...

    jsp-api.jar和servlet-api依赖包

    综上所述,`jsp-api.jar`和`servlet-api.jar`是Java Web开发的基础,理解并熟练掌握这两个API对于构建高效、稳定的Web应用程序至关重要。在项目中,通常将它们作为依赖库,通过Maven或Gradle等构建工具管理,确保...

    Servlet与JSP核心编程第二版5

    《Servlet与JSP核心编程第二版5》是一本深入探讨 Servlet 和 JSP 技术的书籍,涵盖了从基础知识到高级特性的全面内容。通过学习本书,开发者不仅可以掌握 Servlet 和 JSP 的基本原理,还能了解如何构建高效、安全的 ...

Global site tag (gtag.js) - Google Analytics