Javaweb之Request对象与ServletContext对象

简介: Request对象功能:设置响应消息ServletContext对象概念代表整个web应用,可以和程序的容器(Tomcat服务器)来通信

Request对象

功能:设置响应消息

1. 设置响应行

  1. 格式:协议/版本 响应状态码 状态码状态
  2. 设置状态码:setStatus(int sc)

2. 设置响应头

setHeader(String name,String value)

3. 设置响应体

  1. 获取输出流(相对于当前程序来讲这是输出东西到客户端)
    字符输出流:PrintWriter getWriter()
    字节输出流:ServletOutputStream getOutputStream()
  2. 使用输出流,将数据输出到客户端浏览器

4. 响应重定向

       //重定向到responseServlet2

       /*

       //1.设置状态码为302

       response.setStatus(302);

       //2.设置响应头location

       response.setHeader("location", "/responseServlet2");

       */

       //鉴于上述重定向代码参数大都固定,封装有更为简单的重定向方法

       response.sendRedirect("/responseServlet2");

5. redirect和forward的区别?

重定向redirect的特点

  1. 地址栏发生变化
  2. 重定向可以访问其他站点(服务器)的资源
  3. 重定向是两次请求,不能使用request域对象来共享数据(request域对象仅作用 于一次请求的范围内)

转发forward的特点

  1. 转发地址栏不变
  2. 转发只能访问当前服务器的资源
  3. 转发是一次请求,可以使用request域对象来共享数据

6. 相对路径与绝对路径

相对路径

  1. 通过相对路径不可以唯一确定资源
  2. 相对路径以 . 开头,如 ./index.html
  3. ./为当前目录
  4. ../为上一级目录
  5. 如果相对路径开头什么都没有,那么默认为当前目录 ./    如 index.html=./index.html

绝对路径(常用)

  1. 通过绝对路径可以唯一确定资源
  2. 绝对路径以/开头,如 /responseServlet2
  3. 给浏览器使用的绝对路径中需要添加虚拟目录(项目的访问路径)

HTML页面中的链接是一定要加虚拟目录的

服务器端servlet中只有重定向需要加虚拟目录,因为重定向是给浏览器看的(因此有两次请求,用session来共享数据)

服务器端的请求转发不需要加虚拟目录,因为将请求转发是给服务器看的(因此只有一次请求,用request来共享数据)

  1. 超链接a<a href="/test/checkCodeServlet">超链接</a>
  2. form表单<form action="/test/loginServlet">
  3. 服务器响应给浏览器的重定向
    虚拟目录动态获取:request.getContextPath()

//需要动态获取虚拟目录

response.sendRedirect(request.getContextPath()+"/responseServlet2");

  1. 给服务器使用,绝对路径中不需要添加虚拟目录
  1. 服务器进行请求转发

request.getRequestDispatcher("/index.jsp").forward(request, response);

相对路径与绝对路径的区别

  1. 在HTML中使用相对路径,浏览器会在地址栏内容上加上相对路径

1.HTML文件中的超链接

<ahref="hello">relative</a>

2.当前地址栏内容(当前虚拟目录是springmvc01)

http://localhost:8080/springmvc01/

3.点击超链接后,地址栏内容为

http://localhost:8080/springmvc01/hello

  1. 在HTML中使用绝对路径,浏览器会在域名:端口后加上绝对路径

1.HTML文件中的超链接

<ahref="/hello">absolute</a>

2.当前地址栏内容(当前虚拟目录是springmvc01)

http://localhost:8080/springmvc01/

3.点击超链接后,地址栏内容为

http://localhost:8080/hello

7. 服务器输出字符流

中文数据乱码问题

  1. PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
  2. response.setContentType("text/html;charset=utf-8");输出流之前设置响应消息体的数据格式以及编码

       //设置响应消息体的数据格式以及编码

       //response.setHeader("content-type", "text/html;charset=utf-8");

       //上述代码的简单形式

       response.setContentType("text/html;charset=utf-8");

       //1.获取字符输出流

       PrintWriterwriter=response.getWriter();

       //2.输出数据

       writer.write("你好啊啊啊,dominus!");

8. 服务器输出字节流

       //告诉浏览器该流使用的编码

       response.setContentType("text/html;charset=utf-8");

       //1.获取字节输出流

       ServletOutputStreamsos=response.getOutputStream();

       //2.输出数据

       sos.write("你好 dominus!".getBytes("utf-8"));

9. 验证码

       intwidth=100;

       intheight=50;

       //1.创建一个对象,在内存中生成图片

       BufferedImageimage=newBufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

       //2.美化图片

       //2.1填充背景色

       Graphicsg=image.getGraphics();//画笔对象 graphics:图像

       g.setColor(Color.PINK);//设置画笔颜色

       g.fillRect(0, 0, width, height);//填充矩形

       //2.2画边框

       g.setColor(Color.BLUE);

       g.drawRect(0,0,width-1,height-1);

       //2.3画验证码

       Stringstr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

       Randomran=newRandom();

       for (inti=1; i<=4; i++) {

           intindex=ran.nextInt(str.length());//返回[0,str,length)之间的随机整数

           charc=str.charAt(index);//随机字符

           g.drawString(String.valueOf(c), width/5*i, height/2);

       }

       //2.4画干扰线

       g.setColor(Color.GREEN);

       for (inti=0; i<10; i++) {

           intx1=ran.nextInt(width);

           intx2=ran.nextInt(width);

           inty1=ran.nextInt(height);

           inty2=ran.nextInt(height);

           g.drawLine(x1, y1, x2, y2);

       }

       //3.将图片输出到浏览器

       ImageIO.write(image, "jpg", response.getOutputStream());

<script>

   window.onload=function (){

       //获取超链接对象和图片对象

       vara=document.getElementById(`a`);

       varimage=document.getElementById("image");

       //绑定单机事件

       a.onclick=function () {

           //加时间戳

           vardate=newDate().getTime();

           //当超链接被点击时,更换img标签的src属性

           //并且为了浏览器不访问上次缓存的图片,要给绝对路径加上时间戳这个参数

           image.src="/checkCodeServlet?"+date;

       }

   }

</script>

ServletContext对象

概念

代表整个web应用,可以和程序的容器(Tomcat服务器)来通信

获取

  1. 通过request对象获取request.getServletContext()
  2. 通过HttpServlet获取     this.getServletContext()

在同一个web应用中,以上两种方式获取的ServletContext对象为同一个

功能

1. MIME类型

  1. 在互联网通信过程中定义的一种文件数据类型
  2. 格式:大类型/小类型text/htmlimage/jpeg
  3. 获取:String getMimeType(String filename)

2. 域对象:共享数据

  1. 方法:
  1. void setAttribute(String name,Object obj):存储数据
  2. Object getAttribute(String name):通过键获取值
  3. void removeAttribute(String name):通过键移除键值对
  1. ServletContext域对象范围:所有用户所有请求的数据

3. 获取文件的真实(服务器)路径

src目录下的文件都在WEB-INF的classes文件夹中

  1. 方法:String getRealPath(String path)
  2. context.getRealPath("/b.txt");//web目录下资源访问
  3. context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
  4. context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问

classPath类路径

在编译打包后的项目中,根目录是META-INFWEB-INF

WEB-INF/classes 就是类路径,包含src下的所有文件

文件下载案例

       //1.获取请求参数:文件名称

       Stringfilename=request.getParameter("filename");

       System.out.println(filename);

       //2.使用字节输入流加载文件进内存

       //2.1找到文件的服务器路径

       ServletContextservletContext=this.getServletContext();

       Stringpath=servletContext.getRealPath("/img/"+filename);

       //2.2用字节流关联

       FileInputStreamfis=newFileInputStream(path);

       //3.设置response的响应头

       //3.1设置响应头:content-type

       StringmimeType=servletContext.getMimeType(filename);

       response.setContentType(mimeType);

       //3.2设置响应头:打开方式content-disposition

       //解决中文文件名问题

       //获取user-agent请求头

       Stringua=request.getHeader("user-agent");

       //使用工具类方法编码文件名即可

       filename=DownLoadUtils.getFileName(ua, filename);

       response.setHeader("content-disposition", "attachment;filename="+filename);//将文件以附件的形式弹出下载框

       //4.将输入流数据写到输出流

       ServletOutputStreamsos=response.getOutputStream();

       byte[] buff=newbyte[1024*8];

       intlen=0;

       //fis.read(buff)从此输入流中将最多buff.length个字节的数据读入一个byte数组中,如果因为已经到达文件末尾而没有更多的数据,则返回 -1

       while ((len=fis.read(buff))!=-1){

           sos.write(buff, 0, len);

       }

       fis.close();

//HTML文件

<body>

<ahref="/ggbond/downloadServlet?filename=小鸡.jpg">下载</a>

</body>

//解决中文文件名编码问题的工具类

packagecn.upeveryday.util;

importsun.misc.BASE64Encoder;

importjava.io.UnsupportedEncodingException;

importjava.net.URLEncoder;

publicclassDownLoadUtils {

   publicstaticStringgetFileName(Stringagent, Stringfilename) throwsUnsupportedEncodingException {

       if (agent.contains("MSIE")) {

           // IE浏览器

           filename=URLEncoder.encode(filename, "utf-8");

           filename=filename.replace("+", " ");

       } elseif (agent.contains("Firefox")) {

           // 火狐浏览器

           BASE64Encoderbase64Encoder=newBASE64Encoder();

           filename="=?utf-8?B?"+base64Encoder.encode(filename.getBytes("utf-8")) +"?=";

       } else {

           // 其它浏览器

           filename=URLEncoder.encode(filename, "utf-8");

       }

       returnfilename;

   }

}


目录
相关文章
|
4月前
|
Java
深入JavaSE:详解Java对象的比较。
总的来说,Java对象的比较就像海洋生物的比较,有外在的,有内在的,有面对所有情况的,也有针对特殊情况的。理解并掌握这些比较方式,就能更好地驾驭Java的世界,游刃有余地操作Java对象。
84 12
|
5月前
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
161 23
|
5月前
|
Java 数据安全/隐私保护
Java 类和对象
本文介绍了Java编程中类和对象的基础知识,作为面向对象编程(OOP)的核心概念。类是对象的蓝图,定义实体类型;对象是具体实例,包含状态和行为。通过示例展示了如何创建表示汽车的类及其实例,并说明了构造函数、字段和方法的作用。同时,文章还探讨了访问修饰符的使用,强调封装的重要性,如通过getter和setter控制字段访问。最后总结了类与对象的关系及其在Java中的应用,并建议进一步学习继承等概念。
122 1
|
5月前
|
存储 缓存 Java
理解Java引用数据类型:它们都是对象引用
本文深入探讨了Java中引用数据类型的本质及其相关特性。引用变量存储的是对象的内存地址而非对象本身,类似房子的地址而非房子本身。文章通过实例解析了引用赋值、比较(`==`与`equals()`的区别)以及包装类缓存机制等核心概念。此外,还介绍了Java引用类型的家族,包括类、接口、数组和枚举。理解这些内容有助于开发者避免常见错误,提升对Java内存模型的掌握,为高效编程奠定基础。
273 0
|
5月前
|
Java
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
118 0
|
6月前
|
设计模式 缓存 Java
重学Java基础篇—Java对象创建的7种核心方式详解
本文全面解析了Java中对象的创建方式,涵盖基础到高级技术。包括`new关键字`直接实例化、反射机制动态创建、克隆与反序列化复用对象,以及工厂方法和建造者模式等设计模式的应用。同时探讨了Spring IOC容器等框架级创建方式,并对比各类方法的适用场景与优缺点。此外,还深入分析了动态代理、Unsafe类等扩展知识及注意事项。最后总结最佳实践,建议根据业务需求选择合适方式,在灵活性与性能间取得平衡。
364 3
|
6月前
|
存储 算法 安全
Java对象创建和访问
Java对象创建过程包括类加载检查、内存分配(指针碰撞或空闲列表)、内存初始化、对象头设置及初始化方法执行。访问方式有句柄和直接指针两种,前者稳定但需额外定位,后者速度快。对象创建涉及并发安全、垃圾回收等机制。
Java对象创建和访问
|
12天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
47 0
|
24天前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
58 16