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框架的基本工作流程如下:
- 客户端发送请求到服务器;
- 请求被所有的Servlet容器拦截;
- DispatcherServlet拦截请求并将其分配给相应的控制器;
- 控制器处理请求并返回一个ModelAndView对象;
- 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>
在配置文件中,我们使用了
5. 配置web.xml
在web.xml中增加以下内容:
<servlet-mapping>
<servlet-name>springmvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
其中,
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>
在配置文件中,我们使用了
测试
启动应用程序后,使用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技术站