SpringMVC响应使用案例(带数据页面跳转,快捷访问路径,返回json数据)

页面跳转

  • 转发(默认)
@RequestMapping("/showPage1")
public String showPage1() {
    System.out.println("user mvc controller is running ...");
    // return "WEB_INF/pages/forward:page.jsp";这种方式不支持重定向,只能支持转发格式的
    return "forward:page.jsp";
}
  • 重定向
@RequestMapping("/showPage2")
	public String showPage2() {
	System.out.println("user mvc controller is running ...");
	return "redirect:page.jsp";
}

注意:
1、页面访问地址中所携带的 /
2、如果目录是在其它层级,那么在返回时候需要加上层级目录

页面访问快捷设定 (InternalResourceViewResolver)

  • 展示页面的保存位置通常固定,且结构相似,可以设定通用的访问路径,简化页面配置格式,在运行的时候会自动把设置的路径拼接上去。
  • 如果配置了快捷的这种方式,是不支持使用转发和重定向的。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

	<!-- 
		prefix:前缀 
		suffix:后缀
	-->
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
/bean>

在代码里因为配置文件已经做了拼接了,所以直接写页面名称就可以了,不需要写前后缀了

public String showPage3() {
    return "page";
}

如果未设定返回值,使用void类型,则默认使用访问路径作页面地址的前缀后缀

//最简页面配置方式,使用访问路径作为页面名称,省略返回值
@RequestMapping("/page")
public void showPage5() {
    System.out.println("user mvc controller is running ...");
}

带数据页面跳转

方式一:使用HttpServletRequest类型形参进行数据传递

@RequestMapping("/showPageAndData1")
public String showPageAndData1(HttpServletRequest request) {
    request.setAttribute("name","itzhuzhu");
    return "page";
}

page.jsp

${name}

方式二:使用Model类型形参进行数据传递

@RequestMapping("/showPageAndData2")
public String showPageAndData2(Model model) {
    model.addAttribute("name","itzhuzhu");
    Book book = new Book();
    book.setName("SpringMVC入门实战");
    book.setPrice(66.6d);
    model.addAttribute("book",book);
    return "page";
}

方式三:使用ModelAndView类型形参进行数据传递,将该对象作为返回值传递给调用者

//使用ModelAndView形参传递参数,该对象还封装了页面信息
@RequestMapping("/showPageAndData3")
public ModelAndView showPageAndData3(ModelAndView modelAndView) {
    //ModelAndView mav = new ModelAndView();    替换形参中的参数
    // 转发和重定向不能加xml快捷页面访问
    // 转发
    modelAndView.setViewName(forward:page.jsp");
    // 重定向
    modelAndView.setViewName("redirect:page.jsp");
    Book book  = new Book();
    book.setName("SpringMVC入门案例");
    book.setPrice(66.66d);
    //添加数据的方式,key对value
    modelAndView.addObject("book",book);
    //添加数据的方式,key对value
    modelAndView.addObject("name","Jockme");
    //设置页面的方式,该方法最后一次执行的结果生效
    modelAndView.setViewName("page");
    //返回值设定成ModelAndView对象
    return modelAndView;
}

三种方式总结:

  • String:仅封装页面的基本信息,底层由ModeAndView实现
  • Model:仅封装数据
  • ModelAndView:封装数据并封装视图,包含Model和View两个对象

返回json数据

需要先导入json的三个坐标:

    <!--json相关坐标3个-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>

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

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>

方式一:基于response返回数据的简化格式,返回JSON数据

//使用jackson进行json数据格式转化
@RequestMapping("/showData3")
@ResponseBody  //将java对象转为json格式的数据
public String showData3() throws JsonProcessingException {
    Book book  = new Book();
    book.setName("SpringMVC入门案例");
    book.setPrice(66.66d);

    ObjectMapper om = new ObjectMapper();
    return om.writeValueAsString(book);
}

方式二:使用SpringMVC提供的消息类型转换器将对象与集合数据自动转换为JSON数据

//使用SpringMVC注解驱动,对标注@ResponseBody注解的控制器方法进行结果转换,由于返回值为引用类型,自动调用jackson提供的类型转换器进行格式转换
@RequestMapping("/showData4")
@ResponseBody
public Book showData4() {
    Book book  = new Book();
    book.setName("SpringMVC入门案例");
    book.setPrice(66.66d);
    return book;
}

需要手工添加信息类型转换器

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
        </list>
    </property>
</bean
  • 方式三:使用SpringMVC注解驱动简化配置
<!--开启springmvc注解驱动,对@ResponseBody的注解进行格式增强,追加其类型转换的功能,具体实现由MappingJackson2HttpMessageConverter进行-->
<mvc:annotation-driven/>

注解驱动格式:

@EnableWebMvc // 加这个注解
public Book showData5() {}

Servlet相关接口-Servlet相关接口替换方案

SpringMVC提供访问原始Servlet接口API的功能,通过形参声明即可

@RequestMapping("/servletApi")
public String servletApi(HttpServletRequest request,
                         HttpServletResponse response, 
                         HttpSession session){
    System.out.println(request);
    System.out.println(response);
    System.out.println(session);
    request.setAttribute("name","itzhuzhu");
    System.out.println(request.getAttribute("name"));
    return "page.jsp";
}

Head数据获取

  • 名称: @RequestHeader
  • 类型: 形参注解
  • 位置:处理器类中的方法形参前方
  • 作用:绑定请求头数据与对应处理方法形参间的关系
@RequestMapping("/headApi")
public String headApi(@RequestHeader("Accept-Language") String head){
    System.out.println(head);
    return "page.jsp";
}

Cookie数据获取

  • 名称: @CookieValue
  • 类型: 形参注解
  • 位置:处理器类中的方法形参前方
  • 作用:绑定请求Cookie数据与对应处理方法形参间的关系
@RequestMapping("/cookieApi")
public String cookieApi(@CookieValue("JSESSIONID") String jsessionid){
    System.out.println(jsessionid);
    return "page.jsp";
}

Session数据获取

  • 名称: @SessionAttribute
  • 类型: 形参注解
  • 位置:处理器类中的方法形参前方
  • 作用:绑定请求Session数据与对应处理方法形参间的关系
@RequestMapping("/sessionApi")
public String sessionApi(@SessionAttribute("name") String name,
                         @SessionAttribute("age") int age){
    System.out.println(name);
    System.out.println(age);
    return "page.jsp";
}

Session数据设置

  • 名称: @SessionAttributes
  • 类型: 类注解
  • 位置:处理器类上方
  • 作用:声明放入session范围的变量名称,适用于Model类型数据传参
@Controller
@SessionAttributes(names={"name"})
public class ServletController {
    @RequestMapping("/setSessionData2")
    public String setSessionDate2(Model model) {
        model.addAttribute("name", "Jock2");
        return "page.jsp";
    }
}

注解式参数数据封装底层原理

  • 数据的来源不同,对应的处理策略要进行区分
  • Head
  • Cookie
  • Session
  • SpringMVC使用策略模式进行处理分发
  • 顶层接口: HandlerMethodArgumentResolver
  • 实现类: ……
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itzhuzhu.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值