接受参数和数据回传及JavaWeb可能遇到的乱码问题
  TEZNKK3IfmPf 2024年07月27日 70 0

一.处理提交的数据

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

@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";
    }
}

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

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

 我们来引入一个注解:@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的情况了。

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

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

    //前端接受的是一个对象
    @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";
    }
}

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

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

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

首先在我们的控制类中直接使用: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

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

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

第三种: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>

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

 第四种:究极大招,也是过滤器类,但是是大佬写的非常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,第三种))

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年07月27日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年06月14日   102   0   0 spring
  TEZNKK3IfmPf   2024年05月17日   86   0   0 JSpspring
TEZNKK3IfmPf