SpringBoot基础 第二天

news2024/11/24 14:40:25

SpringBoot对静态资源的映射:

(1) 要在src/main/resources文件夹下创建static和templates两个文件夹staitc存储静态资源,templates存储模板引擎

(2)要在pom.xml依赖下导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

 如果导入依赖失败的话 可以尝试添加版本号

示例:创建名为success的页面 并可以访问

首先在templates文件夹下创建网页

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Title</title>
</head>
<body>
<div  th:text="${hello}"> </div>
</body>
</html>

这里的${hello}可以联想成Vue中的{{}}表达式,这里调用了控制器中的方法

然后在控制器写方法

@RequestMapping("/success")
public String hello(Model model){
    model.addAttribute("hello","<h1>zhangsan</h1>");
    return "success";
}

启动服务器 就可以通过端口号进行访问 

Thymeleaf语法

(1)变量表达式:

变量表达式即OGNL表达式或Spring EL表达式(在Spring术语中也叫model attributes)。如下所示: ${session.user.name}
它们将以HTML标签的一个属性来表示:
<span th:text="${book.author.name}"> 

(2)选择表达式

选择表达式很像变量表达式,不过它们用一个预先选择的对象来代替上下文变量容器(map)来执行,如下: *{customer.name}
被指定的object由th:object属性定义:
<div th:object="${book}"> 
 ... 
 <span th:text="*{title}">...</span> 
 ... 
</div>

(3) URL表达式

URL表达式指的是把一个有用的上下文或回话信息添加到URL,这个过程经常被叫做URL重写。不需要指定项目名字
@{/order/list} 
URL还可以设置参数: 
@{/order/details(id=${orderId})} 
让我们看这些表达式:

<form th:action="@{/createOrder}"> 
<a href="main.html" rel="external nofollow" th:href="@{/main}" rel="external n

表达式支持的语法

字面(Literals)
•	文本文字(Text literals): 'one text', 'Another one!',…
•	数字文本(Number literals): 0, 34, 3.0, 12.3,…
•	布尔文本(Boolean literals): true, false
•	空(Null literal): null
•	文字标记(Literal tokens): one, sometext, main,…
文本操作(Text operations)
•	字符串连接(String concatenation): +
•	文本替换(Literal substitutions): |The name is ${name}|
算术运算(Arithmetic operations)
•	二元运算符(Binary operators): +, -, *, /, %
•	减号(单目运算符)Minus sign (unary operator): -
布尔操作(Boolean operations)
•	二元运算符(Binary operators):and, or
•	布尔否定(一元运算符)Boolean negation (unary operator):!, not
比较和等价(Comparisons and equality)
•	比较(Comparators): >, <, >=, <= (gt, lt, ge, le)
•	等值运算符(Equality operators):==, != (eq, ne)
条件运算符(Conditional operators)
If-then: (if) ? (then)
If-then-else: (if) ? (then) : (else)
Default: (value) ?: (defaultvalue)

常用的thymeleaf标签

 

视图控制器:

   @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("login");
        registry.addViewController("/header").setViewName("header");
        registry.addViewController("/index").setViewName("index");
        registry.addViewController("/menu").setViewName("menu");
        registry.addViewController("/add").setViewName("add");
        registry.addViewController("/update").setViewName("update");
        registry.addViewController("/test").setViewName("test");

    }

 拦截器

方法

package com.qcby.DruidConfig;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("前置拦截");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("后置拦截");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("最终拦截");
    }
}

注册

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor())
            .addPathPatterns("/**")
            .excludePathPatterns("/hello2");
}

编写Servlet类:

@Bean
public ServletRegistrationBean myServlet(){
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(new
            MyServlet(),"/myServlet");
    return registrationBean;
}

编写测试类

package com.qcby.Controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        super.doGet(httpServletRequest,httpServletResponse);
        System.out.println("get方法执行了");
    }

    @Override
    protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        super.doPost(httpServletRequest,httpServletResponse);
        System.out.println("Post方法执行了");
    }
}

网页编写

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/myServlet" method="post">
    <input type="text"></br>
    <input type="submit" value="提交">
</form>
</body>
</html>

 输出结果

 

说明配置Servlet方法调用成功

编写Filter

 @Bean
    public FilterRegistrationBean myFilter(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new MyFilter());
        registrationBean.setUrlPatterns(Arrays.asList("/hello","/test"));
        return registrationBean;
    }

@Bean中 要求对/hello /test路径的进行过滤 

package com.qcby.Controller;

import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("处理中");
    }

    @Override
    public void destroy() {
        System.out.println("过滤器结束了");
    }
}

监听器

 @Bean
    public ServletListenerRegistrationBean myListener(){
        ServletListenerRegistrationBean<MyListener> registrationBean = new
                ServletListenerRegistrationBean<>(new MyListener());
        return registrationBean;
    }
package com.qcby.Controller;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("监听器初始化成功");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("监听器摧毁");
    }
}

SpringBoot数据层开发

需要导入的依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-dbcp2</artifactId>
</dependency>

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <scope>runtime</scope>
</dependency>

 在application.yaml中配置数据库的驱动 用户名 密码

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/boot_demo
    driver-class-name: com.mysql.jdbc.Driver
    type: com.zaxxer.hikari.HikariDataSource

配置druid数据库的话

导入依赖

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid</artifactId>
   <version>1.0.9</version>
</dependency>
<dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.15</version>
</dependency>
同上在yaml中配置数据库的基本信息
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/boot_demo
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

创建数据源注册类(可以写在启动类上 不要放在MvcConfig类中,也可以单独写一个配置类)

@Configuration
public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource dataSource(){
        return new DruidDataSource();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1986448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VS项目打包成lib库并使用

一、新建一个静态库项目 一般要把项目设为Release模式 二、添加文件 将所需要打包的头文件、源文件添加到该静态库项目中 三、生成项目 生成成功后即可在Release文件夹出现找到相应的.lib文件 四、使用静态库 将静态库文件复制到项目文件夹中&#xff0c;然后在项目属性设…

LSV实验——部署DR模式集群

目录 一、实验环境 二、配置 1、LVS 2、router 3、client 4、RS 三、配置策略 1.Director服务器采用双IP桥接网络&#xff0c;一个是VPP&#xff0c;一个DIP 2.Web服务器采用和DIP相同的网段和Director连接 3.每个Web服务器配置VIP 4.每个web服务器可以出外网 一、实验环…

CENTOS9+RSYSLOG+LOGROTATE收集日志

系统版版本为CentOS Stream release 9 rsyslog和lograte通常系统已经安装了。 #rpm -qa | grep rsyslog rsyslog-logrotate-8.2310.0-4.el9.x86_64 rsyslog-8.2310.0-4.el9.x86_64 rsyslog-gnutls-8.2310.0-4.el9.x86_64 rsyslog-gssapi-8.2310.0-4.el9.x86_64 rsyslog-relp-…

常见中间件漏洞(三、Jboss合集)

目录 三、Jboss Jboss介绍 3.1 CVE-2015-7501 漏洞介绍 影响范围 环境搭建 漏洞复现 3.2 CVE-2017-7504 漏洞介绍 影响范围 环境搭建 漏洞复现 3.3 CVE-2017-12149 漏洞简述 漏洞范围 漏洞复现 3.4 Administration Console弱囗令 漏洞描述 影响版本 环境搭建…

Netty技术全解析:ByteToMessageCodec类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

Qt/C++最新地图组件发布/历时半年重构/同时支持各种地图内核/包括百度高德腾讯天地图

一、前言说明 最近花了半年时间&#xff0c;专门重构了整个地图组件&#xff0c;之前写的比较粗糙&#xff0c;有点为了完成功能而做的&#xff0c;没有考虑太多拓展性和易用性。这套地图自检这几年大量的实际项目和用户使用下来&#xff0c;反馈了不少很好的建议和意见&#…

【技巧】IDEA 个性化配置

【技巧】IDEA 个性化配置 自动补全 关闭大小写区分 自动导包 插件 Rainbow Brackets 彩色括号 更容易区分是哪个括号

【LVS】负载均衡之NAT模式

一、LVS概念 LVS&#xff08;Linux Virtual Server&#xff09;是一个基于Linux操作系统的虚拟服务器技术&#xff0c;用于实现负载均衡和高可用性。LVS通过将客户端的请求分发到多台后端服务器上&#xff0c;从而提高整体服务的处理能力和可靠性。 二、LVS优势 高性能&…

Centos安装OpenJDK

使用yum包管理器搜索可用的OpenJDK包 sudo yum search openjdk根据你的需求选择合适的OpenJDK版本进行安装 sudo yum install java-1.8.0-openjdk.x86_64安装完成后&#xff0c;验证安装是否成功 java -version

MS2201BP以太网收发电路

MS2201BP 是吉比特以太网收发器电路&#xff0c;可以实现 超高速度的全双工数据传输。它的通信遵从 IEEE 802.3 Gigabit Ethernet 协议中的 10 比特接口的时序要求协 议 。 MS2201BP 支 持 数 据 传 输 速 率 从 1Gbps 到 1.85Gbps 。 主要特点 ◼ 电源电压&#xff…

实验24.创建并挂载文件系统

已完成实验 已完成实验链接 简介 实验 24. 创建并挂载文件系统 总结 创建文件系统: 初始化每一个分区的结构&#xff0c;把扇区划分为超级块&#xff0c;扇区位图&#xff0c;inode 位图&#xff0c;inode 表&#xff0c;根目录&#xff0c;空闲扇区 挂载分区: 创建一个分…

学习STM32(4)--STM32单片机定时器的应用

1 引 言 在STM32单片机的开发中&#xff0c;定时器是一个非常重要的模块&#xff0c;可以用于实现精准的时间控制和周期性的任务。在STM32F103系列单片机中&#xff0c;常见的定时器包括基本定时器、通用定时器和高级定时器。 2 实验目的 1.掌握STM32F103的基本定时器的使…

HAL库源码移植与使用之ADC

ADC类型&#xff1a; F1 F4 H4 H7用的都是逐次递进式 ADC电气特性&#xff1a; 该ADC只能承受3.6v以下电压 F1时钟不能超过14Mhz 流程顺序&#xff1a;先配置好1参考电压和芯片电源&#xff0c;再配置2电压输入通道并通过模拟多路开关选择通路到注入通道或规则通道&#xff0…

Spring AI -快速开发ChatGPT应用

Spring AI介绍 Spring AI是AI工程师的一个应用框架&#xff0c;它提供了一个友好的API和开发AI应用的抽象&#xff0c;旨在简化AI应用的开发工序&#xff0c;例如开发一款基于ChatGPT的对话、图片、音频等应用程序。 Spring AI已经集成了OpenAI的API&#xff0c;因此我们不需…

【虚拟化】KVM使用virt-manager部署及管理虚拟机

目录 一、KVM 概述 二、KVM工作原理 三、部署KVM 四、新建虚拟机步骤 4.1 创建存储池并创建存储卷 4.1.1 创建存储池 4.1.2 创建存储卷 4.3 创建ISO存储池 4.4 生成新的虚拟机 一、KVM 概述 KVM 是 Kernel-based Virtual Machine 的缩写&#xff0c;是一种用于虚拟化的…

LeetCode LCR147.最小栈

LeetCode LCR147.最小栈 思路&#x1f914;&#xff1a; 建立两个栈&#xff0c;一个栈正常入栈出栈&#xff0c;一个栈只用于出入最小数&#xff0c;当push值小于minst栈顶才入栈&#xff0c;当pop值等于minst栈顶才出栈。 代码&#x1f50e;&#xff1a; class MinStack { pu…

如何通过JavaScript提升逻辑判断的可读性?

在前端开发过程中&#xff0c;我们经常会遇到需要根据不同条件执行不同逻辑的场景。对于初学者来说&#xff0c;这样的逻辑判断可能会导致代码冗长且难以维护。那么&#xff0c;如何才能写出既简洁又易读的代码呢&#xff1f;本文将带你逐步优化 JavaScript 中的条件判断&#…

重塑电商新风尚:优选免单策略的深度解析

在当今电商领域&#xff0c;一种创新的销售策略——优选免单模式正悄然兴起。这一模式巧妙融合了价格策略、激励机制与社交互动&#xff0c;旨在激发消费者的购买潜能&#xff0c;引领销售业绩的飞跃式增长。 一、合规创新&#xff0c;重塑激励机制 我们秉承合法合规的原则&am…

API-EXPLORER项目开发笔记(一)

文章目录 前言一、我为什么要做这个项目&#xff1f;二、项目简单介绍三、项目技术栈总结 前言 最近接触到了接口平台这个东西&#xff0c;非常感兴趣&#xff0c;于是就想自己也动手做一个具备核心功能的接口平台&#xff0c;本篇文章主要介绍了做这个项目的初衷以及简单介绍…

DispatcherServlet 源码分析

一.DispatcherServlet 源码分析 本文仅了解源码内容即可。 1.观察我们的服务启动⽇志: 当Tomcat启动之后, 有⼀个核⼼的类DispatcherServlet, 它来控制程序的执⾏顺序.所有请求都会先进到DispatcherServlet&#xff0c;执⾏doDispatch 调度⽅法. 如果有拦截器, 会先执⾏拦截器…