Java 学习【框架篇(三)】SpringMVC(五)重定向和转发 & 接收请求参数及数据回显 & 乱码问题

1. 结果跳转方式

1.1 ModelAndView(老方式)

在这里插入图片描述
在这里插入图片描述

1.2 ServletAPI(不建议)

在这里插入图片描述

1.3 SpringMVC

1.3.1 无视图解析器

无视图解析器要写全路径
在这里插入图片描述
转发: -> URL不变

1.3.2 有视图解析器

1.重定向是不会走视图解析器,因为没有权限去访问WEB-INF目录,就算显示写了也不可以
2.有视图解析器时转发: 视图解析器会自动拼接
在这里插入图片描述

2. SpringMVC 数据处理

2.1 处理提交数据

2.1.1 提交的域名称和处理方法的参数名一致

在这里插入图片描述

2.1.2 提交的域名称和处理方法的参数名不一致

在这里插入图片描述

2.1.3 提交的是一个对象

在这里插入图片描述
在这里插入图片描述

2.2 数据显示到前端

2.2.1 通过 ModelAndView

在这里插入图片描述

2.2.2 通过 ModelMap

在这里插入图片描述

2.2.3 通过 Model(常用)

在这里插入图片描述

2.2.4 对比

在这里插入图片描述
在这里插入图片描述

3. 乱码问题

在这里插入图片描述

3.1 一般解决办法 -> 修改 web.xml 配置

<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>

在这里插入图片描述

<Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"
          connectionTimeout="20000"
          redirectPort="8443" />

3.2 自定义过滤器

package com.kuang.filter;

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;

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

   @Override
   public void destroy() {
    
    
  }

   @Override
   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);
  }

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46644403/article/details/121862741
今日推荐