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);
}
}
全局配置:
运行结果: