Spring MVC框架

  • Post author:
  • Post category:其他




Spring MVC框架



MVC模式


MVC模式是指Model-View-Controller(模型-视图-控制器),是开发web应用程序时常用的一种代码分层方式



基本组成

视图(View):负责格式化数据并把他们呈现给用户,包括数据展示,数据验证,界面设计等功能。

​ 对应组件:JSP或HTML文件

控制器(Controller):负责接收并转发请求,对请求进行处理后指派视图并将相应结果发送给客户端

​ 对应组件:Servlet

模型(Model):模型对象拥有最多的处理任务,是应用程序的主题部分,它负责业务逻辑的处理和实现对数据的操作

​ 对应组件:JavaBean(包括处理业务逻辑的Service层,与数据库操作相关的DAO层及贯穿于各层之间的数据模 型 POJO)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5zlx0kYX-1618907309512)(C:\Users\郭念念\AppData\Roaming\Typora\typora-user-images\image-20210129150006690.png)]



MVC处理过程

  1. 视图提供系统与用户交互的界面,并发送用户输入的请求给控制器
  2. 控制器接收用户的请求,并决定应该调用的模型
  3. 模型根据用户请求进行相应的业务逻辑处理,并返回处理结果(数据)
  4. 控制器根据返回的处理结果,调用相应的视图格式化模型返回的数据,并通过视图呈现结果给用户



优点

  • MVC三个模块相互独立,松耦合架构
  • 多视图共享一个模型,大大提高代码的可重用性
  • 控制器提高了应用程序的灵活性和可配置性
  • 有利于软件工程化管理



缺点

  • 增加了系统结构和实现的复杂性,不适合小规模的项目
  • 层与模型之间需要控制器做中间的链接控制,所以效率低



搭建Spring MVC环境

1.下载相关jar文件


  1. spring-web-5.2.2.RELEASE.jar

  2. spring-webmvc-5.2.2.RELEASE.jar


2. 创建项目并导入依赖包

  1. 创建 JavaWeb项目


  2. Spring 的 JAR 文件



    SpringMVC 的 JAR 文件

    都导入到

    web/WEB-INF/lib

    目录下


  3. log4j.properties

    配置文件拷贝到

    resources

    资源目录下


3. 创建控制器

创建

controller.HellController

package controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController extends AbstractController {

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest reqeust, HttpServletResponse response) throws Exception {
        System.out.println("Spring MVC框架搭建成功。");
        return null;
    }
}


4. 创建核心配置文件

创建

resources/springmvc-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"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean name="/index.html" class="controller.HelloController"/>
</beans>


5. 配置 SpringMVC 入口

修改

web/WEB-INF/web.xml

<?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_4_0.xsd"
         version="4.0">
    <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:springmvc-servlet.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

6.访问测试

在浏览器中访问

http://localhost:8080/index.html

在控制台中会输出

image-20210127120021140



使用注解实现SpringMVC

修改

resources/springmvc-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"
+mlns:context="http://www.springframework.org/schema/context"
+    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/mvc
+      http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- IOC 注解支持-->
+  <context:component-scan base-package="controller"/>
    <!-- MVC 注解支持 -->
+  <mvc:annotation-driven/>

- <bean name="/index.html" class="controller.HelloController"/>
</beans>

修改

controller.HelloController


 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 @Controller
 public class HelloController {
   @RequestMapping("/index.html")
   public String hello() throws Exception {
       return "hello";
   }
}



视图解析器

创建

web/WEB-INF/jsp/hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>我的第一个SpringMVC程序,运行成功啦!</h1>
</body>
</html>

修改

controller.HelloController

@Controller
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        System.out.println("hello Controller");
        return "hello";
    }

}

修改

resources/springmvc-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"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean name="/index.html" class="controller.HelloController"/>

    <!-- 视图解析器 -->
+   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+       <property name="prefix" value="/WEB-INF/jsp/"/>
+       <property name="suffix" value=".jsp"/>
+   </bean>
</beans>

重启服务并访问测试



静态资源解析

  1. 创建静态资源目录:

    web/statics
  2. 在 SpringMVC 的配置文件中进行配置:
<!-- 将 URL '/statics/** 与 本地物理路径 'web/statics/' 进行绑定 -->
<mvc:resources mapping="/statics/**" location="/statics/"></mvc:resources>

​ 3. 修改视图页面的静态资源路径:

<link rel="stylesheet" href="/statics/css/custom.css">
<script src="/statics/js/custom.js"></script>



请求映射

映射到方法上

当请求

/index.html

的时候,就会执行该方法

@Controller
public class HelloController {
    @RequestMapping("/index.html")
    public String index() {
        return "hello";
    }
}

映射到类上

当请求

/user/index.html

的时候,就会执行

index

方法

@Controller
@RequestMapping("/user")
public class HelloController{
    @RequestMapping("/index.html")
    public String hello() throws Exception {
        return "hello";
    }
}

只允许GET请求

@RequestMapping(value="/index.html",method=RequestMethod.GET)
@GetMapping("/index.html")

只允许POST请求

@RequestMapping(value="/index.html",method=RequestMethod.POST)
@PostMapping("/index.html")



控制器入参

直接接收

参数名与形参名保持一致时,可以直接获取

@Controller
public class IndexController {
    @RequestMapping("/index")
    public String index(String name, Integer age){
        System.out.println(name);
        System.out.println(age);
        return "index";
    }
}

用@RequestParam注解接收

@Controller
public class IndexController {
    @RequestMapping("/index")
    public String index(@RequestParam String name, @RequestParam Integer age){
        System.out.println(name);
        System.out.println(age);
        return "index";
    }
}

参数名与形参名不一致时,可以使用

@RequestParam

进行获取


@RequestParam

里的值与参数名保持一致

@Controller
public class IndexController {
    @RequestMapping("/index")
    public String index(@RequestParam("uname") String name, @RequestParam("uage") Integer age){
        System.out.println(name);
        System.out.println(age);
        return "index";
    }
}

用@RequestMapping接收

@Controller
public class IndexController {
    @RequestMapping(value = "/index", params = { "name", "age" })
    public String index(String name, Integer age) {
        System.out.println(name);
        System.out.println(age);
        return "index";
    }
}

非必填参数

访问URL:

/index

@Controller
public class IndexController {
    @RequestMapping("/index")
    public String index(@RequestParam(required=false,value="name")String name) {
        System.out.println(name); // null
        return "index";
    }
}

参数默认值

访问URL:

/index

@Controller
public class IndexController {
    @RequestMapping("/index")
    public String index(@RequestParam(required=false,value="name",defaultValue="匿名")String name) {
        System.out.println(name); // 匿名
        return "index";
    }
}

对象入参

参数名应该与对象的属性名保持一致

需要给

java.Utils.Date

类型的属性添加

@DateTimeFormat(pattern="yyyy-MM-dd")

注解

形参不能使用

@RequestParam

注解


控制器

@RequestMapping(value = "/add.html", method = RequestMethod.POST)
public String addSave(User user) {
    return "user/userlist";
}


pojo.User时间属性

@DateTimeFormat(pattern="yyyy-mm-dd")
private Date birthday;



控制器出参



用ModelAndView实现

值类型出参


控制器

@RequestMapping("/index")
public ModelAndView index() {
    ModelAndView mView = new ModelAndView("index");
    mView.addObject("username", "admin");
    mView.addObject("password", "123456");
    return mView;
}


视图

<h1>${username}</h1>
<h1>${password}</h1>

Map出参


控制器

@RequestMapping("/index")
public ModelAndView index() {
    ModelAndView mView = new ModelAndView("index");
    Map<String, String> modelMap = new HashMap<String, String>();
    modelMap.put("username", "admin");
    modelMap.put("password", "123456");
    mView.addAllObjects(modelMap);
    return mView;
}


视图

<h1>${username}</h1>
<h1>${password}</h1>

对象出参


控制器

@RequestMapping("/index")
public ModelAndView index() {
    ModelAndView mView = new ModelAndView("index");
    User user = new User();
    user.setUsername("admin");
    user.setPassword("123456");
    mView.addObject(user);
    return mView;
}


视图

<h1>username:${user.username}</h1>
<h1>password:${user.password}</h1>



用Model实现

值类型出参


控制器

@RequestMapping("/index")
public String index(Model model) {
    model.addAttribute("username", "admin");
    model.addAttribute("password", "123456");
    return "index";
}


视图

<h1>${username}</h1>
<h1>${password}</h1>

Map出参


控制器

@RequestMapping(value="/index")
public String index(Model model) {
    Map<String, String> datas = new HashMap<String, String>();
    datas.put("username", "admin");
    datas.put("password", "123456");
    model.addAllAttributes(datas);
    return "index";
}


视图

<h1>username:${username}</h1>
<h1>password:${password}</h1>

对象出参


控制器

@RequestMapping("/index")
public String index(Model model) {
    User user = new User();
    user.setUsername("admin");
    user.setPassword("123456");
    model.addAttribute(user);
    return "index";
}


视图

<h1>username:${user.username}</h1>
<h1>password:${user.password}</h1>



用Map实现


控制器

@RequestMapping("/index")
public String index(Map<String, Object> model) {
    model.put("username","张三");
    model.put("password","123456");
    return "index";
}


视图

<h1>username:${username}</h1>
<h1>password:${password}</h1>
el model) {
    User user = new User();
    user.setUsername("admin");
    user.setPassword("123456");
    model.addAttribute(user);
    return "index";
}


视图

<h1>username:${user.username}</h1>
<h1>password:${user.password}</h1>



用Map实现


控制器

@RequestMapping("/index")
public String index(Map<String, Object> model) {
    model.put("username","张三");
    model.put("password","123456");
    return "index";
}


视图

<h1>username:${username}</h1>
<h1>password:${password}</h1>



版权声明:本文为weixin_46657129原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。