您正在查看: Java 分类下的文章

使用docker来构建一个SpringBoot应用

Dcoker是一个开源的应用容器引擎,介绍我就不介绍了,总之就是很牛批,用过的都相见恨晚 笑眼.png
平时我们不是应用都是先搭建相关环境,然后把应用启动一通配置好
本地环境需要搭建一次,测试环境需要搭建一次,生产环境也需要搭建一次,这样重复的工作就做了几次,效率降低 不高兴.png
使用了docker了?我们只需要构建一次镜像,然后不同的环境只需要把镜像拉下来启动就行了,是不是很简单?
如果配合CI/DI持续集成,持续部署,那就太爽歪歪了,我们只需要把代码提交到git,剩下打包/编译/测试/部署工作就全自动自己运行了,是不是大大提高了生产力? 滑稽.png
废话不多说,今天先研究docker怎么构建SpringBoot,改天再研究CI/DI~


1 安装Docker

首先docker只支持CentOS7以上的系统,如果系统版本过低请升级系统
这里我使用的是CentOS7 x64
docker安装教程详见:Docker的基本操作与使用

2 准备SpringBoot应用

- 阅读剩余部分 -

SpringBoot 配置文件存放位置及读取顺序

因为线上部署的时候和本地往往使用不同的配置文件,所以研究了下SpringBoot配置文件存放位置及读取顺序
之前是直接手动指定配置文件启动来启动SpringBoot工程的,后来发现直接按照配置文件的加载顺序优先级放到对应的文件夹下即可进行配置文件的自动覆盖和互补

以下内容转载自:https://my.oschina.net/sdlvzg/blog/1612703


SpringBoot配置文件可以使用yml格式和properties格式

分别的默认命名为:application.yml、application.properties

存放目录

SpringBoot配置文件默认可以放到以下目录中,可以自动读取到:

  • 项目根目录下
  • 项目根目录中 config 目录下
  • 项目的 resources 目录下
  • 项目 resources 目录中 config 目录下

clipboard.png

读取顺序

如果在不同的目录中存在多个配置文件,它的读取顺序是:

1、config/application.properties(项目根目录中config目录下)
2、config/application.yml
3、application.properties(项目根目录下)
4、application.yml
5、resources/config/application.properties(项目resources目录中config目录下)
6、resources/config/application.yml
7、resources/application.properties(项目的resources目录下)
8、resources/application.yml

注:
1、如果同一个目录下,有application.yml也有application.properties,默认先读取application.properties。
2、如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的。
3、创建SpringBoot项目时,一般的配置文件放置在“项目的resources目录下”

解决Spring项目打成Jar包后Freemarker找不到模板的问题

昨天改完CheckDomain的bug后,打包jar准备部署到服务器上,本地测试都正常,但是扔到服务器上却发不了邮件了... 不高兴.png

经过多次测试发现,freemarker在jar包中无法使用类加载器获取resourse目录下的templates文件 泪.png

出现的问题代码如下:(本地测试正常,打包jar后无法获取模板)

/**
 * 邮件模板静态化
 *
 * @param mailTemplateModel 模板数据模型
 * @return 加上数据后的静态化模板
 */
@Override
public String getMailHtml(MailTemplateModel mailTemplateModel) {
    try {
        //创建配置类
        Configuration configuration = new Configuration(Configuration.getVersion());
        //设置模板路径
        String classpath = this.getClass().getResource("/").getPath();
        configuration.setDirectoryForTemplateLoading(new File(classpath + "/templates"));
        //设置字符集
        configuration.setDefaultEncoding("utf-8");
        //加载模板
        Template template = configuration.getTemplate("mailTemplate.ftl");
        //模板静态化并返回
        return FreeMarkerTemplateUtils.processTemplateIntoString(template, mailTemplateModel);
    } catch (Exception e) {
        e.printStackTrace();
        log.error("模板静态化异常", e);
        return null;
    }
}

修改后的代码:(打包jar后正常获取模板)

- 阅读剩余部分 -

记一次解决RestTemplate无法解析api返回的xml数据问题

最近看上了个本命域名,因为过期即将被注册局删除,于是就自己写了个api接口用来监控这个域名,等可以注册了就直接发邮件通知我 吐舌.png

其中用到了阿里云域名的一个api,准备直接使用RestTemplate去请求这个接口,并将结果自动封装为Map集合方便进行进一步处理。

等到框架搭好,代码写完,以为万事大吉的时候,程序却给我来了个惊喜: 疑问.png
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [interface java.util.Map] and content type [text/plain;charset=GBK]

很明显,上面提示接口返回的是text/plain文本类型数据,RestTemplate解析数据的时候没有找到合适的解析器,就抛了异常。
WTF? what.png 我看阿里云的接口明明返回的是xml的数据啊......仔细再定睛一看,类型还真的是文本类型...

- 阅读剩余部分 -

Git分布式版本控制工具

1 Git概述

1.1 Git历史

Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。

到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。

他们对新的系统制订了若干目标:

  • 速度
  • 简单的设计
  • 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
  • 完全分布式
  • 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

1.2 Git与SVN对比

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而开发人员工作的时候,用的都是自己的电脑,所以首先要从中央服务器下载最新的版本,然后开发,开发完后,需要把自己开发的代码提交到中央服务器。

集中式版本控制工具缺点:

- 阅读剩余部分 -

mybatis03 - 多表查询、简单的SSM整合

1 Mybatis多表查询

1.1 一对一查询

1.1.1 一对一查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

图片1.png

1.1.2一对一查询的语句

对应的sql语句:SELECT *,o.id oid FROM orders o, USER u WHERE o.uid = u.id;

查询的结果如下:

图片2.png

- 阅读剩余部分 -

mybatis02 - 核心配置文件深入

1 Mybatis的Dao层实现

1.1 传统开发方式

1.1.1 编写UserDao接口
public interface UserDao {
    List<User> findAll() throws IOException;
}
1.1.2 编写UserDaoImpl实现
public class UserDaoImpl implements UserDao {
    public List<User> findAll() throws IOException {
        InputStream resourceAsStream = 
                    Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new 
                    SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> userList = sqlSession.selectList("userMapper.findAll");
        sqlSession.close();
        return userList;
    }
}
1.1.3 测试传统方式
@Test
public void testTraditionDao() throws IOException {
    UserDao userDao = new UserDaoImpl();
    List<User> all = userDao.findAll();
    System.out.println(all);
}

- 阅读剩余部分 -

mybatis01 - 简介和快速入门

1 Mybatis简介

1.1原始jdbc操作(查询数据)

图片1.png

1.2原始jdbc操作(插入数据)

图片2.png

- 阅读剩余部分 -

springmvc03 - 文件上传、拦截器、异常处理

今日内容

  • SpringMVC的文件上传
  • SpringMVC的拦截器
  • SpringMVC异常处理机制

1 SpringMVC的文件上传

1.SpringMVC的请求-文件上传-客户端表单实现

文件上传客户端表单需要满足:

表单项type=“file”

表单的提交方式是post

表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”

<form action="${pageContext.request.contextPath}/user/quick22" method="post" enctype="multipart/form-data">
    名称<input type="text" name="username"><br/>
    文件1<input type="file" name="uploadFile"><br/>
    <input type="submit" value="提交">
</form>

- 阅读剩余部分 -

springmvc02 - 请求和响应

1 SpringMVC的数据响应

1.SpringMVC的数据响应-数据响应方式

1)页面跳转

直接返回字符串

通过ModelAndView对象返回

2 )回写数据

直接返回字符串

返回对象或集合

2.SpringMVC的数据响应-页面跳转-返回字符串形式

1.jpg

- 阅读剩余部分 -

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5