首页 > 编程语言 >接受参数和数据回传及JavaWeb可能遇到的乱码问题

接受参数和数据回传及JavaWeb可能遇到的乱码问题

时间:2023-03-07 22:22:46浏览次数:39  
标签:return String request name 乱码 回传 public JavaWeb

一.处理提交的数据

我们通过编写一个控制类来测试:

@Controller
@RequestMapping("/user")
public class controllerTest5 {
    @GetMapping("/t1")
    public String test(String name,Model model){
        //前端接受参数
        System.out.println("接受参数为:"+name);
        //将结果返回给前端
        model.addAttribute("msf",name);
        return "msf";
    }
}

 

访问的路径及传参:

http://localhost:8080/user/t1?name=msf

 

这中前端传参的方式可以使用,但是有弊端,就是不管前端的参数对不对的上,都会被传入,如果与后端的名字对不上的话,则会表示null,一般我们不采用这种方式传参

 

 我们来引入一个注解:@RequestParam()括号内绑定我们的传入参数名字:

@Controller
@RequestMapping("/user")
public class controllerTest5 {
    @GetMapping("/t1")
    public String test(@RequestParam("username") String name, Model model){
        //前端接受参数
        System.out.println("接受参数为:"+name);
        //将结果返回给前端
        model.addAttribute("msf",name);
        return "msf";
    }
}

 

当这个注解引入以后,控制器就只会允许这个注解的名字进入,如果不是,就不会参入,后台就不会存在null的情况了。

当我们在编写程序的时候也可以加上这个注解,不管需不要限定取值名,只要加上这个注解,大部分情况下我们就可以直接知道这个变量是用来接受参数的,不用接受参数的肯定就不用加,为了以后的代码审查都是有利的。

2.当我们请求的是一个对象的时候

提交一个对象:http://localhost:8080/user/t2?name=msf&age=3&id=1

    //前端接受的是一个对象
    @GetMapping("/t2")
    public String test1(User user,Model model){
        System.out.println(user);
        model.addAttribute("msf",user.toString());
        return "msf";
    }

 

值得注意的是,我们必须要一个实体类,用于对应引入的对象:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
    private int id;
}

 

接受前端参数时,判断参数的名字,假设名字都对应的上,可以直接使用

假设传递的是一个对象,自动匹配到对象的字段名,如果一致就可以使用,不一样就匹配不到

拓展:Model,ModelMap,ModelAndView的区别

Model:只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解

ModelMap:继承了LinkMap,除了实现自身的一些方法,同样的继承,LinkMap的方法和特性

ModelAndView:可以存储数据的同时,可以进行设置返回逻辑视图,进行控制展示跳转

二.乱码问题

当我们正常编写一个控制类的时候,当表单利用POST方式来传递参数,只要是传递中文,就必定会遇到乱码的问题;

@Controller
public class controllerTest6 {
    @PostMapping("/name")
    public String test(String name, Model model){
        System.out.println("====="+name+"=====");
        model.addAttribute("msf",name);
        return "msf";
    }
}

 

 就像图片中的一样,乱码了;

下面我们来介绍以下解决方式:

首先在我们的控制类中直接使用:req.setCharacterEncoding("UTF-8");  这种方式是解决不了的,只能用于普通的servlet

第二种方式:过滤器

编写一个Filter类:

public class EncodingFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain Chain) throws IOException, ServletException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        Chain.doFilter(req,resp);
    }

    public void destroy() {

    }
}

 

配置web.xml

    <filter>
        <filter-name>filter</filter-name>
        <filter-class>top.lostyou.Filter.EncodingFilter</filter-class>
    </filter>
  <filter-mapping>
      <filter-name>filter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

 

我们对所有的请求和jsp页面都过滤,然后转换编码为UTF-8

 

 我们可以看到,我们自己写的过滤器可以解决乱码问题

第三种:springMVC写好的配置,直接用(使用最多,可以解决绝大部分乱码)

只需要配置web.xml就好了,并且可以把他和DispatcherServlet一样,当成默认配置;

<!-- 配置springMVC的乱码过滤-->
<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

 第四种:究极大招,也是过滤器类,但是是大佬写的非常6,可以解决98%的乱码问题

Filter类:

package top.lostyou.pojo;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

public class GenericEncodingFilter implements Filter{
    /**
     * 解决get和post请求 全部乱码的过滤器
     */



        public void destroy() {
        }


        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            //处理response的字符编码
            HttpServletResponse myResponse=(HttpServletResponse) response;
            myResponse.setContentType("text/html;charset=UTF-8");

            // 转型为与协议相关对象
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            // 对request包装增强
            HttpServletRequest myrequest = new MyRequest(httpServletRequest);
            chain.doFilter(myrequest, response);
        }

        public void init(FilterConfig filterConfig) throws ServletException {
        }

    }

    //自定义request对象,HttpServletRequest的包装类
    class MyRequest extends HttpServletRequestWrapper {

        private HttpServletRequest request;
        //是否编码的标记
        private boolean hasEncode;
        //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
        public MyRequest(HttpServletRequest request) {
            super(request);// super必须写
            this.request = request;
        }

        // 对需要增强方法 进行覆盖
        @Override
        public Map getParameterMap() {
            // 先获得请求方式
            String method = request.getMethod();
            if (method.equalsIgnoreCase("post")) {
                // post请求
                try {
                    // 处理post乱码
                    request.setCharacterEncoding("utf-8");
                    return request.getParameterMap();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            } else if (method.equalsIgnoreCase("get")) {
                // get请求
                Map<String, String[]> parameterMap = request.getParameterMap();
                if (!hasEncode) { // 确保get手动编码逻辑只运行一次
                    for (String parameterName : parameterMap.keySet()) {
                        String[] values = parameterMap.get(parameterName);
                        if (values != null) {
                            for (int i = 0; i < values.length; i++) {
                                try {
                                    // 处理get乱码
                                    values[i] = new String(values[i]
                                            .getBytes("ISO-8859-1"), "utf-8");
                                } catch (UnsupportedEncodingException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                    hasEncode = true;
                }
                return parameterMap;
            }
            return super.getParameterMap();
        }

        //取一个值
        @Override
        public String getParameter(String name) {
            Map<String, String[]> parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            if (values == null) {
                return null;
            }
            return values[0]; // 取回参数的第一个值
        }

        //取所有值
        @Override
        public String[] getParameterValues(String name) {
            Map<String, String[]> parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            return values;
        }
    }

 

配置web.xml

<filter>
    <filter-name>encoding</filter-name>
    <filter-class>top.lostyou.pojo.GenericEncodingFilter</filter-class>

</filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

 

 总结:以上就是乱码的全部解决问题了(四种,可以说没有什么乱码可以逃过了:(限定用于springMVC,第三种))

 

标签:return,String,request,name,乱码,回传,public,JavaWeb
From: https://www.cnblogs.com/5ran2yl/p/17189952.html

相关文章

  • 返回传递给方法的值
    我在接口上有一个方法:stringDoSomething(stringwhatever);我想用最小起订量模拟它,以便它返回传入的任何内容-类似于:_mock.Setup(theObject=>theObject.D......
  • 如何解决MySQL字符集乱码问题
    MySQL自4.1版本推出之后由于中文的特殊性带来的乱码问题也随在互联网行业出现。主要原因就是不同字符集编码不同而产生的。本文简要介绍字符集相关知识及部分乱码情况的解决......
  • 财务软件打开乱码问题处理方法(自然人报税扣缴、etax3.0、鼎信诺等)
    1、首先保证电脑的系统区域、输入法区域、时区都处于中国,日期格式为yyy/MM/dd格式,设置完成后重启计算机。系统区域、输入法区域和时区可以根据这篇文章的方法查询:命令查看......
  • 07、clion中文乱码
    1、将全局编码和项目编码一级文件编码改为【UTF-8】2、按住快捷键:【Ctrl+Alt+Shift+/】,显示一下对话框3、取消勾选:【run.processes.with.pty】......
  • JavaWeb中文乱码问题
    概述在JavaWeb中通过请求(request)和响应(response)来进行数据传递的过程中,有一个不可避免的问题,即传输的数据中有可能包含中文。当传输的数据中包含中文时,往......
  • 解决 IntelliJ IDEA 2019.2.3 java 工程运行中文乱码问题
    前言java语言的语法类似于C++,目前接触的开发环境:eclipse与IntelliJIDEA,AndroidStudio应该跟IntelliJIDEA很类似虽然之前改改AndroidAPK,了解了一些java开发相关的东......
  • Unity package manager 字体乱码
     具体原因是升级Mac系统导致,暂行方案是Playersettings取消勾选AutoGraphicsAPIforMac,改为优先使用OpenGLCore,重启编辑器就好了......
  • JavaWeb——Servlet
      JDBC也是JavaEE的规范之一,其实也是接口。快速入门  这个jar包的依赖范围必须写成provided(在编译环境和测试环境有效,在运行环境无效),不然就会报错。这样以后打......
  • pyftpdlib 中文乱码修复文件
    pyftpdlib1.5.72个文件https://gitee.com/wgf4242/vue3start/raw/vite2tmp/imgs/filesystems.pyhttps://gitee.com/wgf4242/vue3start/raw/vite2t......
  • 3月4日Javaweb学习之html
    html基础标签<h1>~<h6> 定义标题,<h1>字体最大,<h6>字体最小<font>定义文本的字体、字体尺寸、字体颜色--------face控制字体,color控制颜色,size控制字体大小<b>定义粗......