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

原文地址:https://www.cnblogs.com/AmyZheng/p/9799262.html