SpringBoot

目录
1 Springboot简介
2 Springboot整合依赖汇总
3 常见问题汇总

1 Springboot简介

Spring Boot让我们的Spring应用变的更轻量化。比如:你可以仅仅依靠一个Java类来运行一个Spring引用。你也可以打包你的应用为jar并通过使用java -jar来运行你的Spring Web应用。

Spring Boot的主要优点:

  • 为所有Spring开发者更快的入门
  • 开箱即用,提供各种默认配置来简化项目配置
  • 内嵌式容器简化Web项目
  • 没有冗余代码生成和XML配置的要求

2 Springboot整合依赖汇总

2.1 Spring Web基础

2.1.1 Web基础依赖

<parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>1.5.2.RELEASE</version>
     <relativePath /> <!-- lookup parent from repository -->
 </parent>
<dependencies>
   <!-- 集成web -->
   <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>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-surefire-plugin</artifactId>
             <version>2.4.2</version>
             <configuration>
                 <skipTests>true</skipTests>
             </configuration>
         </plugin>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-clean-plugin</artifactId>
             <version>3.0.0</version>
             <configuration>
                 <skipTests>true</skipTests>
             </configuration>
         </plugin>
     </plugins> 
</build>

spring-boot-starter-web会自动引入spring-webmvc,spring-boot-starter-validation,spring-boot-starter,spring-boot-starter-json,spring-boot-starter-tomcat 这5个基础依赖

2.1.2 配置和启动

(1)spring-boot-starter-web添加了Tomcat和Spring MVC
(2)Springboot的几种启动方式:

  • @EnableAutoConfiguration,auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。
@RestController
@EnableAutoConfiguration
public class HelloController {
     @RequestMapping("/hello")
     public String index() {
          return "Hello World";
     }
     public static void main(String[] args) {
         SpringApplication.run(HelloController.class, args);
     }
 }

@ComponentScan(basePackages = "com.itmayiedu.controller") 控制器扫包

 @ComponentScan(basePackages = "com.itmayiedu.controller")
 @EnableAutoConfiguration
 public class App {
     public static void main(String[] args) {
          SpringApplication.run(App.class, args);
     }
 }
  • (推荐) @SpringBootApplication注解
    可以简化部分配置,但mybatis的mapper扫包和springcloud的eureka启动等不能少。
@SpringBootApplication
@EnableEurekaClient
@MapperScan(basePackages="com.qian.mapper")
public class MemberApp {
     public static void main(String[] args) {
        SpringApplication.run(MemberApp.class, args);
     }
 }

(3)yml配置文件

server:
   port: 8080
   context-path: /project

2.2 页面渲染

2.2.1 静态资源访问

在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。
Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:

  • /static
  • /public
  • /resources
  • /META-INF/resources

举例:我们可以在src/main/resources/目录下创建static文件夹,在该位置放置一个图片文件。启动程序后,尝试访问http://localhost:8080/D.jpg。如能显示图片,配置成功。

2.2.2 Freemarker模板引擎渲染web视图

2.2.2.1 模板引擎

模板的诞生是为了将显示与数据分离,模板技术多种多样,但其本质是将模板文件和数据通过模板引擎生成最终的HTML代码。使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档在原有的HTML页面中来填充数据。最终达到渲染页面的目的。

image

模板技术并不是什么神秘技术,干的是拼接字符串的体力活。模板引擎就是利用正则表达式识别模板标识,并利用数据替换其中的标识符。比如:Hello, <%= name%>

image

数据是{name: '木的树'},那么通过模板引擎解析后,我们希望得到Hello, 木的树。模板的前半部分是普通字符串,后半部分是模板标识,我们需要将其中的标识符替换为表达式。

2.2.2.2 Freemarker

(1)maven依赖

使用jar工程即可!

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

(2)yml配置

spring:
   freemarker:
       allow-request-override : false
       cache : true
       check-template-location : true
       charset : UTF-8
       content-type : text/html
       expose-request-attributes : false
       expose-session-attributes : false
       expose-spring-macro-helpers : false
       suffix : .ftl
       template-loader-path : classpath:/templates/

其实上述suffix可以该为.html即可支持html格式文件,测试有效!

(3)启动

@RequestMapping("/index")
public String index(Map<String, Object> map) {
     map.put("name","美丽的天使...");
     return "index";
 }

Map或者modelMap和request转发是一样的

2.2.3 JSP

2.2.3.1 maven依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-tomcat</artifactId>
 </dependency>
 <dependency>
     <groupId>org.apache.tomcat.embed</groupId>
     <artifactId>tomcat-embed-jasper</artifactId>
 </dependency>

maven中使用war类型工程,这点区别于freemarker!

2.2.3.2 yml配置

spring: 
     mvc: 
         view: 
             prefix: /WEB-INF/jsp/
             suffix: .jsp

2.2.3.3 启动

 @Controller 
 public class IndexController {
     @RequestMapping("/index")
     public String index() {
         return "index";
     }
 }

2.3 数据库访问

2.3.1 JdbcTemplate

2.3.1.1 maven依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-jdbc</artifactId>
 </dependency>
 <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.21</version>
 </dependency>

2.3.1.2 yml配置

spring:
   datasource :
       url : jdbc:mysql://localhost:3306/test
       username : root
       password : root
       driver-class-name : com.mysql.jdbc.Driver

2.3.1.3 调用

@Service
public class UserServiceImpl implements UserService {
     @Autowired
     private JdbcTemplate jdbcTemplate;
     public void createUser(String name, Integer age) {
         System.*out*.println("ssss");
         jdbcTemplate.update("insert into users values(null,?,?);", name, age);
     }
 }

2.3.2 Mybatis

2.3.2.1 maven依赖

<dependency>
     <groupId>org.mybatis.spring.boot</groupId>
     <artifactId>mybatis-spring-boot-starter</artifactId>
     <version>1.1.1</version>
 </dependency>
 <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.46</version>
 </dependency>

2.3.2.2 yml配置

spring:
   datasource :
       url : jdbc:mysql://localhost:3306/test
       username : root
       password : root
       driver-class-name : com.mysql.jdbc.Driver

2.3.2.3 调用

(1)定义mapper接口

public interface UserMapper {
     @Select("SELECT * FROM USERS WHERE NAME = #{name}")
     User findByName(@Param("name") String name);
     @Insert("INSERT INTO USERS(NAME, AGE) VALUES(#{name}, #{age})")
     int insert(@Param("name") String name, @Param("age") Integer age);
}

(2)@MapperScan(basePackages = "com.mapper")扫包

@ComponentScan(basePackages = "com.qian")
@MapperScan(basePackages = "com.qian.mapper")
@SpringBootApplication
public class App {
     public static void main(String[] args) {
     SpringApplication.*run*(App.class, args);
    }
 }

2.3.3 Springjpa

2.3.3.1 maven依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.21</version>
</dependency>

2.3.3.2 yml配置

spring:
   datasource :
       url : jdbc:mysql://localhost:3306/test
       username : root
       password : root
       driver-class-name : com.mysql.jdbc.Driver

2.3.3.3 调用和启动

(1)创建实体类

@Entity(name = "users")
public class User {
     @Id
     @GeneratedValue
     private Integer id;
     @Column
     private String name;
     @Column
     private Integer age;
       // ..get/set方法
}

(2)创建Dao接口

public interface UserDao extends JpaRepository<User, Integer> {
}

(3)@EnableJpaRepositories(basePackages = "com.qian.dao")启动

@ComponentScan(basePackages = { "com.qian" })
@EnableJpaRepositories(basePackages = "com.qian.dao")
@EnableAutoConfiguration
@EntityScan(basePackages = "com.itmayiedu.entity")
public class App {
     public static void main(String[] args) {
         SpringApplication.*run*(App.class, args);
    }
}

2.4 @Configuration配置

2.4.1 @ConfigurationProperties

如果我们需要取 N 个配置项,通过 @Value(“${name}”) 的方式去配置项需要一个一个去取,这就显得有点 low 了。我们可以使用 @ConfigurationProperties 。标有 @ConfigurationProperties 的类的所有属性和配置文件中相关的配置项进行绑定。(默认从全局配置文件中获取配置值),绑定之后我们就可以通过这个类去访问全局配置文件中的属性值了。

(1) 在主配置文件中添加如下配置

person: 
     name: kundy
     age: 13
     sex: male

(2)创建配置类,由于篇幅问题这里省略了 setter、getter 方法,但是实际开发中这个是必须的,否则无法成功注入。另外,@Component 这个注解也还是需要添加的。

@Component
@ConfigurationProperties(prefix="person")
public class Person{
     private String name;
     private Integer age;
     private String sex;
}

这里 @ConfigurationProperties 有一个 prefix 参数,主要是用来指定该配置项在配置文件中的前缀。

2.4.2 @Bean

2.4.2.1 使用说明

(1)@Bean注解相当于spring的xml配置文件<bean>标签,告诉容器注入一个bean。

(2)@Bean 注解作用在方法上

(3)@Bean 指示一个方法返回一个 Spring 容器管理的 Bean

(4)@Bean 方法名与返回类名一致,首字母小写

(5)@Bean 一般和 @Component 或者 @Configuration 一起使用

(6)@Bean 注解默认作用域为单例 singleton 作用域,可通过 @Scope(“prototype”) 设置为原型作用域

2.4.2.2 Bean 名称

(1)默认情况下 Bean 名称就是方法名,比如下面 Bean 名称便是 myBean:

@Bean
public MyBean myBean() {
     return new MyBean();
}

(2)@Bean 注解支持设置别名。比如下面除了主名称 myBean 外,还有个别名 myBean1(两个都可以使用)

@Bean("myBean1")
public MyBean myBean() {
     return new MyBean();
}

(3)@Bean 注解可以接受一个 String 数组设置多个别名。比如下面除了主名称 myBean 外,还有别名 myBean1、myBean2(三个都可以使用)

@Bean({"myBean1", "myBean2"})
public MyBean myBean() {
     return new MyBean();
}

2.4.2.3 @Bean 与其他注解一起使用

(1)@Bean 注解常常与 @Scope、@Lazy,@DependsOn 和 @link Primary 注解一起使用:

@Profile 注解:为在不同环境下使用不同的配置提供了支持,如开发环境和生产环境的数据库配置是不同的

@Scope 注解:将 Bean 的作用域从单例改变为指定的作用域

@Lazy 注解:只有在默认单例作用域的情况下才有实际效果

@DependsOn 注解:表示在当前 Bean 创建之前需要先创建特定的其他 Bean

(2)比如下面样例,Bean 的作用域默认是单例的,我们配合 @Scope 注解将其改成 prototype 原型模式(每次获取 Bean 的时候会有一个新的实例)

@Bean()
@Scope("prototype")
public MyBean myBean() {
     return new MyBean();
}

2.4.2.4 Bean 初始化和销毁时调用相应的方法

(1)实际开发中,经常会遇到在 Bean 使用之前或使用之后做些必要的操作,Spring 对 Bean 的生命周期的操作提供了支持:我们可以通过 @Bean 注解的 initMethod 和 destrodMethod 进行指定 Bean 在初始化和销毁时需要调用相应的方法。

(2)下面是一个简单的样例:

public class MyBean {
     public void init() {
        System.out.println("MyBean开始初始化...");
     }
     public void destroy() {
         System.out.println("MyBean销毁...");
     }
     public String get() {
         return "MyBean使用...";
     }
}
> 
> @Bean(initMethod="init", destroyMethod="destroy")
> 
> public MyBean myBean() {
> 
>     return new MyBean();
> 
> }

2.4.3 @Configuration

2.4.3.1 使用说明

(1)@Configuration注解底层是含有@Component ,所以@Configuration 具有和 @Component 的作用。

(2)@Configuration注解相当于spring的xml配置文件中<beans>标签,里面可以配置bean。

2.4.3.2 Demo

import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfigration {
     @Bean
     public String **hello()** {
         return "welcome to hangge.com";
     }
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
    @Autowired
    String hello;

    @GetMapping("/test")
     public String test() {
         return hello;
     }
}

2.5 事务管理

2.5.1 @Transactional

springboot默认集成事物,只主要在方法上加上@Transactional即可。

2.5.1 分布式事务管理

使用springboot+jta+atomikos 分布式事物管理。

maven依赖:

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

2.6 Lombok

2.6.1 maven依赖

<!--Lombok -->
<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <version>1.18.6</version>
</dependency>
<dependency>
     <groupId>net.logstash.logback</groupId>
     <artifactId>logstash-logback-encoder</artifactId>
     <version>4.9</version>
</dependency>

2.6.2 安装lomBok插件

(1)下载lombok.jar包https://projectlombok.org/download.html

(2)运行Lombok.jar: java -jar D:\software\lombok.jar。D:\software\lombok.jar这是windows下lombok.jar所在的位置。数秒后将弹出一框,以确认eclipse的安装路径。

(3)确认完eclipse的安装路径后,点击install/update按钮,即可安装完成

(4)安装完成之后,请确认eclipse安装路径下是否多了一个lombok.jar包,并且其配置文件eclipse.ini中是否 添加了如下内容:

-javaagent:lombok.jar
-Xbootclasspath/a:lombok.jar

那么恭喜你已经安装成功,否则将缺少的部分添加到相应的位置即可,重启eclipse或myeclipse。

2.7 其他

2.7.1 使用@Scheduled创建定时任务

  • 在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置。
  • 设置时间方式:
  1. 固定时间频率运行方法。@Scheduled(fixedRate=30000)
  2. 延迟指定的时间运行方法。@Scheduled(fixedDelay=30000)
  3. 按照 cron 表达式定义的时间方式运行方法。@Scheduled(cron="0 0 * * * *")
@Component
public class ScheduledTasks {
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    @Scheduled(fixedDelay = 5000)
    public void reportCurrentTime() {
        System.out.println("现在时间:" + dateFormat.format(new Date()));
    }
}

2.7.2 @Async实现异步调用

启动加上@EnableAsync,需要执行异步方法上加入 @Async

2.7.3 发布打包

(1)使用mvn package 打包

(2)使用 “java –jar 包名” 运行应用

  • 注意事项
    如果报错没有主清单,在pom文件中新增
<build>
     <plugins>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-compiler-plugin</artifactId>
             <configuration>
                 <source>1.8</source>
                 <target>1.8</target>
             </configuration>
         </plugin>
         <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
                 <configuration>
                     <maimClass>com.qian.app.App</maimClass>
                 </configuration>
                 <executions>
                     <execution>
                         <goals>
                             <goal>repackage</goal>
                         </goals>
                     </execution>
                 </executions> 
         </plugin>
     </plugins>
</build>

2.7.4 说明

关于ActiveMQ、Redis、Zookeeper、Dubbo、Spring Cloud 的相关依赖,在其各自专题介绍。

3 常见问题汇总

3.1 Spring中访问静态资源

注意这里不是Springboot环境,仅仅为Spring环境。在SpringMVC3.0之后推荐使用下列配置,该配置的作用是:DispatcherServlet不会拦截以/static开头的所有请求路径,并当作静态资源交由Servlet处理。

<mvc:annotation-driven />
<mvc:resources location="/img/" mapping="/img/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
  • 说明:
    location元素表示webapp目录下的static包下的所有文件;
    mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b;

3.2 Spring MVC Controller接收前端参数的几种方式

(1) 普通方式-请求参数名和Controller方法的参数一致

/** 
* 请求参数名和Controller方法的参数一致 
 * produces 设置返回参数的编码格式可以设置返回数据的类型以及编码,可以是json或者xml 
 * { 
 * @RequestMapping(value="/xxx",produces = {"application/json;charset=UTF-8"})
 * 或
 * @RequestMapping(value="/xxx",produces = {"application/xml;charset=UTF-8"})
 * 或
 * @RequestMapping(value="/xxx",produces = "{text/html;charset=utf-8}")
 * }
 * @param name 用户名
 * @param pwd 密码
 * @return
 *
*/
@RequestMapping(value = "/add", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
@ResponseBody
public String addUser(String name, String pwd){
    return"name:" + name + ",pwd:" + pwd;
 } 

http://localhost:8080/sty/param/add.action?name=张三&pwd=123456

(2) 对象方式-请求参数名和Controller方法中的对象的参数一致

@Controller
@RequestMapping("/param")publicclass TestParamController {
    privatestaticfinalLogger logger = LoggerFactory.getLogger(TestParamController.class);
    /**    * 请求参数名和Controller方法的参数一致
    * produces 设置返回参数的编码格式可以设置返回数据的类型以及编码,可以是json或者xml
    * }
    * @param user 用户信息
    * @return    *
    */    @RequestMapping(value = "/addByObject", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
    @ResponseBody
    public String addUserByObject(User user){
        logger.debug("name:" + user.getName() + ",pwd:" + user.getPwd());
        return"name:" + user.getName() + ",pwd:" + user.getPwd();
    }
} 

http://localhost:8080/sty/param/addByObject.action?name=张三&pwd=123456

(3)自定义方法参数名-当请求参数名与方法参数名不一致时
可以在参数中增加@RequestParam注解。如果在方法中的参数增加了该注解,说明请求的url该带有该参数,否则不能执行该方法。如果在方法中的参数没有增加该注解,说明请求的url无需带有该参数,也能继续执行该方法。

  @RequestParam(defaultValue="0")可设置默认值(仅当传入参数为空时)。

  @RequestParam(value="id")可接受传入参数为id的值,覆盖该注解注释的字段。

  @RequestParam(name="name",defaultValue = "李四") String u_name   如果传入字段”name”为空,默认u_name的值为”李四”。若传入”name”不为空,默认u_name值为传入值。
/** * 自定义方法参数名-当请求参数名与方法参数名不一致时

* @param u_name 用户名

* @param u_pwd 密码

* @return*/@RequestMapping(value = "/addByDifName", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})

@ResponseBodypublicString addUserByDifName(@RequestParam("name") String u_name, @RequestParam("pwd")String u_pwd){

    logger.debug("name:" + u_name + ",pwd:" + u_pwd);

    return"name:" + u_name + ",pwd:" + u_pwd;

}

访问:http://localhost:8080/sty/param/addUserByDifName.action?name=张三&pwd=123456

(4) HttpServletRequest方式

/** * 通过HttpServletRequest接收

* @param request

* @return*/@RequestMapping(value = "/addByHttpServletRequest", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})

@ResponseBodypublic String addUserByHttpServletRequest(HttpServletRequest request){

    String name = request.getParameter("name");

    String pwd = request.getParameter("pwd");

    logger.debug("name:" + name + ",pwd:" + pwd);

    return"name:" + name + ",pwd:" + pwd;

} 

访问:http://localhost:8080/sty/param/addByHttpServletRequest.action?name=张三&pwd=123456

  • 注意:其他方式的获取,基础都是request请求。自动封装也是从request中获取后进行的封装。

3.3 Spring MVC的转发和重定向

3.3.1 转发

使用request也行。

@RequestMapping("/helloForward")
publicString helloForward(@RequestParam(value="name", required=false, defaultValue="World2017") String name, Model model) {
        model.addAttribute("name", name);
        return"hello";
    }

3.3.2 重定向

(1)RedirectAttributes类

/** * 使用RedirectAttributes类

    * @param name

    * @param redirectAttributes

    * @return*/    @RequestMapping("/helloRedirect")

    publicString helloRedirect(@RequestParam(value="name", required=false ) String name, RedirectAttributes redirectAttributes) {

        redirectAttributes.addFlashAttribute("name", name);

        return"redirect:/hello";

    }

(2)借助Session传值

    /**    * 常规做法,重定向之前把参数放进Session中,在重定向之后的controller中把参数从Session中取出并放进ModelAndView

    * @param name

    * @param request

    * @return*/   

    @RequestMapping("/helloRedirect2")

    publicString helloRedirect2(@RequestParam(value="name", required=false ) String name, HttpServletRequest request) {

        request.getSession().setAttribute("name", name);

        return"redirect:/hello2";

    }

@RequestMapping("/hello2")

    public String hello2(Model model,HttpServletRequest request) {

        HttpSession session = request.getSession();

        model.addAttribute("name",session.getAttribute("name"));

        return"hello";     

    }

3.4 Input标签上传多个图片到服务器

(1)前端页面

<form action="getData" style="font-size: 14px;" method="post"  ENCTYPE="multipart/form-data">
    <td><input type="file" name="file" multiple="multiple"></td>
</form>

(2)服务器端

public void getData(@RequestParam(value = "file", required = false) List<MultipartFile> file,
HttpServletRequest req) {
  try {
    for (MultipartFile f : file) {
        //....
    }
  }
}

3.5 The field file exceeds its maximum permitted size of 1048576 bytes

Spring Boot做文件上传时出现了The field file exceeds its maximum permitted size of 1048576 bytes.错误,显示文件的大小超出了允许的范围。文档说明表示,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。要更改这个默认值需要在配置文件(如application.properties)中加入两个配置。

Spring Boot1.4版本后配置更改为:

spring.http.multipart.maxFileSize = 10Mb 
spring.http.multipart.maxRequestSize=100Mb 

Spring Boot2.0之后的版本配置修改为:

spring.servlet.multipart.max-file-size = 10MB
spring.servlet.multipart.max-request-size=100MB

3.6 服务器发送可下载文件到浏览器

@RequestMapping(value = "downloadZip", method = RequestMethod.GET)
    public void downloadZip(HttpServletResponse response,String id) throws Exception {
        String fileName=workCardPhotoFileService.downloadZipFile(id);
        if (StringUtils.isNotEmpty(fileName)){
            response.setContentType("application/application/vnd.ms-excel");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName);
            download(response.getOutputStream(),fileName);
        }
    }

public void download(OutputStream os, String fileName) throws IOException {
        //获取服务器文件
        File file = new File("/Users/Desktop/download/workcardphoto/"+fileName);
        InputStream ins = new FileInputStream(file);
        byte[] b = new byte[1024];
        int len;
        while((len = ins.read(b)) > 0){
            os.write(b,0,len);
        }
        os.flush();
        os.close();
        ins.close();
    }

3.7 @requestBody注解作用

通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上。

 $.ajax({
        url:"/login",
        type:"POST",
        data:'{"userName":"admin","pwd","admin123"}',
        content-type:"application/json charset=utf-8",
        success:function(data){
          alert("request success ! ");
        }
    });

@requestMapping("/login")
public void login(@requestBody User){
  System.out.println(userName+" :"+pwd);
}

3.8 Springboot访问HTML页面

此部分在测试过程中,一旦引入spring-boot-starter-thymeleaf,整个项目的pom文件就报错,具体原因排查中,了解的小伙伴也可以一起讨论。

在具体实践中,大都使用freemarker进行页面设计,且前述提到过,可以使用freemarker进行Html页面的访问。

3.8.1 Springboot下maven依赖

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

<!--避坑包-->

      <dependency>

          <groupId>net.sourceforge.nekohtml</groupId>

          <artifactId>nekohtml</artifactId>

          <version>1.9.22</version>

      </dependency>

3.8.2 yml配置

spring:
     thymeleaf:
         prefix: classpath:/templates/

在LEGACYHTML5下,application.properties配置文件如下。因为在默认配置下,thymeleaf对.html的内容要求很严格,比如<meta charset=”UTF-8″ />,如果少最后的标签封闭符号/,就会报错而转到错误页。也比如你在使用Vue.js这样的库,然后有<div v-cloak></div>这样的html代码,也会被thymeleaf认为不符合要求而抛出错误。因此,建议增加下面这段:

    spring.thymeleaf.mode = LEGACYHTML5

spring.thymeleaf.mode的默认值是HTML5,其实是一个很严格的检查,改为LEGACYHTML5可以得到一个可能更友好亲切的格式要求。

#<!-- 关闭thymeleaf缓存 开发时使用 否则没有实时画面-->
spring.thymeleaf.cache=false
## 检查模板是否存在,然后再呈现
spring.thymeleaf.check-template-location=true
#Content-Type值
spring.thymeleaf.content-type=text/html
#启用MVC Thymeleaf视图分辨率
spring.thymeleaf.enabled=true
## 应该从解决方案中排除的视图名称的逗号分隔列表
##spring.thymeleaf.excluded-view-names=
#模板编码
spring.thymeleaf.mode=LEGACYHTML5
# 在构建URL时预先查看名称的前缀
spring.thymeleaf.prefix=classpath:/templates/
# 构建URL时附加查看名称的后缀.
spring.thymeleaf.suffix=.html
# 链中模板解析器的顺序
#spring.thymeleaf.template-resolver-order= o
# 可以解析的视图名称的逗号分隔列表
#spring.thymeleaf.view-names=
#thymeleaf end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容