自启动Servlet
自启动servlet也叫自动实例化servlet
特点
- 该Servlet的实例化过程不依赖于请求,而依赖于容器的启动,当Tomcat启动时就会实例化该Servlet
- 普通Servlet是在浏览器第一次向服务器发出请求时才会被创建
如何配置
通过在web.xml中的<servlet>标签中配置<load-on-startup></load-on-startup>自启动Servlet
<servlet>
<servlet-name>autostart</servlet-name>
<servlet-class>www.servlet.AutoStart</servlet-class>
<!-- 值的大小决定创建的先后顺序-->
<load-on-startup>1</load-on-startup>
</servlet>
通过自启动Servlet实现文件的读取
1)在servlet标签中添加要获取的文件的路径,并设置该Servlet为自启动
<servlet>
<servlet-name>autostart</servlet-name>
<servlet-class>www.servlet.AutoStart</servlet-class>
<!--添加图片的路径-->
<init-param>
<param-name>path</param-name>
<param-value>image</param-value>
</init-param>
<!-- 值的大小决定创建的先后顺序,该标签必须放到servlet标签的最下面-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>autostart</servlet-name>
<url-pattern>/autostart.do</url-pattern>
</servlet-mapping>
2)在自启动Servlet的init()方法中通过ServletConfig对象获取init-param的name值,并放到全局容器ServletContext中,
这样当Tomcat启动时init方法就会被执行,图片的路径被存放到全局容器中,所有Servlet都能拿到
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; public class AutoStart extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } @Override
public void init() throws ServletException {
//ServletConfig只对当前servlet有效
ServletConfig servletConfig=this.getServletConfig();
String path=servletConfig.getInitParameter("path");
//获取全局容器对象
ServletContext servletContext=this.getServletContext();
//将获取的path放到全局容器ServletContext中,所有servlet都能获取
servletContext.setAttribute("path",path);
System.out.println("AutoStartServlet");
}
}
3)文件下载的Servlet
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*; @WebServlet("/filedown")
public class FileDown extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext对象,继承自GenericServlet类
ServletContext servletContext=this.getServletContext();
//获取存放图片的目录名称
String path=(String) servletContext.getAttribute("path");
//将相对路径转换为绝对路径
String realpath=servletContext.getRealPath(path+"/樱花.jpg");
System.out.println(realpath); //读取要下载的文件
// File file=new File("D:\\樱花.jpg");
File file=new File(realpath);
//用字节输入流存储文件
InputStream is= new FileInputStream(file);
//创建字节数组
byte[] buff=new byte[is.available()];
is.read(buff); //在响应添加附加信息
// resp.addHeader("Content-Disposition", "attachment; filename="+file.getName());
//将原来的文件名按照gbk的方式变成字节,再按iso-8859-1编码方式变成新的字符串
resp.addHeader("Content-Disposition","attachment;filename="+
new String(file.getName().getBytes("gbk"),"iso-8859-1")); //产生响应
//创建字节输出流
OutputStream os=resp.getOutputStream();
//响应到客户端
os.write(buff);
//刷新流
os.flush();
//关闭流
os.close();
}
}
自启动Servlet的更多相关文章
- pushlet实现服务器端向客户端推送信息
使用Pushlet来实现服务器端向客户端推送信息 1. 实现方式: 有两种实现方式: 1. 通过配置文件来实现定时的从服务器端向客户端推送信息 2. 通过API主动 ...
- Structs1 -配置例子(转)
转自:(http://blog.csdn.net/xys_777/article/details/7542095) Action, ActionForm, ActionForward ,这三个对象构成 ...
- 《Spring3.0就这么简单》
第一章 认识Spring 1.Spring提供的IOC容器,是Spring大杀器之一.容器将对象之间的依赖关系交给Spring进行控制,采用配制的方式对依赖关系进行描述,由Ioc容器负责依赖类之间的创 ...
- activemq学习
一.特性及优势 1.实现JMS1.1规范,支持J2EE1.4以上2.可运行于任何jvm和大部分web容器(ActiveMQ works great in any JVM)3.支持多种语言客户端(jav ...
- 使用Pushlet将消息从服务器端推送到客户端
使用Pushlet来实现服务器端向客户端推送信息 1. 实现方式: 有两种实现方式: 1. 通过配置文件来实现定时的从服务器端向客户端推送信息 2. 通过API主动 ...
- 使用Pushlet来实现服务器端向客户端推送信息
使用Pushlet来实现服务器端向客户端推送信息 1. 实现方式: 有两种实现方式: 1. 通过配置文件来实现定时的从服务器端向客户端推送信息 2. 通过A ...
- 搭建SSM项目框架全过程及思考
1.前言 之前都是在现有框架下进行写代码或者总是看一些别人的架构,总会眼高手低.于是打算自己完整的走一遍流程,同时把所遇到的问题,思考的问题记下来,供大家参考.由于是工作年限不高,属于新手,不足之处还 ...
- ActiveMQ嵌入Tomcat
在一些项目中,单独开启一个ActiveMQ,对于项目实施来说有时略显繁琐.所以我们将ActiveMQ内嵌到Tomcat,Tomcat启动同时就顺带启动了ActiveMQ.由此我们需要掌握三个个重要的知 ...
- servletsza
servlet本身不能独立运行,需要在一个web应用中运行,而web应用是部署在tomcat上的 所以一个servlet开发需要以下几个步骤: ①创建web应用项目 ②编写servlet代码 ③部署到 ...
随机推荐
- 原生数据类型 nint,nuint,nfloat
原生数据类型根据操作系统32位 64位的不同,用这个关键定义的数据大小也不一样. 比如 nint 在 Xamarin.iOS 中,是 native int(原生整数)的缩写.当设备是 Apple 发布 ...
- 通过修改profile 来修改账号的过期时间
转至:https://blog.csdn.net/xxzhaobb/article/details/80026028 查看账号的过期时间 SYS@test>select username,exp ...
- WinRar:你需要从上一压缩卷启动解压命令以便解压
大文件被分解成许多个小的RAR文件,并按顺序排列好,解压时只需解压第一个RAR文件即可顺利解压所有文件,如果不按顺序解压就会出现上述问题,导致解压完一个子文件候无法解压剩下的文件
- c语言刷lleetcode记录
155. 最小栈 笔记: 在push(压栈)的时候思路: typedef struct MinStack{ int data; struct MinStack *next; } MinStack; / ...
- c# 表格控件SourceGrid使用总结
网上SourceGrid相关的资料很少,使用过程中做了下记录,以便日后查用 1:初始化 this.grid = new SourceGrid.Grid(); this.grid.Size = new ...
- linux添加串口权限
通过添加到用户组的方式实现1.由于tty属于"dialout"组别,比如你的用户名是blue, 先命令查看下用户隶属的组别 groups blue 2.如果没有隶属"di ...
- 华山论剑之 PostgreSQL sequence (二)
rename 对 sequence 的影响 关联列与 sequence 后,即 sequence 属于该列后,drop 表或列时会自动 drop 相关 sequence. 但如果对表或列 rename ...
- LeetCode-095-不同的二叉搜索树 II
不同的二叉搜索树 II 题目描述:给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 .可以按 任意顺序 返回答案. 二叉搜索树(Binary ...
- Python自动化 unittest生成测试报告(HTMLTestRunner)03
批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的. unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTest ...
- 【python】kNN基础算法--推荐系统(辅助研究)
# -*- coding:utf-8 -*- # import numpy as np #import numpy 和from numpy import *是不一样的 # # # import num ...