Spring MVC“Hello World”入门示例详细讲解

来源:互联网 发布:淘宝采集器哪个好用 编辑:程序博客网 时间:2024/05/19 14:56

In this example, we will build a hello world web application using the Spring MVC framework. Spring MVC is one of the most important modules of the Spring framework. It builds on the powerful Spring IoC container and makes extensive use of the container features to simplify its configuration.

在这个示例中,我们会使用spring MVC框架创建一个简单的”hello word “web应用。spring MVC是Spring框架中最重要的模块之一,该框架以强大的springIOC容器为基础,并充分地利用了容器的特性来简化配置。

什么是MVC框架?

模型-视图-控制器(MVC)是一个众所周知的界面应用程序的设计模式。它主要通过分离模型、视图及控制器在应用程序中的角色实现将业务逻辑从界面中解耦。通常,模型负责封装应用程序数据在视图层展示。视图仅仅只是展示这些数据,而不包含任何业务逻辑。控制器负责接收来自用户的请求,并调用后台服务(manager或者dao)来处理业务逻辑。处理后,后台业务层可能会返回一些数据在视图层展示。控制器收集这些数据及准备模型在视图层展示。MVC模式的核心思想是将业务逻辑从界面中分离出来,允许它们单独改变而不会相互影响。

Model-View-Controller

在一个Spring MVC应用程序中,模型通常由POJO对象组成,在服务层(业务层)被处理,在持续层被持久化。视图通常是用JSP标准标签库(JSTL)编写的JSP模板。控制器部分是由dispatcher servlet负责,在本教程中我们将会了解更多它的相关细节。

一些开发人员认为业务层和DAO层类是MVC模型组件的一部分。我对此持有不同的意见。我不认为业务层及DAO层类为MVC框架的一部分。通常一个web应用是3层架构,即数据-业务-表示。MVC实际上是表示层的一部分。
三层架构

Dispatcher Servlet(Spring控制器)

在最简单的SpringMVC应用程序中,控制器是你在Java web部署描述文件(即web.xml文件)中需要配置的唯一的一个servlet。Spring MVC控制器 ——经常被称为一个实现了前端控制器设计模式的Dispatcher Servlet,并且每个web请求必须经过它以便让它能够管理整个请求的生命周期。

当一个web请求发送到Spring MVC应用程序,dispatcher servlet首先接收请求。然后它组织那些在Spring web应用程序上下文配置的(例如实际请求处理控制器和视图解析器)或者使用注解配置的组件,所有的这些都需要处理该请求。

当一个web请求发送到SpringMVC应用程序时,Dispatcher Servlet首先接收这个请求,然后再组织Spring web应用程序中上下文配置(例如实际请求处理控制器和视图解析器)或者使用注解配置的不同组件去处理该请求。
Spring-dispatcher-servlet

Spring dispatcher servlet

在Spring3.0中定义一个控制器类,这个类必须被@Controller注解标注。当一个带有@Controller注解的控制器接收到一个请求,它就会去寻找适当的处理方法去处理这个请求。这就需要控制器类通过一个或多个处理器映射(handler mappings)去把每一个请求映射到具体的处理器方法( handler method ) 。为了实现这个操作,控制器类的方法需要被@RequestrianMapping注解修饰,使它们成为处理器方法( handler method )。

在处理器方法(handler method)处理完这个请求后,它会把控制权转交给一个视图名和处理器方法的返回值相同的视图。为了提供一个灵活的实现方法,一个处理器方法的返回值并不是代表一个视图的实现而是一个逻辑视图,也就是说这个返回值没有任何文件扩展名。你可以在applicationContext 文件中将这些逻辑视图映射到正确的实现,这样你就可以轻松地更改你的视图层代码甚至不需要修改处理器类(被@RequestMapping 注解修饰的)代码

为一个逻辑名称匹配正确的文件是视图解析器的责任。一旦控制器类已将一个视图名称解析到一个视图实现,它会根据每个视图实现的设计来渲染对应对象。

基于Spring MVC的Hello World 示例

在这个应用程序中,我将创建一个最简单的员工管理程序示例,该程序只有一个功能,即列出系统中全部有效的员工账户。让我记下这个应用的目录结构。


Spring-mvc-hello-world-directory-structure
Spring mvc hello world directory structure

现在让我们开始编写 hello world 这个应用程序的所有有关文件

1、pom.xml
以下pom.xml文件中包含spring mvc依赖及为编写jsp文件提供支持的taglib相关依赖

<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.howtodoinjava.demo</groupId>    <artifactId>springmvcexample</artifactId>    <packaging>war</packaging>    <version>1.0-SNAPSHOT</version>    <name>springmvcexample Maven Webapp</name>    <url>http://maven.apache.org</url>    <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.12</version>            <scope>test</scope>        </dependency>        <!-- Spring MVC support -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>4.1.4.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-web</artifactId>            <version>4.1.4.RELEASE</version>        </dependency>        <!-- Tag libs support for view layer -->        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>jstl</artifactId>            <version>1.2</version>            <scope>runtime</scope>        </dependency>        <dependency>            <groupId>taglibs</groupId>            <artifactId>standard</artifactId>            <version>1.1.2</version>            <scope>runtime</scope>        </dependency>    </dependencies>    <build>        <finalName>springmvcexample</finalName>    </build></project>

2、web.xml

这最精简的web.xml文件声明了一个Servlet(即dispatcher servlet)来接收所有类型的请求。Dispatcher servlet在这里充当前端控制器的角色。

<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 Hello World Application</display-name>    <servlet>        <servlet-name>spring</servlet-name>            <servlet-class>                org.springframework.web.servlet.DispatcherServlet            </servlet-class>        <load-on-startup>1</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>spring</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping></web-app>

3、spring-servlet.xml (你也可以命名为 applicationContext.xml )

在处理请求、业务和DAO层我们使用了注解类,所以我为“com.howtodoinjava.demo“包中的所有类启用了注解处理

<beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:context="http://www.springframework.org/schema/context"    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd        http://www.springframework.org/schema/context/        http://www.springframework.org/schema/context/spring-context-3.0.xsd">    <context:component-scan base-package="com.howtodoinjava.demo" />    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="prefix" value="/WEB-INF/views/" />        <property name="suffix" value=".jsp" />    </bean></beans>

4、EmployeeController.java

@RequestMapping注解在类级别和方法级别确定了将被调用的方法的URL。

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.howtodoinjava.demo.service.EmployeeManager;@Controller@RequestMapping("/employee-module")public class EmployeeController {    @Autowired    EmployeeManager manager;    @RequestMapping(value = "/getAllEmployees", method = RequestMethod.GET)    public String getAllEmployees(Model model)    {        model.addAttribute("employees", manager.getAllEmployees());        return "employeesListDisplay";    }}

了解更多 : 如何使用@Component, @Repository, @Service 和@Controller 注解?

5、EmployeeVO.java

这个类作为MVC模式的模型。

package com.howtodoinjava.demo.model;import java.io.Serializable;public class EmployeeVO implements Serializable {    private static final long serialVersionUID = 1L;    private Integer id;    private String firstName;    private String lastName;    //Setters and Getters    @Override    public String toString() {        return "EmployeeVO [id=" + id + ", firstName=" + firstName                + ", lastName=" + lastName + "]";    }}

6、EmployeeDAO.java

这个类位于三层架构中的第三层。负责与底层的数据库存储进行交互。

import java.util.List;import com.howtodoinjava.demo.model.EmployeeVO;public interface EmployeeDAO {    public List<EmployeeVO> getAllEmployees();}

7、EmployeeDAOImpl.java

import java.util.ArrayList;import java.util.List;import org.springframework.stereotype.Repository;import com.howtodoinjava.demo.model.EmployeeVO;@Repositorypublic class EmployeeDAOImpl implements EmployeeDAO {    public List<EmployeeVO> getAllEmployees()     {        List<EmployeeVO> employees = new ArrayList<EmployeeVO>();        EmployeeVO vo1 = new EmployeeVO();        vo1.setId(1);        vo1.setFirstName("Lokesh");        vo1.setLastName("Gupta");        employees.add(vo1);        EmployeeVO vo2 = new EmployeeVO();        vo2.setId(2);        vo2.setFirstName("Raj");        vo2.setLastName("Kishore");        employees.add(vo2);        return employees;    }}

8、EmployeeManager.java

这个类处于三层架构中的第二层。负责与DAO层交互。

import java.util.List;import com.howtodoinjava.demo.model.EmployeeVO;public interface EmployeeManager {    public List<EmployeeVO> getAllEmployees();}

9、EmployeeManagerImpl.java

import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.howtodoinjava.demo.dao.EmployeeDAO;import com.howtodoinjava.demo.model.EmployeeVO;@Servicepublic class EmployeeManagerImpl implements EmployeeManager {    @Autowired    EmployeeDAO dao;    public List<EmployeeVO> getAllEmployees()     {        return dao.getAllEmployees();    }}

10、employeesListDisplay.jsp

这个jsp被用于显示系统中的所有员工。它循环遍历employee集合,并且在一个表中打印他们的详细信息。这符合MVC模式的视图层。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%><html><head>    <title>Spring MVC Hello World</title></head><body>    <h2>All Employees in System</h2>    <table border="1">        <tr>            <th>Employee Id</th>            <th>First Name</th>            <th>Last Name</th>        </tr>        <c:forEach items="${employees}" var="employee">            <tr>                <td>${employee.id}</td>                <td>${employee.firstName}</td>                <td>${employee.lastName}</td>            </tr>        </c:forEach>    </table></body></html>

现在在您的应用程序服务器(我用的是tomcat 7)部署应用程序。并点击“http://localhost:8080/springmvcexample/employee-module/getAllEmployees”。如果你已正确配置所有内容,你将会在屏幕下看到:


运行结果

源码下载


在网上看到了这篇比较不错的入门文章,比较全面,所以转了学习。在转载过来的时候,有一些地方是我自己重新翻译了一下,没有完全参照之前的译文。

此外,对于译文中有一点我也有点不同的看法:
模型-视图-控制器(MVC)是一个众所周知的界面应用程序的设计模式 其实MVC不能说成是一种设计模式,MVC只是一种架构模式!为什么这么说,可参考:为什么MVC不是一种设计模式

原文地址:Spring MVC Hello World Example
译文参考地址:Spring MVC 入门示例讲解

1 0