Spring MVC框架解析

一、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>

六、控制器接收前端的数据

  1. 表单提交
  2. URL提交
  3. $.ajax()请求的url的值
  4. . 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+'/'}>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值