首页 > 技术文章 > Spring MVC 响应视图(六)

hhmm99 2018-11-07 19:32 原文

完整的项目案例: springmvc.zip

目录

 

实例

除了依赖spring-webmvc还需要依赖jackson-databind(用于转换json数据格式)

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>

项目结构:

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 请求总控器 -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:dispatcher-servlet.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
View Code

配置dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="edu.nf.ch06.controller"/>

    <mvc:annotation-driven/>

    <mvc:default-servlet-handler/>

    <!-- springmvc提供了很多种视图解析器来完成不同的视图解析工作,
     例如内部资源视图解析器、模板引擎的视图解析器、XML视图解析器等等
     ,而在配置文件中是可以同时配置多个视图解析器的,那么Springmvc
     在做视图响应的时候,会根据配置文件中的配置的所有视图解析器按照顺序
     进行匹配,直到找到一个合适的视图解析器来完成解析。当有多个视图解析器存在时,
     可以通过order属性来指定解析器的优先级(<property name="order" value="0"/>)-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

请求控制器Controller

(RedirectAttributesController)

package edu.nf.ch06.controller;

import edu.nf.ch06.entity.Users;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

/**
 * @author wangl
 * @date 2018/10/31
 * 使用RedirectAttributes解决重定向传参的问题
 * 这个对象是在Springmvc 3.1的版本加入的
 */
@Controller
public class RedirectAttributesController {

    /**
     * 重定向一个JSP页面,使用addAttribute的方式
     * 将参数绑定在重定向的url后面带回到页面
     * @param user
     * @param redirectAttributes
     * @return
     */
    @PostMapping("/redirect3")
    public String redirectPage(Users user, RedirectAttributes redirectAttributes){
        redirectAttributes.addAttribute("user", user.getUserName());
        return "redirect:redirectattr.jsp";
    }

    /**
     * 重定向一个新的请求,使用FlushAttribute的方式,
     * 将数据存入一个FlushMap中,它利用了Session的机制保存,
     * 在重定向完成之后会自动清除这个对象
     *
     * @param user
     * @param redirectAttributes
     * @return
     */
    @PostMapping("/redirect4")
    public String redirectReq(@ModelAttribute("user") Users user, RedirectAttributes redirectAttributes){
        redirectAttributes.addFlashAttribute("user", user);
        return "redirect:redirectAction";
    }

    /**
     * 从redirect4的请求重定向到这个方法
     * @param user
     * @return
     */
    @GetMapping("/redirectAction")
    public String getRedirectAttr(@ModelAttribute("user") Users user){
        System.out.println(user.getUserName());
        return "index";
    }
}
View Code

(ResponseBodyController)

package edu.nf.ch06.controller;

import edu.nf.ch06.entity.Users;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author wangl
 * @date 2018/10/31
 */
//@Controller

/**
 * @RestController是在spring4.0后新加入的一个注解,
 * 同样用于标注一个类为控制器组件,如果当前控制器中所有的
 * 请求处理方法都需要以ResponseBody的方式响应,那么
 * 就是用这个注解,而不需要再每一个方法上都标注@ResponseBody注解
  */
@RestController
public class ResponseBodyController {

    /**
     * 使用@ResponseBody标注,
     * 表示将方法的返回值以Response输出流写回客户端,
     * 这时,springmvc就会将序列化的数据放入响应体中并写回
     * @return
     */
    @GetMapping("/getUser")
    public Users getUser(){
        Users user = new Users();
        user.setUserName("user1");
        user.setAge(21);
        return user;
    }
}
View Code
(RequestBodyController)
package edu.nf.ch06.controller;

import edu.nf.ch06.entity.Users;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author wangl
 * @date 2018/10/31springmvc
 */
@RestController
public class RequestBodyController {

    /**
     * 接收ajax提交的数据并做类型转换映射
     * @param user
     * @return
     */
    @PostMapping("/addUser")
    public String addUser(Users user){
        System.out.println(user.getUserName());
        System.out.println(user.getAge());
        return "success";
    }

    /**
     * 是用@RequestBody标注参数,
     * 表示将接收的json文本数据进行格式转换后映射到实体中
     * @param user
     * @return
     */
    @PostMapping("/addUser2")
    public String addUser2(@RequestBody Users user){
        System.out.println(user.getUserName());
        System.out.println(user.getAge());
        return "success";
    }
}
View Code
(UserController)
package edu.nf.ch06.controller;

import edu.nf.ch06.entity.Users;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

import java.util.Map;

/**
 * @author wangl
 * @date 2018/10/31
 */
@Controller
public class UserController {

    /**
     * 转发视图
     */
    @GetMapping("/forwrd1")
    public ModelAndView forward1(){
        //通过ModelAndView转发
        return new ModelAndView("index");
    }

    @GetMapping("/forwrd2")
    public String forward2(){
        //通过ModelAndView转发
        return "index";
    }

    /**
     * 重定向视图
     * @return
     */
    @GetMapping("/redirect1")
    public ModelAndView redirect1(){
        //在ModelAndView的构造方法传入一个RedirectView的视图对象来完成重定向
        //return new ModelAndView(new RedirectView("redirect.jsp"));
        //简化
        return new ModelAndView("redirect:redirect.jsp");
    }

    @GetMapping("/redirect2")
    public String redirect2(Users user){
        return "redirect:redirect.jsp";
    }
}
View Code

 

推荐阅读