SpringMVC MVC架构与Servlet使用详解

SpringMVC MVC架构与Servlet使用详解

什么是MVC架构?

MVC(Model View Controller)是一种设计模式,它将一个应用划分为三个部分,即模型(Model)、视图(View)和控制器(Controller),每个部分各自处理自己的任务。MVC设计模式可以使程序的处理逻辑更加清晰,程序的维护和修改更加方便。

在MVC架构中,模型层用于处理业务逻辑和数据管理;视图层用于展示数据;控制器用于管理模型和视图之间的通信和转换。模型、视图和控制器之间通常采用松耦合的方式进行通信,这样可以使得这三个部分可以独立地进行开发和修改。

在SpringMVC框架中,MVC架构被广泛使用,它能够使得开发者更加方便地开发WEB应用程序。

SpringMVC与Servlet

SpringMVC框架是基于Servlet技术实现的,它使用了Servlet作为Web请求的入口,SpringMVC框架使用了DispatcherServlet来拦截所有的请求,并将请求分发到相应的控制器进行处理。相比纯Servlet技术,SpringMVC框架拥有更加丰富的功能和更加便利的开发体验。

SpringMVC框架的基本工作流程如下:

  1. 客户端发送请求到服务器;
  2. 请求被所有的Servlet容器拦截;
  3. DispatcherServlet拦截请求并将其分配给相应的控制器;
  4. 控制器处理请求并返回一个ModelAndView对象;
  5. ModelAndView对象被解析为视图并返回给客户端。

SpringMVC的基本结构

SpringMVC框架的基本结构如下:

├── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ ├── test
│ │ ├── java
│ │ └── resources
└── webapp
├── WEB-INF
│ ├── views
│ └── web.xml
└── index.jsp

其中,src目录下的java和resources目录用于存放Java源文件和配置文件;测试代码存放在test目录下;webapp目录用于存放JSP文件和Web应用程序的配置文件。

SpringMVC的配置文件

web.xml

在SpringMVC应用程序中,web.xml是配置文件的入口文件,它包含了WEB应用程序的配置信息,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
         id="WebApp_ID" version="4.0">
    <display-name>springmvc-demo</display-name>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>springmvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

在web.xml中,配置了ContextLoaderListener和DispatcherServlet,用于加载Spring应用程序和SpringMVC应用程序的配置文件,这两个组件是整个SpringMVC框架的核心。

springmvc-servlet.xml

在SpringMVC应用程序中,springmvc-servlet.xml是SpringMVC的配置文件,用于配置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:p="http://www.springframework.org/schema/p"
       xmlns: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">

    <context:component-scan base-package="com.example.controller"/>

    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/views/"
          p:suffix=".jsp"/>
</beans>

在springmvc-servlet.xml中,配置了包扫描路径、注解驱动和视图解析器,它们负责将处理器映射器和处理器适配器和控制器进行关联,并将处理逻辑的返回结果解析为视图。

示例1:Hello World程序

下面我们通过一个简单的Hello World程序来演示SpringMVC的使用。

1. 创建项目

首先,我们需要创建一个Maven项目,在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>

2. 创建控制器

在src/main/java/com/example/controller目录下创建HelloController.java文件,代码如下所示:

package com.example.controller;

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

@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello World");
        return "hello";
    }
}

在这个控制器中,我们使用了@Controller注解,该注解可以告诉Spring容器将该类作为一个控制器来使用。我们还使用了@RequestMapping注解,将http://localhost:8080/hello请求映射到了该控制器中的hello方法。在hello方法中,我们向Model对象中添加了一个名为“message”值为“Hello World”的属性,并返回了一个名为“hello”的逻辑视图名。

3. 创建视图

在webapp/WEB-INF/views目录下创建hello.jsp文件,代码如下所示:

<!DOCTYPE html>
<html>
<head>
    <title>Hello World</title>
</head>
<body>
    <h1>${message}</h1>
</body>
</html>

在这个视图中,我们使用EL表达式从Model对象中读取名为“message”的属性的值,并将其显示在h1标签中。

4. 配置SpringMVC

在src/main/resources目录下创建spring/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"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns: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">

    <context:component-scan base-package="com.example.controller"/>

    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/views/"
          p:suffix=".jsp"/>
</beans>

在配置文件中,我们使用了标签启用了注解驱动,使用标签扫描了com.example.controller包,使用标签配置了一个视图解析器,使得SpringMVC可以将名为“hello”的逻辑视图名解析为/WEB-INF/views/hello.jsp。

5. 配置web.xml

在web.xml中增加以下内容:

<servlet-mapping>
    <servlet-name>springmvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

其中,标签用于映射DispatcherServlet的url-pattern为/,表示当用户访问Web应用的根目录时,会使用DispatcherServlet响应请求。

6. 运行程序

完成代码编写后,我们可以使用Maven打包程序并将其部署到Servlet容器(如Tomcat)中,启动Servlet容器后,在浏览器中输入http://localhost:8080/hello,即可看到输出结果为“Hello World”。

示例2:消息转换器

SpringMVC框架提供了非常强大的消息转换器功能,可以将客户端提交的不同格式数据自动转换为Java对象,并将Java对象以不同格式输出到客户端。这使得开发者不需要手动转换数据,可以更加方便地开发RESTful风格的Web服务。

在SpringMVC框架中,我们可以很容易地配置多种消息转换器,使得不同的输入和输出格式都可以被处理。

创建项目

首先,我们需要创建一个Maven项目,在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.13</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.4</version>
</dependency>

这些依赖包含了SpringMVC框架、Jackson JSON处理库、XML解析库JAXB等。

创建控制器

在src/main/java/com/example/controller目录下创建UserController.java文件,代码如下所示:

package com.example.controller;

import com.example.vo.UserVO;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/user")
public class UserController {
    @GetMapping("/{id}")
    public ResponseEntity<UserVO> getUserById(@PathVariable("id") Long id) {
        UserVO userVO = new UserVO();
        userVO.setId(id);
        userVO.setUsername("test");
        userVO.setPassword("123456");
        return new ResponseEntity<>(userVO, HttpStatus.OK);
    }

    @PostMapping(value = "", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE},
            produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
    public ResponseEntity<UserVO> createUser(@RequestBody UserVO userVO) {
        userVO.setId(1L);
        return new ResponseEntity<>(userVO, HttpStatus.CREATED);
    }
}

在这个控制器中,我们定义了两个处理器方法,其中getUserById方法用于处理http://localhost:8080/user/{id} GET请求,使用@Pathvariable注解表示从URL路径中获取参数id并转换为Long类型;createUser方法用于处理http://localhost:8080/user POST请求,使用@RequestBody注解将客户端提交的JSON/XML数据转换为Java对象。

创建VO

在src/main/java/com/example/vo目录下创建UserVO.java文件,代码如下所示:

package com.example.vo;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class UserVO {
    private Long id;
    private String username;
    private String password;

    // getter和setter省略
}

在这个VO对象中,我们使用了@XmlRootElement和@XmlAccessorType注解来将Java对象转换为XML格式的数据。

配置消息转换器

在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"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns: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">

    <context:component-scan base-package="com.example.controller"/>

    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
            <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/xml;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/views/"
          p:suffix=".jsp"/>

</beans>

在配置文件中,我们使用了标签配置了两个消息转换器,一个用于处理JSON数据,一个用于处理XML数据。

测试

启动应用程序后,使用Postman工具向http://localhost:8080/user发送POST请求并提交以下JSON数据:

{
    "username": "test",
    "password": "123456"
}

可以看到在响应头中返回了HTTP状态码201 Created,并且在响应数据中包含了服务器返回的XML格式的数据。

此外,我们还可以向http://localhost:8080/user/{id}发送GET请求,请求返回JSON格式的数据,URL中的{id}设置为用户ID。响应内容为JSON格式的数据,包含了用户的ID、用户名和密码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC MVC架构与Servlet使用详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Java异常处理try catch的基本使用

    Java异常处理try catch的基本使用 在Java编程中,程序执行过程中可能出现各种错误,例如文件找不到,数组越界等,这些错误被称为异常。异常处理是Java编程中最基本的编程技巧之一。Java异常处理try catch提供了一种结构化的异常处理方法,可以使程序更加健壮,便于维护。 什么是Java异常处理try catch Java异常处理try cat…

    Java 2023年5月27日
    00
  • java实现的AES加密算法完整实例

    下面是“Java实现的AES加密算法完整实例”的完整攻略: 一、概述 AES(Advanced Encryption Standard)是一种常用的对称加密算法,之前常用的DES算法已经不再安全。在Java中,可以通过javax.crypto包中的AES算法实现加密和解密。 二、实现步骤 生成AES密钥 KeyGenerator kgen = KeyGene…

    Java 2023年5月19日
    00
  • Java中创建对象的5种方式总结

    Java中创建对象的5种方式总结 Java中创建对象有5种方式,分别是:使用new关键字、使用Class类的newInstance()方法、使用Constructor类的newInstance()方法、使用clone()方法、使用反序列化。 使用new关键字 使用new关键字可以直接创建一个对象,其语法格式如下: // 创建类的对象 ClassName ob…

    Java 2023年5月26日
    00
  • Java压缩文件工具类ZipUtil使用方法代码示例

    下面我来详细介绍一下“Java压缩文件工具类ZipUtil使用方法代码示例”的完整攻略。 一、ZipUtil工具类介绍 ZipUtil是一个Java压缩文件工具类,它可以将文件或文件夹压缩为zip格式的压缩包,并可以对压缩包进行解压操作。ZipUtil支持中文文件名,可以压缩包含中文文件名的文件或文件夹。 使用ZipUtil前需要导入依赖: <depe…

    Java 2023年5月20日
    00
  • 深层剖析java应用开发中MyBayis缓存

    针对“深层剖析java应用开发中MyBayis缓存”的完整攻略,我们可以从以下几个方面进行讲解: MyBatis缓存的概念:MyBatis缓存分为一级缓存和二级缓存。一级缓存是在SqlSession级别的缓存,是默认开启的,仅在同一SqlSession期间内有效。二级缓存是在SqlSessionFactory级别的缓存,生命周期只存在于一个会话期间中,也可以…

    Java 2023年5月20日
    00
  • 一篇文章带你了解Java SpringBoot Nacos

    一篇文章带你详解Java SpringBoot Nacos 什么是SpringBoot? SpringBoot是一个基于Spring框架的快速开发框架,它简化了Spring的配置、发布和部署过程,提高了开发效率。同时SpringBoot也集成了大量常用的库和插件,方便开发人员开箱即用。如果您是Java开发者,使用SpringBoot无疑是提高开发效率的好选择…

    Java 2023年5月20日
    00
  • Springboot基于maven打包分离lib及resource

    下面是Spring Boot基于Maven打包分离lib及resource的完整攻略: 1. Maven打包 Maven项目中使用Maven插件进行打包,将项目代码打包成可执行JAR文件。具体步骤如下: 在Maven项目的pom.xml文件中,配置插件spring-boot-maven-plugin,如下所示: xml <build> <p…

    Java 2023年5月20日
    00
  • mybatis查询实现返回List类型数据操作

    Sure! 什么是MyBatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java 的 POJO(Plain Old Java Objects)为数据库中的记录…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部