> 文档中心 > 03SpringMVC-----RestFul、数据处理、乱码问题

03SpringMVC-----RestFul、数据处理、乱码问题


RestFul

概念

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

使用RESTful操作资源 :可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!

http://127.0.0.1/item/1 查询,GET

http://127.0.0.1/item 新增,POST

http://127.0.0.1/item 更新,PUT

http://127.0.0.1/item/1 删除,DELETE

好处

  1. 简洁:风格简单
  2. 高效:缓存
  3. 安全:不知到传输的内容

数据处理   使用方式三

三种方式: 

方式一

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

方式二   SpringMVVC 无视图解析器

    @RequestMapping("/q1/t1")    public String test1(Model model){ model.addAttribute("msg", "ModelTest1"); //转发 return "/WEB-INF/jsp/test.jsp";    }    @RequestMapping("/q2/t2")    public String test2(Model model){ model.addAttribute("msg", "ModelTest2"); //转发二 return "forward:/WEB-INF/jsp/test.jsp";    }    @RequestMapping("/q3/t3")    public String test3(Model model){ model.addAttribute("msg", "ModelTest3"); //重定向 return "redirect:/index.jsp";    }

方式三     SpringMVVC 有视图解析器 [重点]

    @RequestMapping("/s1/t2")    public String test6(Model model){ model.addAttribute("msg", "转发"); //转发 return "test";    }    @RequestMapping("/s1/t3")    public String test7(Model model){ model.addAttribute("msg", "重定向"); //重定向 return "redirect:/index.jsp";    }

处理提交数据

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

提交数据 : http://localhost:8080/hello?name=kuangshen

处理方法 :

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

后台输出 : kuangshen

2、提交的域名称和处理方法的参数名不一致  @RequestParam注解

提交数据 : http://localhost:8080/hello?username=kuangshen

处理方法 :

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

后台输出 : kuangshen

3、提交的是一个对象

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

后台输出 : User { id=1, name='kuangshen', age=15 }

说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。

乱码问题

过滤器

可以在web.xml中配置 

   encoding   org.springframework.web.filter.CharacterEncodingFilter          encoding       utf-8      encoding   /*

但是我们发现 , 有些极端情况下.这个过滤器对get的支持不好 .

处理方法 :

1、修改tomcat配置文件 :设置编码!

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 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 parameterMap = getParameterMap();String[] values = parameterMap.get(name);if (values == null) {    return null;      }return values[0]; // 取回参数的第一个值  }   //取所有值   @Override   public String[] getParameterValues(String name) {Map parameterMap = getParameterMap();String[] values = parameterMap.get(name);return values;  }}

然后在web.xml中配置这个过滤器即可!