HttpServletResponse
请求对象封装了HTTP协议的请求行,请求头,请求体,我们可以通过请求对象的方法来获取这些信息。
一、获取请求行
- 获取完整的URL:StringBuffer getRequestURL()
- 获取请求行中的资源路径:String getRequestURI()
- 获取请求方式:String getMethod()
- 获取当前项目的路径:String getContextPath()
- 获取请求行中资源路径后面的参数:String getQueryString()
示例:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取完整的URL
StringBuffer url = request.getRequestURL();
response.getWriter().println(url.toString());
// 获取请求行中的资源路径
String uri = request.getRequestURI();
response.getWriter().println(uri);
// 获取请求方式
String method = request.getMethod();
response.getWriter().println(method);
// 获取当前项目的路径
String path = request.getContextPath();
response.getWriter().println(path);
// 获取请求行中资源路径后面的参数
String queryString = request.getQueryString();
response.getWriter().println(queryString);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
获取请求行
注意:
getRequestURL()返回的是一个可变字符串,不能直接使用String来接收
getQueryString()获取的是资源路径后面的参数,请求体里的数据无法获取
二、获取请求头
- 获取所有的请求头name:Enumeration getHeaderNames()
- 通过name来获取请求头value:String getHeader(String name)
示例:
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enumeration<String> names = request.getHeaderNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value = request.getHeader(name);
response.getWriter().println(name+"---"+value);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
请求头信息
三、获取表单提交的数据
这里获取的数据是在请求体中的数据,也就是获取post请求方式的表单中的数据。
- String getParameter(String name) :根据表单项的name来获取表单项的value
注意:
有表单项提交过来,但是没有值, 打印的是空字符串;表单项根本没有提交过来,打印的就是null,就不能调用字符串的方法,否则会报空指针异常。 - String[] getParameterValues(String name) 根据表单项的name获取表单项value的数组,一般使用在复选框等表单项中。
- Map getParameterMap(): 获取表单提交来的所有数据,并封装成一个map返回,一些框架(工具类)会使用这个方法
注意: 返回值使用泛型时应该是Map<String,String[]>形式,因为有时像checkbox这样的组件会有一个name对应多个value的时候,所以该Map中键值对是<String-->String[]>的实现。 - Enumeration getParameterNames() 获取提交过来表单项所有的name
注意:
注册按钮提交过来没有意义,所以注册按钮千万不要写name属性
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>获取表单数据</title>
</head>
<body>
<form action="/requestdemo/Demo3" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
兴趣爱好:<input type="checkbox" name="hobbies" value="basketball"/>打篮球
<input type="checkbox" name="hobbies" value="travel" />旅游
<input type="checkbox" name="hobbies" value="swimming"/>游泳<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
response.getWriter().println("username:"+username);
String[] hobbies = request.getParameterValues("hobbies");
for (String hobby : hobbies) {
response.getWriter().println("hobby:"+hobby);
}
Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
response.getWriter().println(name);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
form.html
表单数据
四、表单提交数据乱码问题的处理
如果我们在上面的案例中填入中文,就会出现下面的乱码问题。
form.html
乱码问题
原因:
编码前后不一致,表单提交数据用的是UTF-8,请求对象接收数据转换成字符串,用的是默认的ISO-8859-1。
问题的处理:
对于post请求:
设置请求对象创建字符串所使用的编码为UTF-8
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String username = request.getParameter("username");
response.getWriter().println("username:"+username+"<br />");
String[] hobbies = request.getParameterValues("hobbies");
for (String hobby : hobbies) {
response.getWriter().println("hobby:"+hobby+"<br />");
}
Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
response.getWriter().println(name+"<br />");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
对于get请求
浏览器按照表单页面的编码(UTF-8)进行转码,转成字节数组,拼接在请求资源的后面,接下来把字节数组做一个转义(url编码)在发送
服务器首先拿到这个数据做一个url解码(正确的),然后把解码之后的数据按照ISO-8859-1拼成字符串(错误)
这两种问题都可以通过这种做法解决问题:将字符串打回原形,再用UTF-8的编码转换成字符串
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
byte[] bys = request.getParameter("username").getBytes("ISO-8859-1");
String username = new String(bys,"UTF-8");
response.getWriter().println("username:"+username+"<br />");
String[] hobbies = request.getParameterValues("hobbies");
for (String hobby : hobbies) {
response.getWriter().println("hobby:"+hobby+"<br />");
}
Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
response.getWriter().println(name+"<br />");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
问题的解决
五、请求对象实现转发和包含
RequestDispatcher rd = request.getRequestDispatcher("register.html");
rd.forward(request, response);
rd.include(request, response);
和ServletContext实现转发和包含的区别:
用ServletContext实现转发和包含,路径必须以正斜杠开头,request对象路径可以不用正斜杠开头
六、使用请求对象实现数据共享
ServletContext 上下文对象 范围是当前的web应用
时间范围 tomcat 一加载项目 tomcat关闭
空间范围 整个web应用
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;
public class Demo4 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置数据
request.setAttribute("username", "zhangsan");
//转发数据
RequestDispatcher rd = request.getRequestDispatcher("/Demo5");
rd.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo5 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取数据
Object obj = request.getAttribute("username");
response.getWriter().println(obj);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
共享数据












网友评论