👨🎓 Автор: Java Academic Party
✏️ Блог: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
Принцип: сопоставьте весь файл с объектом, который используется при наличии большого количества настраиваемых элементов конфигурации.
Шаги для использования:
- Необходимо создать класс сущностей, и функция этого класса сущностей состоит в том, чтобы получить значение атрибута атрибута в основном файле конфигурации.
// 这个注解作用是:创建这个类的对象
@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;
}
- Используйте значения атрибутов в этом классе сущностей в других классах. Здесь в классе контроллера используется этот экземпляр объекта.
@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 требует настройки:
- Добавьте зависимость для обработки JSP. Отвечает за компиляцию файлов JSP.
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>10.1.0-M8</version>
</dependency>
- Если вам нужны другие зависимости, вам нужно добавить другие зависимости. Например: сервлет...
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
-
Создайте каталог для хранения файлов JSP, обычно называемый webapp.
Когда мы создали эту папку веб-приложения, это был обычный файл. На этом этапе вам нужно изменить свойства этого файла в структуре проекта, чтобы сделать этот файл папкой веб-ресурса.
-
Вам необходимо указать каталог, в котором хранятся скомпилированные файлы 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
- Создать контроллер, получить доступ к 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";
}
}
- Настройте парсер в файле 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:
- Создайте класс для реализации интерфейса 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 {
}
}
- Перехватчики должны быть объявлены в файле конфигурации SpringMVC.
<mvc:interceptors>
<mvc:interceptor>
<mvc:path="url/>
<bean class="拦截器类全限定名称"/>
</mvc:interceptor>
</mvc:interceptors>
Реализуйте пользовательские перехватчики в SpringBoot:
- Создайте класс перехватчика
// 自定义拦截器
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;
}
}
- Внедрите перехватчик в контейнер 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);
}
}
- Учитывая два пути запроса, проверьте, что перехватчик работает
@Controller
public class BootController {
@RequestMapping("/user/account")
@ResponseBody
public String userAccount(){
return "访问user/account地址";
}
@RequestMapping("/user/login")
@ResponseBody
public String userLogin(){
return "访问user/login地址";
}
}
- Запустите основной класс запуска SpringBoot и запросите путь запроса контроллера, чтобы проверить, можно ли его перехватить.
@SpringBootApplication
public class SpringBootInterceptorApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootInterceptorApplication.class, args);
}
}
2.2 Использование сервлета в SpringBoot
- ServletRegistrationBean используется для регистрации сервлета в контейнере servlet3.0+, но он удобен SpringBoot.
Использование шагов сервлета в SpringBoot:
- определить сервлет
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();
}
}
- Зарегистрировать объект сервлета
@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
- Создать пользовательский класс фильтра
// 自定义过滤器
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);
}
}
- Внедрить пользовательские фильтры в контейнер spirng
// 将自定义的过滤器配置到spring容器中
@Configuration
public class WebApplicationConfig {
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new MyFilter());
bean.addUrlPatterns("/user/*");
return bean;
}
}
- Используйте фильтр в контроллере для обработки запроса
@Controller
public class MyController {
@RequestMapping("/user/account")
@ResponseBody
public String userAccount(){
return "/user/account";
}
}
Исходный код вышеуказанных проектов, нажмите на планету, чтобы получить бесплатнопланета(Адрес Github) Если нет партнера Github. Вы можете следить за моей общедоступной учетной записью WeChat:Академическая вечеринка Java, высылайте SpringBoot, а исходный код проекта высылайте всем бесплатно.Код проверен редактором и абсолютно надежен. Бесплатное использование.