亲宝软件园·资讯

展开

SpringMVC介绍与使用

小威要向诸佬学习呀 人气:0

SpringMVC介绍

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,跟Spring,Mybatis框架并称为ssm。Spring MVC是由Spring官方提供的基于MVC设计理念的web框架也是基于Servlet封装的用于实现MVC控制的框架,实现前端和服务端的交互。
为什么叫MVC呢,这是因为,M是模型(Model):模型数据,主要处理业务逻辑;视图(View):呈现模型,主要用与用户进行交互;控制器(Controller):负责接收并处理请求,响应客户端

SpringMVC特点

上面介绍了SpringMVC的概念,接下来介绍它的特点:

因此,综上而言,SpringMVC的本质工作就是:
1.接收并解析请求
2.处理请求
3.数据渲染、响应请求

SpringMVC框架部署

首先创建一个Web工程,在Web工程中添加以下依赖:

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

接下来创建的SpringMVC配置文件,在resources目录下创建名为spring-servlet.xml的文件

<?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">
	<!--IoC采用注解配置-->
    <context:annotation-config/>
    <context:component-scan base-package="com.mvc"/>

    <!--  声明MVC使用注解驱动  -->
    <mvc:annotation-driven/>

</beans>

然后在web.xml中配置SpringMVC的前端控制器:
SpringMVC提供了一个名为DispatcherServlet的类(SpringMVC前端控制器),用于拦截用户请求交由SpringMVC处理。

<?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>SpringMVC</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>SpringMVC</servlet-name>
        <url-pattern>/*</url-pattern> 
    </servlet-mapping>

</web-app>

SpringMVC框架使用

首先创建一个控制器的类,在SpringMVC中,我们把接收用户请求、处理用户请求的类称之为Controlelr(控制器)
我们创建一个控制器:

@Controller
@RequestMapping("/book")
public class BookController {
}

在控制器类中定义处理请求的方法

@Controller
@RequestMapping("/book")
public class BookController {

    @RequestMapping("/add")
    public void addBook(){
        System.out.println("---book add");
    }

    @RequestMapping("/list")
    public void listBooks(){
        System.out.println("---book list");
    }
}

接下来部署静态资源:
静态资源是指项目中的HTML、css、js、图片、字体等

/* 和 / 的区别

/* 拦截所有的HTTP请求,包括.jsp的请求,都做为控制器类的请求路径来处理
/ 拦截所有的HTTP请求,但不包括.jsp的请求,不会放行静态资源的请求(html/css/js/图片)

静态资源放行配置

在springMVC的配置文件,添加如下静态资源放行的配置

<!--配置静态资源放行-->
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/imgs/**" location="/imgs/"/>
<mvc:resources mapping="/pages/**" location="/pages/"/>

前端提交数据到控制器
输入框需要提供name属性,SpringMVC控制器是通过name属性取值的

<body>
    <h3>添加图书</h3>
    <form action="book/add" method="post">
        <p>图书名称:<input type="text"/></p>
        <p>图书作者:<input type="text"/></p>
        <p>图书价格:<input type="text"/></p>
        <p><input type="submit" value="提交"/></p>
    </form>
</body>

URL提交

<a href="book/add?bookName=Java" rel="external nofollow" >URL提交</a>

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.bookName = "Java";
        obj.bookAuthor="张三";
        obj.bookPrice = 3.33;

        $.ajax({
            url:"book/add",
            type:"post",
            headers:{

            },
            contentType:"application/json",
            data:obj,
            success:function(res){
                console.log(res);
            }
        });
    });
</script>

控制器接收前端提交的数据

@RequestParam 接收请求行传值

**@RequestParam**注解用于接收请求行传递的数据

前端提交数据

<form action="book/add" method="post">
    <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 addBook(@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);
}

前端:

<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("/list")
public void listBooks(@RequestHeader("token") String token){
    System.out.println("---book list");
}

ajax封装请求体数据

$.ajax({
    ...,
    contentType:"application/json",
    data:obj,,
    ...
})

**@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>

@RquestBody 将前端请求体提交的JSON格式数据转换成Java对象,依赖jackson包

导入jackson依赖:

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

控制器

@RequestMapping("/update")
public void update(@RequestBody Book book){
    System.out.println("---book update");
    System.out.println(book);
}

控制器响应前端请求

控制器响应同步请求

同步请求:form、超链接

处理同步请求的方法的返回类型定义为String或者ModelAndView,以实现页面的跳转

返回类型为String

转发

@RequestMapping("/add")
public String addBook(String name, String author, double price){
    System.out.println("---book add");
    return "/tips.jsp";
}

重定向

@RequestMapping("/add")
public String addBook(String name, String author, double price){
    System.out.println("---book add");
    return "redirect:/tips.jsp";
}

返回类型为 ModelAndView

转发

@RequestMapping("/add")
public ModelAndView addBook(String name, String author, double price){
    System.out.println("---book add");
    ModelAndView modelAndView = new ModelAndView("/tips.jsp");
    return modelAndView;
}

重定向

@RequestMapping("/add")
public ModelAndView addBook(String name, String author, double price){
    System.out.println("---book add");
    ModelAndView modelAndView = new ModelAndView("redirect:/tips.jsp");
    return modelAndView;
}

控制器响应异步请求

异步请求:ajax请求

使用response中的输出流进行响应

@RequestMapping("/update")
public void update(@RequestBody Book book, HttpServletResponse response) throws IOException {
    System.out.println("---book update");
    System.out.println(book);

    //使用ObjectMapper将对象转换成JSON格式字符串
    String s = new ObjectMapper().writeValueAsString(book);
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/json");
    PrintWriter out = response.getWriter();
    out.println(s);
    out.flush();
    out.close();
}

直接在控制器方法返回响应的对象

@RequestMapping("/update")
@ResponseBody
public List<Book> update() {
    System.out.println("---book update");
    List<Book> books = new ArrayList<Book>();
    books.add(new Book(1,"Java","老张",2.22));
    books.add(new Book(2,"C++","老李",3.22));
    return books;
}

控制器响应同步请求的数据传递

对于同步请求的转发响应,我们可以传递参数到转发的页面

返回类型为String:

//1.在控制器方法中定义一个Model类型的参数
//2.在return页面之前,向model中添加键值对,添加的键值对就会被传递到转发的页面
@RequestMapping("/add")
public String addBook(String name, String author, double price,Model model){
    model.addAttribute("key1","value1");
    model.addAttribute("book",new Book(1,"Java","老张",2.22));
    return "/tips.jsp";
}

//除了使用Model对象传值外,还可以直接使用HttpServletRequest对象
@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("/add2")
public ModelAndView addBook2(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;
}

加载全部内容

相关教程
猜你喜欢
用户评论