tomcat的request和response小案例 1.传统方式读取文件 2.使用getRequestAsStream 3.使用getRealPath读取文件 4.ServletContext作为域对象保存数据 5.下载文件的小案例 6.中文乱码解决问题 7.Request作为域对象存取数据 8.转发和重定向的区别(redirect和forward)

@Test
    public void test() throws IOException {
        //创建输入流,关联文件
        InputStream is = new FileInputStream("src/demo.properties");
        Properties pro = new Properties();
        //加载到对象
        pro.load(is);
        //根据key拿到value
        String usernmae = pro.getProperty("username");
        String password = pro.getProperty("passwrod");
    }

2.使用getRequestAsStream

public class ServletContext1 extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //ServletContext对象
        ServletContext context = this.getServletContext();
        
        InputStream is = context.getResourceAsStream("/WEB-INF/classes/demo.properties");
        
        Properties pro = new Properties();
        
        pro.load(is);
        
        pro.getProperty("usernmae");
        
        pro.getProperty("password");
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

3.使用getRealPath读取文件

//获得ServletContext
        ServletContext context = this.getServletContext();
        //获得文件的绝对磁盘路径
        String realPath = context.getRealPath("/WEB-INF/classes/demo.properties");

4.ServletContext作为域对象保存数据

  

整个web目录,而且是全局对象
服务器启动的时候,服务器为每个web项目创建一个单独的ServletContext对象
服务器关闭的时候销毁

5.下载文件的小案例

分析:
超链接下载,直接将文件的路径写到超链接的href中,前提是文件类型浏览器不支持
手动编写代码的方式完成文件的下载
设置两个头和一个流:
Content-Type:文件的MIME类型
Content-Disposition:以下载的方式打开文件
InputStream:文件的输入流
代码:

    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取在html中的href中传入过来一个filename
        String filename = request.getParameter("filename");
        //设置下载方式
        String type = this.getServletContext().getMimeType(filename);
        response.setHeader("Content-type", type);
        response.setHeader("Content-Disposition", "attachment;filename="+filename);
        //得到文件的绝对路径
        String realPath = this.getServletContext().getRealPath("/download/"+filename);
        //设置流
        InputStream is = new FileInputStream(realPath);
        //获得相应的输出流
        OutputStream os = response.getOutputStream();
        int len = 0;
        byte [] arr = new byte[1024];
        while((len = is.read(arr)) != -1) {
            os.write(arr, 0, len);
        }
        is.close();
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

6.中文乱码解决问题

IE浏览器下载中文文件的时候采用的URL的编码
firefox浏览器下载中文文件的时候采用的是Base64的编码
1:根据浏览器的类型处理中文乱码问题:

String filename = request.getParameter("filename");
        //获得浏览器类型
        String agent = request.getHeader("User-Agent");
        //如果是火狐
        if(agent.contains("FireFox")) {
            filename = base64EncodeFileName(filename);
        }else {
            //其他浏览器
            filename = URLEncoder.encode(filename,"utf-8");
        }
    }
    public static String base64EncodeFileName(String fileName) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        try {
            return "=?UTF-8?B?"
                    + new String(base64Encoder.encode(fileName
                            .getBytes("UTF-8"))) + "?=";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

2:post方式解决中文乱码问题:
Request.setCharacterEncoding(“UTF-8”);
3.get方式解决中文乱码问题
New String(“name”.getBytes(“IOS-8859-1”),”UTF-8)”;
4.接收的参数解决中文乱码问题:
New String(“name”.getBytes(“IOS-8859-1”),”UTF-8)”;
5.输出中文乱码问题
字节流
设置浏览器默认打开的编码:
resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
设置中文字节取出的时候的编码
luanma.getBytes("utf-8");
字符流
设置浏览器默认打开的编码:
resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
设置response的缓冲区编码:
response.setCharacterEncoding(“UTF-8”);

7.Request作为域对象存取数据

  

setAttribute和getAttribute
作用范围:
就是一次请求的范围
创建和销毁:
创建:客户端向服务器发送了一次请求以后,服务器就会创建一个request的对象
销毁:当服务器对这次请求作出了响应之后


8.转发和重定向的区别(redirect和forward)

1.重定向地址栏会发生改变
2.重定向两次请求两次响应,转发一次请求一次响应
3.重定向需要加工程名,转发路径不需要
4.重定向可以跳转的任意页面,转发只能在服务器内部