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日

相关文章

  • asp.net中几种常用的身份验证方法总结

    当用户使用你的网站时,通常需要进行身份验证,以保护用户数据和提供更好的用户体验。ASP.NET 提供了几种身份验证方法,包括基于表单的身份验证、基于 Windows 的身份验证和第三方授权身份验证。本篇攻略将对这些身份验证方法进行总结和详细讲解。 1. 基于表单的身份验证 基于表单的身份验证是 ASP.NET 中最常用的身份验证方法之一。它可以通过简单的 H…

    Java 2023年6月16日
    00
  • MyBatis增删改查快速上手

    MyBatis增删改查快速上手 MyBatis是一款基于Java语言的ORM框架,通过XML或注解的方式操作数据库,可以实现较为灵活的数据库访问控制。本文将介绍MyBatis在增删改查方面的使用方法。 安装MyBatis MyBatis可以通过Maven依赖来引入,也可以直接下载jar包。此处以Maven方式为例,需在pom.xml文件添加以下依赖: &lt…

    Java 2023年5月19日
    00
  • Java 使用JdbcTemplate 中的queryForList发生错误解决办法

    让我来详细讲解“Java 使用JdbcTemplate 中的queryForList发生错误解决办法”的完整攻略。 问题描述 在使用JdbcTemplate的queryForList方法查询数据时,有时候会出现错误,例如: org.springframework.dao.InvalidDataAccessApiUsageException: You need…

    Java 2023年6月16日
    00
  • 什么是方法区?

    以下是关于 Java 方法区的详细讲解: 什么是方法区? Java 方法区是一种用于存储已加载类信息、常量、静态变量、即时编译器编译后的代码数据的内存区域。方法区是线程共享的,的大小可以通过 -XX:MaxMetaspaceSize 参数进行设置。 Java 方法区使用攻略 使用 Java 方法区,需要注意以下几点: 在程序开发中,需要合理内存,避免出现内存…

    Java 2023年5月12日
    00
  • Java中synchronized正确使用方法解析

    Java中synchronized正确使用方法解析 什么是synchronized synchronized是一个对象级别的锁,也称之为内部锁或者特定对象的锁。Java中提供了三种使用synchronized关键字同步代码块的方法。 修饰实例方法,锁的是当前实例对象(this)。 修饰静态方法,锁的是类对象(Class对象)。 修饰代码块,锁的是代码块中的对…

    Java 2023年5月26日
    00
  • java基于jcifs.smb实现远程发送文件到服务器

    下面是关于“Java基于jcifs.smb实现远程发送文件到服务器”的完整攻略。 概述 jcifs.smb是一个java实现的SMB网络协议库,可以在java应用程序中实现与SMB服务器的连接。通过这个库,我们可以在java中实现与文件共享服务器之间的文件传输。在接下来的攻略中,我将详细介绍如何使用jcifs.smb库实现远程发送文件到服务器。 步骤一:引入…

    Java 2023年5月20日
    00
  • MyBatis框架简介及入门案例详解

    MyBatis框架简介及入门案例详解 MyBatis框架简介 MyBatis是一个持久层框架,它支持定制化SQL、存储过程和高级映射。MyBatis消除了几乎所有的JDBC代码和参数的手工输入以及对结果集的检索封装。MyBatis可以采用注解或xml方式配置映射关系,支持动态SQL,极其灵活方便。 MyBatis入门案例 准备工作 1.创建一个Java We…

    Java 2023年5月20日
    00
  • MyBatis批量插入的五种方式小结(MyBatis以集合方式批量新增)

    MyBatis批量插入的五种方式小结 在使用MyBatis进行批量插入时,有多种方式可以选择。本文将介绍MyBatis批量插入的五种方式,并提供示例代码,以便读者更好地理解这些方法。 方式一:使用for循环单条插入 在使用for循环单条插入时,需要在for循环中执行insert语句。这种方式的优点是插入的数据可以轻松地进行转换,缺点是插入效率较低。 priv…

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