AjaxSpring 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(创建,获取,更新,删除),查询,排序和分页的相关操作。

相关文章