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,未有中 ...
随机推荐
- 微信公众平台接口,asp.net实现
原文:微信公众平台接口,asp.net实现 我为自己的笑话网开发了一个微信公众平台的接口,在这里分享给大家,希望能对朋友们有帮助,如果有什么地方写的不好,好请大家指点! 首先是要进行认证,认证的时候, ...
- tomcat的webapps文件夹下放更新后的项目就訪问不了
昨天给同事更新完程序,同事说更新后的程序訪问不了.它曾经的程序叫tj52,更新后的程序叫webapp.也就是tomcat的文件夹有两个文件架,一个叫webapp,一个叫tj52.最后另外一同事给了解决 ...
- 【麦子学院】OpenCV教程函数总结
个自带样例. parter 1: No1. adaptiveskindetector.cpp 利用HSV空间的色调信息的皮肤检測,背景不能有太多与肤色相似的颜色.效果不是特别好. No2. bagof ...
- curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in
当系统开启safe_mode和 open_basedir,在程序中使用以下语句 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 并且遇到301,302状态 ...
- Android小应用-----画画板
public class MainActivity extends Activity { private ImageView iv; float startX = 0; float startY = ...
- 【C++ Primer】拷贝控制
十三.复制控制 1. 复制构造函数 类中的成员函数都默觉得inline类型.所以即使在类定义体内的函数声明显示定义为inline类型,在进行函数定义时也可以将inline进行省略. // 复制构造函数 ...
- 记一次内存泄漏DUMP分析
自从进入一家创业公司以后,逐渐忙成狗,却无所收获,感觉自身的技术能力用武之地很少,工作生活都在业务逻辑中颠倒. 前些天线上服务内存吃紧,让运维把DUMP拿下来,分析一下聊以自慰. 先来统计一下大对象信 ...
- PDF解决方案(1)--文件上传
相关专题链接 PDF解决方案(1)--文件上传 PDF解决方案(2)--文件转PDF PDF解决方案(3)--PDF转SWF PDF解决方案(4)--在线浏览 前言:最近参与了一个项目,客户要求把系统 ...
- android数据库升级的措辞
在基类table增加upgrade操作: public abstract class DbBaseTable { private static final String TAG = "DbB ...
- Android Studio之同一应用创建多个Activity(一)
1. 2. 3. 4. 本文主要是构建多个Activity的过程.