web_day35_请求转发和重定向&&中文乱码问题

一、请求转发和重定向

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

}
请求转发和重定向的区别
 请求转发重定向
请求次数12
地址栏变化不发生变化发生变化
请求的发送方服务器内部请求浏览器发送请求
能否获取request域中的数据不能
能否获取外部应用的数据不能

二、中文乱码问题(以tomcat7为例)

1、请求中文乱码

请求编码:utf-8

tomcat7服务器编码:iso8859-1

注意:

  1. 每个版本tomcat服务器默认编码不一样,tomcat7默认是ios8859-1,tomcat8、tomcat9默认编码是utf-8
  2. 版本的默认编码
  3. 这里是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应用(项目名称)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值