Spring MVC框架使用总结

发布于:2024-12-18 ⋅ 阅读:(122) ⋅ 点赞:(0)

1.Spring MVC

1.1 Spring MVC概述

Spring MVC 是由Spring官方提供的基于MVC设计理念的web框架

Spring MVC是基于servlet封装的用于实现MVC控制的框架,实现前端和服务端的交互

1.1.1 Spring MVC优势

  • 严格遵守MVC的分层思想
  • 采用了松耦合、插件式结构,相比较于我们封装的BaseServlet或其他MVC框架更具有灵活性和扩展性
  • SpringMVC是基于Spring的扩展、也提供了完善的MVC注解
  • SpringMVC在数据绑定、视图解析都提供了多种处理方式,可以灵活配置
  • SpringMVC对RESTful URL设计方法提供了良好的支持

1.1.2 Spring MVC的本质

  • 接收并解析请求
  • 处理请求
  • 数据渲染、相应请求

1.2 SpringMVC框架部署

1.2.1 创建maven web工程

1.2.2 添加依赖

  • spring-context
  • spring-aspects
  • spring-jdbc
  • spring-web
  • spring-webmvc
  • spring-junit
 <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.25.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.2.25.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.25.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.25.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.2.25.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.25.RELEASE</version>
        </dependency>
    </dependencies>

1.2.3 创建SpringMVC的配置文件

<?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:tx="http://www.springframework.org/schema/tx"
       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/tx
                           http://www.springframework.org/schema/tx/spring-tx.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.feng"/>
    <mvc:annotation-driven/>

</beans>

1.2.4 在web.xml中配置SpringMVC的前端控制器

SpringMVC提供了一个名为DispatcherServlcet的类(SpringMVC前端控制器),用于拦截用户请求交由SpringMVC处理。

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <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>

1.3 SpringMVC的使用

在SpringMVC我们把接受用户请求、处理用户请求的类称之为Controller(控制器)

1.3.1 创建控制器

  • 创建controllers 包
  • 创建一个类,无需做任何的继承和实现
  • 在控制类上添加@Controller注解,声明此类为SpringMVC的控制器
  • 在控制类上添加@RequestMapping(“url”)声明此控制器类的请求url
@Controller
@RequestMapping("/book")
public class BookController {

}

1.3.2 定义处理请求的方法

  • 在一个控制器的类中,可以定义多个方法,处理不同的请求
  • 在每方法上添加@RequestMapping(“/url”),用户声明当前方法请求的url
package com.feng.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


/**
 * @program: spring-mvc
 * @description: 图书控制类
 * @author: FF
 * @create: 2024-12-08 19:24
 **/
@Controller
@RequestMapping("/book")
public class BookController {
    @RequestMapping("/add")
    public void add(){
        System.out.println("=========booke==add======");
    }
    @RequestMapping("/list")
    public void list(){
        System.out.println("=========booke==list======");
    }
}

1.3.3 访问

http://localhost:8080/spring_mvc_war/book/add

1.4 前端提交数据到控制器

1.4.1 创建前端页面

<html>
<head>
    <title>Title</title>
</head>
<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>
</html>

1.4.2 /* 和 / 的区别

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

1.4.3 静态资源配置

spring-servlet.xml

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

1.4.4 前端页面提交数据

  • 表单提交:输入框需要提供name属性,SpringMVC控制器是通过name属性取值的
<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>
  • url提交
<h3>超链接提交</h3>
<a href="book/add?bookName=Java"/>
  • 异步提交:ajax,请求行,请求头,请求体都可以传值
<h3>Ajax提交</h3>
<input type="button" value="ajax提交" id="btn"/>
<script type="text/javascript" src="js/jquery-3.7.1.js"/>

<script type="text/javascript">
    $("#btn").click(function () {
        var obj ={};
        obj.bookName="Java";
        obj.bookAuthor="张老师";
        obj.bookPrice="55.5";

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

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

1.5 控制器接受前端数据

1.5.1 请求行传值

  • 表单提交
  • url提交
  • ajax请求的url传值
  • $post() $get()中的{}传值

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

前端提交数据

<form action="book/add" method="post">
    <p>图书名称:<input type="text" name="bookName"/></p>
    <p>图书作者:<input type="text" name="bookAuthor"/></p>
    <p>图书价格:<input type="text" name="bookPrice"/></p>
    <p><input type="submit" value="提交"/></p>
</form>

控制器接收数据

//接收请求行数据
@RequestMapping("/add")
public void add(@RequestParam("bookName") String bookName,
                @RequestParam("bookAuthor") String bookAuthor,
                @RequestParam("bookPrice") String bookPrice) {
    System.out.println("=========booke==add======");
    System.out.println(bookName + bookAuthor + bookPrice);

如果控制器方法中接收数据的参数名与请求行传值的key一致,则@RequestParam(“”)注解可以省略

1.5.2 请求头传值

  • $.ajax ----- headers{}
@RequestHeader("token")   注解用于接收请求头传递的数据(注解里面必须有参数)

1.5.3 请求体传值

  • ajax封装体数据

@RequestBody 注解将前端请求体提交的json格式数据转换成java对象,依赖jackson包

1.6 控制器响应前端请求

1.6.1 同步请求

同步请求:form,超链接

  • 处理同步请求的方法的返回类型为String或ModeAndView

    • String : 返回值直接 return “/tips.jsp”;(转发)
    如果需要重定向:return  "redirect:/tips.jsp";
    
    • ModelAndView :返回值 return new ModelAndView(“/tips.jsp”);

1.6.2 异步请求

异步请求:ajax请求

  • 使用Response中的输出流进行相应

    • 控制器方法的返回类型为void
    • 在方法中添加HttpServletResponse response参数
    • 在方法中通过response.getWriter()
  • 控制器方法的返回类型设置为响应给ajax请求的对象类型,在控制器方法前面添加@ResponseBody注解,将返回的对象转换成JSON相应给ajax请求

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

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

  • 转发类型为String:

  • //接收请求行数据
        @RequestMapping("/add")
        public String add(@RequestParam("bookName") String bookName,
                                @RequestParam("bookAuthor") String bookAuthor,
                                @RequestParam("bookPrice") String bookPrice,
                                Model model) {
            System.out.println("=========booke==add======");
            System.out.println(bookName + bookAuthor + bookPrice);
            model.addAttribute("bookName", bookName);
            return  "/tips.jsp";
    
    //接收请求行数据
        @RequestMapping("/add2")
        public String add2(@RequestParam("bookName") String bookName,
                          @RequestParam("bookAuthor") String bookAuthor,
                          @RequestParam("bookPrice") String bookPrice,
                          HttpServletRequest request) {
            System.out.println("=========booke==add======");
            System.out.println(bookName + bookAuthor + bookPrice);
            request.setAttribute("bookName", bookName);
            return "/tips.jsp";
        }
    
  • 返回值是 ModelAndView:

    •     //接收请求行数据
          @RequestMapping("/add3")
          public ModelAndView add3(@RequestParam("bookName") String bookName,
                             @RequestParam("bookAuthor") String bookAuthor,
                             @RequestParam("bookPrice") String bookPrice) {
              System.out.println("=========booke==add======");
              System.out.println(bookName + bookAuthor + bookPrice);
              ModelAndView modelAndView = new ModelAndView("tips.jsp");
              modelAndView.addObject("bookAuthor", bookAuthor);
              return modelAndView;
          }
      

1.7 解决中文乱码问题

1.7.1 前端编码

JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>

HTML

1.7.2 服务器编码

			<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               URIEncoding="UTF-8"
               />

1.7.3 设置SpringMVC的编码方式

  • 在web.xml中配置SpringMVC编码过滤器的编码方式
<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

网站公告

今日签到

点亮在社区的每一天
去签到