转发和重定向的区别、乱码解决
web系统中跳转资源有两种方式,转发和重定向:
//转发:
request.getRequestDispatcher("/资源").forward(request,response);
//重定向:
response.sendRedirect("/项目/资源"); //项目名可使用request.getContextPath()获取
跳转的下一个资源可以是服务器中的任何一种资源,如jsp,html,servlet等等。
1.转发和重定向的区别
-
转发是一次请求,浏览器的地址栏不会发生变化;重定向是多次请求,地址栏会发生变化,变为新的请求地址。
- 所以点击一个超链接不一定就是一个请求,有可能包含重定向操作发生了多次请求。
-
重定向相当于重新向浏览器中发起请求。
-
转发是在本项目中完成资源的跳转,重定向可以跨webapp跳转资源。
-
转发可以携带参数,重定向不能携带参数。
2.转发和重定向的选择
- 若想跨webapp跳转资源,选择重定向;
- 若想解决浏览器的刷新问题,选择重定向;(转发存在重复刷新的问题)
- 如:在页面中添加数据向数据库中插入,若是使用了转发,则地址不变,此时刷新浏览器,就会造成重复往数据库中添加数据的问题。
- 若上一个资源在request对象中存储了数据,想在下一个资源中访问,选择转发。
- 当需要携带参数时,使用转发。
3.解决乱码问题
乱码问题可能在三种过程中发生:
- 传递过程:如获取参数中的数据;
- 展示过程:数据展示到页面上;
- 保存过程:数据存储到数据库中。
在这里给出前两种乱码问题的解决方案:
解决获取请求参数乱码
Tomcat8版本及以上,get请求不会发生中文乱码的问题,但是post请求会发生乱码问题。
login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form action="/servlet_01_javaweb/servlet11" method="post">
姓名:<input name="name" type="text"><br>
性别:<input name="sex" type="text"><br>
爱好:
打游戏<input name="hobby" type="checkbox" value="打游戏">
看电影<input name="hobby" type="checkbox" value="看电影">
睡觉<input name="hobby" type="checkbox" value="睡觉"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
配置web.xml
Servlet11:
package com.dh.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet11 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
}
结果:发生了乱码
?????????
????????±
???�
(1)万能解决方案
先将获取到的值采用ISO-8859-1解码,再给定一种方式进行编码:
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
byte[] bytes = hobby.getBytes("ISO-8859-1");
String s = new String(bytes, "UTF-8");
System.out.println(s);
}
(2)解决post请求参数乱码
一定要在获取参数前设置编码格式!!!
//在获取参数前设置编码格式
request.setCharacterEncoding("UTF-8");
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
(3)解决get请求参数乱码
修改Tomcat的conf文件夹下的server.xml:若是8版本及以上的Tomcat就不需要修改了
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding = "UTF-8"/>
解决展示乱码问题
(1)servlet输出内容到浏览器页面上乱码
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//直接输出到浏览器页面
response.getWriter().println("你好,世界");
}
结果:会乱码,在浏览器上显示
解决:
在输出内容之前,设置编码格式,一定要在之前!!!
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("你好,世界");
}
(2)页面乱码
如:
<!DOCTYPE html>
<html lang="en">
<head>
<title>乱码问题</title>
</head>
<body>
你好
</body>
</html>
解决:
给页面添加上编码
<!DOCTYPE html>
<html lang="en">
<head>
<!-- 设置编码格式-->
<!-- 两种方式取其一-->
<meta charset="UTF-8">
<!-- <meta content="text/html" charset="UTF-8"> -->
<title>乱码问题</title>
</head>
<body>
你好
</body>
</html>