servlet学习总结(二)—图片下载和读取属性文件

简介: servlet学习总结(二)—图片下载和读取属性文件

引言


在上一篇博客中给大家介绍了一些servlet中的学习收获,在这篇博客中接着给大家分享servlet中图片的下载和属性文件的读取。


先看一下整个demo的目录结构;


20161010205813095.png


1、图片的下载


package com.itheima.sc;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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 ServletContextDemo6 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    //文件在哪儿?以不变应万变
    ServletContext sc = getServletContext();
    String realPath = sc.getRealPath("/WEB-INF/classes/美女.jpg");//  文件存放的真实绝对路径
//    System.out.println(realPath);
    //构建文件的输入流
    InputStream in = new FileInputStream(realPath);
    //告知客户端以下载的方式打开:Content-Disposition=attachment;filename=27.jpg
    //获取要下载的文件名
    String filename  = realPath.substring(realPath.lastIndexOf(File.separator)+1);
    response.setHeader("Content-Type", "application/octet-stream");
    response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));//中文属于不安全的字符,需要进行URL编码
    //用response的字节流进行输出
    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);
  }
}

上面的demo就是在browser中以下载的方式获取图片,仅仅是供学习和研究用,在实际的项目中一般是不会用这个原生的servlet来实现文件的下载和上传的。


2、servlet读取属性文件


在这给大家提供三种读取属性文件的方式,代码如下:

public class servletContextDemo07 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    test10(request, response);
  }
  // 请不要把Tomcat等服务器装在有空格的目录中
  // 类加载器读取:只能读取classes或者类路径中的任意资源。但是不适合读取特别大的资源。b c
  private void test31(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ClassLoader cl = servletContextDemo07.class.getClassLoader();// 得到类加载器
    URL url = cl.getResource("com/itheima/resources/c.properties");
    String path = url.getPath();
    InputStream in = new FileInputStream(path);
    Properties props = new Properties();
    props.load(in);
    System.out.println(props.getProperty("hello"));
  }
  // 类加载器读取:只能读取classes或者类路径中的任意资源。但是不适合读取特别大的资源。b c
  private void test30(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ClassLoader cl = servletContextDemo07.class.getClassLoader();// 得到类加载器
    // InputStream in = cl.getResourceAsStream("b.properties");
    InputStream in = cl.getResourceAsStream("com/itheima/resources/c.properties");
    Properties props = new Properties();
    props.load(in);
    System.out.println(props.getProperty("hello"));
  }
  // 利用ResourceBundle读取:b c ,不能读a,只能读取properties的文件
  private void test20(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ResourceBundle rb = ResourceBundle.getBundle("b");
    ResourceBundle rb = ResourceBundle.getBundle("com.itheima.resources.c");
    System.out.println(rb.getString("hello"));
  }
  // 利用ServletContext读取:a b c
  // 可以读取应用中任何位置上的资源。使用限制:只能在web应用中用
  private void test10(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // String path = getServletContext().getRealPath("/a.properties");
    // String path =
    // getServletContext().getRealPath("/WEB-INF/classes/b.properties");
    String path = getServletContext().getRealPath("/WEB-INF/classes/com/itheima/resources/c.properties");
    InputStream in = new FileInputStream(path);
    Properties props = new Properties();
    props.load(in);
    System.out.println(props.getProperty("hello"));
  }
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
  }
}

遇到的错误


20161010211005172.png


解决方案;


右击项目——》properties——》java Build path ——》右侧选择Libraries——》选择JRE System Libray


然后点击 edit 将jdk换成1.6版本


20161010211530665.png


20161010211541431.png

在项目中读取properties文件还是比较常见的,一些基本配置信息都是配置在这个属性文件中,上面提供了三种读取方式供大家参考,读取方式还有很多中,大家可以去网上查询,然后对比一下根据自己的需求选择读取方式。


小结


上面是在学习servlet中的一些常用功能的总结,通过这两篇博客对servlet又进行了一次总结,这次比第一次接触servlet的时候更多了了解了一些内部的原理机制,这样看一些封装的东西会容易一些。

目录
相关文章
|
6月前
|
设计模式 前端开发 Java
了解 Spring MVC 架构、Dispatcher Servlet 和 JSP 文件的关键作用
Spring MVC 是 Spring 框架的一部分,是一个 Web 应用程序框架。它旨在使用 Model-View-Controller(MVC) 设计模式轻松构建Web应用程序。
101 0
|
11月前
|
小程序 Java 应用服务中间件
【JavaWeb学习】—Servlet(十三)
【JavaWeb学习】—Servlet(十三)
|
5月前
|
XML 数据格式
XML配置Servlet文件,不使用注解配置路径的方法
XML配置Servlet文件,不使用注解配置路径的方法
|
5月前
|
API
servlet研究学习总结--OutputStream和PrintWriter的区别
servlet研究学习总结--OutputStream和PrintWriter的区别
192 1
|
6月前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
Java 应用服务中间件
用IDEA创建servlet文件并用Tomcat运行
用IDEA创建servlet文件并用Tomcat运行
179 0
|
XML Java 应用服务中间件
都2023年了,Servlet还有必要学习吗?一文带你快速了解Servlet(二)
都2023年了,Servlet还有必要学习吗?一文带你快速了解Servlet(二)
243 0
|
Java 应用服务中间件 UED
都2023年了,Servlet还有必要学习吗?一文带你快速了解Servlet(一)
都2023年了,Servlet还有必要学习吗?一文带你快速了解Servlet(一)
219 0
|
XML 缓存 前端开发
Java学习之路006——Servlet开发
包括引入servlet的api库、IDEA2022配置servlet有关操作,以及servlet的xml配置与注解使用;以及简单的servlet编程实现。
165 0
Servlet学习(九):请求重定向(例如:页面搬迁后的跳转)
Servlet学习(九):请求重定向(例如:页面搬迁后的跳转)
117 0
Servlet学习(九):请求重定向(例如:页面搬迁后的跳转)