Spring MVC学习04

1. 在Controller类之中实现转发和重定向

要实现转发和重定向只要在RequestMapping的方法下面返回的字符串加上前缀就行了。

"forward:/"表示转发,"redirect:/"表示重定向

    @RequestMapping("/redirect/test")
    public String testRedirect() {


        return "redirect:/index.jsp";
    }
        @RequestMapping("/forward/test")
    public String testForward() {

        return "forward:/index.jsp";
    }

如果在spring mvc servlet的配置文件之中将resolver的bean类注释掉,转发和重定向依然可以生效。这说明加上了转发和重定向前缀的字符串不会经过resolver的解析,能够让dispatcherServlet直接使用。

2. 前端表单提交一个对象

假设前端表单提交了后端pojo类的多个字段的值,我们要把这些提交的结果重新封装为pojo类。

  1. 可以在处理请求的方法之中加上很多个参数,同时加上@RequestParam注解使得这些参数与传递过来的数据名称一一匹配,接着手动封装。但是这样比较麻烦。

  2. 直接将pojo类作为参数加入方法之中,只要前端传入的值的名称与pojo类的字段名称相同,Spring MVC框架就可以自动封装好

    @RequestMapping("/form/test")
    public String formSubmitTest(User user) {
        System.out.println(user);

        return "test";
    }
<form action="${pageContext.request.contextPath}/form/test" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit">
</form>

结果为:User(username=1234, password=1234)

3. 后端数据回显到前端

将后端数据回显到前端有很多相似的方法。

  1. 在处理请求的方法的参数之中加上HttpServletResponse这个类型的参数,通过这个参数获取PrintWriter输出流,将数据直接输出给前端。能这样做是因为Controller本质也是一个Servlet,能够处理Request和Response。
    @RequestMapping("/data/m1")
    public String dataBack1(HttpServletRequest request, HttpServletResponse response) {
        request.getSession().setAttribute("msg", "method1");

        return "test";
    }
  1. 使用Model。Model这个类能够将数据通过setAttribute这个方法封装为一个键值对,前端能够通过键直接获得值
    @RequestMapping("/data/m2")
    public String dataBack2(Model model) {
        model.addAttribute("msg", "method2");

        return "test";
    }
  1. 使用ModelAndView。相比于Model类,这个主要多了设置要跳转的视图的名称这一个功能。

这种代码是不行的

    // 错误的方法,实际上处理请求的是dataBack1
    @RequestMapping("/data/m3")
    public String dataBack3(ModelAndView mv) {
        mv.addObject("msg", "method3");

        return "test";
    }

如果请求/data/m3,视图会显示和请求/data/m1一样的结果。如果ModelAndView使用setViewName方法设置了视图名称也不会出现预期的结果,前端并没有获取到msg。

    // 正确的方法,mv设置数据以及跳转的视图
    @RequestMapping("/data/m3")
    public ModelAndView dataBack3() {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "method3");
        mv.setViewName("test");

        return mv;
    }
  1. 使用ModelMap。相比于Model类,这个类继承自LinkedHashMap,除了Model有的方法之外还能够做到LinkedHashMap的一些操作
public class ModelMap extends LinkedHashMap<String, Object>

    @RequestMapping("/data/m4")
    public String dataBack4(ModelMap model) {
        model.addAttribute("msg", "method4");

        return "test";
    }

4. 后端回显数据到前端显示乱码问题

后端数据回显到前端显示乱码问题可以通过设置过滤器解决。

  1. 自己设置一个过滤器类,并且通过注解或者在web.xml之中配置好Filter信息

  2. 使用Spring MVC提供的过滤器类,直接在web.xml之中使用这个类

    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
0
所有评论 0