Java学习笔记-Day70 SpringMVC 框架(二)
一、SpringMVC的数据交互
数据交互是 c(Controller 控制器)和 v(View 视图)之间的数据交互。
1、从Controller传递数据给View
(1)可以使用request.setAttribute()或者session.setAttribute()。
- DataTransController.java
package com.etc.ws.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class DataTransController {
@GetMapping("test01")
public String test01(HttpServletRequest request) {
request.setAttribute("name", "tom");
request.getSession().setAttribute("age", "25");
return "test01";
}
}
- test01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>名字:${name}</h1>
<h1>年龄:${age}</h1>
</body>
</html>
也可以使用优化后的方法ModelAndView。
- DataTransController.java
package com.etc.ws.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller // 转发请求
public class DataTransController {
@RequestMapping("test01")
public ModelAndView sayHi() {
ModelAndView mv = new ModelAndView("test01");
mv.addObject("name", "tom");
mv.addObject("age", "25");
return mv;
}
}
- test01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>名字:${name}</h1>
<h1>年龄:${age}</h1>
</body>
</html>
(2)Ajax响应可以使用response.getWriter().print(),也可以直接使用注解返回响应体。
-
加入ajax支持jar包(jackson包)。
-
Controller类前添加@Controller注解,在方法前添加@ResponseBody注解。也可以直接在类前添加@RestController注解(@RestController=@Controller+@ResponseBody)。
- AjaxDataTransController.java
package com.etc.ws.controller;
import java.util.Arrays;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.etc.ws.entity.User;
// @Controller
@RestController
public class AjaxDataTransController {
@GetMapping("ajax01")
// @ResponseBody
public List testajax() {
User user1 = new User(1,"tom",10,100);
User user2 = new User(2,"jack",1,10);
User user3 = new User(3,"jerry",30,300);
return Arrays.asList(user1,user2,user3);
}
}
- ajax01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<input type="button" id="btn" value="获取ajax">
<div id="userlist"></div>
<script src="js/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$("#btn").click(function(){
$.ajax({
url:'ajax01',
type:'get',
success:function(res){
$.each(res,function(index,u){
$("#userlist").append(u.username+"<br/>");
});
}
});
});
});
</script>
</body>
</html>
扫描二维码关注公众号,回复:
12647887 查看本文章

2、从View传递数据给Controller
Controller获取View传递的数据,可以使用request.getParameter获取,也可以使用参数列表直接获取。
1、url传值(参数列表直接获取)
- ParameterController.java
package com.etc.ws.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ParameterController {
@GetMapping("pc1")
public String pc1(String name,int id) {
System.out.println("name="+name+",id="+id);
return "success";
}
}
2、表单提交(参数列表直接获取)
- ParameterController.java
package com.etc.ws.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.etc.ws.entity.User;
@RestController
public class ParameterController {
@GetMapping("pc2")
public String pc2(User user) {
System.out.println("user="+user);
return "success";
}
}
- User.java
package com.etc.ws.entity;
/**
* User类
*/
public class User {
// 用户编号
private int userid;
// 姓名
private String username;
// 创建网站数量
private int create_website_num;
// 累计访问次数
private int website_access_num;
/**
* 有参构造方法
* @param userid 用户编号
* @param username 姓名
* @param create_website_num 创建网站数量
* @param website_access_num 累计访问次数
*/
public User(int userid, String username, int create_website_num, int website_access_num) {
super();
this.userid = userid;
this.username = username;
this.create_website_num = create_website_num;
this.website_access_num = website_access_num;
}
/**
* 无参构造方法
*/
public User() {
super();
}
//属性的Setter和Getter方法
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getWebsite_access_num() {
return website_access_num;
}
public void setWebsite_access_num(int website_access_num) {
this.website_access_num = website_access_num;
}
public int getCreate_website_num() {
return create_website_num;
}
public void setCreate_website_num(int create_website_num) {
this.create_website_num = create_website_num;
}
/**
* 重写的toString方法
*/
@Override
public String toString() {
return "User [userid=" + userid + ", username=" + username + ", create_website_num=" + create_website_num
+ ", website_access_num=" + website_access_num + "]";
}
}
- form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method="get" action="pc2">
<input type="text" id="userid" name="userid" value="12"/><br/>
<input type="text" id="username" name="username" value="baidu"/><br/>
<input type="text" id="create_website_num" name="create_website_num" value="2"/><br/>
<input type="text" id="website_access_num" name="website_access_num" value="102"/><br/>
<input type="submit"/>
</form>
</body>
</html>
3、Ajax请求(参数列表直接获取)
- ParameterController.java
package com.etc.ws.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import com.etc.ws.entity.User;
@RestController
public class ParameterController {
@PostMapping("pc3")
public String pc3(User user) {
System.out.println("user="+user);
return "success";
}
}
- ajaxform.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form>
<input type="text" id="userid" name="userid" value="12"/><br/>
<input type="text" id="username" name="username" value="baidu"/><br/>
<input type="text" id="create_website_num" name="create_website_num" value="2"/><br/>
<input type="text" id="website_access_num" name="website_access_num" value="102"/><br/>
<input type="button" id="btn" value="提交"/>
</form>
<script src="js/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$("#btn").click(function(){
console.log($("form").serialize());
$.ajax({
url:'pc3',
type:'post',
/* data:{
'userid':$('#userid').val(),
'username':$('#username').val(),
'create_website_num':$('#create_website_num').val(),
'website_access_num':$('#website_access_num').val()
}, */
data:$("form").serialize(), // 表单序列化
success:function(res){
console.log(res);
}
});
});
});
</script>
</body>
</html>
二、其他知识点
(1)Handler是指自定义的Controller。
(2)ModelAndView中的view是逻辑视图名,而非真正的视图对象。
(3)SpringMVC默认加载 /WEB-INF/[servlet-name]-servlet.xml 路径下的配置文件。