一、请求转发和重定向
1、请求转发
package com.itheima.web.servlet;
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 DServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求中文乱码问题
request.setCharacterEncoding("utf-8");
// 处理响应的中文乱码问题
response.setContentType("text/html;charset=utf-8");
// 向request域对象中设置值
request.setAttribute("msg", "逗比是给小伙伴看的");
// 请求转发,服务器路径(带?和不带/,相对的是当前web应用)
request.getRequestDispatcher("/EServlet").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package com.itheima.web.servlet;
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 EServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求中文乱码问题
request.setCharacterEncoding("utf-8");
// 处理响应的中文乱码问题
response.setContentType("text/html;charset=utf-8");
// 从request域中获取数据
String msg = (String) request.getAttribute("msg");
System.out.println(msg);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
2、重定向
package com.itheima.web.servlet;
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 BServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
// 给出一句话
System.out.println("我没钱,你可以找大帅借");
// 重定向的底层实现
// response.setStatus(302);
// response.setHeader("Location", "http://localhost:8080/web_day35/CServlet");
// response.addHeader("Location", "http://localhost:8080/web_day35/CServlet");
// 便捷的重定向(定位到当前服务器的一个资源)
// response.sendRedirect("http://localhost:8080/web_day35/CServlet");
// 便捷的重定向(定位到外部服务器的一个资源)
response.sendRedirect("http://www.baidu.com");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package com.itheima.web.servlet;
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 CServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
System.out.println("2000拿去,省着点花");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
请求转发 | 重定向 | |
---|---|---|
请求次数 | 1 | 2 |
地址栏变化 | 不发生变化 | 发生变化 |
请求的发送方 | 服务器内部请求 | 浏览器发送请求 |
能否获取request域中的数据 | 能 | 不能 |
能否获取外部应用的数据 | 不能 | 能 |
二、中文乱码问题(以tomcat7为例)
1、请求中文乱码
请求编码:utf-8
tomcat7服务器编码:iso8859-1
注意:
- 每个版本tomcat服务器默认编码不一样,tomcat7默认是ios8859-1,tomcat8、tomcat9默认编码是utf-8
- 版本的默认编码
- 这里是tomcat7版本的使用说明
1.1 GET请求
String country = request.getParameter("country");
country = new String(country.getBytes("iso8859-1"),"utf-8");//重新指定编码格式
1.2 POST请求
//解决post请求乱码问题
request.setCharacterEncoding("utf-8");//此方法只对请求体有效
String country = request.getParameter("country");
2、响应中文乱码
服务器编码:iso8859-1
浏览器编码:gbk2312
//解决响应的中文乱码问题
response.setContentType("text/html;charset=utf-8");//让服务器和浏览器都使用utf-8的码表
package com.itheima.web.servlet;
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 EncodingServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理响应的中文乱码问题
response.setContentType("text/html;charset=utf-8");
// 处理post请求中文乱码问题
request.setCharacterEncoding("utf-8");
// 获取请求参数
String country = request.getParameter("country");
// 处理get请求中文乱码问题
country = new String(country.getBytes("iso8859-1"), "utf-8");
System.out.println(country);
// 2.判断
if (country != null) {
// 给出提示信息
response.getWriter().write("参数我已经获取到了……");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
三、WEB阶段路径问题
1、客户端路径
- 超链接、表单、地址栏直接输入的、重定向
- 除了请求转发之外,都是客户端路径
绝对路径
http://localhost:8080/web_day36/AServlet
相对路径
- 带/:相对的是当前web服务器,“/”可以理解为webapps目录
- 不带/:相对的是当前文件
- 本身访问当前的文件的路径:http://localhost:8080/web_day36/a.html
- 访问AServlet的路径:http://localhost:8080/web_day36/AServlet
- 那么,我们可以这么认为:默认生成的Servlet与a.html在同一级!直接写文件名称(Servlet名称)
2、服务器端
请求转发
相对路径
带/和不带/都是一样的,都是相对当前web应用(项目名称)