服务器端获取表单数据的编码解码问题(servlet)

首先需要明确指出的是,这里的服务器是指tomcat。

在页面没有明确指定编码的情况下,客户端通过input标签和字符串向服务器传递两个值param1和param2。如果直接使用request.getParameter()方法来获取值的话,得到的肯定都是乱码,我们需要对其重新进行编码解码,就像下面的代码所示的那样:

new String(req.getParameter("param1").getBytes("iso-8859-1"), "gbk");

这是因为,中文环境下,浏览器会以gbk对传递到服务器的数据进行编码,而服务器端则会默认以iso-8859-1进行解码,如果我们不做相应的处理的话,得到的将会是乱码。

如果每次获取客户端的数据的时候,都要进行编码解码,会显得很麻烦,幸好有个很好的解决方法。我们可以写一个过滤器,在请求到达servlet之前,告诉服务器request的编码是什么。简单的示例如下:

package com.thief.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;

public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig config) throws ServletException {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain arg2) throws IOException, ServletException {
        request.setCharacterEncoding("gbk");

        arg2.doFilter(request, response);
    }

    @Override
    public void destroy() {}
}

这时候,在servlet里就可以通过request.getParameter()来直接获取数据了,但是这仅限于input标签传递过来的数据,查询字符串还是按照上述的编码解码过程传递的。

这时候,还有两种解决方案:一是在tomcat 的server配置文件中的 connector下声明 useBodyEncodingForURI=“true” 这个属性;二是在connector元素下配置 URIEncoding来设置URL编码格式,如果不设置默认就是ISO-8859-1。

这两种方案我在tomcat 的bin下的startup.bat命令行窗口下经过检验,是正确的。但是在eclipse的控制台下没有看出效果,这个不知道是什么原因。

参考:http://www.tuicool.com/articles/IbaQza

时间: 2024-10-10 10:20:34

服务器端获取表单数据的编码解码问题(servlet)的相关文章

strus2中获取表单数据 两种方式 属性驱动 和模型驱动

strus2中获取表单数据 两种方式 属性驱动 和模型驱动 属性驱动 /** * 当前请求的action在栈顶,ss是栈顶的元素,所以可以利用setValue方法赋值* 如果一个属性在对象栈,在页面上可以根据name属性进行回显*/ /** * 属性驱动实现的条件:* 1.当前请求的action在栈顶,所以action中的属性就暴漏出来了* 2.获取页面上表单的元素,整合成一个map * 3.调用setValue方法赋值*/ 1 package cn.itcast.struts2.sh; 2 3

jquery获取表单数据无刷新提交

var fdata=$("form").serialize();  //获取表单的值   $.post("tiaozhuan.jsp", fdata, function (result) {//无刷新提交表单      alert(result);   })

struts2中获取表单数据的方式

在最近学习的struts2,struts2获取表单的方式主要有两种 一:属性驱动 属性驱动主要指的是通过字段进行数据的传输,其中包括两种情况 1:与基本数据类型的属性对应 2:直接使用域对象 二:模型驱动 在struts2中,Action处理请求的方式还有另外的一种方式,叫做模型驱动,通过实现ModelDriven接口来接收请求参数,Action类必须实现ModelDriven接口,并且重写getModel方法,这个方法返回的就是Action所使用的数据模型对象. 模型驱动的方式通过javabe

struts2 封装获取表单数据的方式

一.属性封装 1.在action中设置成员变量,变量名与表单中的name属性值相同 2.生成变量的set方法 实例 获取用户输入的用户名和密码 jsp页面 java代码 二.模型驱动(常用) 1.action实现 ModeDriven 接口 2.在action里创建实体类对象 3.实现接口的 getModel方法并返回所创建的对象 示例 获取用户输入的用户名和密码 jsp页面 java代码 需注意的是表单name的值应与类的属性名相同. 三.表达式封装 1.在 action 中声明实体类 2.生

struts2获取表单数据之 属性封装 模型驱动 表达式封装 对象封装到list集合 对象封装到map集合 五种方便的封装方式

一.属性封装 属性封装是在action里面设定属性值,属性名字一定要和表单中的name一样,action中extends ActionSupport demo1.jsp: <body> This is my login JSP page. <br> <form action="demo1.action" method="post" > username<input type="text" name=&qu

不通过getElementByName实现获取表单数据 (document.form表单的name值.input输入框的name值)

function update() { //document.form表单的name值.input输入框的name值 var username = document.form1.username; var mobile = document.form1.mobile; var qq = document.form1.qq; } <form name="form1" method="post" action=""> <table

针对jquery获取表单数据并且迭代方式

function add(){ $("select option:selected").each(function(index){ var name = $(this).text(); console.log(name); }) $("select").each(function(index){ var namekey = $(this).val(); console.log(namekey); }) $("input[name='nodeForm.nam

Python Django 获取表单数据的三种方式

# In viewsdef zbsservice(request): #返回一个列表 v1 = models.Business.objects.all() # .value返回一个字典 v2 = models.Business.objects.all().values("id","caption","code") # .values_list 返回一个元组 v3 = models.Business.objects.all().values_lis

Django - 获取表单数据的三种方式

1.query set 对象 2.字典 3.query set 元组 备注:对象通过 "对象.列名"方式访问,元组通过"对象.索引"方式访问. 原文地址:https://www.cnblogs.com/wulafuer/p/9366093.html