Servlet是一门用于开发动态web资源的技术。

若想开发一个动态web资源,需要完成以下2个步骤:

1)编写一个Java类,实现servlet接口;

2)把开发好的Java类部署到web服务器中。

Servlet快速入门案例

1.建立一个标准的JavaWeb应用目录

FirstApp

------ WEB-INF

--------------classess

--------------lib

--------------web.xml

2.进入classes目录,建立一个文本文件

package cn.lsl.servlet;

import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FirstServlet extends GenericServlet { public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
OutputStream out = res.getOutputStream();
out.write("Hello Servlet".getBytes());
out.close();
}
}

3.进入classes目录,对FirstServlet进行编译:

前提:把servlet-api.jar加入到你的构建路径中.

set classpath=%classpath%;C:\apache-tomcat-6.0.35\lib\servlet-api.jar

执行:javac -d . FirstServlet.java

4.修改web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>cn.lsl.servlet.FirstServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

5.部署应用到Tomcat中

6.访问地址:http://localhost:8080/FirstApp/hello

7.Servlet的执行原理和过程图

Servlet的生命周期

容器最终要调用service方法为客户端进行服务

1.Servlet接口中的常用方法:

public void init(ServletConfig config):初始化。Servlet类被实例化之后就会执行,且执行一次。 由容器进行调用

public void destroy():销毁Servlet对象。由容器进行调用。

2.内存中一个Servlet只有一个实例。针对不同的用户请求,容器采用多线程的机制调用service方法。

3.希望在应用被Tomcat加载完毕后(此时还没有任何人访问),就实例化并完成初始化Servlet的工作?

在<Servlet>中配置上<load-on-startup>2</load-on-startup>

<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>cn.lsl.servlet.FirstServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

Servelt接口实现类

1.Servlet接口定义了两个默认实现类

GenericServlet和HttpServlet

2.HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。应该在编写Servlet时,通过应该去继承这个类。

3.HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此在编写Servlet时,通常只需要覆盖doGet或doPost方法,而不要去覆写service方法。

eg:

package cn.lsl.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getOutputStream().write("hello servlet".getBytes());
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}

Servlet的映射

1.一个Servlet可以被映射到多个URL地址上

2.URL地址映射还支持通配符*

方式一:以*开头,以扩展名结尾<url-pattern>*.do</url-pattern>

方式二:以/前缀开头,以*结尾。比如<url-pattern>/action/*</url-pattern>

2. 多个Servlet使用通配符时,有可能有多种

以"/"开头(方式二)要比"*"开头(方式一)优先级高

都以"/"开头,还是有多个匹配,找最匹配的

3. 如果一个Servlet的映射为一个"/",就称之为默认的Servlet,它负责处理没有映射路径的URL请求的响应。

4.在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。5.当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。

Servlet线程安全问题

当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。

解决办法:

1.在Servlet中定义变量,除非特殊要求,尽量使用局部变量

2.如果有需要实例变量,应做同步处理,且同步代码块尽量包围少的代码。

ServletConfig

作用:代表了Servlet配置中的参数信息。

eg:在web.xml中的参数配置如下信息

<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>cn.lsl.servlet.ServletDemo1</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>23</param-value>
</init-param>
</servlet>
package cn.lsl.servlet;

import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ServletDemo1 extends HttpServlet {
private ServletConfig config;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
test3();
} //获取指定参数username的值
private void test1(){
String value = config.getInitParameter("username");
System.out.println(value);
} //获取所有的参数和参数的值
private void test2(){
Enumeration e = config.getInitParameterNames();
while(e.hasMoreElements()){
String paramName = (String)e.nextElement();
System.out.println(paramName+"="+config.getInitParameter(paramName));
}
} //得到servlet的名字
private void test3(){
String name = config.getServletName();
System.out.println(name);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
} @Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
}
}

ServletContext

1.在应用被服务器加载时就创建ServletContext对象的实例。每一个JavaWeb应用都有唯一的一个ServletContext对象,它就代表着当前应用。

2.如何得到ServletContext对象:ServletConfig.getServletContext();

3.作用

1)ServletContext对象是一个域对象(域对象就是说其内部维护了一个Map<String,Object>)

Object getAttribute(String name):根据名称获取绑定的对象

Enumeration getAttributeNames():获取ServletContex域中的所有名称

void removeAttribute(String name):根据名称移除对象

void setAttribute(String name, Object value):添加或修改对象

2)实现多个Servlet之间的数据共享

eg:

实现ServletDemo2和ServletDemo3之间的数据共享

package cn.lsl.servlet;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ServletDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sc = getServletContext();
sc.setAttribute("username", "zhangsan");
response.getOutputStream().write("OK".getBytes());
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
} }
package cn.lsl.servlet;

import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ServletDemo3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sc = getServletContext();
String name = (String)sc.getAttribute("username");
response.getOutputStream().write(name.getBytes());
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}

3)获取WEB应用的初始化参数(应用的全局参数)

eg:

在web.xml中

<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
package cn.lsl.servlet;

import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ServletDemo4 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sc = getServletContext();
String value = sc.getInitParameter("encoding");
response.getOutputStream().write(value.getBytes());
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}

4.读取资源文件的三种方式

1)利用ServletContext.getRealPath():

特点:读取应用中任何文件。只能在web环境下用

文件下载案例:

package cn.lsl.servlet;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ServletDemo5 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
test2(response);
} //英文名文件下载
private void test1(HttpServletResponse response) throws IOException{
//得到要下载的文件
ServletContext sc = getServletContext();
String path = sc.getRealPath("/f.jpg");
//构建输入流
InputStream in = new FileInputStream(path);
//通知客户端以下载的方式打开
response.setHeader("Content-Disposition", "attachment;filename=f.jpg");
response.setHeader("Content-Type", "application/octet-stream"); //二进制流
OutputStream out = response.getOutputStream();
int len = -1;
byte b[] = new byte[1024];
while((len=in.read(b))!=-1){
out.write(b, 0, len);
}
in.close();
out.close();
} //中文名文件下载
private void test2(HttpServletResponse response) throws IOException{
//得到要下载的文件
ServletContext sc = getServletContext();
String path = sc.getRealPath("/美女.jpg");
//截取文件名
String filename = path.substring(path.lastIndexOf("\\")+1);
System.out.println(filename);
//构建输入流
InputStream in = new FileInputStream(path);
//通知客户端以下载的方式打开
//中文文件名此处要进行URL编码
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filename, "UTF-8"));
response.setHeader("Content-Type", "application/octet-stream");
OutputStream out = response.getOutputStream();
int len = -1;
byte b[] = new byte[1024];
while((len = in.read(b))!=-1){
out.write(b, 0, len);
}
in.close();
out.close();
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}

2)利用ResourceBundle读取配置文件

特点:可以在非web环境下。但是只能读取类路径中的properties文件。

3)利用类加载器读取配置文件

特点:可以用在非web环境下。可以读取类路径下的任何文件。

eg:

package cn.lsl.servlet;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.ResourceBundle;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; //读取资源文件的三种方式
//a1.properties在WEB-INF下
//a2.properties在src下
//a3.properties在src/cn/lsl/resources下
public class ServletDemo6 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
test7();
} //利用ServletContext读取a1.properties
private void test1() throws FileNotFoundException, IOException{
ServletContext sc = getServletContext();
String path = sc.getRealPath("/WEB-INF/a1.properties");
Properties props = new Properties();
props.load(new FileInputStream(path));
String value = props.getProperty("username");
System.out.println(value);
}
//利用ServletContext读取a2.properties
private void test2() throws FileNotFoundException, IOException{
ServletContext sc = getServletContext();
String path = sc.getRealPath("/WEB-INF/classes/a2.properties");
Properties props = new Properties();
props.load(new FileInputStream(path));
String value = props.getProperty("username");
System.out.println(value);
} //利用ServletContext读取a3.properties
private void test3() throws FileNotFoundException, IOException{
ServletContext sc = getServletContext();
String path = sc.getRealPath("/WEB-INF/classes/cn/lsl/resources/a3.properties");
Properties props = new Properties();
props.load(new FileInputStream(path));
String value = props.getProperty("username");
System.out.println(value);
} //--------------------------------------
//利用ResourceBundle读取配置文件a2.properties
private void test4(){
ResourceBundle rb = ResourceBundle.getBundle("a2"); //基名
String value = rb.getString("username");
System.out.println(value);
}
//利用ResourceBundle读取配置文件a3.properties
private void test5(){
ResourceBundle rb = ResourceBundle.getBundle("cn.lsl.resources.a3");
String value = rb.getString("username");
System.out.println(value);
} //--------------------------
//利用类加载器读取配置文件a2.properties
public void test6() throws IOException{
ClassLoader cl = ServletDemo6.class.getClassLoader();
InputStream in = cl.getResourceAsStream("a2.properties");
Properties props = new Properties();
props.load(in);
String value = props.getProperty("username");
System.out.println(value);
} //利用类加载器读取配置文件a3.properties
private void test7() throws IOException{
ClassLoader cl = ServletDemo6.class.getClassLoader();
InputStream in = cl.getResourceAsStream("cn/lsl/resources/a3.properties");
Properties props = new Properties();
props.load(in);
String value = props.getProperty("username");
System.out.println(value);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}

Servlet入门和ServletConfig、ServletContext的更多相关文章

  1. JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response

    1.  ServletConfig  有一些东西不合适在程序中写死,应该写在web.xml中,比如 文字怎么显示, 访问数据库名 和 密码, servlet要读取的配置文件 等等.. l在Servle ...

  2. HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象

    1 HTTP协议特点   1)客户端->服务端(请求request)有三部份     a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请求行中的GET ...

  3. JavaEE:Servlet简介及ServletConfig、ServletContext

    Servlet简介 1.Servlet是sun公司提供的一门用于开发动态web资源的技术*静态web资源:固定数据文件*动态web资源:通过程序动态生成数据文件2.Servlet技术基于Request ...

  4. day05 Servlet 开发和 ServletConfig 与 ServletContext 对象

    day05 Servlet 开发和 ServletConfig 与 ServletContext 对象 1. Servlet 开发入门 - hello world 2. Servlet 的调用过程和生 ...

  5. 1、Servlet 2、ServletConfig 3、ServletContext 4、HttpUrlConnection

    1.Servlet 2.ServletConfig 3.ServletContext 4.HttpUrlConnection 07. 五 / J2EE / 没有评论   一.第一个Servlet的编写 ...

  6. Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】

    Servlet的调用图 前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解 Servlet的细节 一个已经注册的Servlet可以被多次映 ...

  7. Servlet开发(三)之ServletConfig,ServletContext

    1. ServletConfig Servlet是开发动态web的技术,而web.xml是Tomcat工程中最基础也最重要的配置文件,Tomcat启动项目的时候会加载并读取这个文件,其中web.xml ...

  8. Server,Servlet,ServletConfig,ServletContext,Session,Request,Response

    Server流程 解析URL->找到应用->找到Servlet->实例化Servlet->调用init->调用service->返回响应->调用destroy ...

  9. Servlet入门实践

    本文主要介绍servlet,包括入门到升入,基本上可以对servlet有一个很好的认识: 1servlet介绍:   Servlet(Server Applet),全称Java Servlet,未有中 ...

随机推荐

  1. 如何完成Nexus 9上电后激活过程

    所述被激活,因为它是Nexus 9经过努力获得启动OTA最新更新包,而且因为Google关闭一堵墙.原因无法下载更新包. 因为是第一次开机,它不能被设置usb debugging, 无法adb去杀死w ...

  2. 08. 删除重复&海量数据

    原文:08. 删除重复&海量数据 重复数据,通常有两种:一是完全重复的记录,也就是所有字段的值都一样:二是部分字段值重复的记录. 一. 删除完全重复的记录完全重复的数据,通常是由于没有设置主键 ...

  3. Hibernate 之强大的HQL查询

    Hibernate  配备了一种非常强大的查询语言,这种语言看上去很像  SQL.但是不要被语法结构上的相似所迷惑,HQL  是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态和关联之类 ...

  4. CSS3实战开发: 纯CSS实现图片过滤分类显示特效

    原文:CSS3实战开发: 纯CSS实现图片过滤分类显示特效 各位网友大家好,今天我要带领大家开发一个纯CSS的图片分类显示的网址导航,单纯看标题大家可能有些困惑,依照以往惯例,我先给大家演示一下实际运 ...

  5. 上海及周边地区产品技术创业QQ群:98905958

    创业是一件骄傲的事,每一个行业里最棒人才都应该创业或參与创业或以一个创业者的心态进行职业远景规划: 创业是一件寻常的事,跟上班打工一样寻常,没有什么必须的前置条件才干够開始,也没有什么前置条件能保证我 ...

  6. ASP.NET 5 Hello World

    ASP.NET 5系列教程 (二):Hello World   本篇文章内容比较基础,主要是向大家展示如何创建一个 ASP.NET 5 工程,主要包含内容如下: 创建ASP.NET 5 工程 添加 T ...

  7. PCL点云库中怎样读取指定的PCD文件,又一次命名,处理后保存到指定目录

    我一直想把处理后的pcd文件重命名,然后放到指定的目录,尝试了好久最终做到了: 比方我想读取  "table_scene_lms400.pcd" 把它进行滤波处理,重命名为 &qu ...

  8. leetcode第26题--Remove Duplicates from Sorted Array

    problem: Given a sorted array, remove the duplicates in place such that each element appear only onc ...

  9. 谈一谈struts2和springmvc的拦截器

    最近涉及到了两个项目,都需要考虑全局的拦截器,其功能就是判断session的登陆状态,如果session信息完好,可以从中取得相应的信息,则放行,否则拦截,进入重定向的uri. 既然是全局的拦截器,其 ...

  10. Android中常用的颜色

    代码: <?xml version=”″ ?> <resources> <color name=”white”>#ffffff</color><! ...