Второй пункт основного приложения SpringBoot

Spring Boot Spring
Второй пункт основного приложения SpringBoot

👨‍🎓 Автор: Java Academic Party

🏦Склад:Github,Gitee

✏️ Блог:CSDN,Наггетс,InfoQ,Облако + сообщество

💌Общественный номер: Java Academic Party

🚫Особое заявление: Быть оригинальным непросто, и перепечатка или плагиат без разрешения запрещены.Если вам нужно перепечатать, вы можете обратиться к редактору за разрешением.

🙏Заявление об авторских правах: часть текста или изображений в статье взяты из Интернета и энциклопедии Baidu.Если есть какие-либо нарушения, пожалуйста, свяжитесь с редактором как можно скорее. Публичный аккаунт поиска WeChatАкадемическая вечеринка JavaСвяжитесь с Сяобянь.

☠️Ежедневный ядовитый куриный бульон: Это общество несправедливо, не жалуйтесь, потому что оно бесполезно! Люди всегда прогрессируют в размышлениях!

👋 Всем привет! я твой старый другАкадемическая вечеринка Java, У меня давно не было времени писать статьи, а в последнее время я был занят поиском работы. У меня не так много времени, чтобы делиться с вами статьями.С сегодняшнего дня я буду продолжать выпускать для вас новые технические статьи, и я надеюсь, что вы окажете больше поддержки. Спасибо спасибо~~💓💓💓

1.3 Пользовательская конфигурация

  • В основном файле конфигурации SpringBoot, помимо использования встроенных элементов конфигурации, мы также можем настроить конфигурацию, а затем использовать следующие аннотации для чтения настроенных значений атрибутов.

1.3.1 Аннотация @value

Формат синтаксиса:@value("${key}"). Ключ находится в основном файле конфигурации application.properties (yml).

Таким образом, мы можем получить исходные свойства в application.properties|yml и значения свойств пользовательских свойств.

  • В application.properties есть как примитивные, так и пользовательские свойства.

# 设置端口号
server.port=8082
​
# 设置上下文路径
server.servlet.context-path=/myBoot
​
# 自定义属性key=value
school.name=程云博
school.website=https://github.com/yunbocheng
school.address=河北承德
​
school=重返计划
  • На этом этапе в любом классе SpringBoot значение атрибута, используемое для пары атрибутов в основном файле конфигурации, можно получить с помощью аннотации @Value.

// 以下是在Controller层中获取到的主配置文件中属性的属性值。
@Controller
public class HelloController {
​
    // 我们使用 @Value 注解来获取配置文件中 server.port属性对应的属性值。
    @Value("${server.port}")
    private Integer port;
​
    @Value("${server.servlet.context-path}")
    private String contextPath;
​
    @Value("${school.name}")
    private String schoolName;
​
    @Value("${school.website}")
    private String schoolWebsite;
​
    @Value("${school.address}")
    private String schoolAddress;
​
    // 这个注解是请求的路径信息。请求路径如果是:localhost:8082/myBoot/hello,那么就执行这个方法
    @RequestMapping(value = "/hello")
    // 这个注解的作用是:告诉容器返回的是一个字符串,不是返回的一个试图,跳转页面。
    @ResponseBody
    public String queryData(){
        return "学校名字=" + schoolName + ",学校地址=" + schoolAddress + ",学校网站="
                + schoolWebsite + ",项目端口号=" + port + ",项目路径=" + contextPath;
    }
}

1.3.2 Аннотация @ConfigurationProperties

Принцип: сопоставьте весь файл с объектом, который используется при наличии большого количества настраиваемых элементов конфигурации.

Шаги для использования:

  1. Необходимо создать класс сущностей, и функция этого класса сущностей состоит в том, чтобы получить значение атрибута атрибута в основном файле конфигурации.

// 这个注解作用是:创建这个类的对象
@Component
// 这个注解的作用是:主配置文件中属性的开头,也就是配置属性的前缀
@ConfigurationProperties(prefix = "school")
// 添加lombok,省略Getter、Setter方法、有参构造、以及toString()方法
@Data
// 添加无参构造
@NoArgsConstructor
public class SchoolInfo {
​
    // 这个成员属性的名字和主配置文件中的属性名必须保持一致。
    // 主配置:school.name=程云博 school.website=https://github.com/yunbocheng school.address=河北承德
    // 这样就可以把程云博赋值给以下的name属性。
    private String name;
​
    private String website;
​
    private String address;
​
}
  1. Используйте значения атрибутов в этом классе сущностей в других классах. Здесь в классе контроллера используется этот экземпляр объекта.

@Controller
public class HelloController {
​
    // 这个注解的作用是:使用自动注入的方式来获取这个对象。
    // 先使用byName方式来寻找一个info对象。当对象不存在的时候使用byType方式来寻找SchoolInfo这个类。
    // 因为这里不存在info这个对象。所以就使用byType的方式来寻找SchoolInfo这个类/之后发现SchoolInfo
    // 这个类中存在@Component这个注解,就可以创建出一个该类的对象。
    @Resource
    private SchoolInfo info;
​
​
    @RequestMapping(value = "/data")
    @ResponseBody
    public String queryData2(){
        return info.toString();
    }
}

Конкретную реализацию см. в проекте: SpringBoot-custom-yml.

1.4 Использование JSP в SpringBoot

Примечание: JSP не рекомендуется использовать в SpringBoot, а сама SpringBoot по умолчанию не поддерживает JSP.Вам необходимо импортировать зависимости JSP в pom.xml.

Если вы просто используете JSP, вы можете добавить зависимости JSP. Но если вы хотите использовать servert, вы должны добавить зависимости сервлета.

SpringBoot отказывается от JSP и использует технологию шаблонов вместо JSP.

Использование JSP требует настройки:

  1. Добавьте зависимость для обработки JSP. Отвечает за компиляцию файлов JSP.

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>10.1.0-M8</version>
        </dependency>
  1. Если вам нужны другие зависимости, вам нужно добавить другие зависимости. Например: сервлет...

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
  1. Создайте каталог для хранения файлов JSP, обычно называемый webapp.

    Когда мы создали эту папку веб-приложения, это был обычный файл. На этом этапе вам нужно изменить свойства этого файла в структуре проекта, чтобы сделать этот файл папкой веб-ресурса.

  2. Вам необходимо указать каталог, в котором хранятся скомпилированные файлы JSP, в файле pom.xml.META-INF/resources


    <build>
        <!-- 指定jsp文件编译之后的存放目录-->
        <resources>
            <resource>
                <!-- jsp原来的目录-->
                <directory>src/main/webapp</directory>
                <!-- 指定编译后的存放目录-->
                <targetPath>META-INF/resources</targetPath>
                <!-- 指定处理的目录和文件 -->
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.2.2.RELEASE</version>
            </plugin>
        </plugins>
    </build
  1. Создать контроллер, получить доступ к JSP

@Controller
public class JspController {
​
    public String doJsp(HttpServletRequest request){
​
        // 将数据存储到request作用域中
        request.setAttribute("data","SpringBoot使用了JSP");
        // 试图的逻辑名称
        return "index.jsp";
    }
​
    @RequestMapping(value = "/jsp")
    // 此时这个String返回值代表的是视图,用于跳转界面。而不是简单的返回一个字符串
    public String doJsp(Model model){
        model.addAttribute("data","SpringBoot使用了JSP");
        return "index.jsp";
    }
}
  1. Настройте парсер в файле application.properties

server.port=8083
server.servlet.context-path=/myJsp
​
# 配置视图解析器
# 配置试图解析器前缀。/ 代表的是:src/main/webapp
spring.mvc.view.prefix=/
# 配置试图解析器后缀。 .jsp
spring.mvc.view.suffix=.jsp

1.5 Использование ApplicationContext в SpringBoot

  • В основном методе метод SpringApplication.run() получает возвращенный объект-контейнер Spring и вызывает его после получения бизнес-компонента.
  • Через SpringApplication.run(Application.class, args): возвращаемое значение — это контейнер ApplicationContext.

1.6 Интерфейс CommandLineRunner

  • Такой сценарий может быть в разработке. Нужно что-то выполнить после запуска контейнера. Например, чтение файлов конфигурации, ссылок на базы данных и тому подобное. SpringBoot предоставляет нам два интерфейса, которые помогут нам выполнить это требование. Два интерфейса — это CommandLineRunner и ApplicationRunner. Их время выполнения - когда контейнер запущен и завершен.В этих двух интерфейсах есть метод запуска, и нам нужно только реализовать этот метод. Разница между этими двумя интерфейсами: Параметры метода запуска в ApplicationRunner:ApplicationArguments, а параметры метода run в интерфейсе CommandLineRunner:Строковый массив.
  • В обоих этих интерфейсах есть метод run, время выполнения — после создания объекта-контейнера, а метод run() выполняется сам по себе. Вы можете выполнить некоторые пользовательские операции, созданные в объекте-контейнере.

@FunctionalInterface
public interface CommandLineRunner{
  void run(String...args) yhrows Exception;
}
​
@FunctionalInterface
public interface ApplicationRunner{
  void run(ApplicationArguments args) throws Exception;
}

2. Глава 2: Веб-компоненты SpringBoot

2.1 Перехватчики

  • Перехватчик — это объект в SpringMVC, который может перехватывать запросы к контроллеру. В структуре перехватчиков есть систематические перехватчики, и вы также можете настроить перехватчики для предварительной обработки запросов.

Реализация пользовательских перехватчиков в SpringMVC:

  1. Создайте класс для реализации интерфейса HandlerInterceptor платформы SpringMVC.
public interface HandlerInterceptor {
   // 这个方法返回值是boolean类型。返回true时,可以进行处理。返回为false时,请求被拦截。
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
​
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
​
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}
  1. Перехватчики должны быть объявлены в файле конфигурации SpringMVC.

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:path="url/>
        <bean class="拦截器类全限定名称"/>
    </mvc:interceptor>
</mvc:interceptors>

Реализуйте пользовательские перехватчики в SpringBoot:

  1. Создайте класс перехватчика
// 自定义拦截器
public class LoginInterceptor implements HandlerInterceptor {
​
    /**
     *
     * @param request
     * @param response
     * @param handler 被拦截的控制器对象
     * @return boolean
     *         true:请求能被 Controller处理
     *         false:请求被拦截
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行了拦截器的方法!");
        return true;
    }
}
  1. Внедрите перехватчик в контейнер Spring. Укажите, какой адрес запроса этот перехватчик перехватывает/не перехватывает.
@Configuration
public class MyAppConfig implements WebMvcConfigurer {
​
    // 添加拦截器对象,注入到容器中
​
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
​
        // 创建拦截器对象
        HandlerInterceptor interceptor = new LoginInterceptor();
​
        // 指定拦截的请求地址。这个代表以user开头的地址全部的拦截
        String path [] = {"/user/**"};
        // 指定不拦截的请求地址。
        String excludePath [] = {"/user/login"};
        // addInterceptor() :添加拦截器的方法
        // addPathPatterns():添加拦截器拦截的路径的方法
        // excludePathPatterns() : 添加拦截器忽略拦截路径的方法。
        registry.addInterceptor(interceptor)
                .addPathPatterns(path)
                .excludePathPatterns(excludePath);
​
​
    }
}
  1. Учитывая два пути запроса, проверьте, что перехватчик работает
@Controller
public class BootController {
​
    @RequestMapping("/user/account")
    @ResponseBody
    public String userAccount(){
        return "访问user/account地址";
    }
​
    @RequestMapping("/user/login")
    @ResponseBody
    public String userLogin(){
        return "访问user/login地址";
    }
}
  1. Запустите основной класс запуска SpringBoot и запросите путь запроса контроллера, чтобы проверить, можно ли его перехватить.
@SpringBootApplication
public class SpringBootInterceptorApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(SpringBootInterceptorApplication.class, args);
    }
​
}

2.2 Использование сервлета в SpringBoot

  • ServletRegistrationBean используется для регистрации сервлета в контейнере servlet3.0+, но он удобен SpringBoot.

Использование шагов сервлета в SpringBoot:

  1. определить сервлет
public class MyServlet extends HttpServlet {
​
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 使用HttpServletResponse输出数据,应答结果
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out =  resp.getWriter();
        out.println("执行的是Servlet");
        out.flush();;
        out.close();
    }
}
  1. Зарегистрировать объект сервлета
@Configuration
public class WebApplicationConfig {
​
    // 定义方法,注册Servlet对象
    @Bean
    public ServletRegistrationBean servletRegistrationBean(){
        // public ServletRegistrationBean(T servlet,String... urlMappings)
        // 第一个参数是 Servlet对象,第二个是url地址
        ServletRegistrationBean bean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
        return bean;
    }
}

2.3 Регистрация фильтра в SpringBoot

  • Фильтр — это фильтр в спецификации сервлета, который может обрабатывать запросы и настраивать параметры и атрибуты запроса. Кодировки символов часто обрабатываются в фильтрах.
  • SpringBoot использует FilterRegistrationBean для регистрации объектов Filter.

Использование фильтра в SpringBoot

  1. Создать пользовательский класс фильтра

// 自定义过滤器
public class MyFilter implements Filter {
​
​
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行了MyFilter");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
  1. Внедрить пользовательские фильтры в контейнер spirng
// 将自定义的过滤器配置到spring容器中
@Configuration
public class WebApplicationConfig {
​
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new MyFilter());
        bean.addUrlPatterns("/user/*");
        return bean;
    }
}
  1. Используйте фильтр в контроллере для обработки запроса
@Controller
public class MyController {
​
    @RequestMapping("/user/account")
    @ResponseBody
    public String userAccount(){
        return "/user/account";
    }
}

Исходный код вышеуказанных проектов, нажмите на планету, чтобы получить бесплатнопланета(Адрес Github) Если нет партнера Github. Вы можете следить за моей общедоступной учетной записью WeChat:Академическая вечеринка Java, высылайте SpringBoot, а исходный код проекта высылайте всем бесплатно.Код проверен редактором и абсолютно надежен. Бесплатное использование.