javaweb 解决全站字符编码

2024-02-25 07:48

本文主要是介绍javaweb 解决全站字符编码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先创建一个javaweb的项目,在index.jsp里面修改如下代码.

<body><a href="<c:url value='/AServlet?username=董老师你好呀!'/>">GET</a><form action="<c:url value='/AServlet'/>" method="post">用户名:<input type="text" name="username"/><input type="submit" name="提交"/></form></body>

在浏览器打开如图所示,点击提交按钮就是发送的post请求,点击GET是提交get请求.

然后创建一个AServlet实现doGet和doPost方法.

package cn.com.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 AServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String username = request.getParameter("username");    //获取username并打印response.getWriter().print("GET-->username: " + username);    }public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String username = request.getParameter("username");response.getWriter().print("POST-->username: " + username);}
}

此时若去提交表单会出现字符编码的问题,会出现提交中文时出现乱码,打印出乱码.

然后我们创建一个CharSetFilter的过滤器,    /* 处理编码全部过滤.

CharSetFilter的代码实现.

package cn.com.servlet;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;
/*** 处理全站编码问题*/
public class CharSetFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding("utf-8");			//只处理了post请求response.setContentType("text/html;charset=utf-8");	//处理响应的编码chain.doFilter(req, response);    //放行}public void init(FilterConfig fConfig) throws ServletException {}
}

至此post请求的编码解决了.

下面处理get的编码请求.

创建一个CharSetRequest的类并继承HttpServletRequest这个接口.

CharSetRequest类的代码如下,CharsetRequest继承HttpServletRequest接口的类创建好后代码会很多,我们修改它的接口,改成装饰者模式,就是继承一个HTTPServletRequestWrapper,从而实现装饰者模式,这个类会帮我们完成很多底层的方法,我们只需要给它传递一些参数即可.

然后通过增强getParameter来实现get的编码问题.

package cn.com.servlet;import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.Principal;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletInputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpSession;public class CharSetRequest extends HttpServletRequestWrapper {public CharSetRequest(HttpServletRequest request){super(request);	//调用父类的构造器,给父类传递底层对象}/** 增强getParameter()方法* (non-Javadoc)* @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)*/@Overridepublic String getParameter(String name) {String value = super.getParameter(name);//判断当前的请求方式,如果为GET//需要回退,再重解 if (getMethod().equalsIgnoreCase("GET")) {try {value = new String(value.getBytes("iso-8859-1"),"utf-8");} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return value;}
}

最后修改CharSetFilter的过滤器的代码,把request做为底层对象传过去,放行时调包处理.

//创建山寨版的request

通过CharSetRequest req = new CharSetRequest((HttpServletRequest)request);

package cn.com.servlet;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;
/*** 处理全站编码问题*/
public class CharSetFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding("utf-8");			//只处理了post请求response.setContentType("text/html;charset=utf-8");	//处理响应的编码//用来处理get请求//创建山寨版的requestCharSetRequest req = new CharSetRequest((HttpServletRequest)request);//放行时将request改为req,调包处理.chain.doFilter(req, response);}public void init(FilterConfig fConfig) throws ServletException {}
}

至此get的编码处理完成了.

这篇关于javaweb 解决全站字符编码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744829

相关文章

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

如何使用Spring boot的@Transactional进行事务管理

《如何使用Springboot的@Transactional进行事务管理》这篇文章介绍了SpringBoot中使用@Transactional注解进行声明式事务管理的详细信息,包括基本用法、核心配置... 目录一、前置条件二、基本用法1. 在方法上添加注解2. 在类上添加注解三、核心配置参数1. 传播行为(

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例