response和request

response

一.概述

Servlet 最主要的作用就是处理客户端请求,并向客户端做出响应。为此,针对 Servlet 的每 次请求,Web 服务器在调用 service() 之前,都会创建两个对象,分别是 HttpServletRequest 和 HttpServletResponse,其中,

             HttpServletRequest 用于封装 HTTP 请求消息,简称 request 对象。

             HttpServletResponse 用于封装 HTTP 响应消息,简称 response 对象。


二.HttpServletResponse 对象

在 ServletAPI 中,定义了一个 HttpServletResponse 接口,它继承自 ServletResponse,专门 用来封装 HTTP 响应消息。
HTTP 响应消息分为三部分

         响应状态行

         响应消息头

         响应消息体

1.发送响应消息相关方法

  • getOutputStream()方法 该方法所获取的字节输出流对象为 ServletOutputStream 类型。由于 ServletOut putStream 是 OutputStream 的子类,它可以直接输出字节数组中的二进制数据。因此,要 想输出二进制格式的响应正文,就需要使用 getOutputStream() 方法
  • getWriter()方法 该方法所获取的字符输出流对象为 PrintWriter 类型。由于 PrintWriter 类型的对象可 以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档,需要使用 getWriter()方法
//方式1:专门输出二进制类型数据的
String data="小y"; 
ServletOutputStream out=response.getOutputStream();
out.write(data.getBytes());
//方式2:专门输出字符文本的类型数据
String data1="小太阳yyy";
PrintWriter writer=response.getWriter();
writer.write(data1);
//两个方式不可同时使用

三.乱码问题的解决

由于计算机中的数据都是以二进制形式存储的,因此,当传输文本时,就会发生字符和字节 之间的转换。 字符与字节之间的转换是通过查码表完成的,将字符转换成字节的过程称为编码,将字节转 换成字符的过程称为解码,如果编码和解码使用的码表不一致就会导致乱码问题。
      解决方法:

         只需要保证响应数据的编码和浏览器解析的编码一致即可.

          response 缓冲区的默认编码是 iso8859-1,此码表中没有中文,可以通过 response 的 setCharacterEncoding(Stringcharset) 设置 response 的编码
          将 response 缓冲区的编码设置成 UTF-8,但浏览器的默认编码是本地系统的编码,中文系统 默认编码是 GBK,我们可以手动修改浏览器的编码是 UTF-8。
          还可以在代码中指定浏览器解析页面的编码方式,通过 response 的 setContentType(String type)方法指定页面解析时的编码是 UTF-8 response.setContentType("text/html;charset=UTF-8"); 上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含 setCharacterEncoding 的功 能
开发中只要编写 response.setContentType("text/html;charset=UTF-8");就可以解决页面输出中 文乱码问题。

四.文件下载

          文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端。 所以文件需要使用到 IO 流将服务器端的文件使用 InputStream 读取到,再使用 ServletOutputStream 写到 response 缓冲区中

<h1>使用 a 标签直接指向服务器上的资源</h1> 
<a href="/WEB14/download/a.xlsx">a.xlsx</a><br> 
<a href="/WEB14/download/b.jpg">b.png</a><br> 
<a href="/WEB14/download/c.mp3">c.mp3</a><br> 
<a href="/WEB14/download/d.txt">d.txt</a><br>

存放文件位置:

          访问 Servlet 直接进行下载:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取输出流,用于输出二进制数据的输出流
		ServletOutputStream out=response.getOutputStream();
		//获取服务器上文件的地址
		String path=this.getServletContext().getRealPath("download/1.jpeg");
		//设置文件mime的类型.使浏览器可以解析的文件也变成下载而不是直接打开
		response.setContentType(this.getServletContext().getMimeType("download/1.jpeg"));
		//返回image/jpeg
		//System.out.print(this.getServletContext().getMimeType("download/1.jpeg"));
		//设置下载的文件的名称
		response.setHeader("Content-Disposition","attachment;filename=1.jpeg");
		//创建输入流将文件读取到流中
		InputStream in=new FileInputStream(path);
		//copy
		int len=0;
		byte[] b=new byte[1024];
		while((len=in.read(b))!=-1){
			out.write(b,0,len);
		}
		in.close();
		out.close();
	}

           下载指定文件:

    <a href="/day34/download2Servlet?filename=1.jpeg">1.jpeg</a><br>
    <a href="/day34/download2Servlet?filename=人员.xlsx">人员.xlsx</a><br>
    <a href="/day34/download2Servlet?filename=3.txt">3.txt</a><br>
    <a href="/day34/download2Servlet?filename=4.zip">4.zip</a><br>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取文件名称
		String filename=request.getParameter("filename");
		String filePath="download/"+filename;
		//获取请求头中的User-Agent
		 //String agent=request.getHeader("User-Agent"); 
		 String filenameEncoder="";
		 //除了IE浏览器和火狐浏览器,解决文件名是中文的问题
		 filenameEncoder=URLEncoder.encode(filename,"utf-8");
		//设置文件的类型
		response.setContentType(this.getServletContext().getMimeType(filenameEncoder));
		//设置文件下载方式和下载名称
		response.setHeader("Content-Disposition","attachment;filename="+filenameEncoder);
		//执行IO流下载的过程
		ServletOutputStream out=response.getOutputStream();
		//将文件读取到输入流中
		String realPath=this.getServletContext().getRealPath(filePath);
		InputStream in =new FileInputStream(realPath);
		//copy
				int len=0;
				byte[] b=new byte[1024];
				while((len=in.read(b))!=-1){
					out.write(b,0,len);
				}
				in.close();
				out.close();
	}

五.请求重新定向

当客户端访问 Servlet1 时,由于在 Servlet 中调用了 sendRedirect() 方法将请求重定向到 Servlet2 中,因此,Web 服务器在收到 Servlet1 的响应消息后,立刻向 Servlet2 发送请求 Servlet2 对请求处理完毕后,再将响应消息回送给客户端。
代码示例:

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 Servlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.print("servlet1获得了请求");
		//重定向
		response.sendRedirect("/day34/servlet2");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
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 Servlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().write("servlet2 get request");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

request

1.概述

在 Servlet API 中,定义了一个 HttpServlet Request 接口,它继承自 ServletRequest 专门用 来封装 HTTP 请求消息。由于 HTTP 请求消息分为请求行、请求消息头和请求消息体三部分, 因此,在 HttpServlet Request 接口中定义了获取请求行、请求头和请求消息体的相关方法 .

二.获取请求信息的方法

方法声明                                功能描述

String getMethod()                 获取 http 请求消息中请求方式(GET、POST)

String getRequestURI()         获取 URL 的主机和端口之后、参数部分之前 的部分 

String getQueryString()         GET 提交 url 地址后的参数字符串

String getServletPath()          获取 Servlet 的名称或 Servlet 所映射的路径

String getRemoteAddr()        获取访问者 ip 地址 
 

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 RequestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String method=request.getMethod();//获取请求方式
		System.out.println(method);
		//获取请求资源地址路径(端口号之后,参数列表之前,包括项目名和请求地址)
		String requestURI=request.getRequestURI();
		System.out.println(requestURI);
		//获取参数列表之前的部分(包括主机地址,端口号,项目名,请求地址)
		StringBuffer requestURL=request.getRequestURL();
		System.out.println(requestURL);
		//获取GET方式请求的参数列表
		String queryString=request.getQueryString();
		System.out.println(queryString);
		//获取servlet的名称或者映射路径
		String servletPath=request.getServletPath();//映射地址
		System.out.println(servletPath);
		//获取请求的端口号
		int serverPort=request.getServerPort();//端口号
		System.out.println(serverPort);
		//获取请求的IP地址
		String remoteAddr=request.getRemoteAddr();
		response.getWriter().write(remoteAddr);
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

三. 获取请求消息头的方法 

代码示例:

import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 获取请求的相关信息
 * @author yyy
 *
 */
public class Request2Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取指定名称的头信息
		String userAgent=request.getHeader("User-Agent");
		System.out.println(userAgent);
		//获取所有的头信息
		Enumeration<String> headerNames=request.getHeaderNames();
		while(headerNames.hasMoreElements()) {
			String headerName=headerNames.nextElement();
			String headerValue=request.getHeader(headerName);
			System.out.println(headerName+"-"+headerValue);
			response.getWriter().write(headerName+"-"+headerValue);
			response.getWriter().write("<br>");
		}
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

四.获取请求参数

在实际开发中,经常需要获取用户提交的表单数据,例如,用户名、密码、电子邮件等,为 了方便获取表单中的请求参数,在 HttpServlet Request 接口中,定义了一系列获取请求参数 的方法。 

代码如下:

import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RegServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //request解决post方式提交的中文乱码问题
		 request.setCharacterEncoding("utf-8");
		 //request解决get方式提交的中文乱码问题
		 //方式1:获取指定名称的表单数据
		 String username=request.getParameter("username");
		 System.out.println("用户名:"+username); String
		 password=request.getParameter("password");
		 System.out.println("密码:"+password); String[]
		 hobbies=request.getParameterValues("hobby");
		 System.out.println("爱好:"+hobbies);
		 System.out.println(Arrays.toString(hobbies)); 
		 //方式2:获取所有的表单数据
		 Enumeration<String> parameterNames=request.getParameterNames();
		 while(parameterNames.hasMoreElements()) { String
		 param=parameterNames.nextElement();
		 System.out.println(param+": "+request.getParameter(param)); }
		 
		//方式3:获取所有的表单数据,返回map集合.
		Map<String,String[]> maps=request.getParameterMap();
		for (Map.Entry<String, String[]> entry : maps.entrySet()) {
			System.out.println(entry.getKey());
			for(String str:entry.getValue()) {
				System.out.println(str);
			}
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

表单数据

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <form action="/day35_request/regServlet" method="post">
       <label for="username">用户名:</label>
       <input type="text" name="username" id="username"><br>
       <label for="password">密&emsp;码:</label>
       <input type="password" name="password" id="password"><br>
       <label for="">爱&emsp;好:</label>
       <input id="hoby" type="checkbox" name="hobby" value="coding">敲代码
       <input id="hoby" type="checkbox" name="hobby" value="playing">玩游戏
       <input id="hoby" type="checkbox" name="hobby" value="booking">打吴天赐<br>
       <input type="submit" value="确认">
    </form>
</body>
</html>

五.请求转发 

工作原理

当客户端访问 Servlet1 时,可以通过 forward() 方法将请求转发给其它 Web 资源,其它 Web 资源处理完请求后,直接将响应结果返回到了客户端 .

代码示例:

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 Servlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//Servlet1获取到了请求,转发到Servlet2
		System.out.println("servlet1获取到了请求,它又丢给了Servlet2");
		request.getRequestDispatcher("/servlet2").forward(request, response);
	
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
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 Servlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("Servlet2只能接受这个请求了..");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

执行结果:

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值