Respones&&Request

本文详细介绍了HTTP协议中Request和Response的工作原理,包括如何通过Request获取客户端信息及参数,以及如何利用Response对象向客户端发送响应信息。重点讲解了不同场景下的应用案例,如错误状态码的设置、页面跳转、中文输出、文件下载等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Respose对象,用于生成http响应信息,对于开发人员来说就是向response对象中添加信息即可

 响应首行

        Http         200             ok

        void setStaus(int sc)

        void setStatus(int sc,String sm)

        void sendError(int sc) 
        void sendError(int sc, String msg) 


       响应头

             键:值

         void setHeader(String name, String value)  设置键值对.
void setDateHeader(String name, long date) 设置键值对.
void setIntHeader(String name, int value)  设置键值对.

void addHeader(String name, String value) 添加键值对.
void addDateHeader(String name, long date)添加键值对.
void addIntHeader(String name, int value) 添加键值对.


            响应空行

            响应正文

        给浏览器的资源

                  getWrite(); 字符流

                  getOutputStream() 字节流

//---------------------------------------------------------------------------

           例1: 手动向浏览器 发送404错误状态码.

public class AServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.sendError(500,"找到也不告诉你 ");
		
		
	}

}


例2: 访问BServlet,3秒后浏览器自动跳转到传智首页.
<meta http-equiv="Refresh" content="3;url=地址" > 用于模拟响应头的 

public class CServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//response.setStatus(302);//告诉浏览器要重定向
		//添加Location相应头 高速浏览器重定向到哪里
		//response.setHeader("Location", "http://localhost:8080/");
		response.sendRedirect("http://localhost:8080/");
	}

}

例4: 向浏览器输出文字(字节流,中文)

public class EServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//设置解码码表
		
		//response.setCharacterEncoding("UTF-8");
		
		//解码码表
		//response.setHeader("Content-Type", "text/html;charset=UTF-8");//控制解码码表

		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write("黑马");
		
		
	}

}

例5: 向浏览器输出文字(字符流,中文)

public class DServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setHeader("Content-Type", "text/html;charset=GBK");//控制解码码表
		response.getOutputStream().write("前".getBytes("GBK"));//将字符串变成字节流 默认码表就是UTF-8
		

	}

}

//结论:
//1 输出中文建议使用字符流
//2 解决字符流乱码 使用setContentType放可以同时设置编码解码两端的码表.
//3 注意: 码表的设置一定放到输出之前
//4 注意: 字符流与字节流不能同时使用


例6: 向浏览器输出图片.(由servlet输出).

public class FServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获得图片的输入流
		 //获得输出浏览器的输入流
		//两个对象对接
		InputStream is = getServletContext().getResourceAsStream("/WEB-INF/XXX1.jpg");
		//获得输出到浏览器的输出流
		OutputStream os = response.getOutputStream();
		byte[] buffer = new byte[1024];
		int len = -1;
		while((len = is.read(buffer))!=-1){
			os.write(buffer,0,len);
			os.flush();
		}
		os.close();
		is.close();
	}

}


例7: 文件下载(向浏览器输出内容)

public class GServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		ServletContext sc = getServletContext();
		String type = sc.getMimeType("abc.exe");
		response.setContentType(type);
		
		//0 设置响应头=> 提示用户保存名称   =>  Http协议不支持中文码表=> %E5%C3 => URLEncoder.encode("apache-汤姆-6.0.35.exe","UTF-8");
		response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("1.zip","UTF-8"));
		// 1 获得文件的输入流
	InputStream is = getServletContext().getResourceAsStream("/WEB-INF/1.zip");
		// 2 获得输出到浏览器的输出流
	OutputStream os = response.getOutputStream();
		// 3 两个流对接
	byte[] buffer = new byte[1024];
	int len = -1;
	
	while((len = is.read(buffer))!=-1){
		os.write(buffer,0,len);
		os.flush();
	}
	os.close();
	is.close();

	}

}


Request

       HTTP 请求协议        

         请求方式             请求首行           请求路劲        协议 /版本号

               String   getMethod()  获得请求方式

               request.getContextPath                获得项目的路径

               String getServletPath()                  拿到Servlet的路径

               request.getQueryString()       name=tom?age=19   获得请求路径中的参数

               request.getRequestURI(): /day08-request/AServlet  获得当前访问的相对路径,相对主机路径

               request.getRequestURL(): http://localhost:8080/day08-request/AServlet 获得当前访问的绝对路径

        request.getServletPath(): /AServlet 获得servlet路径

       String getScheme()  获得协议协议

               request.getContentLength(): -1 返回正文内容长度

               request.getContentType(): null 返回正文内容类型
       request.getLocale(): zh_HANS_CN  获得accept-language:zh_CN

       request.getServerName(): localhost 获得主机名称

               request.getServerPort(): 8080 获得访问端口号

               String getHeader(String name) 根据键获得值(值只有一个)

               long getDateHeader(String name)

               int getIntHeader(String name) 

               Enumeration getHeaderNames()  获得所有请求头的名字

               Enumeration getHeaders(String name)  根据键获得值(值有多个)


  请求空行

   请求正文                      post才有请求正文               请求参数 => name=tom&age=18


                 String  getParameter(String name ) 根据参数键获得参数值

                 Map<String,String[]> getParameterMap() 根据参数键获得参数值

                Enumeration          getParameterNames()获得所有参数的键

                String[]      getParameterValues(String name) 根据参数键获得参数值



如何获得表单上的键值对

        String getParameter(String  key);         根据键值获得值的方式

      String[]  getParamterValues(String key)  当一个键对应多个值时 该方法就会返回多个值

       Enumeration   getParameterNames () 获得参数的所有键

       Map<String,String[]> getParameterMap() 获得封装所有键值对的map

        1> 提交方式为get时.

2> 提交方式为post时.
//因为post提交,是在获得参数的同时才进行解码. 那么我们就可以在获得参数之前设置解码码表.
//注意: 设置编码的代码一定要放到,获得参数代码之前
req.setCharacterEncoding("UTF-8");


          request的其他功能

 
1. 请求转发/请求包含


请求转发:
一个servlet里面处理逻辑, 将处理结果交给下一个Servlet(JSP)负责显示.

操作(代码):
request.getRequestDispatcher("/EServlet").forward(request,response);


      转发与重定向的异同

        1 浏览器一共发了多少次请求

            重定向:两次请求

             转发:一次请求

         2浏览器地址发生变化与否

         重定向  地址发生改变 

         转发:  不会发生改变

        3  会改变请求方式吗

           重定向:未必 重定向的第二次不一定是

           转发: 不会

          4.request 可不可以共享数据

                 重定向 不可以

                转发:可以 因为在一个请求范围之中

               注意:

            Servlet 向jsp转发   servlet专注于逻辑处理  Jsp注重现实和结果的处理  不要在应该处理逻辑的地方做显示操作。也就是说在servlet中不要使用字符流或字节流做任何输出的动作(不能添加响应正文)。 可以添加响应头。

转发的Servlet不可以向response的正文中添加任何内容.但是可以向响应头添加内容.


//------------------------------------------------------------------------------------------------------------------------------------------

请求包含
一般请求包含不会在两个servlet中进行.都是在两个jsp中进行.
当在多个页面总有需要重复显示的内容. 我们可以把这段内容封装到一个jsp中. 以后凡是要显示这段重复的内容时,只需要把封装的jsp包含进来即可.

操作(代码):
request.getRequestDispatcher("/XXX").include(request,response);

//----------------------------------------------------------------------------------------------------
Request 域

        request 域就是一个放在request对象的声明map

         request域范围

              与request对象的声明周期是一样的 请求达到服务器是,request对象创建当服务器响应浏览器之后, request对象销毁. 

request 域通常在请求装发时候使用 servlet处理结果,将结果放在request域中带给jsp显示.

setAttribute(key,value)
getAttribute(key)
removeAttribute(key)
getAttributeNames()
//------------------------------------------------------------------------------------------------------

什么时候使用转发

servlet负责处理逻辑,JSP用于显示,需要共享数据,一定使用转发 ,使用重定向会让数据丢失

当需要跳转到站外是,一定只能使用重定向














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值