Spring Boot实战

Spring在java
EE开发中是实际意义上的专业,但大家在支付Spring的时候也许会赶上以下令人喉咙疼的题目:

1.大方配备文件的定义。
2.与第三方软件整合的技艺问题。

Spring每个版本的脱离都以减掉配置作为团结的基本点对象,例如:

1.出产@Component,@Service(Service),@Repository,@Controller声明在类上宣称Bean
2.出产@Configuration,@Bean的java配置来代替xml配置。

Spring Boot具有以下特征:

1.比照“习惯优于配备”的尺度,使用Spring
Boot只要求很少的布署。超过半数可以行使默许配置。
2.档次火速搭建,可无配置结合第三方框架。
3.可完全不使用xml配置,只使用机动配置java config
4.内嵌servlet容器,应用可用jar包运行。
5.周转中选择状态的监控。

虽说Spring Boot给大家带来了接近于脚本语言开发的功用,但Spring
Boot里没有采取什么让你不意的技术,完全是一个单独的根据Spring的采用如,Spring
Boot的自动配置是经过Spring 4.x 的@Conditional声明来促成的

先是部分.点睛Spring 4.x

Chapter1.Spring基础

Spring的简史:

1.xml配置

在Spring
1.x一代,使用Spring开发满眼都是xml配置的Bean,随着项目标恢宏,大家必要xml配置文件分放到分裂的布局文件里,那时候须求频仍地在开发的类和配置文件中切换。

2.诠释配置

在Spring 2.x时期,随着JDK
1.5拉动的笺注扶助,Spring提供了声称Bean的注释(如@Component,@Service(Service)),大大裁减了配置量。那时Spring圈子里存在着一种争辨:声明配置和xml配置究竟哪位好?俺们最终的挑选是采用的中央配备(如数据库配置)用xml,业务布局用声明

3.java配置

Spring3.x到现行,Spring提供了java配置的能力,使用java配置能够让您更掌握您布置的Bean。大家当下正好处于那么些时代,Spring
4.x和Spring Boot都推荐使用java配置,所以大家在本书通篇将动用java配置。

Spring使用不难的POJO(plain old java
object,即无别的限制的一般java对象)来进展公司化开发,每一个被Spring管理的java对象都称呼Bean
。而Spring提供了一个IoC容器用来开头化对象,解决对象间的看重管理和目标的选用。

Spring的生态:

1.Spring Boot:使用默许支出配置来落成急速支付
2.Spring Data:对主流的关系型和NoSQL数据库的接济
3.Spring Security:通过验证和授权爱抚利用
4.Spring Web Flow:基于Spring MVC提供根据向导流程式的Web应用开发
5.Spring Web Services:提供了根据协议有限的SOAP/Web服务
6.Spring Session:提供一个API及得以已毕来治本用户会话音信
等等,还有众多。

Spring框架本身有四大规格

1.选拔POJO进行轻量级和微小侵入式开发
2.通过依赖注入和根据接口编程心想事成松耦合
3.通过AOP和默许习惯进行表明式编程
4.透过AOP和模板(template)减弱模块化代码

俺们日常说的主宰翻转(inversion of control-IOC)和凭借注入(dependency
injection-DI)在Spring环境下是等同的定义,控制翻转是通过依赖注入完结的。所谓的借助注入指的是容器负责创立对象和掩护对象间的依靠关系,而不是透过对象自我友好的创设和平解决决自己的信赖。比如典型的:

?

1
2
@Autowired
MyBean bean;

而不是自己new出一个对象

声明Bean的注解:

1.@Component组件,没有强烈的角色
2.瑟维斯(Service)在作业逻辑层(service层)使用
3.@Repository在多少访问层(dao层)使用
4.@Controller在突显层(MVC->Spring MVC)使用

注入Bean的注解:

1.@Autowired,Spring提供的注释(推荐使用)
2.@Inject,JSR-330提供
3.@Resource,JSR-250提供

流入Bean的笺注可以申明在set方法上依然性质上,可是最好是在性质上,优点是代码更少,层次更清楚。

@Configuration注解当前类是一个配置类。

采纳@ComponentScan,自动扫描包名下持有应用@瑟维斯(Service),@Component,@Compository,@Controller的类,并注册为Bean。

java配置是通过@Configuation和@Bean来促成的。

@Configuration宣称当前类时一个配置类,相当于一个Spring配置的xml文件。
@Bean诠释在点子上,注脚当前方式的重临值为一个Bean。

何时使用java配置或者注脚配置呢?
大家的标准是:全局配置利用java配置(如数据库相关配置,MVC相关配置),业务Bean的配备利用声明配置

AOP:面向切面编程,相对于OOP面向对象编程

Spring的AOP的存在的目的是为着解耦。AOP可以让一组类共享相同的作为。在OOP中只可以通过继承类和落到实处接口,来使代码的耦合度增强,且类继承只好为单继承,阻碍越多作为添加到一组类上,AOP弥补了OOP的欠缺。

注解诠释本身是一贯不效劳的,就和xml一样。声明和xml都是一种元数据,元数据即解释多少的数量,那就是所谓的配置。

Chapter2.Spring常用配置

Scope描述的是Spring容器如何新建Bean的实例的。有以下两种,通过@Scope注脚来兑现:

1.Singleton:一个Spring容器中唯有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例
2.Prototype:每一遍调用新建一个Bean的实例。
3.Request:Web项目中,给每一个http request新建一个Bean实例。
4.Session:Web项目中,给每一个http session新建一个Bean实例。

Spring
EL-Spring表明式语言,扶助在xml和注释中运用表明式,类似于JSP的EL表明式语言。

示例:

?

1
2
3
4
5
6
7
8
9
//注入普通字符串
@Value("I Love You!") //1
private String normal;
//注入操作系统属性
@Value("#{systemProperties['os.name']}") //2
private String osName;
//注入表达式结果
@Value("#{ T(java.lang.Math).random() * 100.0 }") //3
private double randomNumber;

在实际上付出的时候,经常会遇上Bean在应用应用以前依然以后做些须求的操作。在选择java配置和注释配置下提供了如下三种方法:

1.java布署格局:使用@Bean的initMethoddestroyMethod
2.诠释情势:利用JSR-250的@PostConstruct@PreDestroy

Spring的事件(Application
Event)
为Bean与Bean之间的新闻通讯提供了援救。当一个Bean处理完一个职责之后,希望其余一个Bean知道并能做相应的拍卖,那时大家就需求让另一个Bean监听当前Bean说发送的事件。

Spring的轩然大波要求遵守如下流程:

1.自定义事件,继承Application伊夫nt
2.定义事件监听器,落成ApplicationListener
3.选拔容器公布事件

切切实实事例看书源码即可。

Chapter3.Spring高级话题

Spring的看重注入的最大优点就是你抱有的Bean对容器Spring容器的留存是没有察觉的。即你可以将您的器皿替换成其余容器。

但在实际上项目中,不可幸免要用到Spring容器本身的功用资源,那时你的Bean必须要发现到Spring容器的留存,才能调用Spring说提供的资源,那就是所谓的Spring
Aware。其实,Spring
Aware
本来就是Spring设计用来框架之中选拔的,若采取了Spring
Aware,你的Bean将会和Spring框架耦合。

Spring Aware的目的是为了让Bean得到Spring容器的劳动

多线程

Spring通过职务执行器(TaskExecutor)来兑现多线程和出现编程。使用ThreadPoolTaskExecutor可完成一个按照线程池的TaskExecutor。而事实上用度中职分一般是非阻碍的,即异步的,所以大家要在布局类中通过@EnableAsync开启对异步职责的支撑。并由此在实质上执行的Bean方法中使用@Async注脚来声称其是一个异步职务。

安排职分

陈设任务在Spring中的完毕变得分外的简短。首先通过在布局类注明@EnableScheduling来开启对陈设义务的协理,然后在要推行职务的艺术上诠释@Scheduled,评释那是一个安排任务。

Spring通过@Scheduled扶助多体系型的布署职务,包涵cron,fixDeley,fixedRate等。例如:

?

1
2
3
4
//每个5秒执行一次
@Scheduled(fixedRate=5000)
//UNIX或LINUX系统下的定时任务
@Scheduled(cron="0 28 11 ? * *")

结合评释和元表明

注明的雅量选取,更加相同的七个声明用到各种类或艺术中,会一定繁琐。那就是所谓的规范代码,是Spring设计标准中要清除的代码。

所谓元注解骨子里就是可以注明到别的注脚上的注释,被诠释的注释称之为结合注明

@Enable*注解

通过观看@Enable*诠释的源码,我们发现持有的笺注都有一个@Import注明,@Import是用来导入配置类的,那也就象征这么些电动开启的落到实处其实是导入了一部分电动配置的Bean。这个导入的配置主要分为三系列型:

1.直接导入配置类
2.依照调价接纳配置类
3.动态注册Bean

vc-4x”>第二部分.点睛Spring MVC 4.x

分清MVC和三层架构的例外:

MVC:Model+View+Controller(数据模型+视图+控制器)

三层架构:Presentation tier+Application tier+Data
tier(突显层+应用层+数据访问层)

实在的MVC只存在三层架构中的突显层,M实际上是数据模型,是富含数据的靶子。在Spring
MVC中,有一个特别的类叫Model,用来和V之间的数额交互、传值;V指的是视图页面,包罗JSP,Thymeleaf等。C当然就是控制器(Spring
MVC的笺注@Controller类)。

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Spring MVC配置
@Configuration
@EnableWebMvc
@EnableScheduling
@ComponentScan("com.wisely.highlight_springmvc4")
public class MyMvcConfig extends WebMvcConfigurerAdapter {
 
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/classes/views/");
        viewResolver.setSuffix(".jsp");
        viewResolver.setViewClass(JstlView.class);
        return viewResolver;
    }
}

注意这里对路线前缀的配备为/WEB-INF/classes/views/,不是和我们的费用的目录一样。因为观望的页面效果是运作时而不是付出时的代码,运行时代码会将我们的页面自动编写到/WEB-INF/classes/views/(因为自己把JSP文件放在了/resources/views目录下)下。

?

1
2
3
4
5
6
7
8
9
10
@Controller
public class HelloController {
 
    @RequestMapping("/index")
    public  String hello(){
 
        return "index";
    }
 
}

通过上边的ViewResolver的Bean配置,再次来到值为index,表明大家的页面放置的门径为/WEB-INF/classes/views/index.jsp。

Spring MVC的常用声明

1.@Controller
2.@RequestMapping
3.@RequestBody
@RequestBody允许request的参数在request体中,而不是在直接链接在地点后边。
4.@ResponseBody
@ResponseBody协理将再次回到值放在response体内,而不是回来一个页面。
5.@PathVariable
6.@RestController
是一个构成注脚,组合了@Controller和@ReponseBody。

示例:
添加jackson即有关依赖,获得对象和json或xml之间的倒车。

特意提议:在实际项目中,我们重点支撑json数据,没须要同时支持json和xml,因为json比xml更精简,而且也更推荐。

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class DemoObj {
    private Long id;
    private String name;
 
    //jackson对对象和json做转换时一定需要此空构造
    public DemoObj() {
        super();
    }
    public DemoObj(Long id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
 
 
 
}

演示@Controller控制器:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@Controller // 1
@RequestMapping("/anno") //2
public class DemoAnnoController {
 
    @RequestMapping(produces = "text/plain;charset=UTF-8"// 3
    public @ResponseBody String index(HttpServletRequest request) { // 4
        return "url:" + request.getRequestURL() + " can access";
    }
 
    @RequestMapping(value = "/pathvar/{str}", produces = "text/plain;charset=UTF-8")// 5
    public @ResponseBody String demoPathVar(@PathVariable String str, //3
            HttpServletRequest request) {
        return "url:" + request.getRequestURL() + " can access,str: " + str;
    }
 
    @RequestMapping(value = "/requestParam", produces = "text/plain;charset=UTF-8")
    //6演示常规的request参数获取,访问路径
    //为/anno/requestParam?id=1
    public @ResponseBody String passRequestParam(Long id,
            HttpServletRequest request) {
 
        return "url:" + request.getRequestURL() + " can access,id: " + id;
 
    }
 
    @RequestMapping(value = "/obj", produces = "application/json;charset=UTF-8")
    //演示解释参数到对象,访问路径为/anno/obj?id=1&name=xx
    @ResponseBody //8
    public String passObj(DemoObj obj, HttpServletRequest request) {
 
         return "url:" + request.getRequestURL()
                    + " can access, obj id: " + obj.getId()+" obj name:" + obj.getName();
 
    }
 
    @RequestMapping(value = { "/name1", "/name2" }, produces = "text/plain;charset=UTF-8")//9
    public @ResponseBody String remove(HttpServletRequest request) {
 
        return "url:" + request.getRequestURL() + " can access";
    }
 
}

演示@RestController控制器:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RestController //1
@RequestMapping("/rest")
public class DemoRestController {
 
    @RequestMapping(value = "/getjson",
            produces={"application/json;charset=UTF-8"}) //2
    public DemoObj getjson (DemoObj obj){
    //直接返回对象,对象会自动转换称json
        return new DemoObj(obj.getId()+1, obj.getName()+"yy");
    }
    @RequestMapping(value = "/getxml",
            produces={"application/xml;charset=UTF-8"})//4返回数据的媒体类型为xml
    public DemoObj getxml(DemoObj obj){
        return new DemoObj(obj.getId()+1, obj.getName()+"yy");
    }
 
}

Spring MVC的为主配备

Spring
MVC的定制配置须要大家的配置类继承一个WebMvcConfigure艾达(Ada)pter类,并在此类使用@EnableWebMvc注明,来拉开对Spring
MVC的安顿协助,那样大家就足以重写那个类的章程,完结大家的常用配置。

静态资源映射

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Configuration
//1开启Spring MVC支持,若无此句,重写
//WebMvcConfigurerAdapter方法无效
@EnableWebMvc
@EnableScheduling
@ComponentScan("com.wisely.highlight_springmvc4")
public class MyMvcConfig extends WebMvcConfigurerAdapter {// 2重写方法进行配置
 
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/classes/views/");
        viewResolver.setSuffix(".jsp");
        viewResolver.setViewClass(JstlView.class);
        return viewResolver;
    }
 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
 
 
//addResourceLocations指的是文件放置的目录,
//addResourceHandler指的是对外暴露的访问路径
registry.addResourceHandler("/assets/**").addResourceLocations(
                "classpath:/assets/");
 
    }
}

快捷的ViewController
俺们在配备页面转向的时候利用下边的代码:

?

1
2
3
4
@RequestMapping("/index")
public Stirng hello(){
return "hello";
}

假若只是单纯的转速,没有其余的作业逻辑的话,那样写很劳碌,我们可以通过重写addViewControllers来简化配置:

?

1
2
3
4
@override
public void addViewControllers(ViewControllerRegistry registry){
registry.addViewController("/index").setViewName("index")
}

文件上传配置:

在Spring的控制器中,通过MultipartFile
file来收纳文件,通过MultipartFile[] files接收多个文本上传。

劳动器端推送技术

服务器推送技术在平日生活中较为常用,很多个人先前时期的方案是使用Ajax向服务器轮询音讯,那种办法的轮询频率不佳控制,所以大大增添了服务器的下压力。

本节的劳务器端推送方案都是根据:当客户端向服务端发送请求,服务端会抓住那么些请求不放,等有数据更新的时候才回到给客户端,当客户端接收到新闻后,再向服务端发送请求,周而复始。那种艺术的功利是大大缩短了服务器的呼吁数量,大大裁减了服务器的下压力

Spring MVC的测试

为了测试Web项目一般不须要启动项目,大家须要一些Servlet相关的如法泡制目的。比如:MockMVC,MockHttpServletRequest,MockHttpServletResponse,MockHttpSession等。

测试驱动开发(TDD)

大家根据需要先写一个和好预想结果的测试用例,这几个测试用例刚开始肯定是败退的测试,随着不断的编码和重构,最终让测试用例通过测试。那样才能保险软件的质料和可控性。

我们重视依靠的是JUnit来拓展测试。
示范测试:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MyMvcConfig.class})
@WebAppConfiguration("src/main/resources") //1
public class TestControllerIntegrationTests {
    private MockMvc mockMvc; //2
 
    @Autowired
    private DemoService demoService;//3
 
    @Autowired
    WebApplicationContext wac; //4
 
    @Autowired
    MockHttpSession session; //5
 
    @Autowired
    MockHttpServletRequest request; //6
 
    @Before //7在测试开始前进行的初始化工作
    public void setup() {
        mockMvc =
                MockMvcBuilders.webAppContextSetup(this.wac).build(); //2
        }
 
    @Test
    public void testNormalController() throws Exception{
        mockMvc.perform(get("/normal")) //8
                .andExpect(status().isOk())//9
                .andExpect(view().name("page"))//10
                .andExpect(forwardedUrl("/WEB-INF/classes/views/page.jsp"))//11
                .andExpect(model().attribute("msg", demoService.saySomething()));//12
 
    }
 
    @Test
    public void testRestController() throws Exception{
        mockMvc.perform(get("/testRest")) //13
        .andExpect(status().isOk())
         .andExpect(content().contentType("text/plain;charset=UTF-8"))//14
        .andExpect(content().string(demoService.saySomething()));//15
    }
 
}

其三部分.实战Spring Boot

Chapter5.Spring基础

Spring Boot:
它应用”习惯优于配备”(项目中留存多量的配备,其它还内置一个习惯性的布署,让你不用手动举办布局)的见地让你的品类火速运行起来。使用Spring
Boot很不难创设一个独门运作(运行jar,内嵌servlet容器),准生育级其余赋予Spring框架的花色,使用Spring
Boot你可以毫不或者只需很少的Spring配置。

Spring Boot大旨职能:

1.单独运转的Spring项目

2.内嵌Servlet容器

3.提供starter简化Maven配置
以此的确很方便,不用自己手动添加很多凭借

4.自行配置Spring
Spring
Boot会依照在类路径中的jar包,类,为jar包里的类活动配置bean,那样会大幅度地收缩大家要动用的配备
。当然,Sping
Boot只是考虑了绝大部分的付出情形,并不是有所的景观,若在骨子里中须求活动配置Bean,而Spring
Boot没有提供支撑,那么可以自定义自动配置。(见Spring运行规律)

5.准生产的使用监控
Spring提供依照http,ssh,telnet对运作时的档次展开监控

6.无代码生成和xml配置
Spring 4.x提倡使用java配置和注释配置结合,而Spring
Boot不须求此外xml配置即可兑现Spring的富有配置。

一个小技巧
在AMDiJ IDEA中开创Spring项目时,选用新建Spring
Initializer项目,可以添加各类starter,然后会在maven中活动抬高看重,很有利。

@SpringBootApplication是Spring
Boot项目的中坚注脚,首要目标是开启自动配置

Chapter6.Spring Boot核心

@SpringBootApplication是个结合注脚,源码如下:

?

1
2
3
4
5
6
7
8
9
10
11
12
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
)}
)

Spring Boot的布置文件

Spring
Boot使用一个大局的布署文件application.properties或application.yml,放置在/src/main/resources目录或者类路径下的/config下。那个中的配备格外多,参见官方给出的附录。例如:

?

1
2
3
4
//将tomcat默认端口号8080改为9090,并将默认的访问路径"/"
//修改为"//hellohost"
server.port=9090
server.context-path=/hellohost

正规属性配置

俺们事先讲过在正规Spring环境下,注入properites文件里的值的方法,通过@PropertySource指明properties文件的地方,然后经过@Value注入值。在Spring
Boot里,大家只需在application.properties中定义属性,然后利用@Value注入即可。

品类安全的安插(基于properties)

上例中行使@Value注入每个配置在其实项目中会显得很费力,因为要写@Value注入很频仍哟。

上边是一个进化版,可以透过@ConfigurationProperties将properties属性和一个Bean及其特性关联,从而已毕项目安全的配置。例如:在application.properties上添加:

?

1
2
author.name =zeng
author.age = 24

理所当然也得以新建一个properties文件,这就需求大家在@ConfigurationProperties的特性locations里面指定properties的位置,且要求在入口类上安顿。

连串安全的Bean:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Component
@ConfigurationProperties(prefix = "author") //1
public class AuthorSettings {
    private String name;
    private Long age;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Long getAge() {
        return age;
    }
 
    public void setAge(Long age) {
        this.age = age;
    }
}

因而prefix指定安顿的前缀,通过locations制定文件的职位。比如:

?

1
@ConfigurationProperties(prefix = "author",locations={"classpath:config/author.properties"})

日志配置

默许意况下,Spring Boot使用Logback作为日志框架。

?

1
2
3
4
5
6
7
8
9
10
# LOGGING
logging.config= # Location of the logging configuration file. For instance `classpath:logback.xml` for Logback
logging.exception-conversion-word=%wEx # Conversion word used when logging exceptions.
logging.file= # Log file name. For instance `myapp.log`
logging.level.*= # Log levels severity mapping. For instance `logging.level.org.springframework=DEBUG`
logging.path= # Location of the log file. For instance `/var/log`
logging.pattern.console= # Appender pattern for output to the console. Only supported with the default logback setup.
logging.pattern.file= # Appender pattern for output to the file. Only supported with the default logback setup.
logging.pattern.level= # Appender pattern for log level (default %5p). Only supported with the default logback setup.
logging.register-shutdown-hook=false # Register a shutdown hook for the logging system when it is initialized.

Spring Boot运行规律

在前面我们询问到Spring 4.x提供了依照条件来布局Bean的力量,其实Spring
Boot的神奇的贯彻也是基于这一规律的。

关于Spring
Boot的周转规律,仍旧要回归到@SpringBootApplication评释上来,那一个注明是一个组成申明,前边早已演示过了,它的中坚成效是由@EnableAutoConfiguration声明来提供的。

Chapter7.Spring Boot的Web开发

Spring
Boot提供了spring-boot-starter-web为Web开发予以匡助,spring-boot-starter-web为我们提供了放置的汤姆(Tom)cat以及Spring
MVC的信赖性。而Web相关的自行配置存储在org.springframework.web下。从这么些文件名可以看看:

1.ServerPropertiesAutoConfiguration和ServerPropertes自动配置内嵌的Servlet容器

2.HttpEncodingAutoConfiguration和HttpEncodingProperties用来机关配置http的编码

3.MultipartAutoConfiguration和MultipartProperties用来自机关配置上传文件的性能

4.杰克逊HttpMessageConvertersConfiguration用来机关配置mapping杰克逊2HttpMessageConverter和mapping杰克逊(Jackson)2XmlHttpMessageConverter。

5.WebMvcAutoConfiguration和WebMvcProperties配置Spring MVC。

Thymeleaf与Spring MVC的集成

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Bean
public TemplateResolver templateResovler(){
    TemplateResovler templateResovler = new ServletContextTemplateResovler();
    templateResovler.setPrefix("/WEB-INF/templates");
    templateResovler.setSuffix(".html");
    templateResovler.setTemplateMode("HTML5");
    return templateResovler;
}
 
@Bean
public SpringTemplateEngine templateEngine(){
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResovler(templateResovler());
    return templateEngine;
}
 
@Bean
public ThymeleafViewResovler thymeleafVewResolver(){
    ThymeleafViewResolver thymeleafVewResolver = new ThymeleafViewResovler();
    ThymeleafViewResovler.setTemplateEngine(templateEngine());
    return ThymeleafViewResovler;
}

在Spring
MVC中固然有发动机,让配置变得不那么麻烦,但要么太繁琐了啊。看看Spring
Boot吧。

Thymeleaf与Spring Boot的集成

上有些的整整布置在Spring Boot中一切都是不须求的。Spring
Boot通过org.springframework.boot.autoconfigure.thymeleaf包对Thymeleaf进行了活动配置。大家只需求在application.properties中举行适宜的配备即可:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
# THYMELEAF (ThymeleafAutoConfiguration)
spring.thymeleaf.cache=true # Enable template caching.
spring.thymeleaf.check-template=true # Check that the template exists before rendering it.
spring.thymeleaf.check-template-location=true # Check that the templates location exists.
spring.thymeleaf.content-type=text/html # Content-Type value.
spring.thymeleaf.enabled=true # Enable MVC Thymeleaf view resolution.
spring.thymeleaf.encoding=UTF-8 # Template encoding.
spring.thymeleaf.excluded-view-names= # Comma-separated list of view names that should be excluded from resolution.
spring.thymeleaf.mode=HTML5 # Template mode to be applied to templates. See also StandardTemplateModeHandlers.
spring.thymeleaf.prefix=classpath:/templates/ # Prefix that gets prepended to view names when building a URL.
spring.thymeleaf.suffix=.html # Suffix that gets appended to view names when building a URL.
spring.thymeleaf.template-resolver-order= # Order of the template resolver in the chain.
spring.thymeleaf.view-names= # Comma-separated list of view names that can be resolved.

接管Spring Boot的Web配置

了不起读读下边两段话

一经Spring Boot提供的Spring
MVC默许配置不合乎您的急需,则足以由此一个配置类(申明有@Configuration)加上@EnableWebMvc表明来兑现完全自己决定的MVC配置。这种场合,那种方式不推荐

本来,在一般状态下,Spring
Boot的机关配置是吻合大家一大半需求的。在你既须求保留Spring
Boot提供的方便,又须要充实和谐的额外的配备的时候,可以定义一个配置类并蝉联WebMvcConfigurer艾达pter,无须使用@EnableWebMvc表明。然后根据第4章讲的Spring
MVC的布署方式来添加Spring Boot为大家所做的其余安顿

关键点是:可以经过Spring MVC的配备格局来配置Spring Boot。

?

1
2
3
4
5
6
7
8
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{
 
@override
public void addViewControllers(ViewControllerRegistry registry){
    registry.addViewController("/xx").addViewName("xx");
}
}

值得提出的是:在此间重写的addViewController方法,并不会覆盖WebMvcAutoConfiguration中的addViewControllers(在源码中,默许的有一个布局,Spring
Boot将”/”映射到index.html),那也就意味着大家的布署和Spring
Boot的自发性配置同时有效,这也是大家推荐添加自己的MVC配置的主意

WebSocket

WebSocket为浏览器和服务端提供了双工异步通讯的意义,即浏览器可以向服务端发送音信,服务端也可以向浏览器发送音讯

WebSocket是因此一个socket来促成双工异步通讯能力的。不过一向利用WebSocket协议会显得相当麻烦,我们会利用它的子协议STOMP,它是一个更高级其他商谈,STOMP协议利用一个根据帧(frame)的格式来定义信息,与HTTP的request和response类似(具有类似于@RequestMapping的@MessageMapping)。

1.广播式
广播式即服务端有音信时,会将新闻发送给所有连接了近年来endpoint的浏览器。

2.点对点式
广播式有友好的施用场景,可是广播式不可能一举成功大家一个广阔的景观,即音信由什么人发送,由什么人收到的题目。

基于Bootstrap和AngularJS的现代Web应用

现代的B/S系统有下边多少个特性:

1.单页面应用

单页面应用(single-page
application,简称SPA)值的是一种类似于原生客户端软件的更通畅的用户体验页面。

在单页面的选用中,所有的资源(HTML,JavaScript,CSS)都是按需动态加载到页面上的,且不须求服务端控制页面的转折

2.响应式设计

响应式设计(Responsive web
design,简称RWD)指的是见仁见智的设施访问同一的页面的时候,得到差距的页面视图,而收获的视图是适应当前屏幕的。

3.数量导向

数据导向是对于页面导向而言的,页面上的多寡得到是经过消费后台的REST服务来促成的,而不是因此服务器渲染的动态界面(如JSP)来完成的,一般数据沟通使用的格式是JSON

AngularJS

HTML一般是用来注脚静态页面的,然而普通境况下大家期待页面是依据数据动态变化的,那也是我们许多服务器端模板引擎出现的原因,而AngularJS可以只透过前端技术就得以完成动态的页面

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
@SpringBootApplication
public class Ch77Application {
 
    @RequestMapping(value="/search",produces={MediaType.APPLICATION_JSON_VALUE})
    public Person search(String personName){
 
        return new Person(personName, 32, "hefei");
 
    }
 
    public static void main(String[] args) {
        SpringApplication.run(Ch77Application.class, args);
    }
}

上边的代码我们模拟一个询问,即接到前台传入的personName,然后回到Person类,因为大家拔取的是@RestController,且重临值类型是Person,所以Spring
MVC会自动将对象输出为JSON。注意代码中的:

?

1
produces={MediaType.APPLICATION_JSON_VALUE}

Chapter8.Spring Boot的数码访问

Spring
Data为大家应用统一的API来对很多数码存储技术(比如关系性和非关系型数据库)进行多少访问操作提供了支撑。那是Spring通过提供Spring
Data 康芒斯(Commons)项目来得以完成的,它是上述种种Spring Data项目标看重性。Spring Data
康芒斯(Commons)让大家在利用关系型或非关系型数据访问技术时都采纳基于Spring的统一标准,该规范包涵CURD(成立,获取,更新,删除),查询,排序和分页的连带操作。

网站地图xml地图