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");
}
}