yJavaEE回顾笔记Ⅱ
1. 介绍
Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。
Maven 是一个项目管理工具,它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统,和用来运行定义在生命周期阶段中插件目标的工具。
2. 功能
帮助构建工程,管理 jar包,编译代码
能够自动运行单元测试,打包,生成报表
可以帮助部署项目,生成 Web 站点
3. 两个核心功能
依赖管理:
通过在 pom.xml 文件中添加所需jar包的坐标。
项目运行时,通过读取坐标到 Maven仓库 找到相应的jar包。
项目构建:
项目从编译、测试、打包、安装、部署整个过程都交给maven管理。这个过程就是项目构建。
* 下载
Maven官网下载地址 :http://maven.apache.org/download.cgi
* 安装
Maven使用java语言开发的,解压即可运行
注意:maven依赖 JAVA_HOME
* 目录
bin:存放了 maven 的命令,比如我们前面用到的 mvn tomcat7:run
boot:存放了一些 maven 本身的引导程序,如类加载器等
conf:存放了 maven 的一些配置文件,如 setting.xml 文件
lib:存放了 maven 本身运行所需的一些 jar 包
* 环境变量
MAVEN_HOME: maven安装目录
path: %MAVEN_HOME%\bin
* 配置完毕了
mvn --version
* 本地仓库
项目通过jar坐标,先从本地仓库找对应jar包,如果找不到会从远程仓库(互联网)去下载jar包,保存在本地仓库(在程序员的电脑上),第二次不需要从远程仓库去下载。
* 远程仓库
中央仓库
由专业团队(maven团队)统一维护。
中央仓库的地址:http://repo1.maven.org/maven2/ https://mvnrepository.com
私服
架设在公司局域网内,提供给内部的人员使用。
第三方仓库
中央仓库只有一个国内使用非常慢,我们可以更换为:阿里云镜像
* 配置
修改 maven的安装目录/conf/settings.xml 文件的标签
* maven的java工程
java工程项目名
|-- src目录
|-- main目录(主干代码)
|--java目录 (java代码)
|--resources目录(配置文件)
|-- test目录(测试代码)
|--java目录 (测试java代码)
|--resources目录(测试配置文件)
|-- target目录(存放编译后的class文件等数据)
|-- pom.xml(maven工程的核心配置文件)
* maven的web工程【重点】
web工程项目名
|-- src目录
|-- main目录(主干代码)
|--java目录 (java代码)
|--resources目录(配置文件)
|-- webapp目录(页面资源)
|--WEB-INF
|-- web.xml(web工程核心配置文件)
|-- css、js、jsp、html...
|-- test目录(测试代码)
|--java目录 (测试java代码)
|--resources目录(测试配置文件)
|-- target目录(存放编译后的class文件等数据)
|-- pom.xml(maven工程的核心配置文件)
1. clean
maven工程的清理命令,执行clean会删除target目录及内容。
2. compile
maven工程的编译命令,作用是将 src/main/java 下的文件编译为class文件输出到target目录下。
3. test
maven工程的测试命令,作用是执行 src/test/java 下单元测试类,并编译为class文件。
4. package
maven工程的打包命令,对于java工程执行package打成jar包,对于web工程打成war包.
5. install
maven工程的安装命令,执行install将maven工程打成jar包或war包,并发布到本地仓库。
6. deploy
maven工程部署命令,将jar或war包部署(上传)到私服中。
maven 对项目构建过程分为“三套相互独立的”生命周期
1. Clean Lifecycle(清理生命周期)
在进行真正的构建之前进行一些清理工作。
命令:clean
2. Default Lifecycle(默认生命周期)
构建的核心部分,编译,测试,打包,部署等等。
命令: compile test package install deploy
3. Site Lifecycle(站点生命周期)
生成项目报告,站点,发布站点。
命令: site
* 在同一个生命周期中的命令,执行后面的命令,前面的命令自动执行
例如:package打包命令 先执行编译、再进行测试,最后再打包
依赖管理,可以配置jar作用时机。
依赖范围 | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行时classpath有效 | 例子 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | mybatis |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
system | Y | Y | - | 本地,maven仓库之外的库 |
* compile
默认依赖范围,作用域在编译、测试、运行时都有效。
* test
作用域在测试时有效。编译和运行时不需要,比如:Junit。
* provided
作用域在编译、测试时有效。运行时不需要,比如: servlet api 被 tomcat 容器提供。
* runtime
作用域在测试、运行时有效。编译时不需要,比如:jdbc的驱动包。
* system
system范围依赖与provided类似,jar包在本地磁盘而不是maven仓库
1. 编写jsp文件,调用相应的Servlet
jsp文件:
提交数据到指定服务器
接受数据并展示
2. 编写Servlet文件,调用serviceImpl方法
Servlet文件:
BaseServet文件:实现HttpServlet,抽取一些Servet共性方法
1.获取action数据,判断需要调用的方法,利用反射调用相应的方法
2.将数据转化为json数据发回jsp文件
UserServlet文件:继承BaseServet,编写各种功能的方法
1.方法名需要和action参数一致,才可以使用反射调用
2.从response域获取参数
3.从Session域中读取或写入参数
4.调用ServiceImpl对象中的方法(先写方法语句,再写接口,再重写实现类)
5.相应的数据处理
5.返回数据
调用父类的方法,将数据转化为json数据发回jsp文件
重定向/转发到新的页面
3. 编写serviceImpl,调用Dao
service接口:添加需要的方法名
serviceImpl实现类:重写接口方法,实现相应功能
调用MyBatisUtils获取SqlSession
加载核心配置文件
获取SqlSessionFactory工厂对象
获取SqlSession
加载映射文件
调用Dao接口中的方法
4. 编写Dao,查询数据
Dao接口文件:
编写方法名
Dao映射文件:
编写sql语句
jsp文件
let username = $(this).val();
let url = "${pageContext.request.contextPath}/UserServlet";
let data = "action=findByUsername&username="+username;
$.post(url,data,function (resp) {
});
**BaseServet **
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("action");
Class clazz = this.getClass();
try {
Method declaredMethod = clazz.getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
declaredMethod.invoke(this,req,resp);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("服务器繁忙");
}
}
protected void javaToJsonWriteClient(HttpServletResponse response, Object object) throws IOException {
//将数据转化为json格式
String json = new ObjectMapper().writeValueAsString(object);
//设置解码格式
response.setContentType("application/json:charset=utf-8");
//返回数据
response.getWriter().write(json);
}
UserServlet
public void demoMethod(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {
//获取request域参数
String telephone = request.getParameter("telephone");
//设置Session域中参数
request.getSession().setAttribute(数据Key,数据Value);
Object sessionCode = request.getSession().getAttribute(数据Key);
//调用Service层方法
ResultInfo resultInfo = userService.sendSms(...);
//用父类方法将数据返回jsp
javaToJsonWriteClient(response, resultInfo);
//重定向到新的页面
request.getRequestDispatcher("/register.jsp").forward(request,response);
}
service接口
public interface UserService {
ResultInfo register(User user);
ResultInfo sendSms(String telephone, String smsCode);
}
service实现类
@Override
public ResultInfo register(User user) {
SqlSession sqlSession = MyBatisUtils.openSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
mapper.save(user);
MyBatisUtils.close(sqlSession);
return new ResultInfo(true,"用户注册成功");
}
Dao接口文件
public interface UserDao {
void save(User user);
}
Dao映射文件
<mapper namespace="com.itheima.travel.dao.UserDao">
<insert id="save" parameterType="User">
insert into tab_user(username,password,telephone) values (#{username},#{password},#{telephone})
insert>
mapper>
1. 是什么?
SVN是 Subversion的简称,是一个自由开源的版本控制系统。
2. 基本概念
repository(源代码库):源代码统一存放的地方
Checkout(提取):当你手上没有源代码的时候,你需要从repository checkout一份
Commit(提交):当你已经修改了代码,你就需要Commit到repository
Update (更新):当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更
* 服务器端
1、创建仓库
2、创建用户
3、创建组
4、为仓库指定权限
* 客户端
1、检查项目 checkout
2、编写代码,将编写的代码先添加到svn,再提交到svn服务器
3、更新代码
4、解决冲突
5、删除代码
6、代码回溯
1. idea中配置svn插件
2. svn标准仓库
trunk: 主干,所用人员编写代码提交的位置
branches: 分支,从主干拉取,用于解决bug或研究新技术等
tags: 标记,里程碑
文件上传前端三要素
文件上传后端使用servlet3.0注解
@WebServlet("/UserServlet")
@MultipartConfig //servlet3.0实现文件上传的主键
public class UserServlet extends BaseServlet {
//文件对象
Part part = request.getpart("pic");
//获取文件名
String fileName = part.getSubmittedFileName();
//文件保存
part.write(realPath);
}
UserServlet
//实现文件上传,修改用户头像
//获取到上传文件
Part part = request.getPart("pic");
//获取文件名称
String fileName = part.getSubmittedFileName();
//基于文件名,判断是否修改了头像信息
if(fileName.length()>0){
// 项目图片访问的图片路径
// 生成随机字符串,避免文件名重名覆盖操作
String path = "/pic/"+ IdUtil.simpleUUID() +fileName;
// 上传图片存放的磁盘真实路径 d:/asfda/asgas.png
String realPath=request.getServletContext().getRealPath(path);
//文件保存
part.write(realPath);
//给user对象设置图片访问路径
user.setPic(path);
}
NoSQL的主流产品
分类 | 特点 | 代表产品 |
---|---|---|
键值存储 | 数据一般存在内存中,读写速度快(10w/s),适合作为缓存服务 | redis |
文档型数据库 | 数据结构要求不严格,适合存储结构不确定或者价值较低的数据 | mongdb |
列存储数据库 | 查找速度快,更容易进行分布式扩展,适合作为文件存储服务 | Hbase |
图形数据库 | 使用“图结构”进行存储,适合做社交网络计算等等 | Neo4j |
Redis(Remote Dictionary Server)是用C语言开发的一个开源的高性能键值(key-value)对数据库,往往作为缓存技术使用。所有数据都是保存在内存中,读写速度极快。
Redis安装和使用
* 下载
Reids官网地址:http://redis.io
中文网地址:https://www.redis.net.cn/
GitHub地址:https://github.com/MSOpenTech/redis/tags
* 目录
redis.windows.conf:配置文件
redis-cli.exe:redis的客户端
redis-server.exe:redis服务器端
* 启动
推荐使用命令行的方式
在当前解压后的目录下 cmd进入dos窗口
先启动 redis-server.exe redis.windows.conf
再启动 redis-cli.exe
redis默认端口号是:6379
Redis数据结构
* Redis采用的键值对存储数据,键(key)的类型只能为字符串,值(value)支持五种数据类型:
1、字符串 String(重点) 数据最多512MB
2、哈希 hashmap 适合存储java中对象的信息
3、双向链表 linkedList 数据特点:有序,底层是双向字符串链表
4、无序集合 set 数据特点:无序、唯一,底层是hash表
5、有序集合 linkedhashset 数据特点:有序、唯一
应用场景
* 秒杀
秒杀涉及高并发问题,数据库无法解决。需要用到缓存技术应对高并发。
* 微博热搜
可以使用zset数据类型完成微博热搜排名操作
* 分布式session
解决服务器集群中不同服务器之间数据交换
* 验证码存储
可以设置数据有效期,记录验证码信息
String 字符串
* 新增
set key value
* 查询
get key
* 删除
del key
* 新增并指定存活时间 expire(过期)
setex key 存活时间(秒) value
ttl key 查看key剩余存活时间
* 主键自增器
incr key (value默认加1)
Hash 哈希
* 新增
hset key hkey hvalue
* 查询
hget key hkey
hgetall key
* 删除
hdel key hkey
del key
List 链表
* 新增
lpush key value 左存值
rpush key value 右存值
* 查询
lrange key start end 从左向有查询 start起始值是:0
* 删除
lpop key 将链表左侧顶端元素取出
rpop key 将链表右侧顶端元素取出
del key 全部删除
Set 集合
* 新增
sadd key value
* 查询
smembers key
* 删除
srem key value -- 删除指定元素
del key 删除整个set集合
ZSet 集合
也称sortedSet, 在Set的基础上,加入了有序功能,在添加元素的时候,允许指定一个分数,它会按照这个分数排序
* 新增
zadd key score value
* 查询
zrange key start end [withscores] -- 默认升序
zrevrange key start end [withscores] -- 降序
* 删除
zrem key value --删除指定元素
del key --删除所有
通用命令
* 模糊查询键
keys *
* 删除多个键
del key1 key2 ...
* 根据键判断记录是否存在
exists key
* 根据键判断值类型
type key
* 选择数据库
select 0-15
* 清空当前数据库
flushdb
* 清空所有数据库
flushall
redis虽然有持久化操作,但是其全部数据依旧都在内存中存在,硬盘上的只是为了安全和备份。
Redis提供了两种数据持久化的方式,分别是RDB和AOF。
* RDB:默认开启的持久化机制
在Redis运行期间,基于指定的时间节点,在满足一定条件后,对内存中的数据进行快照拍摄,将数据持久化到磁盘文件(dump.rdb文件)
指定的时间规则拍摄快照,是在redis.windows.conf配置文件中配置
save 900 1
save 300 10
save 60 10000
# 优点:性能高
# 缺点:可能会造成部分数据丢失
# 应用场景:将redis作为缓存使用
* AOF:默认不开启
在redis运行期间,日志记录的方式监听增删改数据操作。持久化到磁盘中(appendonly.aof)
指定的时间规则拍摄快照,是在redis.windows.conf配置文件中配置
appendonly no ---> appendonly yes 开启AOF
appendfsync always 每次执行增删改操作都会持久化
appendfsync everysec 每秒钟持久化一次
appendfsync no 根据服务器环境,在cpu不忙是持久化一次
# 优点:几乎不会丢失数据
# 缺点:性能比较差
# 应用场景:将redis作为独立数据库使用
Redis作为一款优秀的缓存服务器存在,大多数语言都提供了连接Redis的驱动包,在java中,比较出名的是Jedis和Redisson.
常用API
方法 | 解释 |
---|---|
new Jedis(host, port) | 创建jedis对象,参数host是redis服务器地址,参数port是redis服务端口 |
set(key,value) | 设置字符串类型的数据 |
get(key) | 获得字符串类型的数据 |
hset(key,field,value) | 设置哈希类型的数据 |
hget(key,field) | 获得哈希类型的数据 |
lpush(key,values) | 设置列表类型的数据 |
lpop(key) | 列表左面弹栈 |
rpop(key) | 列表右面弹栈 |
del(key) | 删除指定的key |
导入相关坐标
编写连接池代码,可抽取为工具类
public class JedisUtils {
// 初始化连接池
static {
// 读取配置properties文件给变量赋值
...
// 创建连接池配置对象
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(maxTotal);
jedisPoolConfig.setMaxIdle(maxIdle);
// 创建连接池对象
jedisPool = new JedisPool(jedisPoolConfig, host, port);
}
// 提供获取jedis连接的方法
public static Jedis getJedis() {
return jedisPool.getResource();
}
}
//获取连接对象
Jedis jedis = JedisUtils.getJedis();
//设置值
jedis.set("java","hello world");
jedis.setex("name",20,"baby");
//获取值
String java = jedis.get("java");
//释放资源
jedis.close();
1. jsp页面传递参数
方法名、当前页、最大展示页数、和其他条件
2. Servlet层
接收请求参数
调用service查询分页数据,返回结果为PageBean
将PageBean存入request
转发到旅游线路列表展示页
3. Servcie层
获取代理对象和PageBean对象
调用dao查询相关数据
将以上数据封装到PageBean返回
PageBean
@Data
public class PageBean<T> {
private Integer totalCount;
private Integer totalPage;
private List<T> list;
private Integer currentPage;
private Integer pageSize;
//展示分页页码的起始值和结束值
private Integer begin;
private Integer end;
public Integer getBegin() {
//获取分页起始页面时,对起始页面进行计算修订
calculate();
return begin;
}
//计算分页页码的起始值和结束值
public void calculate(){
if(totalPage<10){
//不足10页
begin = 1;
end = totalPage;
}else {
//超过10页
//前5后4规则
begin=currentPage-5;
end=currentPage+4;
//修订起始值小于1的情况
if(begin<1){
begin=1;
end=begin+9;
}
//修订结束值大于总页面的情况
if(end>totalPage){
end=totalPage;
begin=end-9;
}
}
}
}
1 多表连接查询(inner join) 如果数据量过大时,不建议使用
2 嵌套查询(采用这种方式实现)
3 通过java代码组装需要展示的数据(service调用dao,查询查询的四张表数据再组装即可)
RouteServlet
Route route = routeService.findDetail(rid);
RouteServiceImpl
Route route = routeDaoMapper.findByRidWithAll(rid);
RouteDao
Route findByRidWithAll(String rid);
<resultMap id="routeWithAllMap" type="com.itheima.travel.domain.Route">
<id column="rid" property="rid">id>
<result column="rname" property="rname">result>
<result column="price" property="price">result>
<association property="category" javaType="com...Category" column="cid" select="com...CategoryDao.findByCid">association>
<association property="seller" javaType="com...Seller" column="sid" select="com...SellerDao.findBySid">association>
<collection property="routeImgList" ofType="com...RouteImg" column="rid" select="com...RouteImgDao.findByRid">collection>
resultMap>
<select id="findByRidWithAll" resultMap="routeWithAllMap">
select * from tab_route where rid=#{rid}
select>
CategoryDao
Category findByCid(Integer cid);
<select id="findByCid" resultType="com...Category">
select * from tab_category where cid=#{cid}
select>
RouteImgDao
List<RouteImg> findByRid(Integer rid);
<select id="findByRid" resultType="com...RouteImg">
select * from tab_route_img where rid=#{rid}
select>
SellerDao
Seller findBySid(Integer sid);
<select id="findBySid" resultType="com...Seller">
select * from tab_seller where sid=#{sid}
select>
1. 购物车
购物车数据结构
Cart CartItem
使用redis存储购物车数据
添加商品(旅游线路)到购物车
前端:需要判断是否登录
后端:使用redis保存当前用户的购物车数据
1、redis购物车中是否有当前商品
如果有,数量相加
如果没有,新增商品到购物车
查看购物车列表
删除购物项
2. 订单
订单结算数据展示
收件人地址列表
支付方式
商品清单(购物车中的购物项)
提交订单
order
orderItem
一款基于HTML5 Canvas的纯JS二维码生成插件。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demotitle>
<script type="application/javascript" src="js/jquery-3.3.1.js">script>
<script type="application/javascript" src="js/qrcode.min.js">script>
head>
<body>
<div id="qrCode">div>
<script>
//参数一:二维码位置div的id 参数二:生成二维码的内容
//let qrCode= new QRCode('qrCode','https://www.baidu.com');
new QRCode('qrCode',{
text:'http://www.itcast.cn', //需要编码为二维码的值
width:500, //二维码的宽度(像素)
height:500, //二维码的高度(像素)
colorLight:"red", //二维码的背景颜色。
colorDark:"green", //二维码的前景颜色。
correctLevel:QRCode.CorrectLevel.H //二维码的误差校正级别
});
script>
body>
html>
notify_url
地址发起POST请求/**
* 微信支付工具类
*/
public class PayUtils {
// 支付成功回调地址
private static String notifyUrl = "http://b7ma7w.natappfree.cc/travel/PayNotify";
// 生成微信订单支付 url
public static String getPayUrl(String orderId, Integer totalPay) {
//1、准备接口必填参数
Map<String, String> data = new HashMap<>();
data.put("appid", "wx8397f8696b538317");//公众号
data.put("mch_id", "1473426802");//商户号
//微信SDK提供的功能,生成随机字符串
data.put("nonce_str", WXPayUtil.generateNonceStr());//随机串
// 商品描述
data.put("body", "黑马旅游网支付中心-商品支付");
// 订单号
data.put("out_trade_no", orderId);
//金额,单位是分
data.put("total_fee", totalPay.toString());
//调用微信支付的终端IP
data.put("spbill_create_ip", "127.0.0.1");
//回调地址
data.put("notify_url", notifyUrl);
// 支付有效时间10分钟
Date now = new Date();
Date now_10 = new Date(now.getTime() + 600000); //10分钟后的时间
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");//可以方便地修改日期格式
String nowTime_10 = dateFormat.format(now_10);
data.put("time_expire", nowTime_10);
// 交易类型为扫码支付
data.put("trade_type", "NATIVE");
// 利用HttpClient工具,完成下单
Map<String, String> result = null;
try {
//微信SDK提供的功能,将map集合转为xml格式数据 参数二:传智播客提供的微信支付秘钥
String xmlParam = WXPayUtil.generateSignedXml(data, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb");
//2.通过httpclient请求微信支付接口
HttpClient client=new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
client.setHttps(true);
client.setXmlParam(xmlParam);//封装请求参数
client.post();//发起post提交
//3.返回结果,转换为map
String resultXml = client.getContent();
System.out.println("返回参数:"+resultXml);
//微信SDK提供的功能,将xml字符串转为map格式数据
result = WXPayUtil.xmlToMap(resultXml);
} catch (Exception e) {
throw new RuntimeException("微信下单失败", e);
}
// 校验业务状态
checkResultCode(result);
// 下单成功,获取支付链接
String url = result.get("code_url");
if (StringUtils.isBlank(url)) {
throw new RuntimeException("微信下单失败,支付链接为空");
}
return url;
}
// 检查业务状态
public static void checkResultCode(Map<String, String> result) {
String resultCode = result.get("result_code");
if ("FAIL".equals(resultCode)) {
throw new RuntimeException("【微信支付】微信支付业务失败");
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LehIhKET-1605668885974)(assets\10.png)]
* root目录:超级管理员所在的目录,用~表示
* home目录:普通用户所在的目录
* usr目录:安装软件文件所在的目录
* etc目录:Linux系统管理和配置文件所在的目录
1)查看
* 语法
ls [参数]
* 参数解释
-l 以详细形式查询当前目录下所有文件和目录,不包括隐藏文件和目录
-a 以精简形式查询当前目录下所有文件和目录,包括隐藏文件和目录
* 命令
cd / 进入根目录
ls 以精简形式查询当前目录下的内容
ls -l 以详细形式查询当前目录下的内容,d表示目录,-表示文件;此命令可以简写为ll
ls -a 以精简形式查询当前目录下的隐藏内容
ls -la 以详细形式查询当前目录下的隐藏内容,la和al都可
clear 清屏
2)跳转
* 语法
cd 目录
绝对路径
/xxx/xxx/xxx
相对路径
./ 当前目录
../ 上级目录
* 命令
cd ~ 当前用户目录
cd / 根目录
cd - 上一次访问的目录
cd .. 上一级目录
cd 当前用户目录
3)创建
* 语法
mkdir [参数] 目录
* 参数解释
-p 一次性创建多级目录,如果目录存在不会覆盖
* 命令
cd / 定位于根目录
mkdir aaa 在当前目录下创建aaa目录,相对路径
mkdir ./bbb 在当前目录下创建bbb目录,相对路径
mkdir /ccc 在根目录下创建ccc目录,绝对路径
mkdir /ddd/eee 在根目录下创建ddd目录和eee子目录
4)搜索
* 语法
find 目录 -name '条件'
* 命令
cd /
find / -name 'b' 查询根目录下(包括子目录),名为b的目录和文件
find / -name 'b*' 查询根目录下(包括子目录),名以b开头的目录和文件
在Linux中,按ctrl+c 强行终止程序执行
5)修改(伪改名)
* 语法
mv 旧目录 新目录
* 命令
cd /
mv aaa aaaa 将根目录下的aaa目录修改为aaaa
6)剪切(支持改名)
* 语法
mv 原目录位置 新目录的位置
* 命令
cd /
mv /aaaa /bbb 将根目录下的aaaa目录,移动到bbb目录下,在bbb目录下也叫aaaa目录
mv bbb usr/bbbb 将当前目录下的bbb目录,移动到usr目录下,且修改名为bbbb
7)复制(支持改名)
* 语法
cp -r 目录 目录的新位置
* 参数解释
-r 递归复制,将指定目录下的文件与子目录一并处理
* 命令
cd / 定位于/目录
cp -r /aaa /bbb 将/目录下的aaa目录复制到/bbb目录下,在/bbb目录下名字为aaa
cp -r /aaa /bbb/aaaa 将/目录下的aaa目录复制到/bbb目录下,且修改名为aaaa
8)删除(了解)
* 语法
rmdir [参数] 目录
* 参数解释
-p 删除目录及其父目录
* 命令
cd /
rmdir bbb/ccc 删除bbb目录下ccc目录
rmdir -p bbb/ccc 删除bbb目录和ccc子目录
9)小结
1. 目录查看
ll [-a]
2. 目录跳转
cd 绝对路径 [相对路径]
3. 创建目录
mkdir -p 文件夹名称
4. 搜索
find 指定路径 -name '关键字'
5. 剪切
mv 原来位置 新位置(改名)
6. 复制
cp -r 原来位置 复制后新位置(改名)
1)创建
* 语法
touch 文件名.扩展名
* 命令
cd /soft 定位于/soft目录
touch a.java 在soft目录中创建a.java文件
touch b.txt 在soft目录中创建b.txt文件
touch c.xml 在soft目录中创建c.xml文件
2)查看
* 语法
cat/more/less/head/tail 文件
* 命令
cd /soft
cat a.java 查看a.java文件的最后一页内容
more a.java 从第一页开始,按回车键换行,按空格健翻页,q退出
less a.java 从第一页开始,按回车键换行,按空格健翻页,支持使用PgUp和PgDn翻页,q退出
head a.java 查看a.java文件的前10行内容
tail a.java 查看a.java文件的后10行内容
head -n 7 a.java 查看a.java文件的前7行内容
tail -n 7 a.java 查看a.java文件的后7行内容
* 规则
如果查看页面数据:cat
如果查看多页数据:less
回车:下一行
空格:下一页
PGUP:上一页
PGDN:下一页
q退出
查看头部几行:head
查看尾部几行:tail
3)删除【重点】
* 语法
rm [参数] 目录或文件
* 参数解释
-r 递归处理,将指定目录下的所有文件及子目录一并处理,它会询问你,y表示是删除,n表示不删除
-f 强制删除,它不会再询问你
* 命令
cd /soft
rm -rf a.java 强行式删除当前目录下的a.java文件
rm -rf ./a* 强行式删除当前目录下以a开头的所有文件
rm -rf / 自杀
http://imgsrc.baidu.com/forum/w%3D580/sign=00fefe23dd09b3deebbfe460fcbe6cd3/940f918fa0ec08fa078d4aec55ee3d6d54fbdafc.jpg
4)编辑 (Vi和Vim)
linux 下的vi 是一种文字编辑器,后来的升级版本是vim。vi 分为三种模式:命令行、插入、底行模式。
* 简单使用
vim a.java
i 切换到插入模式
esc 切换到命令行模式
:wq! 保存并退出 | :q! 直接退出,不保存
* 切换到插入模式
i 在当前位置前插入
I 在当前行首插入
a 在当前位置后插入
A 在当前行尾插入
o 在当前行之后插入一行
O 在当前行之前插入一行
* 切换到命令行模式
按Esc键
yy 复制当前行
p 粘贴
dd 删除当前行
G 到文件的最后一行
gg 到文件的第一行
* 切换到底行模式
按 :(冒号)
:wq 保存退出
:q 退出vi(文件无修改的情况下)
:q! 不保存强制退出 quit
windows的压缩文件的扩展名: .zip或.rar
Linux中的打包文件扩展名:.tar
Linux中的压缩文件扩展名:.gz
Linux中打包压缩的文件扩展名:.tar.gz
1)将文件打成压缩包
* 语法
tar -zcvf 打包压缩后的文件名 要打包的文件
tar -cvf *****.tar a.java b.java c.xml d.txt
tar -zcvf *****.tar.gz a.java b.java c.xml d.txt
* 参数解释
-z:调用gzip压缩命令进行压缩
-c:打包文件
-v:显示运行过程
-f:指定文件名
* 命令
cd /soft 定位于/soft目录
tar -zcvf haha.tar.gz a.java b.java c.java
或
tar -zcvf haha.tar.gz ./* 将当前目录下的所有文件打包压缩成haha.tar.gz文件
2)解压缩包获得文件【重点】
* 语法
tar -zxvf 压缩文件
解压后的文件放在当前目录中
tar -zxvf 压缩文件 –C指定目录
解压后的文件放入指定目录中,注意-C是大写字母C,后面不用接空格符
* 参数解释
-z 自动识别压缩或解压
-x 取出文件中的内容
-v 输出文件清单
-f 文件名由命令台设置
* 命令
cd /soft 定位于/soft目录
rm -rf ./*.java 强制式删除当前目录下所有扩展名为java的文件
tar -xvf haha.tar.gz 解压haha.tar.gz这个压缩文件,里面的文件释放到当前目录下
tar -xvf haha.tar.gz -C/usr/local
解压haha.tar.gz这个压缩文件,里面的文件释放到/usr/local目录下
Linux中对每个目录和文件都做了规定,只能由满足条件的用户才能操作,这个规定叫权限。
* 语法
chmod [参数] [<权限范围><符号><权限代号>]
* 参数解释
-R 递归处理,将指定目录下的所有文件及子目录一并处理
* 权限范围
u:User,即文件或目录的拥有者。
g:Group,即文件或目录的所属群组。
o:Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围。
a:All,即全部的用户,包含拥有者,所属群组以及其他用户。
* 符号解释
+ 添加权限
- 取消权限
= 重置权限
* 权限代号
r:读取权限,数字代号为"4"
w:写入权限,数字代号为"2"
x:执行或切换权限,数字代号为"1"
-:不具任何权限,数字代号为"0"
* 命令
chmod u+x 1.txt 给1.txt的拥有者添加执行权限,这种写法稍微有点麻烦,开发中一般使用数字代号
chmod 755 1.txt 给1.txt的拥有者设置读写执行权限,给所属组添加读和执行权限,给其他用户添加 读和执行权限
chmod -R 777 a.txt 给所有人添加对此文件操作的所有权限
1)显示工作目录
* 语法
pwd
2)查看进程
* 语法
ps -au:显示客户端打开的程序进程
ps -ef:当前用户打开的程序进程
* 参数解释
-a 显示所有用户通过终端启动的所有进程
-A 显示所有进程
-u 显示所有用户通过终端启动的所有进程详细信息
-x 显示所有用户通过终端和非终端启动的所有进程详细信息
-e 此参数的效果和指定"A"参数相同,显示所有程序
-f 显示UID,PPID,C与STIME栏位
3)杀死进程
* 语法
kill 进程号:温柔杀
kill -9 进程号:暴力杀
4)搜索【文本】
* 语法
grep [参数] 搜索字符串 文件名
* 参数解释
-i 搜索时不区分大小写,大小写不敏感
-n 显示匹配行及行号,大小写敏感
-v 显示不匹配行及行号,大小写敏感
* 命令
cd /
grep as 123.txt 在123.txt文件中搜索as字符串,大小写敏感,显示行
grep -n as 123.txt 在123.txt文件中搜索as字符串,大小写敏感,显示行及行号
grep -v as 123.txt 在123.txt文件中搜索as字符串,大小写敏感,显示没搜索到行
grep -i as 123.txt 在123.txt文件中搜索as字符串,大小写不敏感,显示行
grep -ni "Q q" 123.txt 在123.txt文件中搜索Q q字符串,大小写不敏感,显示行及行号
5)管道
* 语法
xx | xx
一个命令的输出用作另一个命令的输入
* 命令
ls --help | more 分页查询帮助信息
ps -au | grep system 在ps -au的结果中,搜索字符串a
查看指定进程命令:
ps -ef | grep Xxx
例如:ps -ef | grep tomcat
6)关机
* 语法
poweroff
7)重启
* 语法
reboot
网络(卡)服务
* 查看ip
ifconfig :CentOS6版本
ip addr :CentOS7版本
* 修改网卡ip
vim /etc/sysconfig/network-scripts/ifcfg-ens33
* 概要信息如下
DEVICE=ens33 #网卡名称
TYPE=Ethernet #网卡类型 以太网
ONBOOT=yes #是否开机就使用此网卡 在我们安装的时候都已经配置好
BOOTPROTO=dhcp #启动网卡时指定获取IP地址的方式
常用取值:dhcp (自动获取ip地址,网关,子网掩码等信息无需设置)
常用取值:static (静态ip,如需要访问网络,需要自己设置ip地址等信息)
其他取值:none (不指定)
IPADDR=192.168.6.136 #ip地址
GATEWAY=192.168.6.2 #网关
NETMASK=255.255.255.0 #子网掩码
DNS1=8.8.8.8 # Google提供的公用DNS
* 重启网卡服务
systemctl status network 查看指定服务的状态
systemctl stop network 停止指定服务
systemctl start network 启动指定服务
systemctl restart network 重启指定服务
防火墙服务
* 开启防火墙
systemctl start firewalld
* 重启防火墙
systemctl restart firewalld
* 关闭防火墙
systemctl stop firewalld
* 设置开机启动
systemctl enable firewalld
* 停止并关闭开机启动
systemctl disable firewalld
* 查看防火墙状态
systemctl status firewalld 或者 firewall-cmd --state
* 查看防火墙开机时是否启动
systemctl list-unit-files | grep firewalld
端口设置
* 添加
firewall-cmd --zone=public --add-port=8080/tcp --permanent
* 更新防火墙规则
firewall-cmd --reload
注意:配置了放行端口号,需要更新防火墙规则
* 查看
firewall-cmd --zone=public --query-port=8080/tcp
firewall-cmd --zone=public --list-ports
* 删除
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
* 常用端口
8080 tomcat
80 http协议
443 https协议
22 ssh远程连接
3306 mysql
6379 redis
1. 官网地址:
http://nginx.org/
2. 绿色解压版
3. 启动:
双击nginx.exe即可启动程序,提示放行防火墙,就消失了,其实是启动成功了
4. 访问:
在浏览器输入:http://localhost
5. dos命令行关闭:
nginx.exe -s stop
6. 文件目录
conf 配置文件存放目录
nginx.conf Nginx核心配置文件
html 存放静态资源目录
1. 存放的文件(资源)形式
Nginx是http服务器,只能解析静态文件
Tomcat是web中间件(本质上是一个servlet),能解析jsp和静态文件
2. 用途
nginx可以作为反向代理服务器,负责均衡服务器,静态资源存放服务器
tomcat能作为jsp容器使用,静态资源存放服务器
3. 性能
nginx支持5W+并发,tomcat的并发只能在200-400之间
二进制发布包(绿色免安装)
RPM安装包
* rpm命令安装
语法: rpm 参数 安装包
参数:
-v 显示指令执行过程
-h 表示显示进度
-q 查询包是否已经安装
-a 查看所有安装的软件
-i 安装软件
-U 更新升级
-e 卸载软件
--nodeps 不验证软件的相互关联性
* 常用命令:
安装:rpm -ivh rpm文件
升级:rpm -Uvh rpm文件
卸载:rpm -e --nodeps 软件名
查看所有安装的软件:rpm -qa | grep 具体名
YUM在线安装
yum install 软件名
yum localinstall rpm包 使用yum安装本地rpm包[此过程会自动解决依赖]
源码包
FTP(File Transfer Protocol,文件传输协议)
1. sftp(实现了ssh加密)
使用alt + p 组合键打开sftp窗口
get: 将远程主机(linux)中文件下载到本地主机(windows)
put: 将本地主机(windows)中文件上传到远程主机(linux)
quit: 断开FTP连接
pwd: 查询linux主机所在目录
lpwd: 查询windows主机所在目录
ls: 查询连接到当前linux主机所在目录有哪些文件
lls: 查询当前本地上传目录有哪些文件
lcd: 改变本地上传目录的路径
cd: 改变远程上传目录
2. lrzsz
我们可以使用yum安装方式安装: yum install lrzsz
注意:必须有网络
rz 上传
sz 下载
3. SecureFX工具
1. 查看当前Linux系统是否已经安装java
rpm -qa | grep -i java
rpm -e --nodeps xxxxxx
2. 解压已上传的JDK压缩包,并移动到/usr/local目录下
tar -zxvf /root/jdk-8u201-linux-x64.tar.gz -C /usr/local/
3. 测试jdk
/usr/local/jdk1.8.0_201/bin/java -version
4. 配置环境变量
vim /etc/profile
G 跳转到最后一行
i 进入插入模式
export JAVA_HOME=/usr/local/jdk1.8.0_201
export PATH=$PATH:$JAVA_HOME/bin
esc 进入命令行模式
:wq! 保存
5. 更新环境变量
source /etc/profile
6. 测试
java -version
1. 解压已上传的Tomcat压缩包,到/user/local目录下
tar -zxvf /root/apache-tomcat-8.5.27.tar.gz -C /root
cp -r /root/apache-tomcat-8.5.27 /usr/local/tomcat1
2. 启动tomcat
/usr/local/tomcat1/bin/startup.sh
3. 动态查看日志
tail -f /usr/local/tomcat1/logs/catalina.out
4. 防火墙放行端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
5. 关闭tomcat
/usr/local/tomcat1/bin/shutdown.sh
1. 安装必须库
yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
2. 解压文件
tar -zxvf /root/nginx-1.13.9.tar.gz -C /root
3. 配置
cd /root/nginx-1.13.9
./configure --prefix=/usr/local/nginx
4. 编译
make
5. 安装
make install
6. 启动
/usr/local/nginx/sbin/nginx
7. 防火墙放行端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
8. 停止nginx
/usr/local/nginx/sbin/nginx -s stop #停止服务
9. 修改后,执行
/usr/local/nginx/sbin/nginx -s reload #重新加载配置
1. 查看CentOS是否自带的MySQL环境
rpm -qa | grep -i mysql
rpm -qa | grep -i mariadb
2. 卸载mariadb
rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
3. 解压文件
mkdir -p /usr/local/mysql
tar -zxvf /root/mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar.gz - C/usr/local/mysql
cd /usr/local/mysql/
4. 安装libaio环境(已经存在不需要)
yum install libaio
5. 安装MySQL(按顺序)
rpm -ivh /usr/local/mysql/mysql-community-common-5.7.25-1.el7.x86_64.rpm
rpm -ivh /usr/local/mysql/mysql-community-libs-5.7.25-1.el7.x86_64.rpm
rpm -ivh /usr/local/mysql/mysql-community-devel-5.7.25-1.el7.x86_64.rpm
rpm -ivh /usr/local/mysql/mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm
rpm -ivh /usr/local/mysql/mysql-community-client-5.7.25-1.el7.x86_64.rpm
rpm -ivh /usr/local/mysql/mysql-community-server-5.7.25-1.el7.x86_64.rpm
6. 启动mysql服务
systemctl start mysqld
7. 查看随机生成的密码
grep 'temporary password' /var/log/mysqld.log
8. 修改root用户密码
mysql -u root -p
Enter password:输入刚才查询到的随机密码
>set global validate_password_length=4;
>set global validate_password_policy=LOW;
>set password = password('root');
9. 防火墙放行端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
10. 开启mysql的远程登录权限
mysql -uroot -proot
> CREATE USER 'root'@'%' IDENTIFI ED BY 'root';
> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' ;
> FLUSH PRIVILEGES;
> exit;
11. MySQL编码问题(默认安装完毕为 ISO-8859-1)
1. 编辑/etc/my.cnf,在[mysqld]选项下添加字符集的设置
vim /etc/my.cnf
[mysqld]
character-set-server=utf8
2. 重新启动mysql的服务
systemctl restart mysqld
show create database cc;
1. 解压文件
tar -zxvf /root/redis-3.0.7.tar.gz -C /root
2. 编译
cd /root/redis-3.0.7
make
3. 安装
make PREFIX=/usr/local/redis install
4. 复制配置文件到/usr/local/redis/bin
cp /root/redis-3.0.7/redis.conf /usr/local/redis/bin/
5. 设置后台启动
vim /usr/local/redis/bin/redis.conf
daemonize yes
6. 启动redis
/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf
7. 防火墙放行端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload
8. 关闭redis
/usr/local/redis/bin/redis-cli shutdown
* 语法
netstat -antup
netstat -antup | grep 端口号
* 参数解释
-antup 查看当前正在使用的udp和tcp协议的端口号和进程号
修改 nginx.cnf 配置文件
修改完毕后,需要重写加载配置文件
/usr/local/nginx/sbin/nginx -s reload
# 指定你要代理的tomcat服务器列表
upstream tomcat_server {
server localhost:8080;
}
server {
listen 80;
server_name localhost;
location / {
root html;
# 现在我们nginx不在是访问html路径,改成反向代理
proxy_pass http://tomcat_server;
index index.html index.htm;
}
}
1. 将当前tomcat1停止运行
/usr/local/tomcat1/bin/shutdown.sh
2. 复制tomcat1为tomcat2
cp -r /usr/local/tomcat1 /usr/local/tomcat2
3. 修改tomcat2的3个端口
vim /usr/local/tomcat2/conf/server.xml
8005-->8015 8009-->8019 8080-->8081
4. 放行8081端口
firewall-cmd --zone=public --add-port=8081/tcp --permanent
firewall-cmd --reload
5. 启动两个tomcat
/usr/local/tomcat1/bin/startup.sh
/usr/local/tomcat2/bin/startup.sh
6. 在nginx中配置负载均衡策略
vim /usr/local/nginx/conf/nginx.conf
upstream tomcat_server{
ip_hash;
server localhost:8080 weight=2;
server localhost:8081 weight=1;
}
7. 重新加载nginx配置
/usr/local/nginx/sbin/nginx -s reload
8. 同时开启两个窗口,通过动态查看tomcat日志可见结果
tail -f /usr/local/tomcat1/logs/catalina.out
tail -f /usr/local/tomcat2/logs/catalina.out
伪DNS映射
notpad++工具对linux的配置文件进行文本编辑
al/redis/bin/redis.conf
防火墙放行端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload
关闭redis
/usr/local/redis/bin/redis-cli shutdown
## 10.4项目部署
- **环境确认**
```markdown
* 语法
netstat -antup
netstat -antup | grep 端口号
* 参数解释
-antup 查看当前正在使用的udp和tcp协议的端口号和进程号
修改 nginx.cnf 配置文件
修改完毕后,需要重写加载配置文件
/usr/local/nginx/sbin/nginx -s reload
# 指定你要代理的tomcat服务器列表
upstream tomcat_server {
server localhost:8080;
}
server {
listen 80;
server_name localhost;
location / {
root html;
# 现在我们nginx不在是访问html路径,改成反向代理
proxy_pass http://tomcat_server;
index index.html index.htm;
}
}
1. 将当前tomcat1停止运行
/usr/local/tomcat1/bin/shutdown.sh
2. 复制tomcat1为tomcat2
cp -r /usr/local/tomcat1 /usr/local/tomcat2
3. 修改tomcat2的3个端口
vim /usr/local/tomcat2/conf/server.xml
8005-->8015 8009-->8019 8080-->8081
4. 放行8081端口
firewall-cmd --zone=public --add-port=8081/tcp --permanent
firewall-cmd --reload
5. 启动两个tomcat
/usr/local/tomcat1/bin/startup.sh
/usr/local/tomcat2/bin/startup.sh
6. 在nginx中配置负载均衡策略
vim /usr/local/nginx/conf/nginx.conf
upstream tomcat_server{
ip_hash;
server localhost:8080 weight=2;
server localhost:8081 weight=1;
}
7. 重新加载nginx配置
/usr/local/nginx/sbin/nginx -s reload
8. 同时开启两个窗口,通过动态查看tomcat日志可见结果
tail -f /usr/local/tomcat1/logs/catalina.out
tail -f /usr/local/tomcat2/logs/catalina.out