Servlet讲解及使用1

标签: java  servlet

Servlet进阶

一、HttpServletResponse接口

HttpServletResponse

  • 说明: 该接口继承自ServletResponse接口,主要用于处理响应内容。
  • 响应对象的作用: 用于当请求完成,处理响应到浏览器的页面。文本、图片等等信息,通过写的方式在浏览器展示。
  • 将响应内容分为三类: 响应行、响应头、响应体。

查看请求和响应头信息的方法

  • 第一步:F12 或者Fn + F12 或者 鼠标右键网页,选择检查
  • 第二步: 选择network
  • 点击请求的路径,如下:
    • 查看请求和响应信息:
      在这里插入图片描述

(一)响应行

  • HTTP协议:
    • 概述:Http是超文本传输协议,是应用层协议,底层使用TCP进行数据的传输;Http协议是无状态,请求和响应过程协议本身是不保留承认信息的,即发送过得请求对于http协议来说是不知道是否已经发送过的。不会记录任何信息(无状态的好处是安全)
    • TCP:
      • 第一次: 客户端发送请求到服务器告诉服务器需要建立连接。
      • 第二次:服务器接收到请求之后给客户端发送响应告诉,已经接收到请求。
      • 第三次: 客户端接收到服务器反馈,并告诉服务无器以及接收到反馈,然后连接建立。
    • http协议的不同版本:
      • 0.9: 主要用于传输文本类型的数据
      • 1.0 : 除传输文本之外还可以传输非文本,如图片等,但是1.0是短连接,每次请求都会建立新的连接,会不断的断开和响应。
      • 1.1:在1.0版本的基础之上提升了传输效率,是长连接,长连接是指在建立连接之后,下一个请求来之前不会立即断开连接,而是在一定的时间内可以处理多个请求响应,等结束之后再指定时间内没有请求发起才会断开连接。
      • Https:
        • HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 [1] 。HTTPS 在HTTP 的基础下加入SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面 [2] 。
        • 查看完整身份以及证书的方法:
          在这里插入图片描述
  • 状态码(响应码):
    • 状态码用来表示响应回来的信息的状态的。

    • 常见的状态及含义:

      • 1XX : 100 以内的状态码表示请求已经发送,等待进一步处理。
      • 2XX : 200 到300之间,不包括300,表示响应成功,典型的是200.
      • 3XX : 表示资源被重定向到另一个位置或者是服务器。
      • 4XX: 通常表示资源找不到404,或者请求方法找不到或不能匹配405。
      • 5XX: 服务器异常,主要包括代码逻辑错误或者异常产生。常见的如500.
    • 常见错误的状态码:

      • 404常见问题:

        • 1、要请求的文本不存在,即当前项目与没有提供访问的文件。
        • 2、文本名称错误。
        • 3、将文本放在访问不到的位置,如WEB-INF目录下直接去访问。或者放错位置。
        • 4、服务为启动
      • 405 请求方法不存在或者错误:

        • servlet没有提供对应请求类型的方法,如servlet中只提供了get,访问时使用post请求。
    • 设置状态码的方法: reposne.setStatus(状态码);

(二)响应头

  • 响应头查看方法:
  • 响应头信息大全:
    在这里插入图片描述
    • 响应头大全:
      在这里插入图片描述
      • 响应头大全
        在这里插入图片描述
  • 重要的响应头信息:
    • Content-type: 用来设置响应的数据的MIME类型,MIME类型的格式为 : 大类型/小类型 ,如html文件的MIME类型为 text/html; 图片的MIME类型为 image/jpg ;或者是 image/png
      js文件的MIME类型 text/javaScript;
    • Content-Disposition: 设置文件打开的方式且下载。 其中该响应头的值为attachment; filename=文件名
    • date: 设置响应的日期。
    • content-length: 设置响应的数据的长度,单位字节。
  • 如何设置响应头
    • 通用发方法:
      • response.setHeader(“响应头名字”,“响应头的值”)
      • response.addHeader(“响应头名字”,“响应头的值”);
      • 区别: 两个在设置响应头是用法是一致的的,在设置单个响应头信息是可以互换,但是区别在于addHeader 可以一次添加多个,但是在实际使用时,一次通常只设置一个,所以用法基本完全一致。
    • 设置Content-Type响应头专用方法:
      • response.setContentType(‘Content-Type响应头的值’);
  • 响应图片案例
    • 1.告诉浏览器图片的形式打开响应的内容 即Content-type : image/jpg
      2、需要在服务器提供和响应头设置相同的类型的图片。
      3、将服务器的图片读取到内存中。
      4、将读取到的图片写出到浏览器。
    • 代码实现:
   package com.ujiuye.servlet;
    import java.io.IOException;
    import java.io.InputStream;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class ImageServlet extends HttpServlet {    	
    	private static final long serialVersionUID = 1L;
    	
    	@Override
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		resp.setHeader("Content-Type", "image/jpg"); //设置响应头类型
    		ServletContext context = req.getServletContext();//通过请求获取服务器对象
    		//读取服务器上的图片返回输入流
    		InputStream input = context.getResourceAsStream("source/3.jpg"); 		
    		//将读取到的图片的输入流响应到浏览器
    		//通过响应获取输出流
    		ServletOutputStream out = resp.getOutputStream();
    		byte[] by = new byte[1024];
    		int num = -1;
    		//IO 流的读写过程
    		while((num = input.read(by)) != -1) {
    			out.write(by,0,num);
    		}
    		
    		//关闭资源
    		out.close();
    		input.close();}
    }
  • 文件下载案例
    • 实现步骤:
      • 1、准备下载的文件到服务器
      • 2、设置响应的类型为文件下载,即Content-disposition 为attachment;filename=文件名;
      • 3、读取服务器上的文件,已流的形式返回。
      • 4、将读取的文件写出到浏览器已以下载方式打开。
    • 代码实现:
 package com.ujiuye.servlet;

    import java.io.IOException;
    import java.io.InputStream;

    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class DownLoadServlet extends HttpServlet {    	    	
    	private static final long serialVersionUID = 1L;
    	
    	@Override
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		//获取要下载的文件的名字
    		String name = req.getParameter("name");
    		System.out.println("文件名: " + name);
    		String filename = new String(name.getBytes("UTF-8"),"ISO-8859-1");
    		//设置文件下载时的响应头
    		/* 中文名文件下载乱码处理 */
    		resp.addHeader("Content-Disposition", "attachment;filename=" + filename);
    		ServletContext context = req.getServletContext();
    		//读取服务器上的资源文件
    		InputStream input = context.getResourceAsStream("source/" + name);
    		//获取响应输出流对象
    		ServletOutputStream out = resp.getOutputStream();
    		
    		//IO 流的读写
    		byte[] by = new byte[1024*8];
    		int num = -1;
    		while((num = input.read(by)) != -1) {
    			out.write(by, 0, num);
    		}
    		
    		//关闭资源
    		out.close();
    		input.close();    		
    	}
    }
前端代码: download.html
  <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <a href="down?name=3.jpg">3.jpg下载</a><br>
    <a href="down?name=DBUtil实现DML.mp4">DBUtil实现DML.mp4下载</a><br>
    <a href="down?name=mysqlData.zip">mysqlData.zip下载</a><br>
    <a href="down?name=vcredist_x64.exe">vcredist_x64.exe下载</a><br>
    </body>
    </html>
  • 注意: 如果下载的文件名称包含中文,此时需要进行编码和解码,方法为 对于设置响应头时,将通过请求获取的文件名通过 new String(文件名.getBytes(“UTF-8”),“ISO-8859-1”);如图所示:
    在这里插入图片描述

(三)响应体

  • 响应体主要方法:
    • 响应文本类型的数据即获取打印字符流):
      方法: PrintWriter pw = response.getWrite();
    • 响应所有类型,主要用于非文本(字节输出流):
      方法: OutPutStream
      out = response.getOutPutStream();
  • 响应表格:
    • 步骤:
      • 1、创建一个servlet,设置响应数据的MIME类型
      • 2、定义响应表格的内容
      • 3、将表格内容放入响应体响应出去。
    • 实例:
  package com.ujiuye.servlet;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class TableServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	
    	@Override
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		//设置响应头的MIME类型
    		resp.setContentType("text/html;charset=UTF-8");
    		PrintWriter pw = resp.getWriter();
    		String table = "<!DOCTYPE html>\r\n" + 
    				"<html>\r\n" + 
    				"<head>\r\n" + 
    				"<meta charset=\"UTF-8\">\r\n" + 
    				"<title>Insert title here</title>\r\n" + 
    				"</head>\r\n" + 
    				"<body>\r\n" + 
    				"<table align=\"center\" border=\"1\" cellspacing=\"0\">\r\n" + 
    				"	<tr><th>编号</th><th>姓名</th><th>密码</th><th>年龄</th></tr>\r\n" + 
    				"	<tr><td>1</td><td>狗二蛋</td><td>12345</td><td>23</td></tr>\r\n" + 
    				"	<tr><td>2</td><td>林蛋大</td><td>2343</td><td>21</td></tr>\r\n" + 
    				"	<tr><td>3</td><td>二狗子</td><td>1235</td><td>30</td></tr>\r\n" + 
    				"	<tr><td>4</td><td>傀儡</td><td>12345</td><td>80</td></tr>\r\n" + 
    				"	\r\n" + 
    				"</table>\r\n" + 
    				"</body>\r\n" + 
    				"</html>";
    		//将要响应的表格内容放入响应体
    		pw.print(table);
    		pw.close();
    	}
    }

二、HttpServletRequest接口

HttpServletRequest

  • 说明: HttpServletRequest接口是ServletRequest接口的子接口,是用于处理请求的对象。
  • 作用:主要作用是获取请求提交的参数、获取请求头信息、获取请求行、以及进行页面跳转,通过作用于携带参数等。

(一)请求行

  • 请求行的信息就是浏览器地址栏所见的所有信息。
  • 协议:String scheme = req.getScheme();
  • 主机名:String serverName = req.getServerName();
  • 端口号: int port = req.getServerPort();
  • 服务器的根路径String path = req.getContextPath();
  • 服务器的请求相对路径String path1 = req.getServletPath();
  • 查询参数:String query = req.getQueryString();
  • 相对项目的绝对地址:String uri = req.getRequestURI();
  • 代码实例:
 package com.ujiuye.servlet;

  import java.io.IOException;

  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServlet;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;

  public class RequestTrServlet extends HttpServlet {

  	private static final long serialVersionUID = 1L;
  	
  	@Override
  	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  		//http://localhost:8080/day1101/tr?name=%E5%BC%A0%E4%B8%89&password=12345
  		String scheme = req.getScheme(); //请求的协议
  		String serverName = req.getServerName(); //服务器的域名
  		int port = req.getServerPort(); //服务器的端口号
  		String path = req.getContextPath(); //服务器的根路径
  		String uri = req.getRequestURI(); //请求相对服务器的绝对路径
  		String query = req.getQueryString(); //查询参数
  		String path1 = req.getServletPath();
  		System.out.println(req.getServletPath()); //请求的相对路径
  		/* 在jsp中设置文件的路径时,会使用该种拼接方式 */
  		System.out.println(scheme + "://" + serverName + ":" + port + path + path1 + "?" + query);  	
  	}
  }

(二)请求头

  • 获取请求头参数的方法:
    • String headername = request.getHeader(“请求头名”);获取的单个请求头的值
    • 获取多个请求头的名字,然后通过名字来获取多个值:
      在这里插入图片描述
版权声明:本文为qq_45018290原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45018290/article/details/108069170

智能推荐

Ubuntu 14.04 下,安装 Java8

下载Java http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 打开上述链接, , 下载 特定的 Java8 版本。笔者选择的是 jdk-8u172-linux-x64.tar.gz。 - 配置Java环境变量 将 jdk-8u172-linux-x64.tar.gz 解压至指定目...

OpenCV学习之路(五)图像的几何变换

在这一章将要学习图像的移动、旋转,仿射变换等 扩展缩放 我们如果想要改变图像的大小,我们就需要对图像进行扩展缩放,opencv提供给我们控制扩展缩放的函数: 参数解释: src:进行扩展缩放的原图片 dst:可以在此处设置缩放因子,也可手动设置尺寸 interpolation:在缩放时我们推荐使用cv2.INTER_AREA, 在扩展时我们推荐使用cv2.INTER_CUBIC(慢) 和 cv2....

2018.8.27

2018.8.27...

HTML 表单元素的基本样式

HTML 表单元素的基本样式 原创 ixygj197875 发布于2018-02-22 17:48:53 阅读数 2296 收藏 更新于2018-05-20 15:35:58 分类专栏: 揭秘 CSS 揭秘 CSS 收起 表单元素主要包括 label、input、textarea、select、datalist、******、progress、meter、output等,以及对表单元素进行分组的 ...

php输出语句

php输出语句 常见的输出语句 echo(): 可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用。 print(): 函数print()打印一个值(它的参数),如果字符串成功显示则返回true,否则返回false。 print_r(): 可以把字符串和数字简单地打印出来,而数组则以括起来的键和值...

猜你喜欢

工厂模式

简介 常见的实例化对象模式。 用工厂方法替代new操作的一种模式。 当我们使用new操作实例化对象时,调用构造函数完成初始化。若初始化仅是进行赋值等简单的操作,写入构造函数即可。但如果初始化时需要执行一长串复杂的代码,将多个工作装入一个方法,是不妥的。 创建实例与使用实例分离。将创建实例所需的大量初始化工作从基类的构造函数中分离出去。 简单工厂模式、工厂方法模式针对的是一个产品等级结构;而抽象工厂...

B1105 Spiral Matrix (画图)

B1105 Spiral Matrix (25分) //第一次只拿了21分 矩阵的长和宽,求最大因子,从sqrt(num)开始枚举. 每次循环一次,s++,t--,d--,r++ 测试点四运行超时,是因为输入一个数字的时候,需要直接输出这个数字。//1分 测试点二运行超时,最后一个数字不必再while循环一次,直接输出即可。//3分 最后一个测试点卡了好久/(ㄒoㄒ)/~~ 螺旋矩阵...

Java基础=>String,StringBuffer与StringBuilder的区别

字符串常量池 什么是字符串常量池? JVM为了减少字符串对象的重复创建,其维护了一块特殊的内存,这段内存被称为字符串常量池(存储在方法区中)。 具体实现 当代码中出现字符串时,JVM首先会对其进行检查。 如果字符串常量池中存在相同内容的字符串对象,如果有,则不再创建,直接返回这个对象的地址返回。 如果字符串常量池中不存在相同内容的字符串对象,则创建一个新的字符串对象并放入常量池,并返回新创建的字符...

java调用其他java项目的Https接口

项目中是这样的: 用户拿出二维码展示,让机器识别二维码, 机器调用开门的后台系统接口, 然后开门的后台系统接口需要调用管理系统的接口, 管理系统需要判断能不能开门.这两个系统是互相独立的.当时使用http调用是没有问题的.当时后来要求必须用https.废话不说,直接代码: 我的项目中调用的是 HttpsUtils.Get(utlStr) 这个接口 开门系统接口如下图:   管理系统的接口...

Hadoop1.2.1全分布式模式配置

一 集群规划 主机名            IP                               安装的软件 &nbs...