1.请求参数存在中文数据,则会乱码(post)解决方法
2.get为什么中文乱码和解决方法
1. get解决方法(详细)
URL编码实现方式:
编码:URLEncoder.encode(str, "utf-8");
解码:URLDecoder.decode(s, "ISO-8859-1");
2.代码
package com.itheima.web.request;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class URLDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String username = "张三";
//1. URL编码
String encode = URLEncoder.encode(username, "utf-8");
System.out.println(encode);
//2. URL解码
//String decode = URLDecoder.decode(encode, "utf-8");
String decode = URLDecoder.decode(encode, "ISO-8859-1");
System.out.println(decode);
//3. 转换为字节数据,编码
byte[] bytes = decode.getBytes("ISO-8859-1");
/* for (byte b : bytes) {
System.out.print(b + " ");
}*/
//4. 将字节数组转为字符串,解码
String s = new String(bytes, "utf-8");
System.out.println(s);
}
}
3. 运行截图
3.通用对于get和post的中文乱码解决
1.post的演示结果
2.代码
package com.itheima.web.request;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* 中文乱码问题解决方案
*/
@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 解决乱码:POST,getReader()
//request.setCharacterEncoding("UTF-8");//设置字符输入流的编码
//2. 获取username
String username = request.getParameter("username");
System.out.println("解决乱码前:"+username);
//3. GET,获取参数的方式:getQueryString
// 乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1
/* //3.1 先对乱码数据进行编码:转为字节数组
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
//3.2 字节数组解码
username = new String(bytes, StandardCharsets.UTF_8);*/
username = new String(username.getBytes(StandardCharsets.ISO_8859_1),
StandardCharsets.UTF_8);
System.out.println("解决乱码后:"+username);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
3.小小的总结
4.请求转发
4.1 介绍
- 请求转发(forward):一种在服务器内部的资源跳转方式
- 实现方式:req.getRequestDispatcher("资源B路径").forward(req,resp);
4.2 特点
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器的内部资源
- 一次请求,可以在转发的资源间使用request共享数据
4.3 请求转发资源间共享数据:使用Request对象
- void setAttribute(String name, Object o):存储数据到 request域中
- Object getAttribute(String name):根据 key,获取值
- void removeAttribute(String name):根据 key,删除该键值对
4.4图解
4.5 代码
req5中
package com.itheima.web.request;
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 java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* 请求转发
*/
@WebServlet("/req5")
public class RequestDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo5...");
System.out.println(request);
//存储数据
request.setAttribute("msg","hello");
//请求转发
request.getRequestDispatcher("/req6").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
req6中
package com.itheima.web.request;
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 java.io.IOException;
/**
* 请求转发
*/
@WebServlet("/req6")
public class RequestDemo6 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo6...");
System.out.println(request);
//获取数据
Object msg = request.getAttribute("msg");
System.out.println(msg);
//删除数据
request.removeAttribute("msg");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}