- 浏览: 253988 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
July01:
推荐用StratoIO打印控件,浏览器和系统的兼容性都很好,而 ...
B/S结构下套打票据实现 - Lodop打印组件 -
iTarget:
原原文::http://blog.csdn.net/steve ...
加减乘除的问题 - BigDecimal -
iTarget:
原文:http://blog.csdn.net/gqm1982 ...
加减乘除的问题 - BigDecimal -
iTarget:
在Java中,要想实现精确计算,解决方案是使用BigDecim ...
加减乘除的问题 - BigDecimal -
叶寒_:
...
JSP简单标签
Servlet基础
2.1 HelloWorld
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<font size=30 color=red>Hello World</font><br>"); out.println("<marquee>" + new Date() + "</marquee>"); out.println("</html>"); }
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/demo/hello.html</url-pattern> </servlet-mapping>
2.2 线程安全Servlet
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); count++; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } out.println("<html>"); out.println("This is " + count + " times access" + "The thread name is :" + Thread.currentThread().getName()); out.println("</html>"); System.out.println("这是第" + count + "次访问" + "线程名称为:" + Thread.currentThread().getName());
}
返回结果是:
This is 1times access thread name is :http-8080-1
This is 3times access thread name is :http-8080-1
This is 5times access thread name is :http-8080-2
This is 7times access thread name is :http-8080-3
由上面测试可知,在Servlet中的线程时非安全的,故可以采用以下的方式实现Servlet的线程安全。
2.2.1 继承SingleThreadModel接口
在Servlet中如果继承SingleThreadModel接口那么Servlet引擎将以单线程模式调用service方法。对于实现SingleThreadModel接口的Servlet,Servlet引擎保证其单个实例对象的service方法不会同时被两个线程调用。但是Servlet引擎仍然支持该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象并发运行,但每一个Servlet实例对象的service方法都不会被多个线程并发调用。实现SingleThreadModel接口并不能真正解决Servlet的线程安全问题,因为每个Servlet引擎会创建多个Servlet实例对象,多个并发的请求分别由不同的Servlet实例对象处理或者单个Servlet实例对象排队处理,而真正意义上的多线程安全问题指一个Servlet实例对象被多个线程同时调用的问题。
故在Servlet API 2.4中,SingleThreadModel已经不推荐使用。
2.2.2 编写线程安全的Servlet
注:在Servlet中除了访问成员变量是要注意线程安全问题外,访问其他共享资源是也应注意线程安全问题,如Web应用程序对象、Session对象、数据库等都可能涉及多个Servlet线程同时访问的问题。如果Servlet中没有定义成员变量和service方法中没有访问无同步访问控制的共享数据时,即使是多个线程并发调用service方法,也不会出现线程安全问题。
2.3 ServletConfig接口
Servlet引擎将代表Servlet容器的对象和Servlet的配置参数信息一并封装到一个成为ServletConfig的对象中,并在初始化Servlet实例对象时传递给该Servlet。
Servlet引擎装在并创建Servlet实例对象后,会调用init(ServletConfig config)方法将ServletConfig对象传递给Servlet。
ServletConfig常用方法:
getInitParameterNames()用于获取初始化参数的名称返回一个Enumeration类型
getInitParameter()用于返回初始化参数
getServletName()用于获取Servlet名称
getServletContext()获取Servlet上下文
Web.xml样式:
<servlet> <servlet-name>ServletConfigServlet</servlet-name> <servlet-class>servlet.ServletConfigServlet</servlet-class> <init-param> <param-name>firstname</param-name> <param-value>wang</param-value> </init-param> <init-param> <param-name>lastname</param-name> <param-value>tong</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ServletConfigServlet</servlet-name> <url-pattern>/demo/servletconfig.html</url-pattern> </servlet-mapping>
Java获取ServletConfig参数:
Enumeration e = getServletConfig().getInitParameterNames(); while (e.hasMoreElements()) { String key = (String) e.nextElement(); String value = getInitParameter(key); }
注:
在Servlet接口中定义了getServletConfig()方法,并在GenericServlet类中实现。用于得到ServletConfig对象。
2.4 GenericServlet&HttpServlet
HttpServlet是GenericServlet的一个提供HTTP协议处理的子类。
2.4.1 Init方法
Init方法在Servlet声明期中仅执行一次,Servlet引擎创建Servlet实例对象后立即调用该方法,通常该方法用户与构造方法类似的初始化功能。
Servlet接口定义的init方法:public void init(ServletConfig config)
GenericServlet在Servlet接口基础上添加一个无参数的init()方法
public void init()该方法没有任何语句,会在init(ServletConfig config)方法的最后一句加以调用、init()方法的目的是为编写初始化内容省去了覆盖init(ServletCOnfig config)方法时编写super.init(config)的麻烦。
2.4.2 Service方法
Service方法时Servlet的核心方法,每当servlet访问请求到达时,Servlet引擎就会调用Servlet实例对象的service方法进行相应。GenericServlet没有实现该方法,在HttpServlet中实现。
2.4.3 Destory方法
在web容器卸装Servlet之前被调用,可以覆盖destory方法完成与init方法相反的功能,释放Servlet打开的资源。
2.4.4 getServletConfig方法
返回Servletconfig对象的引用
2.4.5 doXXX方法
doGet() 处理GET请求
doPost() 处理POST请求
doHead() 处理Head请求
doPut() 处理Put请求
doDelete() 处理DELETE请求
doTrace() 处理TRACE请求
doOptions() 处理OPTIONS请求
2.4.6 浏览器缓存机制
响应信息中的Last-Modified头字段用于指定响应内容的最后更新时间,当客户机缓存此文档内容后,它在以后的请求信息中根据Last-Modified头字段指定的时间来生成If-Modified-Since请求头字段,亦指出缓存文档的最后更新时间。只有文档的更新时间比If-Modified-Since请求头指定的时间新时,服务器才返回文档内容。如果自动If-Modified-Since指定的时间以来,网页内容没有发生修改,服务器将返回一个304状态码表示浏览器缓存的版本是最新的则使用以前缓存的内容。
浏览器根据响应信息中是否包含Last-Modified字段来进行处理,如果响应信息中没有包含Last-Modified字段,将每次访问此页面时都想服务器发出访问请求,否则仅每次启动运行后第一次访问页面才向服务器发出请求,其他都从缓存中读取。
在HttpServlet类定义了一个getLastModified方法,返回值影响浏览器如何使用缓存内容。getLastModified()是一个回调方法,由HttpServlet的service方法调用。Servlet程序调用service()方法后在调用doGet()方法之前,先调用getLastModified()方法,并根据其返回值来决定是都调用doGet方法。规则如下:
1、 getLastModified返回一个负数时,service方法后调用doGet方法。
2、 getLastModified方法返回一个正数且请求中不包含If-Modified-Since,或者If-Modified-Since的时间值比getLastModified方法返回的时间旧时,调用doGet方法。
3、 getLastModified返回一个正数,且请求信息中包含的If-Modified-Since时间比getLastModified返回时间新,则调用浏览器的缓存。
2.4.7 ServletContext接口
每个Web应用程序都是一个独立的Servlet容器,每个Web应用程序分别用一个ServletContext对象。ServletContext对象包含在ServletConfig对象中,调用ServletConfig.getServletContext()方法获取ServletContext对象。
2.4.7.1 获取Web应用程序的初始化参数
<context-param> <param-name>companyName</param-name> <param-value>ibm</param-value> </context-param> <context-param> <param-name>website</param-name> <param-value>ibm.com.cn</param-value> </context-param>
Enumeration<String> e = getServletContext().getInitParameterNames(); while (e.hasMoreElements()) { String key = e.nextElement(); String value = getServletContext().getInitParameter(key); }
2.4.7.2 记录日志
ServletContext定义了两个log方法用于记录日志
Public void log(String msg)
Public void log(String message,Throwable t)
2.4.7.3 Application域范围属性
一个Web应用程序中所有Servlet都共享一个ServletContext对象,所以ServletContext对象也是Application对象。
ServletContext定义了4个用于添加、删除、访问application的方法
1、 getAttributeName
2、 getAttribute
3、 removeAttribute
4、 setAttribute
2.4.7.4 访问资源文件
1、 getResourcePath 返回一个包含该目录和文件路径名称的Set集合
2、 getResource 返回映射到资源上的URL对象。
3、 getResourceAsStream 返回连接到某资源上的InputStream对象
PrintWriter out = response.getWriter(); URL url = getServletContext().getResource("/WEB-INF/common.properties"); InputStream is = getServletContext().getResourceAsStream("/WEB-INF/common.properties"); Properties properties = new Properties(); properties.load(is); out.println("database=" + properties.getProperty("database")); out.println("username=" + properties.getProperty("username")); out.println("password=" + properties.getProperty("password"));
2.4.7.5 获取虚拟路径所映射的本地路径
ServletContext接口定义getRealPath()方法用于返回虚拟路径锁映射的本地文件系统路径。
发表评论
-
验证码
2010-05-14 01:10 854class Pair<K, E> { priv ... -
Web服务器在Window下端口占用问题
2010-01-21 10:25 11291、在Web服务器中查找到占用的端口。 2、在控制台中输入以 ... -
EL表达式
2009-04-22 15:00 14598.1.1.1 EL基本应用 1、 JSP标签属 ... -
JSP简单标签
2009-04-20 11:22 3674第9章 简单标签 9.1 简单标签知识 在Js ... -
使用标签对HTML特殊字符进行转义
2009-04-15 11:54 4767public class HtmlFilterTag exte ... -
JSP自定义标签
2009-04-15 11:00 48938.2 自定义标签简单应用 public class ... -
自定义标签开发与使用
2009-04-13 15:29 16218.1 自定义标签应用形式 8.1.1.1 空标 ... -
Listener监听器
2009-04-10 11:52 2642第1章 Listener监听器 1.1 Liste ... -
Filter过滤器
2009-04-10 09:35 1762第6章 Filter过滤器 6.1 Filter接 ... -
使用Filter实现正文压缩
2009-04-09 17:03 1206public class CompressionRespons ... -
中文乱码处理
2009-04-08 14:59 12474.6 请求参数中文问题 HTTP协议规定浏览器想WEB ... -
HttpServletRequest
2009-04-07 16:22 2315HttpServletRequest Web客户端 ... -
HttpServletResponse
2009-04-07 11:47 9067HttpServletResponse Web服务器会送给We ... -
HTTP协议
2009-04-04 20:57 1362第1章 HTTP协议 1.1 ... -
对象嵌套对象的Struts表现层显示
2009-03-24 14:43 1171Struts的ActionForm对象是由多个对象组成,如下: ...
相关推荐
### Servlet基础知识总结 #### 一、Servlet简介 Servlet是一种服务器端的小程序,是Java平台上的一个重要的技术之一,主要用于处理客户端的HTTP请求并生成动态网页。Servlet是在服务器端运行的,能够提供各种服务...
Servlet 基础补充案例习题 在本节中,我们将探讨 Servlet 基础补充案例习题,旨在掌握实际开发中 Servlet 程序的基本实现和使用。我们将通过两个案例,分别演示如何编写基于 HTTP 协议的 Servlet 程序,并掌握 ...
**学习JSP和Servlet基础,你需要理解它们的基本概念、生命周期、API使用以及如何协作处理Web请求。此外,熟悉EL和JSTL,以及如何在实际项目中应用MVC模式,对于提升开发效率和代码质量至关重要。本课件将逐步引导你...
总的来说,Servlet基础知识和Servlet容器模型构成了Java Web开发的核心部分。掌握这些概念有助于理解Web应用的工作原理,以及如何在实际项目中有效地使用Servlet和容器提供的功能。通过深入学习和实践,开发者可以...
在本教程"Servlet基础Demo"中,我们将深入理解Servlet的工作原理,以及如何创建和运行一个简单的Servlet应用。 首先,Servlet是一个Java类,它实现了Servlet接口或者HttpServlet类,后者是Servlet接口的一个实现,...
因此,可以说Servlet是JSP技术的基础,因为JSP最终也是通过Servlet来实现其功能的。 处理HTTP请求的方法主要有两种:GET和POST。GET请求通常用于获取资源,其参数会显示在URL中,而POST请求则常用于向服务器提交...
### servlet基础教程知识点详解 #### 一、Servlet简介与特点 **Servlet** 是服务器端的一种小型程序,主要用于处理客户端发送的HTTP请求,并返回相应的HTTP响应。它与客户端的小程序 **Applet** 相对应,主要区别...
有关第7章_Java_Servlet基础(1)
Servlet基础入门教程 Servlet是Java Web开发中的一个关键组件,它是服务器端的程序,用于处理来自客户端(如浏览器)的请求并返回响应。本教程旨在为初学者提供一个全面的Servlet入门指南,涵盖其基本概念、方法及...
通过学习“Servlet基础教程”,你可以掌握创建动态网站的基本技能。无论你想构建用户管理系统还是其他类型的Web应用,Servlet都能提供强大的支持。这个课程将帮助你理解Servlet的工作原理,如请求和响应的处理,以及...
在"Servlet基础源代码"的学习中,你将接触到以下关键知识点: 1. **Servlet生命周期**:Servlet的生命周期包括加载、实例化、初始化、服务、销毁等阶段。当服务器启动或第一次接收到对Servlet的请求时,会加载并...
在这个"Servlet基础"的学习资料中,我们将深入探讨以下几个关键知识点: 1. **Servlet注册与部署**: - Servlet是通过`web.xml`配置文件或者Java注解(如`@WebServlet`)进行注册的。在`web.xml`中,我们可以通过`...
在Servlet基础.ppt中,我们主要关注以下几个关键知识点: 1. **Servlet接口和HttpServlet类**: - `Servlet`接口是所有Servlet的基类,定义了Servlet的基本行为。在`HttpServlet`类中,它实现了Servlet接口,并...
在本篇3+Servlet基础中,我们将深入探讨Servlet的基本概念、接口、配置以及实际应用。 首先,Servlet是一个Java类,它实现了Servlet接口或HttpServlet接口,这两个接口都是Java Servlet API的一部分。Servlet接口...
Servlet基础
在Servlet编程中,`GenericServlet`是最基础的抽象类,它实现了Servlet接口,而大多数HTTP相关的Servlet会继承`HttpServlet`。`HttpServlet`提供了针对HTTP请求方法的抽象方法,如`doGet`和`doPost`。开发者通常需要...
Servlet基础教程 http原理 request, response
### Servlet基础 **1. Servlet概述:** Servlet是Java API的一部分,是一个Java类,用于扩展服务器的功能,处理HTTP请求。Servlet生命周期由容器(如Tomcat)管理。 **2. Servlet生命周期方法:** - **init()**:...