自启动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(); } }
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号