请求响应及重定向

request和response

request功能

1.接受用户的参数
2.转发
3.作为域对象

接受用户的请求参数:

/**
 * 接受用户的请求参数
 */
@WebServlet("/one")
public class OneServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 设置请求编码格式
		request.setCharacterEncoding("utf-8");
		// 获取姓名
		String name = request.getParameter("name");
		System.out.println("姓名:"+name);
		// 获取爱好
		String[] hobbys = request.getParameterValues("hobby");
		for (String str : hobbys) {
			System.out.println(str);
		}
		// 获取性别
		String sex = request.getParameter("sex");
		System.out.println("性别:"+sex);
		// 获取所有的参数名称
		Enumeration<String> names = request.getParameterNames();
		while(names.hasMoreElements()){
			String str = names.nextElement();
			System.out.println("name:"+str);
		}
		System.out.println("----------------");
		// 获取map类型的数据
		Map<String, String[]> map = request.getParameterMap();
		// 遍历map
		for (java.util.Map.Entry<String, String[]> entry : map.entrySet()) {
			System.out.println(entry.getKey()+":");
			String[] value = entry.getValue();
			for (String val : value) {
				System.out.println(val+" ");
			}
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

乱码问题

/**
 * 处理请求的乱码问题
 */
@WebServlet("/two")
public class TwoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// tomcat8版本之后默认编码格式不是iso-8859-1,是utf-8,不需要对get请求设置编码格式,老版本需要设置编码格式
		String name = request.getParameter("username");
		System.out.println(name);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 方式一
		// 目前的编码格式:iso-8859-1
		/*String name = request.getParameter("username");
		// 得到iso-8859-1对应的字节数组
		byte[] bytes = name.getBytes("iso-8859-1");
		// 根据utf-8进行编码得到新的字符串
		String name1 = new String(bytes , "utf-8");
		System.out.println("old:"+name);
		System.out.println("new:"+name1);*/
		// 方式二(可以使用过滤器设置编码格式)
		// 注意:一定要在参数获取之前设置请求的编码格式
		request.setCharacterEncoding("utf-8");
		String name = request.getParameter("username");
		System.out.println(name);
	}
}

获取请求行信息

package com.hpe.request;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;

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

import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry.Entry;
/**
 * 获取请求行信息
 */
@WebServlet("/three")
public class ThreeServlet 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");
		PrintWriter out = response.getWriter();
		// 1.得到请求类型GET
		out.println("请求类型:"+request.getMethod()+"</br>");
		// 2.得到/servlet03/three
		out.println("请求地址:"+request.getRequestURI()+"</br>");
		// 3.得到http://localhost:8080/servlet03/three
		out.println("请求地址:"+request.getRequestURL()+"</br>");
		// 4.得到/servlet03
		out.println("请求地址:"+request.getContextPath()+"</br>");
		// 5.得到/three
		out.println("请求地址:"+request.getServletPath()+"</br>");
		// 6.得到请求的ip地址(客户端的IP地址)0:0:0:0:0:0:0:1
		out.println("请求IP:"+request.getRemoteAddr()+"</br>");
		// 7.以String的形式返回指定请求头的值;如果不存在,则返回null
		// 得到localhost:8080
		out.println("请求主机:"+request.getHeader("Host")+"</br>");
		// 得到http://localhost:8080/servlet03/index.html
		out.println("请求来源:"+request.getHeader("Referer")+"</br>");
		// 8.得到null
		out.println("信息类型:"+request.getContentType()+"</br>");
	
		// 如何获取当前web应用程序的地址
		// 9.得到协议名称
		String http = request.getScheme();
		// 10.得到主句
		String host = request.getServerName();
		// 11.得到端口号
		int port= request.getServerPort();
		// 12.得到上下文路径
		String path = request.getContextPath();
		// 拼接打印
		String basePath = http + "://" + host + ":" + port + path +"/";
		out.print(basePath+"</br>");
		
		// 如何解决相对路径问题:使用绝对路径
		// <base href="http://localhost:8080/servlet03/">下面的所有超链接地址都是基于base
	}

}

应用案例:

@WebServlet("/four")
public class FourServlet 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");
		PrintWriter out = response.getWriter();
		// 获取请求来源
		String referer = request.getHeader("Referer");
		if(referer == null){
			out.write("返回首页,<a href='index.html'>首页</a>");
		}else{
			out.write("<img src='"+request.getContextPath()+"/imgs/1.jpg'/>");
		}
	}

}

请求转发

概念

一个web资源收到客户端请求后,通过服务器去调用另外一个web资源进行处理。

特点

1.只发送一次请求,发送请求后请求对象会保存
2.是server内部转发,地址栏不变
3.共享request中的数据:request对象始终是同一个
4.路径:/代表当前web应用程序路径
5.只能转发到当前的web应用资源

request实现共享数据

1.Request对象同时也是一个域对象(Map容器),在实现转发时把request对象带给其他web资源。
2.要求:必须满足是同一个请求
3.实现:request.setAttribute(name,value)
4.获取:request。getAttribute(name)

代码实例

转发的Servlet:

package com.hpe.forward;

import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;

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

import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry.Entry;
@WebServlet("/forward")
public class ForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("请求转发...");
		// 请求转发到TestServlet
		// 请求转发步骤
		// 1.使用request中的getRequestDispatcher(转发的地址),得到的是RequestDispatcher实例
		// 2.执行转发(调用requestDispatcher中的forward方法进行请求转发)
		//RequestDispatcher requestDispatcher = request.getRequestDispatcher("test");
		//requestDispatcher.forward(request, response);
		// /解决相对路径位置
		// 共享数据 ServletContext,HTTPSession,HttpServletRequest
		request.setAttribute("name", "jack");
		// 获取属性
		System.out.println("name:"+request.getAttribute("name"));
		request.getRequestDispatcher("/test").forward(request, response);
		//也可以请求转发到一个页面
		//request.getRequestDispatcher("/index.html").forward(request, response);
		// 转发结束
		System.out.println("转发结束");
	}

}

转发到的Servlet:

package com.hpe.forward;

import java.io.IOException;
/**
 * 测试请求转发和重定向
 */
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/test")
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("TestServlet...");
		String name = (String)request.getAttribute("name");
		System.out.println("name:"+name);
	}

}

response

概念

HttpServletResponse是ServletResponsede 子接口,用于封装Http响应信息。

功能

1.设置响应内容

字符流输出
字节流输出

例子:

package com.hpe.response;

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

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * response
 */
@WebServlet("/five")
public class FiveServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 通过设置响应头控制浏览器以utf-8的编码显示数据
		//response.setHeader("Content-type", "text/html;charset=utf-8");// application/json
		response.setContentType("text/html;charset=utf-8");
		// 设置响应内容(字节流和字符流输出是互斥的,使用了一个另一个则不能使用)
		// 字符流输出
		//PrintWriter out = response.getWriter();
		//out.print("BATJ:百度、阿里、腾讯、京东");
		// 字节流输出
		ServletOutputStream out2 = response.getOutputStream();
		out2.write("SEO:搜索引擎优化".getBytes("utf-8"));
	}

}

2.设置响应头
3.重定向

重定向

概念

请求发送回浏览器,由浏览器再重新向服务器自动发送一个请求

实现方式

调用response对象的sendRedirect(url)

特点

1.发送了两次请求,前一次的请求不会保留,会有两个request和response对象
2.地址栏会发生变化
3.不会共享request中的数据
4.路径:重定向路径以/开头,/代表当前web站点的路径
5.可以重定向到任何url的资源
6.状态码为302
请求转发和重定向的区别
1.请求转发只发送一次请求,重定向发送了两次请求
2.请求转发地址栏是初次访问的地址,重定向地址栏开始是初次访问地址,后来是最后响应的地址
3.请求转发的request对象始终是同一个,重定向中的request对象是两个
4.请求转发只能转发给当前的web应用,重定向可以定向到任何资源
5.请求转发中的/代表当前web应用的路径http://localhost:8080/servlet03,而重定向中的/代表web站点的路径http://localhost:8080
6.请求转发是一种server行为(服务器内部转发),重定向是一种client行为(交给客户端重新自动发起请求)
例子:

package com.hpe.redirect;

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;

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("请求重定向...");
		// 设置请求域的对象
		request.setAttribute("name", "tom");
		System.out.println(request.getAttribute("name"));
		// 请求重定向
		// 1.使用test是相对路径,相对于当前的servlet。http://localhost:8080/servlet03/a/test
		// 2.使用/test是绝对路径,相对于当前tomcat站点。http://localhost:8080/test
		// 3.拼接路径如下
		String contextPath = request.getContextPath();
		// 可以在重定向的时候传递数据
		int id = 1;
		response.sendRedirect(contextPath+"/test?id="+id);
		//response.sendRedirect("http://www.baidu.com");
	}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章