Spring MVC示例
欢迎使用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>
contextConfigLocation
init-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端口和上下文根目录。