发表于: 2021-04-21 21:36:38
2 1221
一,今天完成的事情
任务二12-15
1,任务二-12,编写部署脚本,部署到服务器的开发环境,用Postman测试是否成功
我编写了部署项目的脚本,是任务一和二里面有一点点逻辑的代码了。
脚本有5个文件,包含:启动,重启,停止,查看“停止还是启动”的功能。是写给我在项目二的在linux上的tomcat使用的。如果需要能控制其它服务器,可以在我的.sh中稍微修改。需要根据服务器目录调整代码。
application.sh grep, awk的使用需要掌握。
if [ $? -eq "0" ];
这里的 $? 是最近语句的返回值
#!/bin/bash
#name: application.sh
#desc: check running, do start, do stop
#author: nicole
#当前脚本所在文件夹路径. I am using tomcat
#current_path="/usr/local/myTomcat/apache-tomcat-9.0.45/bin"
#应用名称, tomcat
app_name="tomcat"
#应用位置
app_path="/usr/local/myTomcat/apache-tomcat-9.0.45/bin"
#应用运行的pid
pid=''
#判断jar包是否在运行
#jar如果在运行返回1,否则返回0
function is_running(){
pid=`ps aux|grep ${app_name}|grep -v grep|awk '{print $2}'` #获取jar包运行的pid
if [ -z $pid ] ;then #如果pid的长度为空,说明没有在运行
return 0
else
return 1
fi
}
#启动jar包,启动成功返回1,否则返回0
function start(){
#先判断jar有没有在运行
is_running
if [ $? -eq "0" ]; then #没有运行,tomcat
${app_path}/startup.sh
is_running
return 1
else
return 0
fi
}
#停止jar包,停止成功返回1,否则返回0
function stop(){
#先判断jar是否在运行
is_running
if [ $? -eq '0' ]; then
return 0 #jar没有运行,停止失败
else
kill -9 $pid #jar在运行,使用kill命令停止
return 1
fi
}
restart.sh 。特别注意dirname,readlink 的用法。readlink -f $0是取得脚本的相关描述信息,$0表示正在执行脚本名称。
`dirname $(readlink -f $0)`
#!/bin/bash
#name: restart.sh
#desc: restart server
#author: nicole
#当前脚本所在目录的路径
current_path=`dirname $(readlink -f $0)`
#导入application.sh
. $current_path/application.sh
#重启方法
function restart(){
is_running #先获取pid
if [ $? -eq '0' ]
then #返回0,表示没有运行,那么我就直接启动
echo "${app_name} is not running, and now it will be started"
start #调用启动方法
is_running #更新pid
echo "${app_name} is running at pid: ${pid}" #提示启动成功
else
stop #程序在运行,先stop,再start
start
is_running #更新pid
echo "${app_name} has been restarted running at pid: ${pid}"
fi
}
####################程序入口##################
restart
start.sh
#!/bin/bash
#name: start.sh
#desc: start server
#author: nicole
#当前脚本所在目录的路径
current_path=`dirname $(readlink -f $0)`
#导入application.sh
. $current_path/application.sh
#启动程序
function start_app(){
start
is_running #更新pid
if [ $? -eq '1' ]; then #如果启动成功
echo "${app_name} is started at pid: ${pid}"
else #启动失败
if [ -z $pid ]
then #如果pid为空,说明启动失败
echo "${app_name} started failed"
else
echo "${app_name} is already running at pid: ${pid}" #程序已经在运行
fi
fi
}
##############脚本程序入口############
start_app
status.sh
#!/bin/bash
#name: status.sh
#desc: check status of server
#author: nicole
#当前脚本所在目录的路径
current_path=`dirname $(readlink -f $0)`
#导入application.sh
. $current_path/application.sh
#获取程序运行状态方法
function status(){
is_running #获取pid
if [ $? -eq '0' ];then #返回0,表示没有运行
echo "${app_name} is not running"
else
echo "${app_name} is running at pid: ${pid}" #返回1,表示在运行
fi
}
################程序入口#################
status
stop.sh
#!/bin/bash
#name: stop.sh
#desc: stop server
#author: nicole
#当前脚本所在目录的路径
current_path=`dirname $(readlink -f $0)`
#导入application.sh
. $current_path/application.sh
#暂定方法
function stop_app(){
stop
if [ $? -eq '0' ]; then #如果暂停失败
echo "${app_name} is NOT running" #程序没有在运行
else
echo "${app_name} has benn stopped" #成功停止
fi
}
#############程序入口###############
stop_app
使用我的脚本,会把当前服务器状态判断好。stop.sh能保证执行完后相应的web服务器停止,其它类似。避免Tomcat等报错。避免达不到希望的结果。没有硬性执行顺序,因为执行前会判断服务器当前状态再执行。
把5个文件放到任意位置。我的是某目录下的scripts文件夹。
记得修改文件的exe属性,否则无法执行
ls -l 查看 744
运行 ./start.sh 启动
成功
查看状态成功,重新启动成功
停止,成功
停止成功
所以,启动,重启,停止,查看“停止还是启动”测试通过
用restart.sh。
Postman测试成功
2,任务二条目13,本地编写代码,实现Service的功能,编写Junit,插入几条模拟数据,用Postman测本地接口,看结果是否正常
用的是以下代码。插入9条数据
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-mybatis.xml"})
public class StudentServiceTest {
@Autowired
private StudentService studentService;
@Test
@Transactional
@Rollback(true)
public void testInsertStudents() {
Student student = new Student();
long ids = 1012;
int max = 1020;
long startTime = System.currentTimeMillis();
student.setCreateAt(startTime);
student.setUpdateAt(startTime);
System.out.println(startTime);
while( ids++ < max ){
student.setId( ids );
student.setName( "nnccc" + ids );
studentService.addStudent(student);
}
}
本地test通过
启动我本地的Jetty,用Postman尝试访问Controller, C控制Service,加入一位学生成功
3,任务二条目15,提交代码到SVN/Git,部署代码到服务器,用Postman测试服务器数据是否成功
3-1,Push
在我的项目右键,单击git bash。add commit push到master来一套
在云linux查看,这台没有安装git
3-2, linux 安装git
mkdir /usr/local/git
cd /usr/local/git
安装可能之后会用的依赖,工具。如果以前有也不要紧。
yum install -y wget
yum install -y gcc-c++
yum install -y zlib-devel perl-ExtUtils-MakeMaker
sudo yum groupinstall "Development Tools"
sudo yum install curl-devel expat-devel gettext-devel openssl-devel perl-CPAN perl-devel zlib-devel
需要sudo的时候,在最前面加上sudo
https://github.com/git/git/releases
浏览以上网址,选一个targz包,复制url。wget url
wget https://github.com/git/git/archive/refs/tags/v2.29.0.tar.gz
解压
tar -zxvf git 按tab得到targz包名
cd到解压文件夹下
make prefix=/usr/local/git all
make prefix=/usr/local/git install
上面2行的/usr/local/git是需要安装的地址,git的还是安装在git下面,就像tomcat安装在tomcat 下面,成功安装
但是,为了使用29,可以配置环境变量
vim /etc/profile
把配置换成我刚才安装的git,GIT_HOME就是想用的那个git的bin的前一个目录
立即生效,查看成功
3-3,GitHub到CentOS云。云上打包运行
代码已经在我的GitHub,不用fork。
创造要放文件的文件夹,cd到位后。在云linux上 git clone .git的URL
我是因为默认有main分支,所以git clone -b master .git的URL
在任务一已经安装了maven,如果需要打包运行我有限考虑mvn的命令
如果想在云上用mvn 系列命令,建议先在intellij的本地terminal运行命令。
就在这个文件夹,先mvn clean
然后mvn package
成功。这时出现了一个新的target文件夹,把war包移到服务器部署的文件夹下。cp
重新启动web服务器。Postman测试成功
4,不用使用JSON Tag-lib,直接用Spring 返回JSON对象,对比两种实现方式的差别和应用场景
4-1,JSON Tag-lib 使用Object等元素定义,设置.jsp页面如下,完成对象转换成json格式输出。
<%@ taglib prefix="json" uri="http://www.atg.com/taglibs/json" %>
<json:object>
<json:array name="students" var="student" items="${students}">
<json:object>
<json:property name="id" value="${student.id}"/>
<json:property name="name" value="${student.name}"/>
<json:property name="studentId" value="${student.studentId}"/>
<json:property name="createAt" value="${student.createAt}"/>
<json:property name="updateAt" value="${student.updateAt}"/>
</json:object>
</json:array>
</json:object>
只要设置了对象即可。JSON Tag-lib的object,array,property让列表中的对象preperty可以用比较少的代码输出
request.setAttribute("students", students);
return "jsontaglib";
4-2,Spring 返回JSON对象
@ResponseBody
@ResponseBody的作用其实是将java对象转为json格式的数据。将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
注意:在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
//@ResponseBody回复。@RequestBody接收
@RequestMapping(value = "/add", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> addStudent(@RequestBody Student student){
//StringUtils judge blank
if (StringUtils.isBlank(student.getName())) {
return Restful.set(400, messageSource.getMessage("name.null", null, null));
} else {
//auto increased id
studentService.addStudent2(student);
return Restful.set(200, messageSource.getMessage("addSuccess",
null, null), student);
}
}
4-3,JSON Tag-lib,直接用Spring 返回JSON对象对比
使用注解ResponseBody返回java对象或集合,自动转化生成。使用JsonTaglib在jsp中设置字段或者嵌套生成。
JsonTaglib相比其他方式,更加灵活,修改更加方便。如果以后需要更改json数据格式,只需要更改jsp页面即可,不需要改动控制器代码。如果显示的项目不是整个对象的property,而是1到几个;和或者希望调整展示顺序,JsonTaglib需要的Controller代码普遍减少。如果输出有任何改变,JsonTaglib的修改会更灵活。
如果全部展示,而且按照pojo的顺序,这种情况是@ResponseBody不需要写 .jsp页面设置字段嵌套,代码量少。
另外:
之前我应该没提到的@RequestHeader注解,能够将请求头中的变量值映射到控制器的参数中。
比如
public String hello(@RequestHeader(value="User-Agent") String userAgent)
有时验证会用
二,今天问题:
乘风破浪
三,今天的收获
服务器部署脚本
service,JUnit的添加测试
从上传GitHub,从GitHub获取。mvn相关命令打包
JSON Tag-lib 和 Spring 返回JSON对象区别
四,明天的计划:
任务2,条目16-18
评论