SpringMVC之数据处理

六、数据处理

目录:处理提交数据、数据显示到前端、乱码问题

1.处理提交数据

1)提交的域名称和处理方法的参数名一致。
提交数据:http://localhost:8080/hello?name=ping
处理方法

@RequestMapping("/hello") 
public String hello(String name){ 
  System.out.println(name); 
  return "hello"; 
}

后台输出:ping
2)提交的域名称和处理方法的参数名不一致。
提交数据:http://localhost:8080/hello?username=ping
处理方法

//@RequestParam("username"):username提交的域的名称
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){ 
  System.out.println(name); 
  return "hello"; 
}

后台输出:ping
3)提交的是对象。
要求提交的表单域和对象的属性名一致,参数使用对象即可。
实体类

public class User { 
  private int id; 
  private String name; 
  private int age; 
  //构造 
  //get/set 
  //tostring() 
}

提交数据:http://localhost:8080/mvc/user?name=ping&id=1&age=20
处理方法

@RequestMapping("/user") 
public String user(User user){ 
  System.out.println(user); 
  return "hello"; 
}

后台输出:User { id=1, name=‘ping’, age=20 }
说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。

2.数据显示到前端

1)通过ModelAndView

public class ControllerTest1 implements Controller { 
  public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { 
    //返回一个模型视图对象 
    ModelAndView mv = new ModelAndView(); mv.addObject("msg","ControllerTest1"); 
    mv.setViewName("test"); 
    return mv; 
  } 
}

2)通过ModelMap

@RequestMapping("/hello") 
public String hello(@RequestParam("username") String name, ModelMap model){ 
  //封装要显示到视图中的数据 
  //相当于req.setAttribute("name",name); 
  model.addAttribute("name",name); 
  System.out.println(name); 
  return "hello"; 
}

3)通过Model

@RequestMapping("/ct2/hello") 
public String hello(@RequestParam("username") String name, Model model){ 
  //封装要显示到视图中的数据 
  //相当于req.setAttribute("name",name); 
  model.addAttribute("msg",name); 
  System.out.println(name); 
  return "test"; 
}

3.乱码问题

测试
①编写一个提交的表单。

<form action="/t" method="post">
  <input type="text" name="name">
  <input type="submit">
</form>

②后台编写对应的处理类。

@Controller public class Encoding { 
  @RequestMapping("/t") 
  public String test(Model model,String name){ 
    model.addAttribute("msg",name);
    //获取表单提交的值 
    return "test";
    //跳转到test页面显示输入的值 
  }
}

③输入测试后产生乱码。
以前乱码问题通过过滤器解决,而SpringMVC给我们提供了一个过滤器,可以在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>

修改了xml文件需要重启服务器。
注意:有些极端情况下,这个过滤器对get的支持不好。
处理方法
Ⅰ修改Tomcat配置文件:设置编码

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

Ⅱ自定义过滤器
在web.xml中配置这个过滤器即可。

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

总结:乱码问题需要在尽可能设置编码的地方,都设置为统一编码UTF-8。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值