发表于: 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





返回列表 返回列表
评论

    分享到