注意
本教程基于Spring 2.5.6,已经过时了。 尝试考虑新教程:
在本教程中,我们将向您展示Spring MVC Hello World Web应用程序。
使用的技术:
- Spring2.5.6
- JDK 1.6
- Eclipse 3.6
- Maven 3
1. MVC基础
在Spring MVC Web应用程序中,它包含3个标准MVC(模型,视图,控制器)组件:
- 模型–由服务层(业务逻辑)或持久层(数据库操作)处理的域对象。
- 视图–显示数据,通常是使用Java标准标记库(JSTL)编写的JSP页面。
- 控制器– URL映射并与服务层进行交互以进行业务处理并返回模型。
下图演示了Spring MVC Web应用程序如何处理Web请求。
图1.1 –图像是从Spring MVC参考复制而来的,并稍加修改。
图1.2 – 图片是从本书复制而来的: Spring食谱
注意
在Spring MVC中,核心调度程序组件是DispatcherServlet
,它充当前端控制器(设计模式)。 每个Web请求都必须通过此DispatcherServlet
,并且DispatcherServlet
会将Web请求DispatcherServlet
到合适的处理程序。
2.目录结构
标准的Maven项目目录结构。
3. Maven
声明spring-webmvc
依赖项,Maven将帮助您自动管理传递性依赖项(下载spring-webmvc
所需的其他依赖spring-webmvc
,例如spring-context
或spring-beans
)。
如果您将JSP页面与JSTL技术一起使用,则还应包括jstl
依赖项。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mkyong.common</groupId>
<artifactId>spring2-mvc-xml-hello-world</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Spring 2 MVC</name>
<properties>
<jdk.version>1.6</jdk.version>
<spring.version>2.5.6</spring.version>
<jstl.version>1.2</jstl.version>
<servletapi.version>2.5</servletapi.version>
</properties>
<dependencies>
<!-- Spring MVC framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!-- for compile only, your container should have this -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servletapi.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
<!-- embedded jetty, good for testing -->
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.11.v20150529</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webApp>
<contextPath>/spring2</contextPath>
</webApp>
</configuration>
</plugin>
<!-- configure Eclipse workspace -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
<wtpversion>2.0</wtpversion>
<wtpContextName>spring2</wtpContextName>
</configuration>
</plugin>
</plugins>
</build>
</project>
4.弹簧控制器
Spring附带了许多Controller,通常,您只需要扩展AbstractController
并重写handleRequestInternal()
方法即可。
package com.mkyong.common.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class HelloWorldController extends AbstractController{
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView model = new ModelAndView("HelloWorldPage");
model.addObject("msg", "hello world");
return model;
}
}
4.1 ModelAndView(“ HelloWorldPage”) –为了确定哪个视图应返回给用户,在此示例中,将返回HelloWorldPage.jsp
。
4.2 model.addObject(“ msg”,“ hello world”) –在名为“ msg”的模型中添加“ hello world”字符串,稍后可以使用EL ${msg}
显示“ hello world”字符串。
5.视图(JSP页面)
在这种情况下,“视图”是一个JSP页面,您可以通过表达式语言(EL)$ {msg}显示存储在模型“ msg”中的值“ hello world”。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
<h1>Spring MVC Hello World Example</h1>
<h2>${msg}</h2>
</body>
</html>
注意
如果按原样显示$ {msg},而不是“ msg”模型中的值,则可能是由于旧的JSP 1.2描述符(默认情况下禁用表达式语言)引起的,请参见此处的解决方案 。
6. Spring XML配置
6.1声明了Spring Controller和viewResolver。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean name="/welcome.htm"
class="com.mkyong.common.controller.HelloWorldController" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
1. 控制器 –声明一个bean名称/welcome.htm
并将其映射到HelloWorldController
。 这意味着,如果请求带有/welcome.htm
模式的URL,则HelloWorldController
控制器将处理该请求。
2. viewResolver –定义Spring如何查找视图模板。 在这种情况下,控制器HelloWorldController
将返回一个名为HelloWorldPage
的视图,该viewResolver将使用以下机制查找文件: 前缀+视图名称+后缀 ,即/WEB-INF/pages/HelloWorldPage.jsp
。
注意
实际上,默认情况下,不需要在web.xml
定义BeanNameUrlHandlerMapping
,如果找不到处理程序映射,DispatcherServlet将自动创建BeanNameUrlHandlerMapping
。 有关详细信息,请参见本文BeanNameUrlHandlerMapping示例 。
6.2在web.xml
,声明了DispatcherServlet
servlet充当前端控制器,以处理所有以htm
扩展名结尾的整个Web请求。
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring Web MVC Application</display-name>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
</web-app>
注意
mvc-dispatcher
用于定义要加载Spring XML配置的文件。 默认情况下,它将通过将servlet名称mvc-dispatcher
与-servlet.xml
来查找Spring XML配置文件。在此示例中,Spring将寻找该文件–
mvc-dispatcher-servlet.xml
。
7.演示
7.1使用Maven运行该项目:
$ mvn jetty:run
7.2要在Eclipse IDE中运行该项目,请使用以下Maven命令创建Eclipse项目设置:
$ mvn eclipse:eclipse
手动导入项目并从服务器插件开始。
网址: http:// localhost:8080 / spring2 / welcome.htm
怎么运行的?
- 请求http:// localhost:8080 / spring2 / welcome.htm。
- URL以“ .htm”扩展名结尾,因此它将重定向到“ DispatcherServlet”,并将请求发送到默认的BeanNameUrlHandlerMapping。
- BeanNameUrlHandlerMapping将HelloWorldController返回到DispatcherServlet。
- DispatcherServlet将请求转发到HelloWorldController。
- HelloWorldController对其进行处理,并返回视图名称为“ HelloWorldPage”的ModelAndView对象。
- DispatcherServlet收到了ModelAndView并调用viewResolver对其进行处理。
- viewResolver将
/WEB-INF/pages/HelloWorldPage.jsp
返回到DispatcherServlet。 - DispatcherServlet将“ HelloWorldPage.jsp”返回给用户。
下载源代码
下载它– spring2-mvc-xml-hello-world.zip (14 KB)
参考文献
翻译自: https://mkyong.com/spring-mvc/spring-mvc-hello-world-example/