Servlet常用操作(基础)

----------------------------------------------------------------------------------------------
[版权申明:本文系作者原创,转载请注明出处] 
文章出处:http://blog.csdn.net/sdksdk0/article/details/51953305
作者:朱培      ID:sdksdk0      邮箱: zhupei@tianfang1314.cn   

--------------------------------------------------------------------------------------------

本文主要介绍servlet的基本使用操作,是一些非常基础的知识,主要掌握servlet作用域、servlet映射、请求转发、ServletConfig配置、ServletContext等的使用,最后以一个简易的文件下载的案例来说明Servlet的应用。

一、简介

Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。servlet是运行在web服务器中的小型java程序,通过HTTP接收和响应web客户端的请求。

Servlet 看起来像是通常的 Java 程序。Servlet 导入特定的属于 Java Servlet API 的包。因为是对象字节码,可动态地从网络加载,可以说 Servlet 对 Server 就如同 Applet对 Client 一样,但是,由于 Servlet 运行于 Server 中,它们并不需要一个图形用户界面。从这个角度讲,Servlet 也被称为 FacelessObject。

二、编码步骤

1、编码一个类,实现javax.servlet.Servlet接口或者继承javax.servlet.GenericServlet

public class HelloServlet extends GenericServlet{
     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException{
        res.getOutputStream().write("hello world".getBytes());
     }
}

2、配置一个servlet。web.xml中

<!--声明一个servlet -->
<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>cn.tf.servlet.HelloServlet</servlet-class>

</servlet>

<!--  给servlet映射一个url地址 -->
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>

</servlet-mapping>

3、把应用部署到Tomcat中,之后才可以看到效果。

三、执行过程

  • 1、通过浏览器输入网址访问tomcat,
  • 2、然后在tomcat中访问该应用
  • 3、找到了这个应用的web.xml()
  • 4、在web.xml中找到叫做/hello的映射
  • 5、在web.xml中找到servlet-name:HelloServlet()
  • 6、找到对应的类HelloServlet.class:先从应用的class目录、应用的lib中的jar包、Tomcat\lib目录中所有的jar包这个顺序进行查找。 实例化servlet对象,接着调用init方法、第一次访问时调用.
  • 7、有Tomcat调用该类的servlet方法
  • 8、浏览器界面响应。

四、生命周期

实例化对象,第一次访问时调用.

init() 一旦初始化完成,该实例就一直保持在Tomcat的内存中,第一次访问时调用.。

getServletInfo() 返回作者、版权等信息。

service() 用户每次请求都会执行。

destroy() 关闭tomcat的时候调用。

加载和实例化 Servlet。这项操作一般是动态执行的。然而,Server 通常会提供一个管理的选项,用于在 Server 启动时强制装载和初始化特定的 Servlet。

public class ServletDemo2 implements Servlet {

public ServletDemo2(){
    System.out.println("调用了servletDemo2的构造方法");
}

//初始化
@Override
public void init(ServletConfig arg0) throws ServletException {
    System.out.println("调用了init方法");
}

//获取servlet配置的方法
@Override
public ServletConfig getServletConfig() {
    return null;
}
//返回作者,版权等信息
@Override
public String getServletInfo() {
    return null;
}
//服务器方法
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
        throws ServletException, IOException {
    System.out.println("执行了service方法");
}
//销毁方法
@Override
public void destroy() {
    System.out.println("服务器被销毁");
}
}

通过web.xml让servlet在Tomcat加载应用时,就完成实例化和初始化。

<load-on-startup>2</load-on-startup>

GenericServlet和HttpServlet的对比

从大到小:servlet、GenericServlet、HttpServlet myeclipse默认的是继承HttpServlet。这个时候不需要覆盖service方法。继承了doGet、doPost方法。

五、servlet映射细节

映射地址:多个不同的地址可以映射到同一个servlet.

通配符映射:*匹配所有字符串 url-pattern:

  1. .do   以开头,以某个字符串结尾。
  2. /action/*   以前缀开头,以*结尾。
  3. /*   匹配所有。

匹配原则: 绝对匹配: /开头的批评 扩展名结尾的 (优先级高->低).

默认的servlet:一个servlet的url-pattern为一个/,那么这个servlet就是默认的servlet。

线程安全

对于单例对象:多线程就可能出现线程安全问题。 实现SingleThreadModel接口后,控制线程安全问题完全由服务器来决定。

在servlet中尽量不要使用实例变量,应该要使用局部变量。

六、ServletConfig配置

将编码配置放到web.xml中。

  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
</init-param>

读取配置参数的值: ServletConfig

    String value=getServletConfig().getInitParameter("encoding");

七、ServletContext

1、 servletContext的实例就代表当前的javaweb应用。 一个javaweb只有一个servletContext的实例。当前应用中的其他资源(servlet、jsp、html等)共享同一个ServletContext.

2、生命周期 应用被服务器加载时产生ServletContext实例。 生命周期是 从servletContext创建到服务器关闭

3、获得ServletContext的引用

ServletContext  sc=getServletContext();

sc.setAttribute("a", "demo1"); Object value=sc.getAttribute("a");

4、获得web应用的全局参数 在web.xml中配置

<context-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </context-param>

调用:

ServletContext sc=config.getServletContext();
sc.getInitParameter("encoding");

5、servlet请求转发 从demo4转到demo3

ServletContext sc=getServletContext();
    RequestDispatcher  dispatcher=sc.getRequestDispatcher("/servlet/Demo3");
    dispatcher.forward(request, response);

6、读取配置文件

ResourceBundle只适合读取properties文件,只能读取类路径中的配置文件,WEB-INF/class或者jar中的文件:

ResourceBundle rb=ResourceBundle.getBundle("cn.tf.servletContext.c");

ServletContext:String getRealPath(String path), 获取到文件的真实路径,只适合javaweb应用,能够读取其任何位置的任意文件:

ServletContext sc=getServletContext();
    String path=sc.getRealPath("/WEB-INF/a.properties");
    System.out.println(path);

    Properties prop=new Properties();
    prop.load(new FileInputStream(path));
    System.out.println(prop.getProperty("key"));

用类加载器:文件位置要在在类路径中,可以读取任意类型的文件,不适合读取大文件。

ClassLoader cl=Demo5.class.getClassLoader();
    InputStream is=cl.getResourceAsStream("cn/tf/servletContext/c.properties");

    Properties prop=new Properties();
    prop.load(is);
    System.out.println(prop.getProperty("key"));

八、文件下载(案例)

1、我们先将图片1放置到项目的WEB-INF目录下

2、我们需要得到文件的真实路径:

ServletContext sc=getServletContext();
		String path=sc.getRealPath("/WEB-INF/1.jpg");

3、以流的方式进行读取

OutputStream out=response.getOutputStream();
		int len =-1;
		byte b[] =new byte[1024];

		while((len=in.read(b))!=-1){
			out.write(b,0,len);
		}

4、告知浏览器去下载这个文件

response.setHeader("Content-Disposition", "attachment;filename=1.jpg");
		response.setHeader("Content-Type", "application/octet-stream");

5、关闭流

in.close();
out.close();

完整代码:

//文件下载
public class Demo6 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//得到要下载的文件的真实路径
		ServletContext sc=getServletContext();

		String path=sc.getRealPath("/WEB-INF/1.jpg");

		InputStream in=new FileInputStream(path);

		//告知浏览器去下载
		response.setHeader("Content-Disposition", "attachment;filename=1.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();

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request,response);
	}

}

源码下载:https://github.com/sdksdk0/ServletDemo

时间: 2024-11-03 02:21:04

Servlet常用操作(基础)的相关文章

javascript中对Date类型的常用操作小结_基础知识

javascript中对Date类型的常用操作小结 /** 3. * 日期时间脚本库方法列表: 4. * (1)Date.isValiDate:日期合法性验证 5. * (2)Date.isValiTime:时间合法性验证 6. * (3)Date.isValiDateTime:日期和时间合法性验证 7. * (4)Date.prototype.isLeapYear:判断是否闰年 8. * (5)Date.prototype.format:日期格式化 9. * (6)Date.stringToD

Ubuntu电脑操作基础:终端和命令行

  1.启动终端 1)点菜单"应用程序-附件-终端"命令,打开一个终端窗口; 2)出来一个终端窗口,标题栏上是自己的用户名和计算机名,窗口中一个光标一闪一闪,表示可以输入命令了; ; 上面的 ~ 表示自己的主文件夹,$ 表示普通命令提示符,如果是 # 则表示是管理员提示符; 2.常用命令 1)ls 命令,在提示符$后面输入ls,然后按回车键,可以显示当前目录下的文件和文件夹; 2)启动文本编辑器,或其他文本工具,输入命令 gedit 然后按一下回车键; ; 这时候会出来一个文本编辑器的

Docker学习之常用的基础命令总结_docker

前言 Docker是一个用了一种新颖方式实现的超轻量虚拟机,在实现的原理和应用上还是和VM有巨大差别,专业的叫法是应用容器(Application Container).下面这篇文章将简单介绍一下Docker常用的一些基础命令. # 在ubuntu中安装docker $ sudo apt-get install docker.io # 查看docker的版本信息 $ docker version # 查看安装docker的信息 $ docker info # 查看本机Docker中存在哪些镜像

JQuery 常用操作代码_jquery

//遍历option和添加.移除option function changeShipMethod(shipping){ var len = $("select[@name=ISHIPTYPE] option").length if(shipping.value != "CA"){ $("select[@name=ISHIPTYPE] option").each(function(){ if($(this).val() == 111){ $(thi

Javascript数组Array的常用操作

文章简介:JavaScript中的数组. Array是JavaScript中常用的类型,并且JavaScript中的数组和其他语言的数组有比较大的区别.JavaScript中数组中存放的数据类型不一定相同,而且数组的长度也是可改变的. 下面记录一下Array的常用操作: 一 新建数组 新建数组可以用一下方法: var obj = ['zdy',22,'湖北武汉','计算机科学与技术'];//创建一个数组变量 var obj1 = new Array('zdy',22,'湖北武汉','计算机科学与

WIN98注册表编辑器的常用操作

注册表 WIN98注册表编辑器的常用操作注册表编辑器是一个可以让你改变系统注册设定的高级工具,有经验的Windows用户可以通过编辑注册表改变系统设定. 启动注册表编辑器的方法是执行Windows文件夹下的REGEDIT.EXE.如果注册表中有错误,计算机可能不能正常运行.如果发生这种情况,可以将注册表信息恢复到上次启动计算机时的状态.下面详细介绍Win98注册表编辑器常用的操作. 一.恢复注册表 1.单击"开始",再单击"关闭系统": 2.单击"重新启动

C#中对DatagridView的部分常用操作

C#中对DatagridView部分常用操作 只列出技巧部分,后面会有补充 0(最基本的技巧). 获取某列中的某行(某单元格)中的内容 this.currentposition = this.dataGridView1.BindingContext [this.dataGridView1.DataSource, this.dataGridView1.DataMember].Position; bookContent = this.database.dataSet.Tables[0].Rows [

python中list常用操作实例详解

  本文实例讲述了python中list常用操作.分享给大家供大家参考.具体分析如下: 1.定义list ? 1 2 3 4 5 6 7 >>> li = ["a", "b", "mpilgrim", "z", "example"] >>> li ['a', 'b', 'mpilgrim', 'z', 'example'] >>> li[0] 'a' &

MongoDB在PHP中的常用操作小结

  本篇文章主要是对MongoDB在PHP中的常用操作进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 $mongodb = new Mongo(); //$connection = new Mongo( "$dburl:$port" ); // connect to a remote host (default port) $mydb = $mongodb->mydb; //隐性创建数据库mydb $mydb = $mongodb->selectDB(&