转发和重定向的区别、乱码解决

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>

posted @ 2021-03-11 17:37  deng-hui  阅读(630)  评论(0编辑  收藏  举报