BootstrapSpring 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,@瑟维斯),大大裁减了配置量。那时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之间的倒车。

专程指出:在骨子里项目中,大家任重(英文名:rèn zhòng)而道远支撑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的兼具配置。

一个小技巧
在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为大家提供了安置的Tomcat以及Spring
MVC的倚重性。而Web相关的自发性配置存储在org.springframework.web下。从这一个文件名能够观望:

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

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

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

4.杰克逊HttpMessageConvertersConfiguration用来机关配置mapping杰克逊2HttpMessageConverter和mapping杰克逊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提供的有益,又须求充实和谐的额外的安顿的时候,可以定义一个安排类并再而三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(创设,获取,更新,删除),查询,排序和分页的有关操作。

相关文章