文档章节

Spring Boot-快速构建应用

wmy596
 wmy596
发布于 2017/03/18 14:30
字数 5422
阅读 39
收藏 2

 

 

spring 框架作为目前非常流行的一个 Java 应用开发框架,它所包含的内容是非常繁多的。Spring 框架包含几十个不同的子项目,涵盖应用开发的不同方面。要在这些子项目之间进行选择,并快速搭建一个可以运行的应用是比较困难的事情。Spring Boot 的目的在于快速创建可以独立运行的 Spring 应用。通过 Spring Boot 可以根据相应的模板快速创建应用并运行。Spring Boot 可以自动配置 Spring 的各种组件,并不依赖代码生成和 XML 配置文件。Spring Boot 可以大大提升使用 Spring 框架时的开发效率。

      官方文档:http://docs.spring.io/spring-boot/docs/current/reference/html/

 

Spring Boot提供了一个强大的一键式Spring的集成开发环境,能够单独进行一个Spring应用的开发,其中:

(1)集中式配置(application.properties)+注解,大大简化了开发流程
(2)内嵌的Tomcat和Jetty容器,可直接打成jar包启动,无需提供Java war包以及繁琐的Web配置
(3)提供了Spring各个插件的基于Maven的pom模板配置,开箱即用,便利无比。
(4)可以在任何你想自动化配置的地方,实现可能
(5)提供更多的企业级开发特性,如何系统监控,健康诊断,权限控制
(6) 无冗余代码生成和XML强制配置
(7)提供支持强大的Restfult风格的编码,非常简洁

 

1、安装

  • 一个称手的文本编辑器(例如Vim、Emacs、Sublime Text)或者IDE(Eclipse、Idea Intellij)
  • Java环境(JDK 1.7或以上版本)
  • Maven 3.0+(Eclipse和Idea IntelliJ内置,如果使用IDE并且不使用命令行工具可以不安装)

1. spring-boot是一个mavan项目,所以其使用的jar包全部是通过maven管理,当然,使用maven也是非常方便的。

2. spring-boot打出来的包是一个可执行jar包的状态,使用的是内置的tomcat服务器,所以不需要将项目转成EJB项目。

Eclipse插件安装

1) 插件安装

点击菜单 Help -> Install new software 进行插件安装

插件地址 http://m2eclipse.sonatype.org/sites/m2e

 

如果你已经成功安装了这个插件,当你打开Window→ Preferences...的时候,你应该能够在一个选项列表中看到一个Maven选项

安装好m2eclipse插件后,要作两个设置 a) 禁用Downloadrepository index updates on startup(即取消这个选项的勾选,第三个第四个可以点上),如下图

 

b) 设置maven的setting.xml文件路径,如下图

 

 

2、创建应用

 

 

使用Spring Boot框架可以大大加速Web应用的开发过程,首先在Maven项目依赖中引入spring-boot-starter-web

我们在Eclipse 创建maven项目:

 

填写GroupId和artifactId

 

后生成:

 

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class Application {

    @RequestMapping("/")
    public String greeting() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

 在IDE中直接直接执行main方法,然后访问http://localhost:8080即可。
 另外可以使用maven打包为可执行jar包,然后执行java -jar xxx.jar。
 或者执行mvn spring-boot:run运行项目。
 在浏览器中访问http://localhost:8080/,Hello World!就出现在了页面中。只用了区区十几行Java代码,一个Hello World应用就可以正确运行.

 

 

3、spring boot项目结构

 

3.1、pom.xml文件

 pom.xml文件就是项目依赖文件,maven根据pom.xml自动加载相应的依赖

 

 

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>guisu</groupId>
  <artifactId>guisu-demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>guisu</name>
  <description>Demo project for Spring WebMvc</description>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.5.RELEASE</version>
    <relativePath/>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>


</project>

在Maven依赖中引入了spring-boot-starter-web,它包含了Spring Boot预定义的一些Web开发的常用依赖:

  • spring-webspring-webmvc Spring WebMvc框架
  • tomcat-embed-* 内嵌Tomcat容器
  • jackson 处理json数据
  • spring-* Spring框架
  • spring-boot-autoconfigure Spring Boot提供的自动配置功能

    “org.springframework.boot:spring-boot-starter-web”是 Spring Boot 所提供的推荐的基础 POM 文件之一,用来提供创建基于 Spring MVC 的 Web 应用所需的第三方库依赖。除了这个 POM 文件之外,Spring Boot 还提供了其他类似的 POM 文件。所有这些基础 POM 依赖都在“org.springframework.boot”组中。一些重要 POM 文件的具体说明见:

Spring Boot 推荐的基础 POM 文件

名称 说明
spring-boot-starter 核心 POM,包含自动配置支持、日志库和对 YAML 配置文件的支持。
spring-boot-starter-amqp 通过 spring-rabbit 支持 AMQP。
spring-boot-starter-aop 包含 spring-aop 和 AspectJ 来支持面向切面编程(AOP)。
spring-boot-starter-batch 支持 Spring Batch,包含 HSQLDB。
spring-boot-starter-data-jpa 包含 spring-data-jpa、spring-orm 和 Hibernate 来支持 JPA。
spring-boot-starter-data-mongodb 包含 spring-data-mongodb 来支持 MongoDB。
spring-boot-starter-data-rest 通过 spring-data-rest-webmvc 支持以 REST 方式暴露 Spring Data 仓库。
spring-boot-starter-jdbc 支持使用 JDBC 访问数据库。
spring-boot-starter-security 包含 spring-security。
spring-boot-starter-test 包含常用的测试所需的依赖,如 JUnit、Hamcrest、Mockito 和 spring-test 等。
spring-boot-starter-velocity 支持使用 Velocity 作为模板引擎。
spring-boot-starter-web 支持 Web 应用开发,包含 Tomcat 和 spring-mvc。
spring-boot-starter-websocket 支持使用 Tomcat 开发 WebSocket 应用。
spring-boot-starter-ws 支持 Spring Web Services。
spring-boot-starter-actuator 添加适用于生产环境的功能,如性能指标和监测等功能。
spring-boot-starter-remote-shell 添加远程 SSH 支持。
spring-boot-starter-jetty 使用 Jetty 而不是默认的 Tomcat 作为应用服务器。
spring-boot-starter-log4j 添加 Log4j 的支持。
spring-boot-starter-logging 使用 Spring Boot 默认的日志框架 Logback。
spring-boot-starter-tomcat 使用 Spring Boot 默认的 Tomcat 作为应用服务器。

所有这些 POM 依赖的好处在于为开发 Spring 应用提供了一个良好的基础。Spring Boot 所选择的第三方库是经过考虑的,是比较适合产品开发的选择。但是 Spring Boot 也提供了不同的选项,比如日志框架可以用 Logback 或 Log4j,应用服务器可以用 Tomcat 或 Jetty。

 

3.2  java代码

 

创建src/main/java/Application.java:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class Application {

    @RequestMapping("/")
    public String greeting() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

类似如下结构:

[plain] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. com  
  2.  +- example  
  3.      +- myproject  
  4.          +- Application.java  
  5.          |  
  6.          +- domain //<span style="color: rgb(51, 51, 51); font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: rgb(245, 245, 245);">用来管理javaBean实体对象</span>  
  7.          |   +- Customer.java  
  8.          |   +- CustomerRepository.java  
  9.          |  
  10.          +- service //业务逻辑层,处理数据逻辑,验证数据  
  11.   
  12.          |   +- CustomerService.java  
  13.          |  
  14.          +- web //Controller控制器  
  15.              +- CustomerController.java  

 

     

    Spring Boot建议将我们main方法所在的这个主要的配置类配置在根包名下。

     运行应用后,那么这段代码究竟做了什么呢?我们从程序的入口SpringApplication.run(Application.class, args);开始分析:

 

    Java代码中没有任何配置,和传统的Spring应用相比,多了两个我们不认识的符号:

  • @EnableAutoConfiguration
  • SpringApplication

    它们都是由Spring Boot框架提供。在SpringApplication.run()方法执行后,Spring Boot的autoconfigure发现这是一个Web应用(根据类路径上的依赖确定),于是在内嵌的Tomcat容器中启动了一个Spring的应用上下文,并且监听默认的tcp端口8080(默认约定)。同时在Spring Context中根据默认的约定配置了Spring WebMvc:

  • Servlet容器默认的Context路径是/
  • DispatherServlet匹配的路径(servlet-mapping中的url-patterns)是/*
  • @ComponentScan路径被默认设置为SampleController的同名package,也就是该package下的所有@Controller@Service@Component@Repository都会被实例化后并加入Spring Context中。

    没有一行配置代码、也没有web.xml。基于Spring Boot的应用在大多数情况下都不需要我们去显式地声明各类配置,而是将最常用的默认配置作为约定,在不声明的情况下也能适应大多数的开发场景。

 

  1. SpringApplication是Spring Boot框架中描述Spring应用的类,它的run()方法会创建一个Spring应用上下文(Application Context)。另一方面它会扫描当前应用类路径上的依赖,例如本例中发现spring-webmvc(由 spring-boot-starter-web传递引入)在类路径中,那么Spring Boot会判断这是一个Web应用,并启动一个内嵌的Servlet容器(默认是Tomcat)用于处理HTTP请求。

  2. Spring WebMvc框架会将Servlet容器里收到的HTTP请求根据路径分发给对应的@Controller类进行处理,@RestController是一类特殊的@Controller,它的返回值直接作为HTTP Response的Body部分返回给浏览器。@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直接填入HTTP响应体中,是REST风格的控制器。@RequestMapping("/books")表示该控制器处理所有“/books”的URL请求,具体由那个函数处理,要根据HTTP的方法来区分:GET表示查询、POST表示提交、PUT表示更新、DELETE表示删除。

  3. @RequestMapping注解表明该方法处理那些URL对应的HTTP请求,也就是我们常说的URL路由(routing),请求的分发工作是有Spring完成的。例如上面的代码中http://localhost:8080/根路径就被路由至greeting()方法进行处理。如果访问http://localhost:8080/hello,则会出现404 Not Found错误,因为我们并没有编写任何方法来处理/hello请求。

   4. 启动项目SpringApplication.run

     启动Spring Boot项目最简单的方法就是执行下面的方法:

[java] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. SpringApplication.run(Application.class, args);  

      该方法返回一个ApplicationContext对象,使用注解的时候返回的具体类型是AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext,当支持web的时候是第二个。

除了上面这种方法外,还可以用下面的方法:

[java] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. SpringApplication application = new SpringApplication(Application.class);  
  2. application.run(args);  

 

SpringApplication包含了一些其他可以配置的方法,如果你想做一些配置,可以用这种方式。

除了上面这种直接的方法外,还可以使用SpringApplicationBuilder

[java] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. new SpringApplicationBuilder()  
  2.         .showBanner(false)  
  3.         .sources(Application.class)  
  4.         .run(args);  

 

当使用SpringMVC的时候由于需要使用子容器,就需要用到SpringApplicationBuilder,该类有一个child(xxx...)方法可以添加子容器。

 

 

3.3  java代码主要注解

 

     因为默认和包有关的注解,默认包名都是当前类所在的包,例如@ComponentScan, @EntityScan, @SpringBootApplication注解。

     @RestController

     因为我们例子是写一个web应用,因此写的这个注解,这个注解相当于同时添加@Controller@ResponseBody注解。

     @EnableAutoConfiguration

      Spring Boot建议只有一个带有该注解的类。

   @EnableAutoConfiguration作用:Spring Boot会自动根据你jar包的依赖来自动配置项目。例如当你项目下面有HSQLDB的依赖时,Spring Boot会创建默认的内存数据库的数据源DataSource,如果你自己创建了DataSource,Spring Boot就不会创建默认的DataSource

      如果你不想让Spring Boot自动创建,你可以配置注解的exclude属性,例如:

 

[java] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. @Configuration  
  2. @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})  
  3. public class MyConfiguration {  
  4. }  

 

        @SpringBootApplication

       由于大量项目都会在主要的配置类上添加@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解。

       因此Spring Boot提供了@SpringBootApplication注解,该注解可以替代上面三个注解(使用Spring注解继承实现)。

       @RequestMapping

       注解表明该方法处理那些URL对应的HTTP请求,也就是我们常说的URL路由(routing),请求的分发工作是有Spring完成的。例如上面的代码中http://localhost:8080/根路径就被路由至greeting()方法进行处理。如果访问http://localhost:8080/hello,则会出现404 Not Found错误,因为我们并没有编写任何方法来处理/hello请求。

 

 

 

3.4  项目配置

 

 

Spring Boot最大的特色是“约定优先配置”,大量的默认配置对开发者十分的友好。但是在实际的应用开发过程中,默认配置不可能满足所有场景,同时用户也需要配置一些必须的配置项——例如数据库连接信息。Spring Boot的配置系统能够让开发者快速的覆盖默认约定,同时支持Properties配置文件和YAML配置文件两种格式,默认情况下Spring Boot加载类路径上的application.propertiesapplication.yml文件,例如:

 

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

YAML格式更加简洁:

 

spring:
  datasource:
    url: jdbc:mysql://localhost/test
    username: dbuser
    password: dbpass
    driver-class: com.mysql.jdbc.Driver

一旦发现这些信息,Spring Boot就会根据它们创建DataSource对象。另一个常见的配置场景是Web应用服务器:

 

# Server settings (ServerProperties)
server:
  port: 8080
  address: 127.0.0.1
  sessionTimeout: 30
  contextPath: /

  # Tomcat specifics
  tomcat:
    accessLogEnabled: false
    protocolHeader: x-forwarded-proto
    remoteIpHeader: x-forwarded-for
    basedir:
    backgroundProcessorDelay: 30 # secs

通过portaddress可以修改服务器监听的地址和端口,sessionTimeout配置session过期时间(再也不用修改web.xml了,因为它根本不存在)。同时如果在生产环境中使用内嵌Tomcat,当然希望能够配置它的日志、线程池等信息,这些现在都可以通过Spring Boot的属性文件配置,而不再需要再对生产环境中的Tomcat实例进行单独的配置管理了。

4、Sping boot处理请求

     

 

4.1 URL路由

 

       现代Web应用往往包括很多页面,不同的页面也对应着不同的URL。对于不同的URL,通常需要不同的方法进行处理并返回不同的内容。

       使用@Controller实现URL路由使用@Controller实现URL路由

匹配多个URL

@RestController
public class Application {

    @RequestMapping("/")
    public String index() {
        return "Index Page";
    }

    @RequestMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}

@RequestMapping可以注解@Controller类:

@RestController
@RequestMapping("/classPath")
public class Application {
    @RequestMapping("/methodPath")
    public String method() {
        return "mapping url is /classPath/methodPath";
    }
}

method方法匹配的URL是/classPath/methodPath"

 提示:可以定义多个@Controller将不同URL的处理方法分散在不同的类中

URL中的变量——PathVariable

在Web应用中URL通常不是一成不变的,例如微博两个不同用户的个人主页对应两个不同的URL:http://weibo.com/user1http://weibo.com/user2。我们不可能对于每一个用户都编写一个被@RequestMapping注解的方法来处理其请求,Spring MVC提供了一套机制来处理这种情况:

@RequestMapping("/users/{username}")
public String userProfile(@PathVariable("username") String username) {
    return String.format("user %s", username);
}

@RequestMapping("/posts/{id}")
public String post(@PathVariable("id") int id) {
    return String.format("post %d", id);
}

在上述例子中,URL中的变量可以用{variableName}来表示,同时在方法的参数中加上@PathVariable("variableName"),那么当请求被转发给该方法处理时,对应的URL中的变量会被自动赋值给被@PathVariable注解的参数(能够自动根据参数类型赋值,例如上例中的int)。

4.2 HTTP请求方法

对于HTTP请求除了其URL,还需要注意它的方法(Method)。例如我们在浏览器中访问一个页面通常是GET方法,而表单的提交一般是POST方法。@Controller中的方法同样需要对其进行区分:

 

[java] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. package com.example.controller;  
  2.   
  3. import org.springframework.web.bind.annotation.GetMapping;  
  4. import org.springframework.web.bind.annotation.PathVariable;  
  5. import org.springframework.web.bind.annotation.RequestBody;  
  6. import org.springframework.web.bind.annotation.RequestMapping;  
  7. import org.springframework.web.bind.annotation.RequestMethod;  
  8. import org.springframework.web.bind.annotation.RequestParam;  
  9. import org.springframework.web.bind.annotation.RestController;  
  10.   
  11. import com.example.bean.RequestLoginBean;  
  12. import com.example.response.BaseResponse;  
  13. import com.google.gson.Gson;  
  14.   
  15. @RestController  
  16. @RequestMapping(value = "/index")  
  17. public class Login {  
  18.   
  19.     /** 
  20.      * index home 
  21.      *  
  22.      * @return 
  23.      */  
  24.     @RequestMapping(value = "/home")  
  25.     public String home() {  
  26.         return "index home";  
  27.     }  
  28.       
  29.     @RequestMapping(value = "/login", method = RequestMethod.GET)  
  30.     public String loginGet() {  
  31.         return "Login Page";  
  32.     }  
  33.   
  34.     @RequestMapping(value = "/login", method = RequestMethod.POST)  
  35.     public String loginPost() {  
  36.         return "Login Post Request";  
  37.     }  
  38.     /** 
  39.      * 得到1个参数 
  40.      *  
  41.      * @param name 
  42.      *            用户名 
  43.      * @return 返回结果 
  44.      */  
  45.     @GetMapping(value = "/{name}")  
  46.     public String index(@PathVariable String name) {  
  47.         return "oh you are " + name + "<br> nice to meet you";// \n不起作用了,那就直接用html中的标签吧  
  48.     }  
  49.   
  50.     /** 
  51.      * 简单post请求 
  52.      *  
  53.      * @param name 
  54.      * @param pwd 
  55.      * @return 
  56.      */  
  57.     @RequestMapping(value = "/testpost", method = RequestMethod.POST)  
  58.     public String testpost() {  
  59.         System.out.println("hello  test post");  
  60.         return "ok";  
  61.     }  
  62.   
  63.     /** 
  64.      * 简单post的body数据请求 
  65.      *  
  66.      * @param name 
  67.      * @param pwd 
  68.      * @return 
  69.      */  
  70.     @RequestMapping(value = "/testpost", method = RequestMethod.POST)  
  71.     public String testpost2(@RequestBody String dataJson) {  
  72.         System.out.println("hello  test post:" +dataJson);  
  73.         return "ok";  
  74.     }  
  75.     /** 
  76.      * 同时得到两个参数 
  77.      *  
  78.      * @param name 
  79.      *            用户名 
  80.      * @param pwd 
  81.      *            密码 
  82.      * @return 返回结果 
  83.      */  
  84.     @GetMapping(value = "/login/{name}&{pwd}")  
  85.     public String login(@PathVariable String name, @PathVariable String pwd) {  
  86.         if (name.equals("admin") && pwd.equals("admin")) {  
  87.             return "hello welcome admin";  
  88.         } else {  
  89.             return "oh sorry user name or password is wrong";  
  90.         }  
  91.     }  
  92.   
  93.     /** 
  94.      * 通过get请求去登陆 
  95.      *  
  96.      * @param name 
  97.      * @param pwd 
  98.      * @return 
  99.      */  
  100.     @RequestMapping(value = "/loginbyget", method = RequestMethod.GET)  
  101.     public String loginByGet(@RequestParam(value = "name", required = true) String name,  
  102.             @RequestParam(value = "pwd", required = true) String pwd) {  
  103.         return login4Return(name, pwd);  
  104.     }  
  105.   
  106.     /** 
  107.      * 通过post请求去登陆 
  108.      *  
  109.      * @param name 
  110.      * @param pwd 
  111.      * @return 
  112.      */  
  113.     @RequestMapping(value = "/loginbypost", method = RequestMethod.POST)  
  114.     public String loginByPost(@RequestParam(value = "name", required = true) String name,  
  115.             @RequestParam(value = "pwd", required = true) String pwd) {  
  116.         System.out.println("hello post");  
  117.         return login4Return(name, pwd);  
  118.     }  
  119.   
  120.     /** 
  121.      * 参数为一个bean对象.spring会自动为我们关联映射 
  122.      * @param loginBean 
  123.      * @return 
  124.      */  
  125.     @RequestMapping(value = "/loginbypost1", method = { RequestMethod.POST, RequestMethod.GET })  
  126.     public String loginByPost1(RequestLoginBean loginBean) {  
  127.         if (null != loginBean) {  
  128.             return login4Return(loginBean.getName(), loginBean.getPwd());  
  129.         } else {  
  130.             return "error";  
  131.         }  
  132.     }  
  133.       
  134.     /** 
  135.      * 请求内容是一个json串,spring会自动把他和我们的参数bean对应起来,不过要加@RequestBody注解 
  136.      *  
  137.      * @param name 
  138.      * @param pwd 
  139.      * @return 
  140.      */  
  141.     @RequestMapping(value = "/loginbypost2", method = { RequestMethod.POST, RequestMethod.GET })  
  142.     public String loginByPost2(@RequestBody RequestLoginBean loginBean) {  
  143.         if (null != loginBean) {  
  144.             return login4Return(loginBean.getName(), loginBean.getPwd());  
  145.         } else {  
  146.             return "error";  
  147.         }  
  148.     }  
  149.   
  150.       
  151.   
  152.   
  153.     /** 
  154.      * 对登录做出响应处理的方法 
  155.      *  
  156.      * @param name 
  157.      *            用户名 
  158.      * @param pwd 
  159.      *            密码 
  160.      * @return 返回处理结果 
  161.      */  
  162.     private String login4Return(String name, String pwd) {  
  163.         String result;  
  164.         BaseResponse response = new BaseResponse();  
  165.         if (name.equals("admin") && pwd.equals("admin")) {  
  166.             result = "hello welcome admin";  
  167.             response.setState(true);  
  168.         } else {  
  169.             result = "oh sorry user name or password is wrong";  
  170.             response.setState(false);  
  171.         }  
  172.         System.out.println("收到请求,请求结果:" + result);  
  173.         return new Gson().toJson(response);  
  174.     }  
  175. }  


 

 

 

4.3 请求响应

 

    在之前所有的@RequestMapping注解的方法中,返回值字符串都被直接传送到浏览器端并显示给用户。但是为了能够呈现更加丰富、美观的页面,我们需要将HTML代码返回给浏览器,浏览器再进行页面的渲染、显示。

     一种很直观的方法是在处理请求的方法中,直接返回HTML代码,但是这样做的问题在于——一个复杂的页面HTML代码往往也非常复杂,并且嵌入在Java代码中十分不利于维护。更好的做法是将页面的HTML代码写在模板文件中,渲染后再返回给用户。为了能够进行模板渲染,需要将@RestController改成@Controller

import org.springframework.ui.Model;

@Controller
public class HelloController {

    @RequestMapping("/hello/{name}")
    public String hello(@PathVariable("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello"
    }
}

     在上述例子中,返回值"hello"并非直接将字符串返回给浏览器,而是寻找名字为hello的模板进行渲染,假如我们使用Thymeleaf模板引擎进行模板渲染,需要引入依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

接下来需要在默认的模板文件夹src/main/resources/templates/目录下添加一个模板文件hello.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>

th:text="'Hello, ' + ${name} + '!'"也就是将我们之前在@Controller方法里添加至Model的属性name进行渲染,并放入<p>标签中(因为th:text<p>标签的属性)。模板渲染还有更多的用法,请参考Thymeleaf官方文档

 

4.4 处理静态文件

 

      浏览器页面使用HTML作为描述语言,那么必然也脱离不了CSS以及JavaScript。为了能够浏览器能够正确加载类似/css/style.css/js/main.js等资源。

      1、默认情况下我们只需要在src/main/resources/static目录下添加css/style.cssjs/main.js文件后,Spring MVC能够自动将他们发布,通过访问/css/style.css/js/main.js也就可以正确加载这些资源。这些资源经过编译以后是在放在classes\static目录下的。

     2 、可以在工程的根目录直接建一个 "static"目录(和src同级)。资源都放里面。然后,就能访问了。(这个不需要编译)

     3、statis/和 src/main/resources/static目录,如果是同一个静态资源,如check.html. 优先访问rc/main/resources/static/check.html。

 

 

 

 

5、实例:数据库访问

 

除了最基本的Web框架,另一种非常普遍的开发场景是访问数据库。在传统的Spring应用中,访问数据库我们需要配置:

  • 类路径上添加数据库访问驱动
  • 实例化DataSource对象,指定数据库urlusernamepassword等信息
  • 注入JdbcTemplate对象,如果使用HibernateMybatis等框架,还需要进一步配置框架信息

在Spring Boot中,上述过程会被简化。首先在Maven项目依赖中定义:

 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

spring-boot-starter-web-jdbc引入了spring-jdbc依赖,h2是一个内存关系型数据库。在引入了这些依赖并启动Spring Boot应用程序后,autoconfigure发现spring-jdbc位于类路径中,于是:

  • 根据类路径上的JDBC驱动类型(这里是h2,预定义了derbysqlitemysqloraclesqlserver等等),创建一个DataSource连接池对象,本例中的h2是内存数据库,无需任何配置,如果是mysqloracle等类型的数据库需要开发者配置相关信息。
  • 在Spring Context中创建一个JdbcTemplate对象(使用DataSource初始化)

接下来开发者的工作就非常简单了,在业务逻辑中直接引入JdbcTemplate即可:

 

@Service
public class MyService {

    @Autowired
    JdbcTemplate jdbcTemplate;

}

除了spring-jdbc,Spring Boot还能够支持JPA,以及各种NoSQL数据库——包括MongoDBRedis,全文索引工具elasticsearchsolr等等。

 

 

6、Production特性

 

      从前面的例子可以看出,Spring Boot能够非常快速的做出一些原型应用,但是它同样可以被用于生产环境。为了添加生产环境特性支持,需要在Maven依赖中引入:

 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

加入actuator依赖后,应用启动后会创建一些基于Web的Endpoint:

  • /autoconfig,用来查看Spring Boot的框架自动配置信息,哪些被自动配置,哪些没有,原因是什么。
  • /beans,显示应用上下文的Bean列表
  • /dump,显示线程dump信息
  • /health,应用健康状况检查
  • /metrics
  • /shutdown, 默认没有打开
  • /trace

 

 

参考资料:

 

本文转载自:http://blog.csdn.net/hguisu/article/details/50956370

wmy596
粉丝 5
博文 23
码字总数 202
作品 0
广州
程序员
私信 提问
Spring Boot 和 Grails 的不同点

最近花了些时间了解了一下 Spring Boot 这个新框架。这个框架提供了快速开发基于 Spring Framework 的应用的功能。同样,SpringSource 旗下还有另一个用于 Web 应用快速开发的框架,就是 Gr...

编走编想
2014/05/02
915
0
使用IDE或者向导工具迅速构建一个Spring Boot应用

第一篇简单的内容我们通过敲代码的方式构建了一个Spring Boot应用。 但在实际工作中,应该没有多少人能记住这已经不算太多的模板代码了。 这里介绍一些开发Spring Boot的利器,可以很有效的提...

虾游于海
2018/06/16
0
0
Spring Boot实战与原理分析

Spring Boot实战与原理分析 1:Spring Boot概述与课程概要介绍 2:Spring4 快速入门 3:Spring4 扩展分析(一) 4:Spring4 扩展分析(二) 5:Spring Boot 快速入门 6:Spring Boot 配置分析...

刘宗泽
2018/06/26
0
0
Spring Boot入门(1)Hello World

Spring Boot介绍   对于熟悉Spring的读者读者来说,想必也听说过Spring Boot的大名,Spring Boot旨在简化Spring的开发,它涉及了Spring的方方面面,是一个令人惊叹的神奇发明。Spring Boot...

jclian91
2018/04/07
0
0
若不是公司需要,我怎么会用上 Spring Boot ?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/GitChat/article/details/96402637 我从业于第三方支付和互联网金融这...

GitChat技术杂谈
07/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
10
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部