Servlet入门和ServletConfig、ServletContext
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的更多相关文章
- JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response
1. ServletConfig 有一些东西不合适在程序中写死,应该写在web.xml中,比如 文字怎么显示, 访问数据库名 和 密码, servlet要读取的配置文件 等等.. l在Servle ...
- HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象
1 HTTP协议特点 1)客户端->服务端(请求request)有三部份 a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请求行中的GET ...
- JavaEE:Servlet简介及ServletConfig、ServletContext
Servlet简介 1.Servlet是sun公司提供的一门用于开发动态web资源的技术*静态web资源:固定数据文件*动态web资源:通过程序动态生成数据文件2.Servlet技术基于Request ...
- day05 Servlet 开发和 ServletConfig 与 ServletContext 对象
day05 Servlet 开发和 ServletConfig 与 ServletContext 对象 1. Servlet 开发入门 - hello world 2. Servlet 的调用过程和生 ...
- 1、Servlet 2、ServletConfig 3、ServletContext 4、HttpUrlConnection
1.Servlet 2.ServletConfig 3.ServletContext 4.HttpUrlConnection 07. 五 / J2EE / 没有评论 一.第一个Servlet的编写 ...
- Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】
Servlet的调用图 前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解 Servlet的细节 一个已经注册的Servlet可以被多次映 ...
- Servlet开发(三)之ServletConfig,ServletContext
1. ServletConfig Servlet是开发动态web的技术,而web.xml是Tomcat工程中最基础也最重要的配置文件,Tomcat启动项目的时候会加载并读取这个文件,其中web.xml ...
- Server,Servlet,ServletConfig,ServletContext,Session,Request,Response
Server流程 解析URL->找到应用->找到Servlet->实例化Servlet->调用init->调用service->返回响应->调用destroy ...
- Servlet入门实践
本文主要介绍servlet,包括入门到升入,基本上可以对servlet有一个很好的认识: 1servlet介绍: Servlet(Server Applet),全称Java Servlet,未有中 ...
随机推荐
- android 反编译(dex 和 odex),非脑残转帖,绝对可靠
Android 反编译 反编译odex文件(比如framework.odex),若是反编译dex,直接第4步 1.因为反编译odex的工具在D:\Develop tools\android反编译工具\ ...
- Socket 学习(一)
本次项目增加的引用using System.Net; using System.Net.Sockets; using System.Threading; TextBox.CheckForIllegal ...
- TDD(测试驱动开发)学习二:创建第一个TDD程序
本节我们将学习一些测试驱动开发环境的搭建,测试驱动开发概念和流程.所涉及的内容全部会以截图的形式贴出来,如果你也感兴趣,可以一步一步的跟着来做,如果你有任何问题,可以进行留言,我也会很高兴的为你答疑. ...
- ASP.NET4.0新特性
原文:ASP.NET4.0新特性 在以前试用VS2010的时候已经关注到它在Web开发支持上的一些变化了,为此我还专门做了一个ppt,当初是计划在4月12日那天讲的,结果因为莫名其妙的原因导致没有语音 ...
- 快速构建Windows 8风格应用36-商店应用发布流程
原文:快速构建Windows 8风格应用36-商店应用发布流程 引言 在发布应用之前,我们需要注册开发者账号才能够发布应用.我们可以登录https://appdev.microsoft.com/Sto ...
- Node.js日志框架选型比較:Winston
日志对于问题定位.调试,系统性能调优至关重要,尤其是系统复杂以及在线执行的情况下. 好的开发框架都会有一个可开启关闭/可配置记录级别的日志系统.我们从下面几个方面来做选型: 1. 每行日志都须要有准确 ...
- Thrift学习
Thrift学习 一:thrift介绍 Thrift是facebook开发的用来处理各不同系统之间数据通讯的rpc服务框架,后来成为apche的开源项目.thrift支持多种程序语言,包括Java,P ...
- leetcode第五题--Longest Palindromic Substring
Problem:Given a string S, find the longest palindromic substring in S. You may assume that the maxim ...
- 通过localstorage和cookie实现记录文章的功能
我们在做页面的时候,会考虑记录用户曾经看过的文章的功能,并记录下来在页面中显示!但是在IE低版本的下是不支持localstorage的功能,只能采用cookie来代替本地存储的功能!实现的方法如下! ...
- 基于Mvc3,Ef,领域驱动电子商务系统的EShop开发
分享自己从代码小工一步步走向搭架子,ING... 简单了解UnitOfWork 摘要: UnitOfWorkUnit Of Work模式,即工作单元,它是一种数据访问模式.它是用来维护一个由已经被业务 ...