SpringMVC学习记录-03

一、Controller返回值分类

1.返回字符串

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

具体的应用场景
控制器将数据存入Model

@Controller 
@RequestMapping("/user") 
public class UserController {        
	/**     
	* 请求参数的绑定     
	*/    
	@RequestMapping(value="/update")    
	public String update(Model model) {        
		// 模拟从数据库中查询的数据        
		User user = new User();        
		user.setUsername("张三");        
		user.setPassword("123");        
		user.setMoney(100d);        
		user.setBirthday(new Date());        
		model.addAttribute("user", user);   //将数据存入Model     
		return "update";    
	}    
}

前端通过 EL 表达式从域对象中取值

${ user.username }
${ user.password }        

2.返回值是void

  • 如果上述的 update 方法改为返回值是 void 类型,则视图解析器会自动去WEB-INF下寻找 update.jsp 文件
  • 可以使用请求转发或者重定向跳转到指定的页面
@RequestMapping(value="/initAdd")    
public void initAdd(HttpServletRequest request,HttpServletResponse response) throws Exception {        	 
	System.out.println("请求转发或者重定向");        
	// 请求转发        
	// request.getRequestDispatcher("/WEB-INF/pages/add.jsp").forward(request, response);    
	    
	// 重定向 (重定向无法访问 WEB-INF 路径下的资源)
	// response.sendRedirect(request.getContextPath()+"/add2.jsp");       
	         
	response.setCharacterEncoding("UTF-8");        
	response.setContentType("text/html;charset=UTF-8");                
	// 直接响应数据        
	response.getWriter().print("你好");        
	return;    
}

3.返回值是ModelAndView对象

ModelAndView 对象是 Spring 提供的一个对象,可以用来调整具体的 JSP 视图

  /**     
  * 返回ModelAndView对象     
  * 可以传入视图的名称(即跳转的页面),还可以传入对象。     
  * @return     
  * @throws Exception     
  */    
  @RequestMapping(value="/findAll")    
  public ModelAndView findAll() throws Exception {        
  	 ModelAndView mv = new ModelAndView();        
             
  	 // 模拟从数据库中查询所有的用户信息        
  	 List<User> users = new ArrayList<>();        
  	 User user1 = new User();        
  	 user1.setUsername("张三");        
  	 user1.setPassword("123");                
  	 User user2 = new User();        
  	 user2.setUsername("赵四");        
  	 user2.setPassword("456"); 
  	 users.add(user1);        
  	 users.add(user2);       
  	 
  	 // 添加对象        
  	 mv.addObject("users", users);    
  	 // 跳转到list.jsp的页面        
  	 mv.setViewName("list");               
  	 return mv;    
 } 

jsp 界面通过 EL 表达式取值:

 <h3>查询所有的数据</h3>    
 <c:forEach items="${ users }" var="user">        
 	${ user.username }    
 </c:forEach>

二、SpringMVC框架提供的转发和重定向

  • forward:请求转发
  • redirect:重定向
@RequestMapping("/delete")    
 public String delete() throws Exception {        
 	System.out.println("delete方法执行了...");       
 	// 请求转发 
 	// return "forward:/WEB-INF/pages/success.jsp";        
 	 
	//  重定向
	return "redirect:/add.jsp";   
 }

三、@ResponseBody响应json数据

需求: 使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端

1. 首先需要导入 jquery.min.js 框架文件以及 jackson 的 依赖

在这里插入图片描述

2. 导入jackson依赖(Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入 jackson 的包。 )

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

3. DispatcherServlet 会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决该问题的就是需要配置静态资源不进行拦截,在 springmvc.xml 配置文件添加如下配置 :

    <!-- 设置静态资源不过滤 -->
    <mvc:resources location="/css/" mapping="/css/**"/>  <!-- 样式 -->
    <mvc:resources location="/images/" mapping="/images/**"/>  <!-- 图片 -->
    <mvc:resources location="/js/" mapping="/js/**"/>  <!-- javascript -->
  • location 元素表示 webapp 目录下的包下的所有文件
  • mapping 元素表示以 /static 开头的所有请求路径,如 /static/a 或者/static/a/b

4. 前端JSP页面

<head>
    <title>Title</title>

    <srcipt src = "js/jquery.min.js"></srcipt>
    <script type = "text/javascript">

        $(function(){
            $("#testJson").click(function(){
                $.ajax({
                    type: "post",
                    url: "/testResponseJson",
                    contentType: "application/json; charset= utf-8",
                    data: '{"uname":"小黑", "age":20, "password":"123"}',
                    dataType: "json",
                    success:function(data){
                        alert(data);
                        // alert(data.age);
                    }
                });
            });
        });
    </script>
</head>

<body>
    <button id = "testJson">测试 ajax 请求 json 和响应 json</button>
</body>

5. 使用@RequestBody获取请求体数据

 @Controller
public class HelloController {
    @RequestMapping("/testResponseJson")
    public void testResponseJson(@RequestBody String body){
        System.out.println("test方法执行了"+body);
    }
}

6. 使用@RequestBody注解把json的字符串转换成JavaBean的对象

//控制器类
@Controller
public class HelloController {
    @RequestMapping("/testResponseJson")
    public void testResponseJson(@RequestBody User user){
        System.out.println("test方法执行了"+ user);
    }
}

7. 使用@ResponseBody注解把JavaBean对象转换成json字符串,直接响应

//控制器类
@Controller
public class HelloController {
    @RequestMapping("/testResponseJson")
    public @ResponseBody User testResponseJson(@RequestBody User user){
        System.out.println("test方法执行了"+ user);
        user.setAge(21);
        return user;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值