一、Spring MVC依赖的包
spring-context
spring-aspects
spring-jdbc
spring-test
spring-web
spring-webmvc
在pom.xml文件中添加依赖
<properties>
<spring.version>5.2.13.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
二、在resource中创建spring-servlet.xml文件
添加MVC命名空间
<?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:aop="http://www.springframework.org/schema/aop"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:annotation-config/>
<context:component-scan base-package="com.qfedu"/>
<!--声明MVC使用注解驱动-->
<mvc:annotation-driven/>
</beans>
三、在web.xml中配置spring MVC的前端控制器
spring mvc提供了一个名为DispatcherServlet的类(Spring MVC的前端控制器),用于拦截用户请求交由spring MVC处理
<?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_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>Spring MVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring MVC</servlet-name>
<url-patter>/*</url-patter>
</servlet-mapping>
</web-app>
四、创建控制器类
@Controller //声明此类为spring MVC的控制器类
@RequestMapping("/book")//声明此控制器类请求的url
public class BookController{
}
@controller
@RequsetMapping("/book")
public class BookController{
@RequestMapping("/add")
public void addBook(){
System.out.println("add");
}
@RequestMapping("/list")
public void listBooks(){
System.out.println("list");
}
}
//访问的URL
- http://localhost:8080/springmvc_demo2/book/add
- http://localhost:8080/springmvc_demo2/book/list
/*:拦截所有的HTTP请求,包含.jsp的请求,都作为控制器类的请求路径来处理
/:拦截所有的HTTP请求,但是不包括.jsp的请求,但是不会放行静态资源的请求
五、前端提交数据到控制器
表单提交
<body>
<h3>图书信息</h3>
<form action="/book/add" method="post">
<p><input type="text"></p>
<p><input type="text"></p>
<p><input type="submit"></p>
</form>
</body>
超链接提交
<a herf="localhost:8080/md?account=806563&password=122345">
AJAX提交(请求头,请求行,请求体)都可以被用来传值
<input type="button" value="ajax提交" id=”btn1“>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$("#btn1").click(function(){
var obj={};
obj.name="炸那个死鬼";
obj.author="死鬼";
obj.bookprice=12.6;
$.ajax({
url:"/book/add",
type:"post",
headers:{},
contentType:"application.json",
data:obj,
success:function(res){
console.log(res);
}
})
})
</script>
六、控制器接收前端的数据
- 表单提交
- URL提交
- $.ajax()请求的url的值
- . p o s t ( ) / .post()/ .post()/.get()中的{}的值
@RequestParam:注解用于接收请求行传递的数据
<form action="book/add" method="add">
<p>图书名称:<input type="text" name="name"/></p>
<p>图书作者:<input type="text" name="author"/></p>
<p>图书价格:<input type="text" name="price"/></p>
<p><input type="submit" value="提交"/></p>
</form>
控制器接收数据
@RequestMapping("/add")
public void book(@RequestParam ("name") String a,@RequestParam("author") String b,@RequestParam("price") double c){
System.out.println("---book add");
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
注意:如果控制器方法接收的请求数据的参数名与请求行传值的key一致时,则@RequestParam注解可以省略
@RequestMapping("/add")
public void addBook(String name,String author, double price){
System.out.println("---book add");
System.out.println(name);
System.out.println(author);
System.out.println(price);
}
@RequestHander 请求头传值,用于接收请求头传递的数据
<input type="button" value="ajax提交" id="btn1"/>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$("#btn1").click(function(){
$.ajax({
url:"book/list",
type:"post",
#请求头
headers:{
token:"wahahaawahaha"
},
success:function(res){
console.log(res);
}
});
});
</script>
@RequestMapping("/book")
public class book(@RequestHeader String a){
System.out.println("---list---")
}
七、请求体传值
@RequestBody注解用于接收请求体传递的数据
<input type="button" value="ajax提交" id="btn1"/>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$("#btn1").click(function(){
var obj = {};
obj.bookName = "Python";
obj.bookAuthor="杰哥";
obj.bookPrice = 2.22;
var s = JSON.stringify(obj); //将对象转换成JSON格式
$.ajax({
url:"book/update",
type:"post",
contentType:"application/json",
//请求体
data:s, //如果data的值为json格式字符串,contentType必须设置为"application/json"
success:function(res){
console.log(res);
}
});
});
</script>
注意一定要导入依赖jackjson
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
@RequestMapping("book")
public class book(@RequestBody String a){
System.out.prinln("list")
}
八、控制器响应前端请求
同步请求:form表单,超链接
处理同步请求返回类型定义为String,ModelAndView,以实现页面的跳转
返回类型为String
转发
@RequestMapping("/book")
public class BookController{
@RequestMapping("/add")
public String AddBook(String name,String Author,double price){
System.out.println("book");
return "/book.jsp";
}
}
重定向
@RequestMapping(”/add“)
public class BookController{
@RequestMapping("/add")
public String AddBook(String name,String Author,double price){
System.out.println("book");
return "redirect:/book.jsp";
}
}
返回类型为ModelAndView
转发
@RequestMapping("/book")
public class BookController{
@RequestMapping("/add")
public ModelAndView addBook(String name,String Author,double price){
System.out.println("add");
ModelAndView modelAndView =new ModelAndView("/tips.jsp");
return modelAndView;
}
}
重定向
@RequestMapping("/book")
public class BookController{
@RequestMapping("/add")
public ModelAndView addBook(String name,String Author,double price){
System.out.println("add");
ModelAndView modelAndView =new ModelAndView("redirect:/book");
return modelAndView;
}
}
九、控制器响应异步请求
异步请求:ajax请求
使用response中的输出流响应请求
控制器返回类型为void
控制器方法中添加HttpResponse response参数
在方法中通过response获取输出流,使用流响应ajax请求
@RequsetMapping("/update")
public void update(@Requestbody Book book,HttpResponseServlet response) throws IOException{
System.out.println("addbook");
System.out.println(book);
//使用ObjectMapper将对象转换为Json格式
String s=new ObjectMapper.writeValueAsString(book);
response.setCharacterEnCoding("UTF-8");
response.setContentType("application/json");
PrintWriter out =response.getWrite();
out.println(s);
out.flush();
out.close();
}
直接在控制器中返回控制对象
控制器方法的返回类型设置响应请求为ajax请求对象
在控制器前添加@Requestbody,将返回的对象转换成JSON响应给ajax对象
如果控制器里所有的请求都是ajax对象请求,则可以直接在控制器前添加@RequestBody注解
@RequestMapping("/book")
@RequestBody
pdublic List<Book> addBook(){
System.out.println("*************");
List<Book> book=new ArrayList<Book>();
book.add(new Book());
book.add(new Book());
return book;
}
控制器响应同步数据的请求
返回类型为String
//在控制器中定义一个Model参数
//在return之前,向model中添加键值对,添加的键值对被传递到转发的界面
@Controller
@RequestMapping("/book")
pulic String addBook(String name,String Author,double price,Model model){
model.addAttribute("key1","value1");
model.addAttribute("book",new Book(1,"hello","to",26.3,));
return "tips.jps";
}
除了直接使用model对象传值,还可以直接使用HttpServeltRequest对象
@RequestMapping("/add")
public String addBook(String name,String author,double price,HttpServletRequest request){
request.setAttribute("key1","value1");
request.setAttribute("book",new Book(1,"Java","老张",2.22));
return "tips.jsp";
}
返回类型ModelAndView
@RequestMapping("/book")
public MOdelAndView addBook(String name,String author,double price){
ModelAndView modelAndView=new ModelAndView("/tips.jsp");
modelAndView.addObject("key1","value1");
modelAndView.addObject("book",new Book(1,"Java","老张",2.22));
return modelAndView;
}
${pageContext.request.contextPath}//打印当前项目路径名
<base href=${pageContext.request.contextPath+'/'}>