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编程之文件读写实例详解

    《Java编程之文件读写实例详解》的攻略如下: 第一步:导入IO库 首先要在Java代码中导入IO库,这个库包括文件读写所需的各种类。 import java.io.*; 第二步:读取文件 使用BufferedReader类读取文本文件,具体方法如下: try{ BufferedReader reader = new BufferedReader(new F…

    Java 2023年5月20日
    00
  • MyBatis动态SQL标签的用法详解

    MyBatis动态SQL标签的用法详解 MyBatis支持使用动态SQL标签,通过在XML中使用不同的标签和表达式可以很灵活地生成不同的SQL语句。在本文中,将详细讲解MyBatis动态SQL标签的使用方法。 if标签 if标签用于判断某个条件是否成立,如果成立则生成指定的SQL语句。示例: <select id="getUserList&q…

    Java 2023年5月20日
    00
  • 详解使用@RequestBody取POST方式的json字符串

    下面我将详细讲解使用@RequestBody取POST方式的json字符串的完整攻略。 什么是@RequestBody @RequestBody 是Spring框架提供的注解,通常用于接收前端传来的JSON格式的数据。在处理来自前端的POST请求时,Spring会自动解析标有@RequestBody 注解的参数,并将请求体中的JSON字符串转换为对应的Jav…

    Java 2023年5月26日
    00
  • java LeetCode普通字符串模拟题解示例

    Java LeetCode普通字符串模拟题解示例攻略 1. 题目简述 本题是一道字符串模拟题目,要求实现一个String模拟类,具有以下功能: 初始化操作:构造函数接受一个字符串作为参数,将其存储在对象中。 获取字符串操作:实现一个charAt方法,接受一个整数索引index,返回字符串指定位置的字符;实现一个substring方法,接受两个整数索引star…

    Java 2023年5月19日
    00
  • Java中mybatis关于example类的使用详解

    Java中mybatis关于Example类的使用详解 Mybatis的Example类是一个用于构建查询条件的实用工具。它可以帮助我们快速地生成复杂的查询语句,避免了手写SQL的繁琐,提高了开发效率。 常用方法 清空查询条件 clear() 在使用Example构造查询条件的时候,我们常会需要重用这个对象,这时候就需要清空之前的查询条件。可以通过调用Exa…

    Java 2023年5月20日
    00
  • Java中的interrupted()和isInterrupted()

    在Java中,interrupted()和isInterrupted()都是用于线程中断处理的方法,但是它们的使用方式和含义是不同的。 interrupted()方法 interrupted()是一个静态方法,用于检测当前线程是否被中断,并清除线程的中断状态。方法的使用方式如下: boolean isInterrupted = Thread.interrup…

    Java 2023年5月27日
    00
  • Mybatis中的resultType和resultMap查询操作实例详解

    “Mybatis中的resultType和resultMap查询操作实例详解”是关于Mybatis中两种结果映射方式的详细介绍。在Mybatis中,我们可以通过resultType和resultMap两种方式来实现查询操作。这两种方式的本质区别是:resultType是直接将查询结果映射为实体类对象,而resultMap是通过自定义映射规则将查询结果映射为实…

    Java 2023年5月19日
    00
  • java启动jar包将日志打印到文本的简单操作

    下面我来为您详细讲解如何通过 Java 启动 Jar 包并将日志打印到文本的简单操作攻略。 简介 在 Java 中,我们可以通过 log4j、logback 等成熟的日志框架来记录日志。而在启动 Jar 包时,如果想将程序运行过程中产生的日志打印到文本,可以在启动命令中加入 log4j 配置文件,并指定日志文件的输出路径。 操作步骤 1. 编写 log4j …

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