写在前面

校招在即,为了更好的应对面试,以博客的形式详细梳理一下之前学过的重点知识。

Spring Boot的自动装配原理

精髓之处:

  • Spring Boot启动会加载大量的自动配置类
  • 看我们需要的功能有没有在Spring Boot默认写好的自动配置类中
  • 再看这个自动配置类中到底配置了哪些组件(只要我们需要的组件在其中,我们就不需要再手动配置了)
  • 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们只需要在配置文件中指定这些属性值即可
    • xxxAutoConfiguration:自动配置类;给容器中添加组件
    • xxxProperties:封装配置文件中相关属性

可以通过debug = ture 来判断哪些自动配置类生效,那些没有生效。

Spring Boot的Web开发

要解决的问题

  • 导入静态资源(html,css)
  • 首页
  • jsp(Spring MVC可以用,但是这个技术在Spring Boot中寄了,要换另一个技术),模板引擎Thymeleaf
    • 忘记了什么是jsp就看一眼这篇文章:jsp是什么?
      • JSP(Java Server Pages)是建立在Servlet规范之上的动态网页开发技术,其实质是一个简化的Servlet,在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用于实现网页中静态内容的显示,Java代码用于实现网页中动态内容的显示。为了与传统HTML有所区别,JSP文件的扩展名为jsp。
  • 装配扩展Spring MVC
  • 增删改查
  • 拦截器
  • 国际化

导入静态资源

  1. 在Spring Boot中可以使用如下方法处理静态资源(通过看源码得出的结论):‘
    • webjars:localhost:8080/webjars/(不常用)
    • public,static,/**,resources localhost:8080/
  2. 优先级:resources >static(默认)> public

也可以通过yaml文件改写静态资源的配置(指定properties中的属性),但是处理不好就寄了,建议不要这么做。

首页定制(并非前后端分离)

  1. 首页只能放在resources 、static、 public这三级目录下访问。如果新建了文件夹,比如templates(Thymeleaf所有模板写在这个文件夹内,html页面),那就只能通过controller进行跳转,无法直接访问。在用controller进行跳转时,我们需要用到jsp,但是Spring Boot原则上不支持jsp,为什么,那又要该怎们办?

    1. 使用jsp做开发,比如Spring MVC中,要用到视图解析器查找 JSP 视图,从而实现页面的跳转。下面谈到的视图可理解为就是jsp。

      1. 我们在配置springMVC时通常会配置如下代码段: 
        
        <!-- 视图解析器 -->
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/jsp/"/>
                <property name="suffix" value=".jsp"/>
            </bean>
        
               /*WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。
                如果想在页面中直接访问其中的文件,必须通过 web.xml 文件对要访问的文件进行相应映射才能访问。
                所以我们传统的JavaEE项目,这也是为什么我们servlet配置映射的index.jsp页面不在WEB-INF下的原因。*/
      2. InternalResourceViewResolver:它是URLBasedViewResolver的子类,所以URLBasedViewResolver支持的特性它都支持。在实际应用中InternalResourceViewResolver也是使用的最广泛的一个视图解析器。那么InternalResourceViewResolver有什么自己独有的特性呢?单从字面意思来看,我们可以把InternalResourceViewResolver解释为内部资源视图解析器,这就是InternalResourceViewResolver的一个特性。

     InternalResourceViewResolver会把返回的视图名称都解析为InternalResourceView对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。比如在InternalResourceViewResolver中定义了prefix=/WEB-INF/,suffix=.jsp,然后请求的Controller处理器方法返回的视图名称为test,那么这个时候InternalResourceViewResolver就会把test解析为一个InternalResourceView对象,先把返回的模型属性都存放到对应的HttpServletRequest属性中,然后利用RequestDispatcher在服务器端把请求forword到/WEB-INF/test.jsp。

     **这就是InternalResourceViewResolver一个非常重要的特性,我们都知道存放在/WEB-INF/下面的内容是不能直接通过request请求的方式请求到的,为了安全性考虑,我们通常会把jsp文件放在WEB-INF目录下,而InternalResourceView在服务器端跳转的方式可以很好的解决这个问题。**

  3. 可以看出,在Spring MVC中配置视图解析器的目的,是出于安全性的顾虑,将jsp文件放在了WEB-INF目录下,还可以通过controller进行页面的跳转。
  1. 在jsp开发中,前端交给我们页面,是html页面。如果是按以前的套路开发,我们需要把它们转换成jsp页面,jsp好处是当我们查出一些数据转发到jsp页面后,我们可以用jsp轻松实现数据的显示,以及交互。jsp支持非常强大的功能,包括能写java代码,但是呢,首先,Spring Boot这个项目首先是以jar的方式,不是war,第二我们用的还是嵌入式的tomcat,所以他现在默认是不支持jsp的。

    1. jar包和war包的区别:jar与war
      1. jar包里的com里放的就是class文件,配置文件,但是没有静态资源的文件(index.jsp),大多数 JAR 文件包含一个 META-INF 目录,它用于存储包和扩展的配置数据,如安全性和版本信息;
      2. war包中的文件按照一定目录结构来组织,和项目的文件结构保持一致。其根目录下包含有html和jsp文件,或者包含有这两种文件的目录。(META-INF和jar包作用一样)WEB-INF目录下含有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的servlet类和jsp,或者servlet所依赖的其他类(如JavaBean),通常这些所依赖的类也可以打包成jar包放在WEB-INF下的lib目录下。
  2. 那不支持jsp,如果我们直接用纯静态页面的方式,会给我们带来非常大的麻烦,那怎么办呢?Spring Boot推荐使用模板引擎。

    1. 模板引擎
    2. 虽然但是,jsp就相当于是一种模板引擎。模板引擎的作用就是我们来写一个页面模板,比如有些值呢,是动态的,我们写一些表达式。而这些值,从哪来呢,就是我们在后台封装一些数据。然后把这个模板和这个数据交给我们模板引擎,模板引擎按照我们这个数据帮你把这表达式解析、填充到我们指定的位置,然后把这个数据最终生成一个我们想要的内容给我们写出去,这就是我们这个模板引擎,不管是jsp还是其他模板引擎,都是这个思想。只不过呢,就是说不同模板引擎之间,他们可能这个语法有点不一样。Thymeleaf模板引擎,这模板引擎呢,是一个高级语言的模板引擎,他的这个语法更简单。而且呢,功能更强大。