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-INFweb应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面
    ${basedir}/target打包输出目录
    ${basedir}/target/classes编译输出目录
    ${basedir}/target/test-classes测试编译输出目录
    Test.javaMaven只会自动运行符合该命名规则的测试类
    ~/.m2/repositoryMaven默认的本地仓库目录位置
  • 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.versionjava的版本
      maven.compiler.sourceMaven编译源代码的JDK版本
      project.build.sourceEncoding文件编码格式UTF-8
      maven.compiler.targetMaven打包源代码的JDK版本
    • 依赖管理dependency

    • 插件体系plugins

  • 构建生命周期

    image-20220826154418173

    阶段处理描述
    验证 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依赖注入

  1. Java注解:Java注解是附加在代码中的一些元信息,用于编译和运行时进行解析和使用,起到说明、配置的功能。 注解不会影响代码的实际逻辑,仅仅起到辅助性的作用。

    1. Target:设定注解的目标范围

      • ElementType.Type:作用于类、接口类、枚举类上
      • ElementType.FIELD:作用于类的属性上
      • ElementType.METHOD:作用于类的方法上
      • ElementType.PARAMETER:作用于类的参数
      @Target({ElementType.TYPE,ElementType.METHOD})
      
    2. Retention:声明该注解的生命周期

      • SOURCE:纯注释作用
      • CLASS:编译阶段
      • RUNTIME:在运行时有效
    3. Documented:将注解中的元素包含到JavaDoc文档

    4. @interface:声明当前的Java类型是Annotation

    5. Annotation属性:@AliasFor注解别名

  2. Spring Bean和Spring Resource

    classpath指向的就是打war包之后的classes的位置。而classes文件夹下就是我们原项目的java文件和resources文件夹里面的内容

    @PostConstruct:代表该方法在Spring Bean启动后自动执行

Spring MVC(Model View Controller)

  1. Spring Boot在Spring Initializr创建即可
  2. Spring Controller:是一种Spring Bean,提供Web能力,不是面向接口
    • 在controller中会自动加载static下的内容
    • @RequestMapping:路由配置
    • @RequestParam(“参数名”):url中参数名配置
      • url多个参数要用&分隔
    • @GetMapp:get请求路由配置
    • @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。

Spring Thymeleaf

  1. 入门

    • Model 对象负责在控制器和展现数据的视图之间传递数据。实际上,放到 Model 属性中的数据将会复制到 Servlet Response 的属性中,这样视图就能在这里找到它们了。从广义上来说,Model 指的是 MVC 中的 M,即 Model(模型)。从狭义上讲,Model 就是个 key-value 集合。
    • 模板文件放在src/main/resources/templates
  2. 语法

    • 模板变量: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.indexit.count:迭代对象的索引(开始位置的区别)it.size:迭代对象的大小, it.current当前迭代变量,相当于song,it.even/oddboolean,当前循环是否是偶数/奇数,it.first/lastboolean当前循环是否是第一个或者最后一个

    • 表达式

      • 字符串拼接

        <span th:text="'00:00/'+${totalTime}"></span>
        <span th:text="|00:00/${totalTime}|"></span>
        
      • 工具类#{工具类}

      • 内联表达式;[[变量]]

        <span>Hello [[${msg}]]</span>
        
      • 条件语句th:ifh:unless

  3. 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显示上一次的属性值

  4. 布局:th:include + th:replace

    • th:include="::content"::content指的是选择器,这个选择器指的就是加载当前页面的th:fragment
    • th:replace="layout":这个一旦被声明,页面会被替换成layout
    • th:fragment="content":选择器所指定的片段

Spring Boot入门

  1. ComponentScan

    • @SpringBootApplication,加参数,告知系统要额外扫描的包@SpringBootApplication(scanBasePackages={"fm.douban.app", "fm.douban.service"})
    • @ComponentScan({"fm.service", "fm.app"})
  2. Boot Logger

    • 在配置文件application.properties中输入logging.level.root = …

    • 初始化Logger对象

       private static final Logger LOG = LoggerFactory.getLogger(SongListControl.class);
      
    • 使用LOG.方法名("参数")

  3. application.properties

    • 配置项为:配置项名称 = 配置项值,等号两边不加空格

      logging.level.root=info
      logging.level.fm.douban.app=info
      

      image-20220827211908580

    • 自定义配置项:项目在启动的时候会自动把配置中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

  1. 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;
        }
        
  2. Session API

    1. 读操作
      • 从HttpServletRequest对象中取得HttpSession对象,request.getSession()。返回结果不是数组,是对象。
      • attribute属性中用键值对的形式来存储多个数据
      • 使用getAttribute(“xxxx”)来获取登陆信息
    2. 写操作setAttribute()
  3. 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<>());
      }
    }
    
  4. Request拦截器HandlerInterceptor

    1. 创建拦截器

      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 {
      
        }
      }
      
    2. 实现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("/**");
        }
      }
      
posted @   chanxe  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示