Web应用技术(第八周/第5次练习/2h)

本次练习尝试解决进行CRUD的最后一个bug——中文乱码

    • 1.方式1——在Servlet中进行请求和相应的编码设置(失败)
        • (1)修改每一个Servlet:
        • (2)操作验证
    • 2.方式2——使用过滤器(失败)
      • 使用过滤器其实是直接对每一个Servlet进行编码处理的升级版,减少了重复操作
        • (1)首先,我编写了一个过滤器EncodingFilter.java,放在src的filter包下
        • (2)接着,在web.xml中进行配置,使所有映射都要先经过过滤器Servlet
        • (3)操作验证
    • 3.方式3——使用“getBytes”(成功)
      • (1)修改HeroUpdateServlet.java的代码:
      • (2)操作验证:
    • 4.疑问/总结:

Web应用技术(第八周/第5次练习/2h)_第1张图片

1.方式1——在Servlet中进行请求和相应的编码设置(失败)

最近刚好在补充学习how2j上Servlet的内容,看到Serlet中文问题有一个貌似可行的解决办法

(1)修改每一个Servlet:

为每一个Servlet添加如下代码:

//确保能够正确地处理接收到的中文字符。
//将 request 对象中的字符编码设置为 UTF-8。
//这通常用于处理来自表单或 URL 参数等数据的编码问题,确保在服务器端得到正确的编码格式。
   	request.setCharacterEncoding("UTF-8"); 
//确保能够正确地将中文字符输出到浏览器。
//设置 response 对象的内容类型为 "text/html",并且字符编码为 UTF-8。
//这告诉浏览器应该使用什么字符集来解析响应数据,在客户端显示正确的文本。
   	response.setContentType("text/html; charset=UTF-8");

(2)操作验证

修改id=41得Hero的数据,name设置为“咋这么难”,验证失败
Web应用技术(第八周/第5次练习/2h)_第2张图片

2.方式2——使用过滤器(失败)

使用过滤器其实是直接对每一个Servlet进行编码处理的升级版,减少了重复操作

(1)首先,我编写了一个过滤器EncodingFilter.java,放在src的filter包下

package filter;

import java.io.IOException;


import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class EncodingFilter implements Filter {

    @Override
    public void destroy() {
        // 销毁方法,通常不需要实现
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        // 将ServletRequest和ServletResponse对象转换为更具体的类型
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        // 设置请求字符编码为UTF-8
        request.setCharacterEncoding("UTF-8");

        // 继续处理请求链
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // 初始化方法,通常不需要实现
    }

}

(2)接着,在web.xml中进行配置,使所有映射都要先经过过滤器Servlet

完成配置后web.xml中的代码如下:


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  
  <filter>
    <filter-name>EncodingFilterfilter-name>
    <filter-class>filter.EncodingFilterfilter-class>
  filter>
  <filter-mapping>
    <filter-name>EncodingFilterfilter-name>
    <url-pattern>/*url-pattern> 
  filter-mapping>
  <display-name>MVC_Test3display-name>
  <welcome-file-list>
    <welcome-file>index.htmlwelcome-file>
    <welcome-file>index.htmwelcome-file>
    <welcome-file>index.jspwelcome-file>
    <welcome-file>default.htmlwelcome-file>
    <welcome-file>default.htmwelcome-file>
    <welcome-file>default.jspwelcome-file>
  welcome-file-list>
web-app>

(3)操作验证

修改id=41得Hero的数据,name设置为“起个名字咋”
Web应用技术(第八周/第5次练习/2h)_第3张图片

中文乱码:
Web应用技术(第八周/第5次练习/2h)_第4张图片

3.方式3——使用“getBytes”(成功)

(1)修改HeroUpdateServlet.java的代码:

将代码的

String name = request.getParameter("name");

修改为:

//首先调用request.getParameter("name")方法获取名为"name"的参数值。
//由于在HTTP协议中,参数值默认使用ISO-8859-1编码进行传输,因此接下来调用getBytes("ISO-8859-1")方法将参数值从ISO-8859-1编码转换为字节数组。
//最后,调用new String(byte[], String)方法将字节数组转换为字符串并指定字符编码为UTF-8
String name = new(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");

完整代码如下:

package servlet;

import bean.Hero;
import dao.HeroDAO;

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("/UpdateHero")
public class HeroUpdateServlet extends HttpServlet {

    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
//    	request.setCharacterEncoding("UTF-8"); 
//    	response.setContentType("text/html; charset=UTF-8");
       // String name = request.getParameter("name");
       String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
        int hp  = Integer.parseInt(request.getParameter("hp"));
        int id  = Integer.parseInt(request.getParameter("id"));
        Hero hero = new Hero();
        hero.setName(name);
        hero.setHp(hp);
        hero.setId(id);
        new HeroDAO().update(hero);

        response.sendRedirect("listHero");

    }
}

(2)操作验证:

修改id=41得Hero的数据,name设置为“起个名字咋这么”
Web应用技术(第八周/第5次练习/2h)_第5张图片

4.疑问/总结:

按理来说,因为作用范围更广,第一种方法和第二种方法应该是更为实用的,而使用第三种方式进行编码转换,则仅仅解决了获取参数时的编码问题,而并没有解决请求和响应本身的编码问题,因此网页中其他部分的中文字符可能仍然存在乱码问题。为什么前两种方法无效呢?

你可能感兴趣的:(Web应用技术学习,前端,servlet,java,mvc)