一些部署到阿里云的问题
一直在阿里云上部署项目,但是只是以ip:端口的形式去进行访问部署到阿里云的项目,个人觉得很丑,之前也有申请过一个.top的域名,但是迟迟过不了认证,后来也一直没有纠结过这个事情,直到课设和前端合作了一个web项目。发现其实还是有许多问题等着解决
80/8080有什么区别
之前访问一个项目不论是在本地使用localhost形式还是部署到阿里云后使用ip形式访问,始终都要带上tomcat的默认端口8080,这让我觉得真的很丑,并且也心生疑问,为什么访问诸如百度阿里腾讯这类大型网站不需要带上项目部署的端口
80端口是为 HTTP(HyperText Transport Protocol)即超文本传输协议开放的,此为上网冲浪使用次数 最多的协议,主要用于WWW(World Wide Web)即万维网传输信息的协议。可以通过HTTP地址(即常说的“网址”)加“:80”来访问网站,因为浏览网页服务默认的端口号都是80,因此只要输入网址即可
看了这句话不难理解,其实 www.baidu.com 也就相当于 www.baidu.com:80
之前在跟安卓交互的时候,因为没有添加host请求头,所以我在这边看我的tomcat日志一直都没有拦截到请求的迹象,项目中在关键地方打了log之后才发现,没有加host的时候,使用我提供的接口请求的默认端口是80端口,也就更能证明上面说的80端口是HTTP协议默认的端口了
之前在阿里云配置域名解析之后,访问的结果是这样的实在是觉得:8080这个东西既不好看又累赘,所以修改了阿里云tomcat的配置
进入tomcat下conf目录编辑server.xml
找到Connector结点
修改port从8080变为80
重启tomcat就可以发现我们可以通过省略tomcat默认端口8080去访问云上的项目
DNS是什么
DNS 是域名系统 (Domain Name System) 的缩写,它是由解析器和域名服务器组成的。
域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,而IP地址不一定有域名。 域名系统采用类似目录树的等级结构。
域名服务器为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程就称为 “域名解析”。
在Internet上域名与IP地址之间是一对一(或者多对一)的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。
DNS 命名用于 Internet 等 TCP/IP 网络中,通过用户友好的名称查找计算机和服务。当用户在应用程序中输入 DNS 名称时,DNS 服务可以将此名称解析为与之相关的其他信息,如 IP 地址。因为,你在上网时输入的网址,是通过域名解析系统解析找到了相对应的IP地址,这样才能上网。其实,域名的最终指向是IP。
以百度为例 打开win10 cmd
简单来说,我们最常用就是的DNS域名解析服务。比如上网时输入www.baidu.com计算机通过DNS服务器将www.baidu.com 解析成百度对应的服务器IP地址,220.181.112.244
编码时候的问题
Spring Boot篇
SSM用得已经很熟了,这次课设本来想使用Spring Boot 写一个正儿八经的web服务端,还准备尝试着去使用一下Rest风格,可最后因为前端的问题,课设最后也才算刚刚完成,最后将web和后端放在了一个项目
Spring Boot使用的时候出现的问题:
-
因为我是用的是gradle构建的项目,在部署的时候迟迟找不到idea的gradle中的war选项,后来了解到需要在项目的build.gradle中添加如下属性
apply plugin: 'war'
并且在执行打包之前,需要对整个程序的启动类进行一定的操作
@MapperScan("com.bsb.mapper")
@SpringBootApplication
public class SpringBootMybaitsApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybaitsApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringBootMybaitsApplication.class);
}
}
修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法,注意这里要指向原先用main方法执行的Application启动类
- 因为Spring Boot在idea项目初始化的时候会让开发者自己选择项目所需要的模块,真的很方便,但是,在部署到阿里云的时候出现了问题。因为Spring Boot是使用的内嵌的tomcat,所以在部署到阿里云tomcat的时候需要尤其注意在build.gradle中加入如下属性
providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
这句话的意思是,在执行项目打包的时候,内嵌的tomcat不会被打包进最后的.war中
这样就可以在阿里云的tomcat中部署,并且使用阿里云tomcat作为web服务器进行正常工作
后来还是使用了SSM,这也让我回顾了一些东西
Mybaits动态SQL
比如现在有一个需求,需要批量插入一组数据进数据库,会怎么做,循环一条一条做吗
Mybaits 提供了动态SQL功能
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。
MyBatis中用于实现动态SQL的元素主要有:
- if
- where
- set
- choose(when,otherwise)
- trim
- foreach
下面看几个例子
向数据库中插入批量数据
<insert id="buyTicket" parameterType="com.bsb.pojo.Ticket">
INSERT INTO ticket_table
(
movieId, hallId, startTime, seatRow, seatColumn, ticketPrice, userId
)
VALUES
<foreach collection="list" item="ticket" index="index" separator=",">
(
#{ticket.movieId}, #{ticket.hallId}, #{ticket.startTime}, #{ticket.seatRow},
#{ticket.seatColumn}, #{ticket.ticketPrice}, #{ticket.userId}
)
</foreach>
</insert>
批量更新数据
<update id="updateSelectedMovie" parameterType="java.util.List">
<foreach collection="list" item="movie" index="index" separator=";">
UPDATE movies_table
<set>
scm = #{movie.update}
</set>
WHERE id = #{movie.movieId} AND status = 1
</foreach>
</update>
批量删除数据
<delete id="returnTickets" parameterType="java.util.List">
DELETE FROM ticket_table WHERE userId = #{userId} AND id IN
<foreach item="id" collection="ticketsIds" index="index" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
其实可以看出,这些加入了<foreach>标签的SQL语句其实和普通的语句没有什么区别,区别在于,foreach标签能够对Mapper接口传入的集合参数进行遍历,并且对SQL语句进行拼接,也正是因为这样才能实现批量增删改查的功能
数据库篇
数据库的结构设计真的对后期编码十分影响,这次我们的课设项目的数据表结构设计得在我看来是相当合理的,其中使用到了一些视图、触发器和定时任务,觉得设计得不错并且练了手也对数据库的基本操作有了更好地熟悉和回顾
课程设计github地址 https://github.com/challengerzsz/TTMS-RestfulApi