Spring MVC示例

时间:2020-02-23 14:35:54  来源:igfitidea点击:

欢迎使用Spring MVC示例。
有时在Spring MVC教程中,我解释了如何使用Spring Tool Suite创建Spring MVC应用程序。
但是今天,我将使用maven和Eclipse创建一个基本的hello world spring MVC应用程序。

Spring MVC示例

Spring MVC基于模型-视图-控制器体系结构。
下图从高层次显示了Spring MVC架构。

DispatcherServlet是前端控制器类,用于接收所有请求并开始处理它们。
我们必须在web.xml文件中对其进行配置。
它的工作是将请求传递给适当的控制器类,并在视图页面呈现响应页面时将响应发送回去。

" HomeController.java"将是我们的Springmvc示例应用程序中的单个控制器类。

home.jsp,user.jsp是我们的Springmvc hello世界示例应用程序中的视图页面。

" user.java"将是我们在Springmvc示例Web应用程序中拥有的唯一模型类。

Spring MVC示例Hello World Eclipse项目

下图显示了我们在Eclipse中的Spring MVC示例项目。

让我们开始并从头开始创建我们的项目。

Spring MVC示例Eclipse项目设置

由于它是一个Web应用程序,并且我们希望使用maven进行依赖项管理,因此我们首先必须创建一个动态Web应用程序,然后将其转换为maven项目。
下图显示了如何执行此操作并准备好我们的项目骨架结构。

右键单击项目浏览器窗口,然后单击"新建->动态Web项目",如下图所示。

在下一个弹出页面中将名称提供为" spring-mvc-example",其余的事情不需要更改。

在下一页上,将源文件夹提供为" src/main/java"。
您可能需要从列表中删除" src"文件夹,然后再添加它。

接下来是Web模块页面,提供应用程序的上下文根作为" spring-mvc-example",并确保选中" Generate web.xml部署描述符"选项。

单击Finish,您的Eclipse项目浏览器中将有一个新的Dynamic Web Project。

将动态Web项目转换为Maven项目

我们想使用Maven轻松管理我们的Spring MVC依赖关系。
因此,让我们将我们的网络项目转换为Maven。

右键单击项目,然后选择"配置->转换为Maven项目"。

接下来提供pom.xml配置,如下所示。

我们的Maven Web应用程序项目框架代码已准备就绪。
现在我们可以开始对其进行更改,并创建我们的spring mvc hello world示例应用程序。

Spring MVC对pom.xml的依赖

我们需要在pom.xml中添加spring-web和spring-webmvc依赖关系,还需要添加servlet-api,jsp-api和jstl依赖关系。
我们最终的pom.xml文件将如下所示。

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.theitroad.spring.mvc</groupId>
	<artifactId>spring-mvc-example</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>Spring MVC Example</name>
	<description>Spring MVC Hello World Example</description>

	<!-- Add Spring Web and MVC dependencies -->
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.6.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>3.0.0</version>
				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
				</configuration>
			</plugin>
		</plugins>
		<finalName>${project.artifactId}</finalName> <!-- added to remove Version from WAR file -->
	</build>
</project>

注意构建中的" finalName"配置,因此我们的WAR文件名没有版本详细信息。

当该项目由Eclipse构建时,您会注意到在maven依赖项部分中显示了所有jar。

Spring MVC DispatcherServlet作为前端控制器

我们必须将Spring MVC框架添加到我们的Web应用程序中,为此,我们需要在web.xml中配置DispatcherServlet,如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>spring-mvc-example</display-name>

	<!-- Add Spring MVC DispatcherServlet as front controller -->
	<servlet>
      <servlet-name>spring</servlet-name>
      <servlet-class>
              org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <init-param>
     		<param-name>contextConfigLocation</param-name>
     		<param-value>/WEB-INF/spring-servlet.xml</param-value>
  		</init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
 
  <servlet-mapping>
      <servlet-name>spring</servlet-name>
      <url-pattern>/</url-pattern> 
  </servlet-mapping>
  
 </web-app>

contextConfigLocationinit-param用于提供Spring bean配置文件的位置。

Spring MVC示例Bean配置文件

下一步是创建spring bean配置文件" spring-servlet.xml",如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="https://www.springframework.org/schema/mvc"
	xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:beans="https://www.springframework.org/schema/beans"
	xmlns:context="https://www.springframework.org/schema/context"
	xsi:schemaLocation="https://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing 
		infrastructure -->

	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven 
	<context:component-scan base-package="com.theitroad.spring" 

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
		in the /WEB-INF/views directory -->
	<beans:bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" 
		<beans:property name="suffix" value=".jsp" 
	</beans:bean>

</beans:beans>

有三个重要的配置。

  • "注释驱动"告诉DispatcherServlet使用@Controller注释查找Controller类。

  • context:component-scan告诉DispatcherServlet其中寻找控制器类。

  • " InternalResourceViewResolver" Bean配置,用于指定所使用的视图页面和后缀的位置。
    控制器类方法返回视图页面的名称,然后添加后缀以找出视图页面以用于呈现响应。

Spring MVC控制器类

我们有一个控制器类来响应两个URI –" /"代表主页,"/user"代表用户页面。

package com.theitroad.spring.controller;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

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

import com.theitroad.spring.model.User;

@Controller
public class HomeController {

	/**
	 * Simply selects the home view to render by returning its name.
	 */
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		System.out.println("Home Page Requested, locale = " + locale);
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

		String formattedDate = dateFormat.format(date);

		model.addAttribute("serverTime", formattedDate);

		return "home";
	}

	@RequestMapping(value = "/user", method = RequestMethod.POST)
	public String user(@Validated User user, Model model) {
		System.out.println("User Page Requested");
		model.addAttribute("userName", user.getUserName());
		return "user";
	}
}

请注意,为简单起见,我没有使用任何日志框架,例如log4j。

Spring MVC模型类

我们有一个带有单个变量的简单模型类,它是使用getter-setter方法的。
这是一个简单的POJO类。

package com.theitroad.spring.model;

public class User {
	private String userName;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}
}

Spring MVC查看页面

我们有两个如下定义的视图页面。

home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<html>
<head>
<title>Home</title>
</head>
<body>
	<h1>Hello world!</h1>

	<P>The time on the server is ${serverTime}.</p>

	<form action="user" method="post">
		<input type="text" name="userName"><br> <input
			type="submit" value="Login">
	</form>
</body>
</html>

user.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User Home Page</title>
</head>
<body>
<h3>Hi ${userName}</h3>
</body>
</html>

请注意,Spring MVC负责将表单变量映射到模型类变量,这就是为什么我们在两个地方都使用相同的变量名称的原因。

就是这样,我们的spring mvc示例项目已经准备好进行部署和测试。

Spring MVC Eclipse项目部署

我们可以使用Eclipse导出为WAR文件选项将其直接部署到任何正在运行的tomcat服务器webapps目录中。
但是,您也可以使用命令行来构建项目,然后将其复制到您喜欢的servlet容器部署目录中。

Spring MVC示例测试

部署spring mvc项目后,我们可以在https://localhost:8080/spring-mvc-example /中访问主页。
相应地更改tomcat端口和上下文根目录。