SpringMVC学习笔记【part4】响应数据类型

SpringMVC 学习笔记 Part4

1.Controller方法 返回值为String

Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。

@Controller @RequestMapping("/user") 
public class UserController { 

    @RequestMapping("myMVC") 
    public String findOne(Model model) { 
		User user = service.findByName("张三");
        model.addAttribute("user", user); 
        return "success";
    } 
}

springmvc.xml里的视图解析器配置回顾。

	<!-- 配置视图解析器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

最后视图解析出来的地址将是 /WEB-INF/pages/success.jsp

2.Controller方法 返回值为void

如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。因为方法返回值写成void的话,springmvc 框架默认会解析@RequestMapping(value="/myMVC") 里的 value 值,并跳转到 myMVC.jsp 这个页面去。

若不想跳转到默认页面去,则可以使用请求转发或者重定向跳转到指定的页面。方法前面小节也介绍过,需要在控制器方法参数中加入 HttpServletRequest request 和 HttpServletResponse response 。

@RequestMapping("myMVC") 
    public String findOne( HttpServletRequest request , HttpServletResponse response ) {
        
		/* 请求转发、重定向或着直接响应数据  */
        
        return ;
    } 
// 请求转发 
	request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);

// 重定向 
	response.sendRedirect(request.getContextPath()+"/success.jsp");

// 直接响应数据 
    response.setCharacterEncoding("UTF-8"); 
    response.setContentType("text/html;charset=UTF-8"); 
    response.getWriter().print("你好");

3.Controller方法 返回值为ModelAndView

ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图。 ModelAndView 可以传入视图的名称(即跳转的页面),还可以传入对象。

    @RequestMapping("myMVC")
    public ModelAndView findAll() throws Exception { 
        ModelAndView mv = new ModelAndView(); 
        mv.setViewName("success"); // 设置方法结束后跳转到 success.jsp 的页面 
        List<User> users = service.findAll(); 
        mv.addObject("users", users);// 添加对象进 ModelAndView 里 
        return mv;
    }

在success.jsp中,可以用 jstl 来遍历mv对象,首先先要导入 jstl 包。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

查询所有的数据。

    <c:forEach items="${ users }" var="user"> 
    	${ user.username } 
    </c:forEach>

我们在页面上上获取使用的是 requestScope.user取的,所以返回 ModelAndView 类型时,浏览器跳转只能是请求转发。

4. SpringMVC框架提供的转发和重定向

Controller方法返回String类型,想进行请求转发也可以编写成如下。forward 关键字的使用:“forward:转发的JSP路径”,不走视图解析器了,所以不能使用逻辑路径,需要编写完整的路径 。它相当于 request.getRequestDispatcher(“url”).forward(request,response) 。使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。

@RequestMapping("/myMVC")
public String myForward() throws Exception {
     return "forward:/WEB-INF/pages/success.jsp";
}

Controller方法返回String类型,想进行重定向也可以编写成如下。它相当于 response.sendRedirect(“url”) 。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。

@RequestMapping("/myMVC")
public String myRedirect() throws Exception {
     return "redirect:/hello.jsp";
}

5. ResponseBody响应json数据

响应json数据我们需要用到异步技术,这时需要导入jquery的包。但在导入之前,我们需要处理一个问题。DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置。

<!-- 设置静态资源不过滤 --> 
<mvc:resources location="/css/" mapping="/css/**"/>  
<mvc:resources location="/images/" mapping="/images/**"/> 
<mvc:resources location="/js/" mapping="/js/**"/> 

< mvc:recources >属性

location:表示webapp下的绝对路径
mapping:表示在html中写的路径
例如:
<mvc:resources location="/WEB-INF/ui/js/" mapping="js/**" /> 的意思是:html中写 src=“js/xxxx.js”,就会去/WEB-INF/ui/js文件夹下查找。

首先先来回顾一下 jquery的 异步技术使用方法。

$(function(){ 
    // 绑定点击事件 
    $("#btn").click(function(){ 
        $.ajax({ 
            url:"user/myJson", 
            contentType:"application/json;charset=UTF-8", 
            data:'{"username":"zhangsan","password":"123","age":18}', 
            dataType:"json",
            type:"post",
            success:function(data){ 
                alert(data);
                alert(data.username);
            } 
        });
    });
});

在 json字符串 和 JavaBean对象 互相转换的过程中,需要使用jackson的jar包。

    <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-core</artifactId> 
        <version>2.9.0</version> 
    </dependency> 
    <dependency> 
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.9.0</version> 
    </dependency>

@RequestBody注解

在控制器的方法中对 String 类型参数使用 @RequestBody注解 获取请求体内容。

    @RequestMapping("/myJson") 
    public void testJson(@RequestBody String body) { 
        System.out.println(body);
    }

spring框架提供了为我们自动解析json封装为javabean的功能,所以我们在控制器中对 Javabean 类型参数 使用 @RequestBody注解 可以直接转换为 Javabean对象。

    @RequestMapping("/myJson") 
    public void testJson(@RequestBody User user) { 
        System.out.println(user); 
    }

@ResponseBody注解

当需要控制器的方法响应javabean对象给页面时,我们可以使用 @ResponseBody注解 把JavaBean对象转换成json字符串,直接响应。

    @RequestMapping("/testJson") 
    public @ResponseBody User testJson(@RequestBody User user) {  
        user.setAge("20");
        return user;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Parker7

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

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

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

打赏作者

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

抵扣说明:

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

余额充值