Spring基础学习
Spring(Rob Johnson)入门
依赖注入(DI):由Spring Beans来整合类,来实现类之间依赖关系,也是IoC(控制反转)
Maven(内行,专家)
-
目录结构:
${basedir}
表示Java工程的根路径目录 目的 ${basedir} 存放pom.xml和所有的子目录 ${basedir}/src/main/java 项目的java源代码 ${basedir}/src/main/resources 项目的资源,比如说property文件,springmvc.xml ${basedir}/src/test/java 项目的测试类,比如说Junit代码 ${basedir}/src/test/resources 测试用的资源 ${basedir}/src/main/webapp/WEB-INF web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面 ${basedir}/target 打包输出目录 ${basedir}/target/classes 编译输出目录 ${basedir}/target/test-classes 测试编译输出目录 Test.java Maven只会自动运行符合该命名规则的测试类 ~/.m2/repository Maven默认的本地仓库目录位置 -
POM(Project Object Model 项目对象模型)
-
(坐标)必须:
节点 描述 project 工程的根标签。 modelVersion 模型版本需要设置为 4.0。 groupId 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.companyname.project-group 拥有所有的和银行相关的项目。 artifactId 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。 version 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如: com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1
-
Maven属性
节点 描述 properties 属性 java.version java的版本 maven.compiler.source Maven编译源代码的JDK版本 project.build.sourceEncoding 文件编码格式UTF-8 maven.compiler.target Maven打包源代码的JDK版本 -
依赖管理dependency
-
插件体系plugins
-
-
构建生命周期
阶段 处理 描述 验证 validate 验证项目 验证项目是否正确且所有必须信息是可用的 编译 compile 执行编译 源代码编译在此阶段完成 测试 Test 测试 使用适当的单元测试框架(例如JUnit)运行测试。 包装 package 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包 检查 verify 检查 对集成测试的结果进行检查,以保证质量达标 安装 install 安装 安装打包的项目到本地仓库,以供其他项目使用 部署 deploy 部署 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 Maven 有以下三个标准的生命周期:
- clean:项目清理的处理
- default(或 build):项目部署的处理
- site:项目站点文档创建的处理
-
Maven仓库:运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
-
本地仓库:Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>C:/MyLocalRepository</localRepository> </settings>
-
中央仓库:
- 这个仓库由 Maven 社区管理。
- 不需要配置。
- 需要通过网络才能访问。
-
远程仓库:自己构建
-
Spring依赖注入
-
Java注解:Java注解是附加在代码中的一些元信息,用于编译和运行时进行解析和使用,起到说明、配置的功能。 注解不会影响代码的实际逻辑,仅仅起到辅助性的作用。
-
Target:设定注解的目标范围
- ElementType.Type:作用于类、接口类、枚举类上
- ElementType.FIELD:作用于类的属性上
- ElementType.METHOD:作用于类的方法上
- ElementType.PARAMETER:作用于类的参数
@Target({ElementType.TYPE,ElementType.METHOD})
-
Retention:声明该注解的生命周期
- SOURCE:纯注释作用
- CLASS:编译阶段
- RUNTIME:在运行时有效
-
Documented:将注解中的元素包含到JavaDoc文档
-
@interface:声明当前的Java类型是Annotation
-
Annotation属性:@AliasFor注解别名
-
-
Spring Bean和Spring Resource
classpath指向的就是打war包之后的classes的位置。而classes文件夹下就是我们原项目的java文件和resources文件夹里面的内容
@PostConstruct:代表该方法在Spring Bean启动后自动执行
Spring MVC(Model View Controller)
- Spring Boot在Spring Initializr创建即可
- Spring Controller:是一种Spring Bean,提供Web能力,不是面向接口
- 在controller中会自动加载static下的内容
- @RequestMapping:路由配置
- @RequestParam(“参数名”):url中参数名配置
- url多个参数要用
&
分隔
- url多个参数要用
- @GetMapp:get请求路由配置
- @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
Spring Thymeleaf
-
入门
- Model 对象负责在控制器和展现数据的视图之间传递数据。实际上,放到 Model 属性中的数据将会复制到 Servlet Response 的属性中,这样视图就能在这里找到它们了。从广义上来说,Model 指的是 MVC 中的 M,即 Model(模型)。从狭义上讲,Model 就是个 key-value 集合。
- 模板文件放在
src/main/resources/templates
-
语法
-
模板变量:
th:text="${msg}"
:动态替换掉html标签的内部内容,${msg}这个语法表示获取模板中的变量 -
model.addAttribute(“msg”,str);:第一个参数设置的是上下文变量,第二个参数设置的是变量的值
-
循环语句:
th:each
<ul th:each="song : ${songs}"> <li th:text="${song.name}">歌曲名称</li> </ul> // ${songs}从模板上下文中获取songs这个变量 // song 是 ${songs}比上年了遍历后的每一个对象
th:each="song,it: ${songs}"
:it 是作为可选参数出行it.index
、it.count
:迭代对象的索引(开始位置的区别)it.size
:迭代对象的大小,it.current
当前迭代变量,相当于song,it.even/odd
boolean,当前循环是否是偶数/奇数,it.first/last
boolean当前循环是否是第一个或者最后一个 -
表达式
-
字符串拼接
<span th:text="'00:00/'+${totalTime}"></span> <span th:text="|00:00/${totalTime}|"></span>
-
工具类
#{工具类}
-
内联表达式;[[变量]]
<span>Hello [[${msg}]]</span>
-
条件语句
th:if
、h:unless
-
-
-
Spring Validation
-
注解直接设置在Bean的属性上,注解可以累加
-
表单提交传入一个对象,对象要验证的话,前面要加@Valid注解, BindingResult errors来处理报错
-
报错处理:
-
在form 标签中加
th:object="${user}"
-
th:classappend
语法,如果错误信息中有name字段,则生成<div class="error"> </div>
<div th:classappend="${#fields.hasErrors('name')} ? 'error' : ''"> </div>
-
th:errors="*{age}"
自动提取错误信息 -
th:field
显示上一次的属性值
-
-
-
布局:th:include + th:replace
th:include="::content"
:::content
指的是选择器,这个选择器指的就是加载当前页面的th:fragment
th:replace="layout"
:这个一旦被声明,页面会被替换成layoutth:fragment="content"
:选择器所指定的片段
Spring Boot入门
-
ComponentScan
- @SpringBootApplication,加参数,告知系统要额外扫描的包
@SpringBootApplication(scanBasePackages={"fm.douban.app", "fm.douban.service"})
@ComponentScan({"fm.service", "fm.app"})
- @SpringBootApplication,加参数,告知系统要额外扫描的包
-
Boot Logger
-
在配置文件
application.properties
中输入logging.level.root = … -
初始化Logger对象
private static final Logger LOG = LoggerFactory.getLogger(SongListControl.class);
-
使用
LOG.方法名("参数")
-
-
application.properties
-
配置项为:配置项名称 = 配置项值,等号两边不加空格
logging.level.root=info logging.level.fm.douban.app=info
-
自定义配置项:项目在启动的时候会自动把配置中song.name的值赋值给songName
song.name=God is a girl
import org.springframework.beans.factory.annotation.Value; public class SongListControl { @Value("${song.name}") private String songName; }
-
Spring Session
-
Cookie
-
读
- control类的方法增加一个HttpSeverletRequest参数,系统会自动传入所需要的HttpSeverletRequest对象
- 通过getCookies方法来读取HttpSeverletRequest对象cookie
- control类的方法增加一个@CookieValue(“xxxx”) String xxxx参数,@CookieValue(“xxxx”)里面是cookie的名字
-
写
-
control类的方法增加一个HttpSeverletResponse参数
-
调用addCookie()方法添加Cookie实例对象
-
Cookie设置
import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; @RequestMapping("/songlist") public Map index(HttpServletResponse response) { Map returnData = new HashMap(); returnData.put("result", "this is song list"); returnData.put("name", songName); Cookie cookie = new Cookie("sessionId","CookieTestInfo"); // 设置的是 cookie 的域名,就是会在哪个域名下生成 cookie 值 cookie.setDomain("youkeda.com"); // 是 cookie 的路径,一般就是写到 / ,不会写其他路径的 cookie.setPath("/"); // 设置cookie 的最大存活时间,-1 代表随浏览器的有效期,也就是浏览器关闭掉,这个 cookie 就失效了。 cookie.setMaxAge(-1); // 设置是否只能服务器修改,浏览器端不能修改,安全有保障 cookie.setHttpOnly(false); response.addCookie(cookie); returnData.put("message", "add cookie successful"); return returnData; }
-
-
-
Session API
- 读操作
- 从HttpServletRequest对象中取得HttpSession对象,
request.getSession()
。返回结果不是数组,是对象。 attribute
属性中用键值对的形式来存储多个数据- 使用getAttribute(“xxxx”)来获取登陆信息
- 从HttpServletRequest对象中取得HttpSession对象,
- 写操作setAttribute()
- 读操作
-
Session配置
<!-- spring session 支持 --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core</artifactId> </dependency>
import org.springframework.session.MapSessionRepository; import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession; import org.springframework.session.web.http.CookieSerializer; import org.springframework.session.web.http.DefaultCookieSerializer; import java.util.concurrent.ConcurrentHashMap; @Configuration @EnableSpringHttpSession public class SpringHttpSessionConfig { @Bean public CookieSerializer cookieSerializer() { DefaultCookieSerializer serializer = new DefaultCookieSerializer(); serializer.setCookieName("JSESSIONID"); // 用正则表达式配置匹配的域名,可以兼容 localhost、127.0.0.1 等各种场景 serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$"); serializer.setCookiePath("/"); serializer.setUseHttpOnlyCookie(false); // 最大生命周期的单位是秒 serializer.setCookieMaxAge(24 * 60 * 60); return serializer; } // 当前存在内存中 @Bean public MapSessionRepository sessionRepository() { return new MapSessionRepository(new ConcurrentHashMap<>()); } }
-
Request拦截器
HandlerInterceptor
-
创建拦截器
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class InterceptorDemo implements HandlerInterceptor { // Controller方法执行之前 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 只有返回true才会继续向下执行,返回false取消当前请求 return true; } //Controller方法执行之后 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } // 整个请求完成后(包括Thymeleaf渲染完毕) @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
-
实现WebMvcConfigurer
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebAppConfigurerDemo implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 多个拦截器组成一个拦截器链 // 仅演示,设置所有 url 都拦截 registry.addInterceptor(new UserInterceptor()).addPathPatterns("/**"); } }
-
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!