欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet之处理请求(六)

程序员文章站 2022-06-03 11:21:04
...

6.发送响应
在服务器端,Servlet对请求处理完后,通常需要向客户发回响应。如果需要直接向客户发送响应,需要使用输出流对象,也可以将响应重定向到其他资源。
HTTP响应结构分为三个部分:
1.状态行与状态码
状态行:HTTP版本、说明请求结果的响应状态码以及描述状态码的短语。
2.响应头
响应头是服务器向客户端发送的消息。
3.响应数据:空行后面的就是响应数据。

输出流与内容类型

public PrintWriter getWriter()  //返回一个PriterWriterd对象用于向客户发送文本数据;
public ServletOutPutStream getOutputStream() throws IOException  //返回一个输出流对象,用来向客户发送二进制数据
public void setContextType(String type)  //设置发送到客户端响应的MIME内容类型

1.使用PrintWriter
PrintWriter对象被Servlet用来动态产生页面。调用响应对象的getWriter()返回PriintWriter类对象,它可以向客户发送文本数据:

PrintWriter out =response.getWriter();

2.使用ServletOutputStream:

ServletOutputStream sos= response.getOutputStream();

3.设置内容类型
Servlet之处理请求(六)

下面的Servlet使用指标分隔符数据生成Excel电子表格

package com.demo;

import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * Servlet implementation class ExcelServlet
 */
@WebServlet("/excel.do")
public class ExcelServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("application/vnd.ms-excel;charset=Gb2312");
		PrintWriter out =response.getWriter();
		
		out.println("学号\t姓名\t年龄\t所在系");
		out.println("95001\t李勇\t男\t20\t信息");
		out.println("95002\t刘晨\t女\t19\t数学");
}

}

7.响应重定向
响应重定向:客户端的请求发给服务器后,该servlet有可能不直接向浏览器发送响应,而是向浏览器发送一个Location响应头,告诉浏览器访问其他资源
响应重对象是通过响应对象response的sendRedirect()实现,一般格式为:
Public void sendRedirect(String location)
响应重定向与请求转发的区别:
1.地址栏与响应报文:
请求转发:客户浏览器的地址栏不会显示转发后的资源地址,响应状态码:200;
响应重定位:新资源的URL在浏览器的地址栏可见,响应状态码:301,响应头增加location
2.数据共享:
请求转发:可以共享Request和Session作用域的属性(还在同一个请求Request周期内)
响应重定向:不能共享Request的属性,可以使用session对象作用域的数据

下面是使用sendRedirect()重定向请求的例子:

package com.demo;

import java.io.IOException;

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

/**
 * Servlet implementation class RedirectServlet
 */
@WebServlet("/redirect.do")
public class RedirectServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//重定向到另一个网页去处理,假设为welcome.jsp
//		request.setAttribute("username", "zhangsan");
		request.getSession().setAttribute("username", "lisi");;
		response.sendRedirect("welcome.jsp");
		
	}

}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登陆成功,welcom.jsp</title>
</head>
<body>
	<h4>登陆成功,欢迎您!${username}</h4>
</body>
</html>