Spring MVC 简介及 Hello World 项目创建

2015-11-06 00:00:17   最后更新: 2016-11-16 17:49:20   访问数量:1283




最初诞生的 web 开发模式是 CGI,即通用网关接口,任何语言只要具有标准输入与标准输出都可以进行 CGI 的开发

由于 CGI 针对每次请求都会产生一个进程,十分消耗资源,且不利于项目的管理

Servlet 是随后诞生的一种 J2EE web 组件技术,用于接受 web 请求并动态产生响应,每次只产生一个线程用来处理请求,具有轻量级的优点,但是表现逻辑、控制逻辑和业务逻辑调用容易产生混乱

Servlet 最大的问题是他直接在 java 代码中输出 html,这样前端的开发与网站后台的开发偶合在一起,很难去进行页面风格等的设计与修改,于是 JSP 应运而生

JSP 是一种在服务器端执行的 web 组件,是一种运行在标准 HTML 页面中嵌入 java 的模板页面技术,在开发完成后,JSP 会被编译为 Servlet,但是在开发过程中,让页面更加简单、易于维护

虽然在开发过程中,页面与后台进行了简单的分隔,但控制逻辑、表现代码、业务逻辑对象调用仍然混杂在一起,为了解决这个问题,各种 MVC 框架就应运而生

spring 就是众多 java web MVC 框架中的一员

 

Spring Web MVC框架也是一个基于请求驱动的Web框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器(动作/处理器)进行处理

他是 spring 框架的后续产品呢,提供了构建 web 应用的全功能 MVC 模块

他拥有下列重要接口:

  1. DispatcherServlet -- 前端控制器,用于接收请求
  2. HandlerMapping接口 -- 用于处理请求的映射
  3. DefaultAnnotationHandlerMapping -- HandlerMapping接口的实现,用于把一个URL映射到具体的Controller类上
  4. HandlerAdapter接口 -- 用于处理请求的映射
  5. AnnotationMethodHandlerAdapter -- HandlerAdapter接口的试下,用于把一个URL映射到对应Controller类的某个方法上
  6. ViewResolver接口 -- 用于解析View
  7. InternalResourceViewResolver -- ViewResolver接口的实现,用于把ModelAndView的逻辑视图名解析为具体的View

 

处理流程:

 

  1. 当请求离开浏览器到达服务端,会带有用户所请求内容的信息,至少会带有 URL
  2. Spring 的 DispatcherServlet 会首先收到请求
  3. DispatcherServlet 的任务是将请求发送给特定的 Spring MVC 控制器(Controller),通常会有多个 Controller,因此需要首先访问 HandlerMapping 来确定需要将请求发给哪个 Controller
  4. 一旦选择了合适的 Controller,DispatcherServlet 就会把请求发送给选中的 Controller,并等待 Controller 返回
  5. 事实上,设计良好的 Controller 通常只处理很少的工作,而是将业务逻辑委托给一个或多个服务对象来处理,Controller 在完成逻辑处理后通常会产生一些信息,这些信息被称为 model
  6. 通常需要以视图(view)的形式发送给用户,因此需要调用 ViewResolver 将 model 转换为 view 返回

 

网上看到很多人配置基于 Eclipse 的 spring 项目,虽然其实原理上是一样的,不过这里提供一下 IntelliJ Idea 环境下的 Spring 配置及 Tomcat 运行环境的搭建

 

创建项目

选择菜单栏中的 File -> New... -> Project...

创建一个 maven webapp 项目

 

 

如果出现下图这样的意外情况,Loading archetype list... 一直等待:

 

那么就是 Maven 的 JRE 占用内存过大而崩溃,在 Preference... -> Build, Execution, Deployment -> Build Tools -> Maven -> Importing 的 VM 设置中将 importer 的内存设大(从 512m 增加到 1024m):

 

这样问题就可以解决了

 

言归正传,在选择 maven webapp 项目点击 Next 后,输入 GroupId 和 ArtifactId 然后选择创建路径即可完成项目的创建

 

创建完成后,IDE 首先会执行一些工作进行必要的创建和引入 jar 包等操作,经过一段等待,你将看到下图的目录结构:

 

 

webapp 就是整个项目的入口目录,里面默认放置了 index.jsp,里面写入了 Hello World,也就是说,此时当你编译运行这个项目,通过访问网站根目录就可以展示出 Hello World

当然,这样的静态文件展示并不是我们想要的,这里我们删掉 index.jsp

 

这个目录结构很清晰

pom.xml 是 maven 依赖关系的描述文件,描述了你的项目所依赖的其他项目或组建及最低的版本号,当我们需要升级依赖,或引入新的依赖,只需要修改这个文件,然后右击执行 reimport 即可

.idea 是 IDE 所需要的文件目录,我们不需要关心

src 就是最重要的代码目录,上文已经说过,目录中的 webapp 就是网站根目录的入口路径,web.xml 定义了请求如何被处理,一般用来定义 Servlet 及 URL 模式以及每个 Servlet 的优先级,main 目录下一般存放 Controller、model 等等应用代码

 

pom.xml

首先,必须在 pom.xml 中添加依赖的包,才能够让 maven 为项目引入必要的依赖

<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- $Id: pom.xml 642118 2008-03-28 08:04:16Z reinhard $ --> <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 http://www.w3.org/2001/XMLSchema-instance "> <modelVersion>4.0.0</modelVersion> <packaging>war</packaging> <name>springtest</name> <groupId>com.test</groupId> <artifactId>springtest</artifactId> <version>1.0-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.7</version> <configuration> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>8888</port> <maxIdleTime>30000</maxIdleTime> </connector> </connectors> <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version} </webAppSourceDirectory> <contextPath>/</contextPath> </configuration> </plugin> </plugins> </build> <properties> <java-version>1.7</java-version> <org.springframework-version>3.1.3.RELEASE</org.springframework-version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework-version}</version> </dependency> <!-- servlet jsp and jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> </project>

 

这里我们引入了 jsp、jstl、spring-context、spring-webmvc 等一些必要的包

 

web.xml

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!-- Handles all requests into the application --> <servlet> <servlet-name>appServlet</servlet-name> <!-- 定义 DispatcherServlet --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/servlet-context.xml</param-value> <!-- Servlet 的配置文件 --> </init-param> <load-on-startup>1</load-on-startup> <!-- 启动优先级,为 1 则与 Sevletp 容器一起启动 --> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> <!-- 拦截 URL 模式(此处拦截所有 URL) --> </servlet-mapping> </web-app>

 

这里定义了用来分发请求到对应 Controller 的 DispatcherServlet,并定义了他拦截 URL 的模式及启动优先级

 

servlet-context.xml

web.xml 中定义了 Servlet 的配置文件 servlet-context.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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <!-- Scans the classpath of this application for @Components to deploy as beans --> <context:component-scan base-package="com.hello" /> <!-- Configures the @Controller programming model --> <mvc:annotation-driven /> <!-- 支持注解 --> <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <!-- 定义 jsp 文件所在目录 --> <property name="suffix" value=".jsp" /> </bean> </beans>

 

配置文件中具体描述了 Servlet 的命名空间,基础包及 jsp 所在目录

 

HomeController

package com.hello; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * Created by techlog on 15/11/5. */ @Controller public class HomeController { @RequestMapping("/home") public String home() { //return "WEB-INF/views/home.jsp"; return "home"; } }

 

这里我们仅仅简单地定义了一个 URL 映射关系,并返回了字符串 "home",通过 servlet-context.xml 中的配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <!-- 定义 jsp 文件所在目录 --> <property name="suffix" value=".jsp" /> </bean>

 

Spring 会通过字符串 home 自动找到 /WEB-INF/views/home.jsp

 

home.jsp

<html> <body> <h1>Hello World!</h1> </body> </html>

 

 

光说不练假把式,既然一切都创建好了,下面就得跑一跑了

既然要 run 一个 web 服务,就需要服务器了,这里我们讲解一下如何结合 Idea 与 tomcat 把一个 spring MVC 项目 run 起来

 

首先,在 Apache Tomcat 官方网站上,下载源码包编译安装完成后,点击 Idea 右上角配置

 

 

在 Run/Debug Configurations 窗口中的左侧栏 Default 项中,找到 Tomcat Server -> Local

点击 configure,填入 Tomcat 的安装路径,默认监听的 HTTP 端口如图所示是 8080,你也可以通过这里的设定改成其他端口

 

 

然后点击左上角的加号,选择刚刚配置好的 Tomcat Server -> Local

 

 

在右侧的窗口中点击 Deployment 然后点击加号添加 Artifact

 

 

 

然后,点击 run 按钮,一阵 log 刷过,访问 http://localhost:8080/home,久违的 Hello World 出现了

 

 

 

通过 mvnrepository 可以很方便的查询 maven 依赖

 






技术帖      web      mvc      技术分享      framework      spring      helloworld      springmvc     


京ICP备15018585号