zoukankan      html  css  js  c++  java
  • SprintBoot学习(三)

    Thymeleaf模板引擎

    1、thymeleaf是一个Java类库,,他是xml/xhtml/html5的模板引擎可以作为view层

    2、themeleaf基本语法

    • 引入thymeleaf
      <!--引入Thymeleaf-->
      <html xmlns:th="http://www.thymeleaf.org">

      将镜头页面转换成动态的视图,要进行动态处理的元素将使用“th:”为前缀

    • 访问model中的数据
      <div class="panel-body">
              <!--通过${}访问model中的属性-->
              <span th:text="${singlePerson.name}"></span>
          </div>

      需要处理的动态内容需要加上“th:”前缀

    • model中的数据迭代
      <div class="panel-body">
          <ul class="list-group">
              <!--通过th:each 来迭代数据-->
              <li class="list-grop-item" th:each="person:${people}">
                  <span th:text="${person.name}"></span>
                  <span th:text="${person.age}"></span>
              </li>
          </ul>
      </div>

      person做为迭代元素来使用,然后像上面一样访问迭代元素中的属性

    • 数据判断
      <!--通过${not #lists.isEmpty(people)} 来判断数据。Thymeleaf 支持> 、<、>=、<=、  == 、!= 作为比较条件,同时也支持将Spring EL表达式语言用于条件中-->
      <div th:if="${not #lists.isEmpty(people)}">

      Thymeleaf 支持> 、<、>=、<=、  == 、!= 作为比较条件,同时也支持将Spring EL表达式语言用于条件中

    3、测试案例:

    • 新建spring-boot项目
    •  新建一个JavaBean
      package com.example.spring_boot_thymeleaf_test.entity;
      
      /**
       * @Author: Amy
       * @Date: 2018/10/16
       * @Time: 17:23
       * Description:
       */
      public class Person {
      
          private  String name ;
      
          private  Integer age;
      
          public Person(){
      
              super();
          }
          
          public Person(String name , Integer age ){
      
              super();
              this.age=age;
              this.name=name;
      
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public Integer getAge() {
              return age;
          }
      
          public void setAge(Integer age) {
              this.age = age;
          }
      }
    • 启动类(controller和启动类在同一个类中)
      package com.example.spring_boot_thymeleaf_test;
      
      import com.example.spring_boot_thymeleaf_test.entity.Person;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      import java.util.ArrayList;
      import java.util.List;
      @Controller
      @SpringBootApplication
      public class SpringBootThymeleafTestApplication {
      
          public static void main(String[] args) {
      
              SpringApplication.run(SpringBootThymeleafTestApplication.class, args);
          }
      
          @RequestMapping("/")
          public String index(Model model){
              Person single = new Person("Amy",21);
              List<Person> people = new ArrayList<Person>();
              Person p1 = new Person("旋涡鸣人",12);
              Person p2 = new Person("佐助",12);
              people.add(p1);
              people.add(p2);
              model.addAttribute("singlePerson",single);
              model.addAttribute("people",people);
              return  "index";
          }
      
      
      }

      当启动类和controller在同一个类的时候,要使用@controller注解

    • controller类(controller和启动类不在同一个类中)
      package com.example.spring_boot_thymeleaf_test;
      
      import com.example.spring_boot_thymeleaf_test.entity.Person;
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.servlet.ModelAndView;
      
      import java.util.ArrayList;
      import java.util.List;
      
      /**
       * @Author: Amy
       * @Date: 2018/10/17
       * @Time: 17:12
       * Description:
       */
      @Controller
      @RequestMapping("/test")
      public class TestController {
         /* @RequestMapping("/index")
          public String index(Model model){
              Person single = new Person("Amy",21);
              List<Person> people = new ArrayList<Person>();
              Person p1 = new Person("旋涡鸣人",12);
              Person p2 = new Person("佐助",12);
              people.add(p1);
              people.add(p2);
              model.addAttribute("singlePerson",single);
              model.addAttribute("people",people);
              return  "index";
          }*/
          @RequestMapping("/index")
          public ModelAndView index(){
              ModelAndView model = new ModelAndView("/index");
              Person single = new Person("Amy",21);
              List<Person> people = new ArrayList<Person>();
              Person p1 = new Person("旋涡鸣人",12);
              Person p2 = new Person("佐助",12);
              people.add(p1);
              people.add(p2);
              model.addObject("singlePerson",single);
              model.addObject("people",people);
              return model;
          }
      }

      当启动类和controller不在同一个类的时候,启动类要放在根目录下,启动类上使用了注解@SpringBootApplication会默认扫描启动类的所在的包和子包下面所有的注解;如果controller和启动类不在同一个包需要使用注解@ComponentScan来指定扫描的包

    • index页面
      <!DOCTYPE html>
      <!--将镜头页面转换成动态的视图,要进行动态处理的元素将使用“th:”为前缀-->
      <!--引入Thymeleaf-->
      <html xmlns:th="http://www.thymeleaf.org">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
          <!--引入Bootstrap-->
          <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
          <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
      </head>
      <!--通过@{}引用web静态资源,引入jQuery-->
      <script th:src="@{jquery-3.3.1.min.js}" type="text/javascript"></script>
      <body>
      <div class="panel panel-primary">
          <div class="panel-heading">
              <h3 class="panel-title">访问model</h3>
          </div>
          <div class="panel-body">
              <!--通过${}访问model中的属性-->
              <span th:text="${singlePerson.name}"></span>
          </div>
      </div>
      <!--通过${not #lists.isEmpty(people)} 来判断数据。Thymeleaf 支持> 、<、>=、<=、  == 、!= 作为比较条件,同时也支持将Spring EL表达式语言用于条件中-->
      <div th:if="${not #lists.isEmpty(people)}">
          <div class="panel panel-primary">
              <div class="panel-heading">
                  <h3 class="panel-title">列表</h3>
              </div>
              <div class="panel-body">
                  <ul class="list-group">
                      <!--通过th:each 来迭代数据-->
                      <li class="list-grop-item" th:each="person:${people}">
                          <span th:text="${person.name}"></span>
                          <span th:text="${person.age}"></span>
                      </li>
                  </ul>
              </div>
          </div>
      </div>
      </body>
      </html>
    • 运行结果,浏览器访问http://localhost:8080/test/index 或者http://localhost:8080/ 页面如下

    Servlet、Filter、Listener的注册

    1、直接注册Bean

    • Servlet注册测试
      package com.example.spring_boot_thymeleaf_test.servlet;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.io.PrintWriter;
      
      /**
       * @Author: Amy
       * @Date: 2018/12/5
       * @Time: 17:10
       * Description:
       */public class HelloServlet extends HttpServlet {
      
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              System.out.println("GET");
              request.setCharacterEncoding("UTF-8");
              response.setCharacterEncoding("UTF-8");
              // 向客户端生成响应数据
              response.setContentType("text/html;charset=UTF-8");
              PrintWriter w = response.getWriter();
              w.println("<h1 style='text-align:center;color:blue;'>Hello, Servlet!</h1>");
          }
      }

      配置类

      @Configuration
      public class WebCofig {
          @Bean
          public HelloServlet helloServlet(){
              return  new HelloServlet();
          }
      
      }
    • Filter注册测试
      package com.example.spring_boot_thymeleaf_test.filter;
      
      import javax.servlet.*;
      import java.io.IOException;
      
      /**
       * @Author:Amy
       * @Date: 2018/12/5
       * @Time: 17:32
       * Description:
       */public class HelloFilter implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
              System.out.println( "Filter Init" );
      
          }
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              System.out.println( "Hello" );
              filterChain.doFilter( servletRequest, servletResponse );
              System.out.println( "Filter" );
          }
      
          @Override
          public void destroy() {
              System.out.println("Filter Destroy");
      
          }
      }

      配置类

       @Bean
          public HelloFilter helloFilter(){
              return new HelloFilter();
          }
    • Listener注册测试
      package com.example.spring_boot_thymeleaf_test.listener;
      
      import javax.servlet.DispatcherType;
      import javax.servlet.ServletRequest;
      import javax.servlet.ServletRequestEvent;
      import javax.servlet.ServletRequestListener;
      import javax.servlet.http.HttpServletRequest;
      
      /**
       * @Author: Amy
       * @Date: 2018/12/5
       * @Time: 17:38
       * Description:
       */
      public class RequestLifecycleListener implements ServletRequestListener {
      
          @Override
          public void requestDestroyed(ServletRequestEvent event) {
              ServletRequest req = event.getServletRequest();
              HttpServletRequest request = (HttpServletRequest) req ;
              String uri = request.getRequestURI();
              DispatcherType type = request.getDispatcherType();
              String name = req.getLocalName();
              System.out.println(  "来自"+name+"请求类型为"+type + " ,请求路径是 " + uri +"的请求结束");
          }
      
          @Override
          public void requestInitialized(ServletRequestEvent event) {
              ServletRequest req = event.getServletRequest();
              HttpServletRequest request = (HttpServletRequest) req ;
              String uri = request.getRequestURI();
              DispatcherType type = request.getDispatcherType();
              String name = req.getLocalName();
              System.out.println( "接收到请求:来自" +name+"的请求,请求类型为"+type + " ,请求路径是 " + uri );
      
          }
      
      }

      配置类

      @Bean
          public RequestLifecycleListener requestLifecycleListener(){
              return  new RequestLifecycleListener();
          }

    2、通过RegistrationBean

    • Servlet注册配置文件
      @Bean
          public ServletRegistrationBean servletRegistrationBean(){
              return  new ServletRegistrationBean(new HelloServlet(),"/hello/*");
          }
    • Filter注册配置文件
        @Bean
          public FilterRegistrationBean filterRegistrationBean(){
              FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
              filterRegistrationBean.addUrlPatterns("/hello");
              filterRegistrationBean.setFilter(new HelloFilter());
              return  filterRegistrationBean;
          }
    • Listener注册配置文件
        @Bean
          public ServletListenerRegistrationBean servletListenerRegistrationBean(){
              return new ServletListenerRegistrationBean(new RequestLifecycleListener());
          }

    3、使用注解

    • Servlet注册
      @WebServlet("/hello/*")

      启动类增加@ServletComponentScan注解,会扫描到相关组件

    • Filter注册
      @WebFilter("/hello")
    • Listener注册
      @WebListener

     配置Tomcat

     1、使用配置文件进行配置

    ####配置servlet容器
    #修改端口号
    server.port=8080
    #修改访问路径,默认是/
    server.servlet.context-path=/springboot
    ####配置Tomcat
    #配置Tomcat的编码
    server.tomcat.uri-encoding=utf-8

    2、使用配置类进行配置

    package com.example.spring_boot_thymeleaf_test;
    
    import org.apache.catalina.connector.Connector;
    import org.apache.coyote.http11.Http11NioProtocol;
    import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
    import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
    import org.springframework.boot.web.server.WebServerFactory;
    import org.springframework.boot.web.server.WebServerFactoryCustomizer;
    /**
     * @Author: Amy
     * @Date: 2018/12/5
     * @Time: 19:01
     * Description:
     */
    public class ServletContainerConfig implements WebServerFactoryCustomizer {
        @Override
        public void customize(WebServerFactory factory) {
            ((TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
                @Override
                public void customize(Connector connector) {
                    Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                    protocol.setPort(8081);
                }
            });
    
        }
    
    }

    Spring Boot2.0以上使用WebServerFactoryCustomizer接口替换EmbeddedServletContainerCustomizer组件完成对嵌入式Servlet容器的配置。

     替换Tomcat

    1、替换为jetty

         <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jetty</artifactId>
                <version>2.0.6.RELEASE</version>
            </dependency>

    2、替换为Undertow

           <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-undertow</artifactId>
                <version>2.0.6.RELEASE</version>
            </dependency>

    推荐博客

    https://blog.csdn.net/pml18710973036/article/details/60764496

    https://blog.csdn.net/caychen/article/details/80351936

    https://blog.csdn.net/Hard__ball/article/details/81281898

    转载请于明显处标明出处

    https://www.cnblogs.com/AmyZheng/p/9799262.html

  • 相关阅读:
    char nvarchar varchar
    第32月第8天 打包 Framework 时使用 CocoaPods 引入第三方库的方法
    第31月第25天 xcode debug 限制uitextfiled输入
    第31月第22天 draw
    第31月第19天 NV12
    第31月第17天 resolveInstanceMethod
    第31月第15天 -fembed-bitcode
    第31月第10天 tableview头部空白 Other Linker Flags rtmp
    第31月 第9天 责任链AppDelegate
    第30月第18天 autolayout代码
  • 原文地址:https://www.cnblogs.com/AmyZheng/p/9799262.html
Copyright © 2011-2022 走看看