Spring Boot实战

Spring在java
EE开发被是实际意义上的科班,但咱于付出Spring的时刻可能会见遇上以下让人头疼的题材:

1.大气布局文件之定义。
2.暨第三方软件成的技巧问题。

Spring每个版本的淡出都因减少配置当团结的最主要目标,例如:

1.产@Component,@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),大大减少了配置量。这时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.起定义事件,继承ApplicationEvent
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的定制配置需要我们的配置类继承一个WebMvcConfigureAdapter类,并以此类使用@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的有所配置。

一个聊技巧
在InteliJ 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为咱提供了安放的Tomcat以及Spring
MVC的乘。而Web相关的机关配置存储在org.springframework.web下。从这些文件称好看出:

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

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

3.MultipartAutoConfiguration暨MultipartProperties用自机关配置达到传文书之习性

4.JacksonHttpMessageConvertersConfiguration于是来机关配置mappingJackson2HttpMessageConverter和mappingJackson2XmlHttpMessageConverter。

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提供的方便,又得加和谐的额外的安排的时段,得定义一个布局类似并延续WebMvcConfigurerAdapter,无须使用@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(创建,获取,更新,删除),查询,排序和分页的相关操作。

相关文章