request response(ee

[toc]

01–读取WEB工程下的文档

1
2
3
4

InputStream is = new FileInputStream("src/db.properties");用绝对路径可以
Properties properties = new Properties();
properties.load(is);
  • getResourceAsStream读取
    默认在tomcat的项目根目录下(web项目下):
    ServletContext. getResourceAsStream("/WEB-INF/classes/db.properties");

  • getRealPath读取
    通过相对路径获得绝对路径
    String realPath = context.getRealPath("/WEB-INF/classes/db.properties");
    // 获得该文档的磁盘绝对路径.
    InputStream is = new FileInputStream(realPath);

  • 类加载器读取文档

    1
    2
    3
    4
    5
    6
    7
    8

    // 类的加载器用来加载class文档,将class文档加载到内存.
    InputStream is = ReadFileUtils.class.getClassLoader().getResourceAsStream("db.properties");
    Properties properties = new Properties();
    properties.load(is);
    // 放在src中的文档,类加载器读取
    // webContent里面 通过ServletContext读取
    //不在servlet中使用类加载器

02–ServletContext功能

  1. 读取全局初始化参数
    ServletContext.getInitParameter() 读取web.xml中的参数
    ServletConfig.getInitParameter() 读取servlet标签中配置的参数

  2. 获得文档的MIME的类型
    MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文档用一种应用进程来打开的方式类型,当该扩展名文档被访问的时候,浏览器会自动使用指定应用进程来打开文档下载,设置mime类型,浏览器自动使用指定应用进程来打开
    ServletContext.getMimeType(“xxxxx.jpg”);

  3. 作为域对象存取数据
    setAttribute(key,Object)/getAttribute(key)
    ServletContext对象
    创建时间:服务器启动的时候创建,一个项目有且仅有一个ServletContext对象
    销毁时间:服务器关闭或者项目移除
  4. 读取web项目下的文档
    默认读取项目根路径下的文档
    ServletContext.getResourceAsStream(“路径”)
    通过相对路径动态获得根盘符的绝对路径
    ServletContext.getRealPath(“路径”)

03–文档的下载

  • 超链接下载.直接将文档的路径写到超链接的href中.(文档类型,浏览器不支持才下载,不然直接打开)
  • 手动编写代码的方式完成文档的下载(设置两个头和一个流)
    • Content-Type: 文档的MIME的类型.
    • Content-Disposition: 以下载的形式打开文档.
    • InputStream: 文档的输入流.response.getOutputStream() 往浏览器输出
1
2
3
4
5
6
7
8
9
10
11
// 2.1设置Content-Type头
String type = this.getServletContext().getMimeType(filename);
response.setHeader("Content-Type", type);
// 2.2设置Content-Disposition头
response.setHeader("Content-Disposition","attachment;filename="+filename);
// 2.3设置文档的InputStream.
//realPath = this.getServletContext().getRealPath("/download/"+filename);
//InputStream is = new FileInputStream(realPath);
InputStream is = this.getServletContext.getResourceAsStream("/download/"+filename)
// 获得response的输出流:
OutputStream os = response.getOutputStream();

04–中文文档名下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
String filename=new String( request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");
String fileType = this.getServletContext().getMimeType(filename);
response.setHeader("Content-Type", fileType);
String realPath = this.getServletContext().getRealPath("/webpagehtml/download/"+filename);
InputStream is=new FileInputStream(realPath);
String agent = request.getHeader("User-Agent");
System.out.println(agent);
//根据浏览器的不同来编码
if(agent.contains("Firefox")){
filename = base64EncodeFileName(filename);
}else{
filename = URLEncoder.encode(filename,"UTF-8");
}
response.setHeader("Content-Disposition", "attachment;filename="+filename);
ServletOutputStream outputStream = response.getOutputStream();
int len=0;
byte[] by=new byte[1024];
while((len=is.read(by))!=-1){
outputStream.write(by,0,len);
}
is.close();
//base64Encoder编码
private static String (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);
}
}

05–响应中文的解决

输出中文字符:response.setContentType(“text/html;charset=UTF-8”);
字符流: response.getWriter()(做页面响应输出)
字节流:response.getOutputStream() (做文档下载)

06–request功能

Request对象的功能
1.获得客户端的信息
String getRequestURI()
StringBuffer getRequestURL()
2.获得请求参数
getParameter(key)
3.域对象,存储数据
setAttribute(key,Object)
getAttribute()

07–request处理中文乱码的问题

接收中文乱码
get方式提交:new String(String.getByes(“ISO-8859-1”),”UTF-8”)
配置server.xml URIEncoding=”utf-8”
post方式提交:
设置request缓冲区的编码:request.setCharacterEncoding(“UTF-8”)

输出中文乱码
设置response.setContentType(“text/html;charset=utf-8”)
设置response.setHeader("Content-Type","text/html;charset=UTF-8");

08–重定向和转发的区别

转发与重定向的区别

  • 重定向的地址栏会发生变化,转发的地址栏不变
  • 重定向两次请求两次响应,转发一次请求一次响应.
  • 重定向路径需要加工程名,转发的路径不需要加工程名.
  • 重定向可以跳转到任意网站,转发只能在服务器内部进行转发.
  • 重定向不能使用request域存储数据,转发可以使用request存储数据

09–request域对象

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

总结

  1. ==ServletContext==

    • 获得初始化参数 getInitParameter("username")``getInitParameterNames()
    • 获得MIME类型 getMimeType(“文档名”)
    • ==域对象存储获取键值对== setAttribute(key,Object) getAttribute(key)
    • ==读取web工程下的文档== getResourceAsStream("/WEB-INF/classes/db.properties")``getRealPath("/WEB-INF/classes/db.properties")``new FileInputStream("路径")``ReadFileUtils.class.getClassLoader().getResourceAsStream("db.properties");
  2. response对象

    • 重定向response.sendRedirect(路径)
    • 输出字符串response.getWriter().println(字符串)
    • 设置各种响应头的信息response.setContentType(“text/html;charset=utf-8”)
      下载设置文档的显示方式 response.setHeader(“Content-disposition”,”attachement;filename=xxx.xx”)
  3. request 对象

    • 接收参数 getParameter(key)
    • 获得客户端的信息
      getRequestURL() // http://localhost:8080/day10/xxxx
      getRequestURI() // /day10/xxxx
      getRemoteAddr() 获得客户端的IP地址
      getMethod() 获得访问方式
      getContextPath() 获得当前工程名称
    • 作为域对象存储数据 setAttribute(key,Object) getAttribute(key)
    • 转发 request.getRequestDispatcher("/demo1-download/login.jsp").forward(request, response);
  4. ==转发和重定向的区别==

    • 转发时浏览器地址栏不会改变,重定向会改变
    • 转发发起一次请求返回一次响应,重定向发起两次请求两次响应
    • 转发也叫服务器内部跳转,只能访问到自己工程的路径,重定向可以访问外部的路径
    • 转发书写路径转发时不需要写工程名称,重定向要写工程名(/day10/xxxx)
    • 转发可以使用request域存取数据,重定向不能使用
  5. ==中文乱码的解决==
    接收中文乱码
    get方式 new String(String.getBytes("ISO-8859-1"),"UTF-8");
    post方式 request.setCharacterEncoding(“UTF-8”)

    输出中文乱码
    字符流
    设置response.setContentType("text/html;charset=UTF-8");
    字节流
    response.setHeader("Content-Type", "text/html;charset=UTF-8"); // 设置浏览器默认打开的时候采用的字符集编码
    response.getOutputStream().write("中文".getBytes("UTF-8")); // 设置中文转成字节数组的时候取出的编码