白痴与Servlet的深入交流(三)内含解决请求参数的中文乱码问题(针对Get请求和Post请求)、RequestDispatcher请求转发(并与sendRedirect()请求重定向作对比分析)

HttpServletRequest应用

获取请求参数

在实际开发中,经常需要获取用户提交的表单数据,例如,用户名、密码、电子邮件等,为了方便获取表单中的请求参数,在HttpServletRequest接口的父类ServletRequest中,定义了一系列获取请求参数的方法,如表所示
在这里插入图片描述

示例1、

RequestParamServlet.java

package Request;

import java.io.IOException;
import java.util.Arrays;

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

/**
 * Servlet implementation class RequestParamServlet
 */
public class RequestParamServlet 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 {
		// TODO Auto-generated method stub
		String usernameString = request.getParameter("username");
		String passwordString = request.getParameter("pwd");

		String[] hobbysStrings = request.getParameterValues("hobby");
		response.getWriter().println("username:" + usernameString + "<br />");
		response.getWriter().println("password:" + passwordString + "<br />");
		response.getWriter().print("hobbys:   " + Arrays.toString(hobbysStrings));
	}

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

}

form.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>登录页面</h1><br />
	<form action="/Review4/param" method="get">
		<table>
			<tr>
				<td>用户名:</td>
				<td><input type="text" name="username" /></td>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name="pwd" /></td>
			</tr>
			<tr>
				<td><input type="checkbox" name="hobby" value="sing"/></td>
				<td>唱歌</td>
			</tr>
			<tr>
				<td><input type="checkbox" name="hobby" value="dance"/></td>
				<td>跳舞</td>
			</tr>
			<tr>
				<td><input type="checkbox" name="hobby" value="football"/></td>
				<td>足球</td>
			</tr>
			<tr>
				<td colspan="2" align="center">
				<input type="submit" value="提交" />
				</td>
			</tr>
		</table>
	</form>
	
</body>
</html>

全局配置:
在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述

示例2、

在示例1的基础上,改一下servlet的代码:
RequestParamServlet.java

package Request;

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

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

/**
 * Servlet implementation class RequestParamServlet
 */
public class RequestParamServlet 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 {
		// TODO Auto-generated method stub
		String usernameString = request.getParameter("username");
		String passwordString = request.getParameter("pwd");

		String[] hobbysStrings = request.getParameterValues("hobby");
//		response.getWriter().println("username:" + usernameString + "<br />");
//		response.getWriter().println("password:" + passwordString + "<br />");
//		response.getWriter().print("hobbys:   " + Arrays.toString(hobbysStrings));
		Map<String, String[]> map = request.getParameterMap();
		// 遍历map
		java.util.Set<String> set = map.keySet();
		for (String keyString : set) {
			String[] valueStrings = map.get(keyString);
			System.out.println("name属性的值:" + keyString + " " + Arrays.toString(valueStrings));
		}
	}

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

}

运行结果:
在这里插入图片描述
由于是System.out.println()方式输出的,所以结果输出在服务器

解决请求参数的中文乱码问题

doGet方法的情况

乱码的情况:
RequestParamServlet.java

package Request;

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

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

/**
 * Servlet implementation class RequestParamServlet
 */
public class RequestParamServlet 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 {
		// TODO Auto-generated method stub
//		paramMethod(request);
		String valueString = request.getParameter("username");
		response.getWriter().print(valueString);
	}

	private void paramMethod(HttpServletRequest request) {
		String usernameString = request.getParameter("username");
		String passwordString = request.getParameter("pwd");

		String[] hobbysStrings = request.getParameterValues("hobby");
//		response.getWriter().println("username:" + usernameString + "<br />");
//		response.getWriter().println("password:" + passwordString + "<br />");
//		response.getWriter().print("hobbys:   " + Arrays.toString(hobbysStrings));
		Map<String, String[]> map = request.getParameterMap();
		// 遍历map
		java.util.Set<String> set = map.keySet();
		for (String keyString : set) {
			String[] valueStrings = map.get(keyString);
			System.out.println("name属性的值:" + keyString + " " + Arrays.toString(valueStrings));
		}
	}

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

}

运行结果:
在这里插入图片描述
在这里插入图片描述
解决问题的过程:

通过以下代码我们可以知道默认响应编码格式

System.out.println(response.getCharacterEncoding());
		PrintWriter writer = response.getWriter();
		writer.write("张宸");

在这里插入图片描述

解决问题的代码:
RequestParamServlet.java

package Request;

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

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

/**
 * Servlet implementation class RequestParamServlet
 */
public class RequestParamServlet 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 {
		// TODO Auto-generated method stub
//		paramMethod(request);
//		System.out.println(response.getCharacterEncoding());
//		PrintWriter writer = response.getWriter();
//		writer.write("张宸");

		// 设置服务器的字符集编码
		response.setCharacterEncoding("UTF-8");
		// 通过响应头设置浏览器字符集编码也为UTF-8
		response.setHeader("Content-Type", "text/html;charset=UTF-8");
		String valueString = request.getParameter("username");
		response.getWriter().print(valueString);
	}

	private void paramMethod(HttpServletRequest request) {
		String usernameString = request.getParameter("username");
		String passwordString = request.getParameter("pwd");

		String[] hobbysStrings = request.getParameterValues("hobby");
//		response.getWriter().println("username:" + usernameString + "<br />");
//		response.getWriter().println("password:" + passwordString + "<br />");
//		response.getWriter().print("hobbys:   " + Arrays.toString(hobbysStrings));
		Map<String, String[]> map = request.getParameterMap();
		// 遍历map
		java.util.Set<String> set = map.keySet();
		for (String keyString : set) {
			String[] valueStrings = map.get(keyString);
			System.out.println("name属性的值:" + keyString + " " + Arrays.toString(valueStrings));
		}
	}

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

}

或者

package Request;

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

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

/**
 * Servlet implementation class RequestParamServlet
 */
public class RequestParamServlet 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 {
		// TODO Auto-generated method stub
//		paramMethod(request);
//		System.out.println(response.getCharacterEncoding());
//		PrintWriter writer = response.getWriter();
//		writer.write("张宸");

//		// 设置服务器的字符集编码
//		response.setCharacterEncoding("UTF-8");
//		// 通过响应头设置浏览器字符集编码也为UTF-8
//		response.setHeader("Content-Type", "text/html;charset=UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		String valueString = request.getParameter("username");
		response.getWriter().print(valueString);
	}

	private void paramMethod(HttpServletRequest request) {
		String usernameString = request.getParameter("username");
		String passwordString = request.getParameter("pwd");

		String[] hobbysStrings = request.getParameterValues("hobby");
//		response.getWriter().println("username:" + usernameString + "<br />");
//		response.getWriter().println("password:" + passwordString + "<br />");
//		response.getWriter().print("hobbys:   " + Arrays.toString(hobbysStrings));
		Map<String, String[]> map = request.getParameterMap();
		// 遍历map
		java.util.Set<String> set = map.keySet();
		for (String keyString : set) {
			String[] valueStrings = map.get(keyString);
			System.out.println("name属性的值:" + keyString + " " + Arrays.toString(valueStrings));
		}
	}

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

}

运行结果:
在这里插入图片描述
Attention!!!
response.setContentType(“text/html;charset=UTF-8”);一定要在获取数据流之前,否则设置无效

doPost方法的情况

在这里插入图片描述
RequestParamServlet.java

package Request;

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

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

/**
 * Servlet implementation class RequestParamServlet
 */
public class RequestParamServlet 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 {
		// TODO Auto-generated method stub
//		paramMethod(request);
//		System.out.println(response.getCharacterEncoding());
//		PrintWriter writer = response.getWriter();
//		writer.write("张宸");

//		// 设置服务器的字符集编码
//		response.setCharacterEncoding("UTF-8");
//		// 通过响应头设置浏览器字符集编码也为UTF-8
//		response.setHeader("Content-Type", "text/html;charset=UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		String valueString = request.getParameter("username");
		response.getWriter().print(valueString);
	}

	private void paramMethod(HttpServletRequest request) {
		String usernameString = request.getParameter("username");
		String passwordString = request.getParameter("pwd");

		String[] hobbysStrings = request.getParameterValues("hobby");
//		response.getWriter().println("username:" + usernameString + "<br />");
//		response.getWriter().println("password:" + passwordString + "<br />");
//		response.getWriter().print("hobbys:   " + Arrays.toString(hobbysStrings));
		Map<String, String[]> map = request.getParameterMap();
		// 遍历map
		java.util.Set<String> set = map.keySet();
		for (String keyString : set) {
			String[] valueStrings = map.get(keyString);
			System.out.println("name属性的值:" + keyString + " " + Arrays.toString(valueStrings));
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		String valueString = request.getParameter("username");
		System.out.println(valueString);
		response.setContentType("text/html;Charset=utf-8");
		PrintWriter outPrintWriter = response.getWriter();
		outPrintWriter.print(valueString);
	}

}

运行结果:
在这里插入图片描述
在这里插入图片描述

通过Request对象传递数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

RequestDispatcher对象的应用

请求转发

当一个Web资源收到客户端的请求后,如果希望服务器通知另外一个资源去处理请求,这时,除了使用sendRedirect()方法实现请求重定向外,还可以通过RequestDispatcher接口的实例对象来实现。在ServletRequest接口中定义了一个获取RequestDispatcher对象的方法,如表所示。
在这里插入图片描述
获取到RequestDispatcher对象后,最重要的工作就是通知其它Web资源处理当前的Servlet请求,为此,在RequestDispatcher接口中,定义了两个相关方法,如表所示。
在这里插入图片描述
表中列举的两个方法中,forward()方法可以实现请求转发,include()方法可以实现请求包含。

在Servlet中,如果当前Web资源不想处理请求时,可以通过forward()方法将当前请求传递给其它的Web资源进行处理,这种方式称为请求转发。为了使读者更好地理解使用forward()方法实现请求转发的工作原理,接下来通过一张图来描述,如下图所示。
在这里插入图片描述
从图中可以看出,当客户端访问Servlet1时,可以通过forward()方法将请求转发给其它Web资源,其它Web资源处理完请求后,直接将响应结果返回到客户端。

同时对比请求重定向
在这里插入图片描述
关于请求重定向知识点详细请参看博文白痴与Servlet的深入交流(二)内含请求重定向等知识点

小示例

RequestForwardServlet.java

package Request;

import java.io.IOException;

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

/**
 * Servlet implementation class RequestForwardServlet
 */
public class RequestForwardServlet 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 {
		// TODO Auto-generated method stub
		// 1.获取转发对象
		RequestDispatcher rDispatcher = request.getRequestDispatcher("/result");
		// 调用转发方法,实现转发效果
		request.setAttribute("Company", "Rihood---");
		rDispatcher.forward(request, response);

	}

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

}

RequestResultServlet.java

package Request;

import java.io.IOException;

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

/**
 * Servlet implementation class RequestResultServlet
 */
public class RequestResultServlet 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 {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
		Object object = request.getAttribute("Company");
		String nameString = (String) object;
		response.getWriter().print("公司名称:" + nameString);
	}

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

}

全局配置:
在这里插入图片描述
运行结果:
在这里插入图片描述

抓包对比请求重定向和请求转发

请求转发

通过抓包我们可以发现,RequestDispatcher转发发送了一次请求一次响应
在这里插入图片描述

请求重定向

通过博文白痴与Servlet的深入交流(二)内含请求重定向等知识点中的内容,我们也可以进行抓包实验
在这里插入图片描述
不论登陆是否成功
在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述

重定向和转发的区别

在这里插入图片描述

请求包含

请求包含指的是使用include()方法将Servlet请求转发给其它Web资源进行处理,与请求转发不同的是,在请求包含返回的响应消息中,既包含了当前Servlet的响应消息,也包含了其他Web资源所作出的响应消息。为了使读者更好地理解使用include()方法实现请求包含的工作原理,接下来,通过一个图来描述如图所示。
在这里插入图片描述
从图中可以看出,当客户端访问Servlet1时,通过调用include()方法将其它Web资源包含了进来,这样,当请求处理完毕后,回送给客户端的响应结果既包含当前Servlet的响应结果,也包含其它Web资源的响应结果。

示例

RequestIncludingServlet.java

package Request;

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

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

/**
 * Servlet implementation class RequestIncludingServlet
 */
public class RequestIncludingServlet 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 {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
		// 1.获取转发对象
		RequestDispatcher rDispatcher = request.getRequestDispatcher("/includedServlet?p=abc");
		// 2.请求包含动作
		PrintWriter outPrintWriter = response.getWriter();
		outPrintWriter.print("including before---" + "<br />");
		// 3.去包含includedServlet
		rDispatcher.include(request, response);

		outPrintWriter.print("including after---" + "<br />");
	}

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

}

RequestIncludedServlet.java

package Request;

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;

/**
 * Servlet implementation class RequestIncludedServlet
 */
public class RequestIncludedServlet 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 {
		// TODO Auto-generated method stub
		// 防乱码
		response.setContentType("text/html;charset=utf-8");
		// 1.获取输出字符流对象
		PrintWriter outPrintWriter = response.getWriter();
		// 2.输入一段中文
		outPrintWriter.print(" 中国 " + "<br />");
		// 3.获取请求路径后面拼接的参数
		outPrintWriter.print("request URI " + request.getQueryString() + "<br />");
		// 4.获取请求的参数
		outPrintWriter.print(" getParameter " + request.getParameter("p") + "<br />");
	}

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

}

全局配置:
在这里插入图片描述
运行结果:
在这里插入图片描述

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值