undertow容器

打开application.yaml文件,就可以看到Halo的配置内容,笨鸟有笨的办法,我们可以一点点的开始分析,先来看看关于内置服务器undertow的配置

server:port: 8090use-forward-headers: trueundertow:io-threads: 2worker-threads: 36buffer-size: 1024directBuffers: trueservlet:session:timeout: 86400s

这些都是常规的设置,什么端口号啊,session失效时间,还有有关undertow的io线程数,阻塞任务线程池等等。这些配置如果不懂呢网上搜一搜就知道了。当然还有这个springboot内嵌服务器啊,如何将默认的tomcat转换为undertow也是需要自己慢慢弄明白的,如果不会呢,就可以看看我写的博客《springboot配置undertow容器》,不过呢我是用springboot2.1.1做的demo,假如你比我的版本高的话就可以不用博客里的最后一步,直接将tomcat依赖排除,加上undertow的依赖,然后配置文件写上配置就完事了,完全不用再配置一个ServletWebServerFactory,还是相当简单的。

H2数据库

接下来就是H2数据库的配置了,如图所示

spring:output:ansi:enabled: alwaysdatasource:type: com.zaxxer.hikari.HikariDataSource# H2database 配置driver-class-name: org.h2.Driverurl: jdbc:h2:file:./halo/halousername: adminpassword: 123456#MySql配置
#    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://127.0.0.1:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
#    username: root
#    password: 123456h2:console:settings:web-allow-others: truepath: /h2-consoleenabled: truejpa:hibernate:ddl-auto: updateshow-sql: false

作者用的是H2数据库并没有使用mysql,当然它也是可以支持mysql的,mysql我们已经熟悉了,所以我们可以试试这个陌生的H2数据库是怎么使用的。这些也是很常规的配置,我相信大家肯定看得懂,从上到下分别是,日志彩色显示,连接池(应该是连接池吧),驱动,url,用户名,密码,还有有关H2的配置,Jpa的配置啥的,mysql配置已经注释掉了。H2配置里的path属性表示项目启动之后就可以用这个路径来访问数据库,是的,它是通过浏览器访问数据库的,不过呢关系型数据库都差不多,都很简单,大家看一看就明白了。还有就是这个url地址,刚开始在file:后边是~符号,项目一启动就会在C盘用户目录下创建数据库文件,于是呢我就把它改到了项目根目录下./表示项目的根目录,如图所示

这个就是你的数据库了。

接下来就是有关Freemarker的配置,如果你想学就研究研究。不过呢现在都流行前后端分离的模式,所以我不打算研究它。

然后呢就是上传文件的设置,国际化的设置,日志的设置

  servlet:multipart:max-file-size: 10MBmax-request-size: 10MB# 多语言资源文件路径messages:basename: i18n/messages
logging:file: ./logs/log.log

关于springboot实现国际化也是非常的简单,如果没有做过,可以网上搜一搜,都有详细的教程,只要照着做就行了,当然要是有人像我一样不老老实实的照着做,出现问题了,可以参考我的这篇文章,是不是出现了和我一样的问题——springboot国际化

Halo的国际化

接下来我们来看看Halo是如何实现国际化的,我们先看看这个i18n文件夹里的properties文件,看着就不简单,500行左右,也就是近500个词作者都做了国际化翻译,要是让我来,光是给变量起名字都费死劲了。这里我还得说一句,看看人家的包名

看着就很好,一眼下去就知道哪个包是干什么的,我们想要找国际化设置,自然是在config包里面找

这里面就两个类,一看类名就知道是在哪个类里边,不得不说一句,我们要学学人家是怎么起名字的,光看类名就知道这个类是干啥的。我也是在几个月前才开始尽量起比较符合规范的名字,不要怕名字长,没关系,名字长不长的无所谓,我们要的是望文知意。点开这个类,往下翻,就能看到有关国际化的设置

   /*** 国际化设置** @return LocaleResolver*/@Beanpublic LocaleResolver localeResolver() {final SessionLocaleResolver slr = new SessionLocaleResolver();slr.setDefaultLocale(Locale.CHINA);return slr;}/*** 国际化参数拦截器** @return LocaleChangeInterceptor*/@Beanpublic LocaleChangeInterceptor localeChangeInterceptor() {final LocaleChangeInterceptor lci = new LocaleChangeInterceptor();lci.setParamName("lang");return lci;}

作者实现国际化的方式跟我的略有不同,使用的是SessionLocaleResolver和LocaleChangeInterceptor相结合的方式,不过作者为什么要将这两个对象用final修饰呢,难道是要把它变成唯一不可变的吗?但是如果把它交给spring来管理,默认的就是单例模式,不用final也可以吧。这个问题先存着,或许等我有项目经验了就明白了。言归正传,接下来就是注册拦截器了,也是在这个类里边,最上边的这个方法

/*** 注册拦截器** @param registry registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/admin.*").addPathPatterns("/admin/**").addPathPatterns("/backup/**").excludePathPatterns("/admin/login").excludePathPatterns("/admin/getLogin").excludePathPatterns("/static/**");registry.addInterceptor(installInterceptor).addPathPatterns("/**").excludePathPatterns("/install").excludePathPatterns("/install/do").excludePathPatterns("/static/**");registry.addInterceptor(apiInterceptor).addPathPatterns("/api/**");registry.addInterceptor(localeInterceptor).addPathPatterns("/admin.*").addPathPatterns("/admin/**").addPathPatterns("/install");registry.addInterceptor(localeChangeInterceptor()).addPathPatterns("/install");}

我们看到,它注册了不少拦截器,其中有两个关于国际化的,就是最后两个,它居然有两个拦截器,刚刚我们只是看到了其中一个LocaleChangeInterceptor用来拦截参数,通过参数来改变语言,接下来看看这个LocaleInterceptor主要是干啥的。看看有这么多拦截器就知道,作者肯定有一个包专门放拦截器,就是在web包下。我们打开这个拦截器类,也没几行代码,看着一行怪长,还没有写注释,但是我们耐心一读就明白了。这样,我手动加上注释再把代码贴出来。

 @Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//先从session中找到Localefinal Object attribute = request.getSession().getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME);//判断Locale是否存在,如果有就直接放行if (null != attribute) {return true;}/** 判断博客语言设置是不是en_US,如果是的话就在session中保存一个英文的Locale* 如果不是就存一个中文的Locale*/if (StrUtil.equals(LocaleEnum.EN_US.getValue(), OPTIONS.get(BlogPropertiesEnum.BLOG_LOCALE.getProp()))) {request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("en", "US"));} else {request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("zh", "CN"));}return true;}

这里作者又一次用了final,我依旧不甚理解为什么要用final修饰,而且好多地方都用了final,也可能是我经验少,没写过什么项目,到现在我写代码几乎没有用过final修饰,所以看到了这个final就觉得作者用了好多次。好了,回到正题,我们还是说一说这个国际化的问题,我们知道,国际化需要用Locale来决定用英文还是中文或者是其他语言,这个SessionLocaleResolver应该是将这个Locale保存到了session中,所以先要看看session中有没有这个Locale,如果有的话直接放行,直接用session中的Locale就行了,如果没有的话,自然是新建一个,怎么建呢,就是接下来的代码,先看看博客设置选项里是不是英文的,如果不是就建一个中文的。或许大家会有疑问,每个变量这么长都是啥意思?这个问题不要担心,作者已经做了注释,只要选中这个变量,然后快捷键ctrl+q就会显示出来这个变量的意思。这些基本上就是Halo的国际化操作了,虽然简单,但是也是值得一看。

学习开源项目Halo(二)相关推荐

  1. 学习开源项目Halo(1) - 初步了解与运行Halo

    文章目录 学习开源项目Halo(1) - 初步了解与运行Halo 0.前言 1.Halo简介 2.Halo项目运行 3.Halo项目涉及到的技术栈 学习开源项目Halo(1) - 初步了解与运行Hal ...

  2. 聊聊如何学习开源项目

    工作几年的程序员同学,有了一定的项目经验,对于编程也有了自己的理解,但他们偶尔也会感到困惑,不知道接下来该如何提升自己. 在笔者看来:"这个阶段的程序员最需要的是提升自身编程能力和视野高度, ...

  3. 如何有效地学习开源项目的代码?

    对于计算机专业的同学来说,网络上丰富的开源代码是一笔极为宝贵的财富.通过对开源代码的学习与钻研,大家能从中学到很多书本上.课堂上学习不到的实践知识.如何学习开源代码以及如何学好开源代码成为了大家经常关 ...

  4. 一周焦点 | 李彦宏:如果谷歌回来,有信心再赢一次;GitHub深度学习开源项目Top200...

    ▌业界焦点 瞄准超算皇冠:神威E级超算原型机正式启用 运算速度达每秒百亿亿次的 E 级计算机,被称作"超级计算机界的下一顶皇冠".8 月 5 日,国产超算研制向着这一皇冠又迈进了一 ...

  5. 《开源思索集》一如何更有效地学习开源项目的代码?

    本节书摘来异步社区<开源思索集>一书中的第2章,第2.1节,作者: 庄表伟 责编: 杨海玲, 更多章节内容可以访问云栖社区"异步社区"公众号查看. 如何更有效地学习开源 ...

  6. 如何学习开源项目及Ceph的浅析

    摘要:开源技术的学习和采用确实存在着一定门槛,然而学习各种开源项目已经成为许多开发者不可回避的工作内容.那么,对于类似OpenStack的大型开源项目,开发者该如何着手,这里我们看章宇的分享. [编者 ...

  7. GitHub上最火的40个iOS开源项目(二)

    http://www.open-open.com/lib/view/open1388316950609.html GitHub上最火的40个Android开源项目(一) GitHub上最火的40个An ...

  8. 新手如何在Git Hub上学习开源项目+社交

    文章目录 背景 前提条件 搜索相应主题的开源项目 步骤 从Git Hub上下载项目源码并编译执行 步骤 Fork别人的项目并申请Pull Request 步骤 Git Hub社交 步骤 关于我 背景 ...

  9. 转: 学习开源项目的若干建议(infoq)

    转: http://www.infoq.com/cn/news/2014/04/learn-open-source 学习开源项目的若干建议 作者 崔康 发布于 2014年4月11日 | 注意:GTLC ...

最新文章

  1. CXF的webservice接口中字符串参数中文问题
  2. 成功解决TypeError: ‘float’ object cannot be interpreted as an index
  3. 机器学习之数据预处理
  4. 每次启动项目的服务,电脑竟然乖乖的帮我打开了浏览器,100行源码揭秘!
  5. 深度学习第三次课-梯度下降与反向传播
  6. LeetCode 474. Ones and Zeroes 动态规划解法+拓展
  7. 北京黑龙江商会成立纪实(2)
  8. 【代码源 Div1 - 108】#464. 数数(主席树,区间比k小的数的个数)HDU4417
  9. redis慢查询日志,php安装redis扩展,redis存储session,redis主从配置
  10. linux 运行可执行文件
  11. 鸿蒙系统的特点,鸿蒙系统有什么特别之处
  12. PHP+H5全栈工程师培训视频教程
  13. 【HDU2825】AC自动机+状压DP
  14. 一文讲清微服务架构、分布式架构、微服务、SOA
  15. ai跟随路径_AI教程:如何沿着对象的路径输入文字?
  16. win10计算机启动慢,win10开机慢?如何使开机破8秒
  17. Tomcat 启动速度慢,一直转圈的原因
  18. 【Python】 标准差计算(std)
  19. 区块链论文8(ContractGuard分析写作手法)
  20. 该如何搭建网校系统,需要哪些准备呢?

热门文章

  1. beast软件linux用法,杂项类设置 - 黑苹果驱动高手篇 MultiBeast用法进阶_Linux教程_Linux公社-Linux系统门户网站...
  2. vue项目引入彩色iconfont图标
  3. ipv6掩码格式解析
  4. OneNote2007产品密钥及激活方法
  5. 2009年网易笔试题
  6. 哪些手机系统必备,却鲜为人知的APP?
  7. C语言学习第7天(错误处理、递归、内存管理)默认熟悉数据结构和java基础
  8. 【计算机网络】TCPUDP区别、TCP可靠、UDP不可靠
  9. 机电翻模【管道转化】功能,自动识别CAD图纸完成翻模
  10. linux 操作系统笔记基础命令