译:7.使用Spring MVC服务Web内容
本指南向您介绍了使用Spring创建“hello world”网站的过程。阅读原文:Serving Web Content with Spring MVC
1. 你将会构建什么?
您将构建一个具有静态主页的应用程序,并且还将在以下位置接受HTTP GET请求:
http://localhost:8080/greeting
并用显示HTML的网页进行响应。 HTML的主体包含一个问候语:
"Hello, World!"
您可以使用查询字符串中的可选名称参数来自定义问候语:
http://localhost:8080/greeting?name=User 名称参数值覆盖“World”的默认值,并反映在响应中:
"Hello, User!"
2. 你需要准备什么?
- 大约十五分钟 
- 一个喜欢的文本编辑器或者IDE 
- JDK 1.8 或者更高 
- 你也可以导入Code到你的IDE中 
3. 如何实现这个指南?
像大多数Spring入门指南一样,您可以从头开始并完成每个步骤,也可以绕过已熟悉的基本设置步骤。 无论哪种方式,你最终得到工作代码。
1. 打开STS,New ————> Import Spring Getting Started Content

2. 输入servi ,搜索找到Serving Web Content

Tips: Build Type 选择Maven, Code Sets 全部勾选,因为这样可以同时生成完成后的点和空的项目,方便我们学习。
3. 创建一个Web Controller
在Spring构建网站的方法中,HTTP请求由控制器处理。
您可以通过@Controller注释轻松识别这些请求。 在以下示例中,GreetingController通过返回View的名称(在本例中为“greeting”)来处理/ greeting的GET请求。 视图负责呈现HTML内容:
src/main/java/hello/GreetingController.java
package hello;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam; @Controller
public class GreetingController { @GetMapping("/greeting")
public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
model.addAttribute("name", name);
return "greeting";
} }
这个控制器简洁明了,但有很多事情要做。 让我们一步一步分解它。
@GetMapping注释可确保将/ GET的HTTP GET请求映射到greeting()方法。
@RequestParam将查询字符串参数名称的值绑定到greeting()方法的name参数中。 此查询字符串参数不是必需的; 如果请求中缺失,则使用“World”的缺省值。 name参数的值被添加到Model对象,最终使其可以被视图模板访问。
方法体的实现依赖于视图技术,在这种情况下是Thymeleaf,执行HTML的服务器端呈现。 Thymeleaf解析下面的greeting.html模板并评估th:text表达式来呈现在控制器中设置的$ {name}参数的值。
src/main/resources/templates/greeting.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Serving Web Content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'Hello, ' + ${name} + '!'" />
</body>
</html>
4.开发Web应用程序
开发Web应用程序的一个常见功能是对变更进行编码,重新启动应用程序,并刷新浏览器以查看更改。 整个过程可能会耗费很多时间。 为了加速事情的循环,Spring Boot附带了一个称为spring-boot-devtools的方便模块。
启用热交换
切换模板引擎以禁用缓存
使LiveReload能够自动刷新浏览器
其他基于开发而非生产的合理违约
5. 使应用程序变得可执行
虽然可以将此服务作为传统WAR文件打包以部署到外部应用程序服务器,但下面演示的更简单的方法会创建独立应用程序。 您将所有内容打包到一个单独的,可执行的JAR文件中,由一个良好的旧Java main()方法驱动。 一路上,您使用Spring的支持将Tomcat servlet容器作为HTTP运行时嵌入,而不是部署到外部实例。
src/main/java/hello/Application.java
package hello; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
} }
@SpringBootApplication是一个方便的注释,它增加了以下所有内容:
- @Configuration将类标记为应用程序上下文的bean定义的来源。
- @EnableAutoConfiguration通知Spring Boot根据类路径设置,其他bean和各种属性设置开始添加bean。
- 通常你会为Spring MVC应用程序添加@EnableWebMvc,但Spring Boot在类路径中看到spring-webmvc时会自动添加。这将该应用程序标记为Web应用程序并激活关键行为,例如设置DispatcherServlet。
- @ComponentScan告诉Spring在hello包中查找其他组件,配置和服务,以便找到控制器。
main()方法使用Spring Boot的SpringApplication.run()方法启动应用程序。你有没有注意到没有一行XML?没有web.xml文件。这个Web应用程序是100%纯Java,您不必处理配置任何管道或基础设施。
6. 编译出一个可执行的Jar
您可以使用Gradle或Maven从命令行运行应用程序。 或者您可以构建一个包含所有必需的依赖项,类和资源的可执行JAR文件,并运行该文件。 这使得在整个开发生命周期内跨越不同环境等,将服务作为应用程序发布,版本化和部署变得非常容易。
如果您正在使用Gradle,则可以使用./gradlew bootRun运行该应用程序。 或者您可以使用./gradlew构建构建JAR文件。 然后你可以运行JAR文件:
java -jar build/libs/gs-serving-web-content-0.1.0.jar
如果您使用的是Maven,则可以使用./mvn spring-boot:run来运行该应用程序。 或者您可以使用./mvn clean包构建JAR文件。 然后你可以运行JAR文件:
java -jar target/gs-serving-web-content-0.1.0.jar
上述过程将创建一个可运行的JAR。 您也可以选择构建经典的WAR文件。
7.测试这个App
"Hello, World!"
如图所示:

提供一个name查询字符串参数通过 http://localhost:8080/greeting?name=User.
现在你注意到这个消息已经由 "Hello, World!" 改变成了 "Hello, User!"
"Hello, User!"

此更改演示了GreetingController中的@RequestParam排列按预期工作。 name参数已被赋予默认值“World”,但始终可以通过查询字符串显式覆盖。
添加一个Home 页面
像HTML或JavaScript或CSS这样的静态资源可以很容易地从Spring Boot应用程序中提供,只需将它们放在源代码的正确位置即可。 默认情况下,Spring Boot以“/ static”(或“/ public”)的类路径中的资源提供静态内容。 index.html资源是特殊的,因为它用作“欢迎页面”(如果它存在),这意味着它将作为根资源提供,即在我们的示例中为http:// localhost:8080 /。 所以创建这个文件:
src/main/resources/static/index.html
<!DOCTYPE HTML>
<html>
<head>
<title>Getting Started: Serving Web Content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>Get your greeting <a href="/greeting">here</a></p>
</body>
</html>
然后当你重启你的App你将会看到这个页面在这个网址 http://localhost:8080/

恭喜! 你刚刚用Spring开发了一个网页。
源码: 点击查看
译:7.使用Spring MVC服务Web内容的更多相关文章
- 基于Spring MVC的Web应用开发(三) - Resources
		基于Spring MVC的Web应用开发(3) - Resources 上一篇介绍了在基于Spring MVC的Web项目中加入日志,本文介绍Spring MVC如何处理资源文件. 注意到本项目的we ... 
- 【译】理解Spring MVC Model Attribute 和 Session Attribute
		作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用 ... 
- JSR-303 Bean Validation 介绍及 Spring MVC 服务端参数验证最佳实践
		任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用很多时候同样的数据验证逻辑会出现在不同的层,这样 ... 
- JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践
		任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用在很多时候,同样的数据验证逻辑会出现在不同的层, ... 
- [翻译]Spring MVC RESTFul Web Service CRUD 例子
		Spring MVC RESTFul Web Service CRUD 例子 本文主要翻译自:http://memorynotfound.com/spring-mvc-restful-web-serv ... 
- spring mvc构建WEB应用程序入门例子
		在使用spring mvc 构建web应用程序之前,需要了解spring mvc 的请求过程是怎样的,然后记录下如何搭建一个超简单的spring mvc例子. 1) spring mvc的请求经历 请 ... 
- 2分钟在eclipse下使用SpringBoot搭建Spring MVC的WEB项目
		1. 首先用eclipse创建一个maven工程, 普通maven工程即可 2. 修改pom如下: <?xml version="1.0" encoding="UT ... 
- 使用IDEA搭建一个 Spring + Spring MVC 的Web项目(零配置文件)
		注解是Spring的一个构建的一个重要手段,减少写配置文件,下面解释一下一些要用到的注解: @Configuration 作用于类上面,声明当前类是一个配置类(相当于一个Spring的xml文件)@C ... 
- 使用IDEA搭建一个Spring + Spring MVC 的Web项目(零配置文件)
		话不多说,直接上代码: 注解是Spring的一个构建的一个重要手段,减少写配置文件,下面解释一下一些要用到的注解: @Configuration 作用于类上面,声明当前类是一个配置类(相当于一个Spr ... 
随机推荐
- Gitlab管理用户、组、权限(一)
			&& 内容: 添加用户 创建组 用户权限 保护主要分支 配置项目的可见性 移除用户 一. 添加用户 1. 用root 管理员登陆. 2. 点击管理区域 3. 点击New User 4. ... 
- BZOJ3674 可持久化并查集加强版 可持久化 并查集
			欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3674 题意概括 n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的 ... 
- 052 自动将每日的日志增量导入到hive中
			一:大纲介绍 1.导入方式 load data local inpath 'local_file_path' into table tbname partition (date='',hour='') ... 
- 聊聊ReentrantLock的内部实现
			大家都用过ReentrantLock,但是大家对内部实现是否足够了解呢,下面我就简单说一下其中的实现原理. ReentrantLock是可重入锁,也就是同一个线程可以多次获取锁,每获取一次就会进行一次 ... 
- 浅谈vue之动态路由匹配
			在日常开发过程中,可能会遇到一些类似于新闻详情页的内容,需要把所有详情页映射到同一组件上,这是动态路由匹配的应用场景之一.在使用的过程中,也遇到过一些小坑,此篇做个简要的总结说明: 基本使用 { pa ... 
- JAXB 实现java对象与xml之间互相转换
			首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用: 1.@XmlRootElement,用于类级别的注解,对应xml的跟元素.通过name属性定义这个根节点的名称. 2.@XmlAcces ... 
- python魔法方法-比较相关
			在python2.x的版本中,支持不同类型的比较,其比较原则如下: 内置类型: 1.同一类型: 1.1)数字类型:包含int.float.long.complex.bool(bool类型是int的 ... 
- android monitor 汉化 ddms
			作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com android.jar\com\androi ... 
- BZOJ.3598.[SCOI2014]方伯伯的商场之旅(贪心 数位DP)
			题目链接 先考虑,对于确定的一个数,怎样移动代价最少(或者移到哪个位置最优)? 假设我们都移到下标\(1\)位置(设集合点为\(1\)),那么移动到下标\(2\)与\(1\)相比代价差为:\(下标&l ... 
- JavaScript_作用域(2017-03-16)
			这里写的还不够清楚. 建议去看:王福朋 的博客的加深理解. 深入理解javascript原型和闭包(8)——简述[执行上下文]上 深入理解javascript原型和闭包(9)——简述[执行上下文]下 ... 
