06_JavaEE回顾笔记Ⅱ

yJavaEE回顾笔记Ⅱ

Day01Maven基础&环境搭建

1.1Maven简介

1. 介绍
		Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。
		Maven 是一个项目管理工具,它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统,和用来运行定义在生命周期阶段中插件目标的工具。
2. 功能
		帮助构建工程,管理 jar包,编译代码
		能够自动运行单元测试,打包,生成报表
		可以帮助部署项目,生成 Web 站点
3. 两个核心功能
	依赖管理:
		通过在 pom.xml 文件中添加所需jar包的坐标。
		项目运行时,通过读取坐标到 Maven仓库 找到相应的jar包。
	项目构建:
		项目从编译、测试、打包、安装、部署整个过程都交给maven管理。这个过程就是项目构建。

1.2Maven安装和使用

* 下载
		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

1.3Maven仓库

* 本地仓库	
		项目通过jar坐标,先从本地仓库找对应jar包,如果找不到会从远程仓库(互联网)去下载jar包,保存在本地仓库(在程序员的电脑上),第二次不需要从远程仓库去下载。
		 
* 远程仓库
	中央仓库
		由专业团队(maven团队)统一维护。 
		中央仓库的地址:http://repo1.maven.org/maven2/  https://mvnrepository.com
	私服
		架设在公司局域网内,提供给内部的人员使用。
	第三方仓库
		中央仓库只有一个国内使用非常慢,我们可以更换为:阿里云镜像

* 配置
		修改 maven的安装目录/conf/settings.xml 文件的标签

1.4Maven工程的结构

* 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.5Maven常用命令和插件

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包部署(上传)到私服中。

1.6生命周期

maven 对项目构建过程分为“三套相互独立的”生命周期
1. Clean Lifecycle(清理生命周期)
		在进行真正的构建之前进行一些清理工作。
		命令:clean
		
2. Default Lifecycle(默认生命周期)
		构建的核心部分,编译,测试,打包,部署等等。
		命令: compile  test  package  install  deploy
		
3. Site Lifecycle(站点生命周期)
		生成项目报告,站点,发布站点。 
		命令: site
		
* 在同一个生命周期中的命令,执行后面的命令,前面的命令自动执行
	例如:package打包命令   先执行编译、再进行测试,最后再打包

1.7依赖管理

依赖管理,可以配置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仓库

Day02用户注册&BaseServlet

2.1基本流程

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语句

2.2Web层

  • 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);
        }
    

2.3service层

  • 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,"用户注册成功");
        }
    

2.4Dao层

  • 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>
    

Day03SVN

3.1简介

1. 是什么?
		SVN是 Subversion的简称,是一个自由开源的版本控制系统。
2. 基本概念
		repository(源代码库):源代码统一存放的地方
		Checkout(提取):当你手上没有源代码的时候,你需要从repository checkout一份
		Commit(提交):当你已经修改了代码,你就需要Commit到repository
		Update (更新):当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更

3.2功能

* 服务器端
		1、创建仓库
		2、创建用户
		3、创建组
		4、为仓库指定权限
* 客户端
		1、检查项目 checkout
        2、编写代码,将编写的代码先添加到svn,再提交到svn服务器
        3、更新代码
        4、解决冲突
        5、删除代码
        6、代码回溯

3.3IDEA集成SVN客户端插件

1. idea中配置svn插件

2. svn标准仓库
		trunk: 主干,所用人员编写代码提交的位置
		branches: 分支,从主干拉取,用于解决bug或研究新技术等
		tags: 标记,里程碑

Day04文件上传、编程思想

4.1文件上传

文件上传前端三要素

头像:

文件上传后端使用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);
	}

4.2面向接口编程

  • 降低各层级间的耦合度
  • 方便代码维护
  • 隐藏底层代码实现细节

4.3工厂模式

  • 导入依赖坐标:dom4j+xpath
  • 编写beans.xml 配置文件
  • 编写BeanFactory工厂
  • 通过工厂模式创建UserServiceImpl对象

Day05Redis

5.1NoSQL

  • NoSQL(Not-Only SQL),泛指非关系型的数据库,它可以作为关系型数据库的良好补充。
  • 解决互联网产品的高并发、高可用、高性能、海量数据问题
  • 一般情况下使用关系型数据库持久化数据(处理复杂的业务场景),对一些热点数据通过NoSQL来作为缓存提高效率…

NoSQL的主流产品

分类 特点 代表产品
键值存储 数据一般存在内存中,读写速度快(10w/s),适合作为缓存服务 redis
文档型数据库 数据结构要求不严格,适合存储结构不确定或者价值较低的数据 mongdb
列存储数据库 查找速度快,更容易进行分布式扩展,适合作为文件存储服务 Hbase
图形数据库 使用“图结构”进行存储,适合做社交网络计算等等 Neo4j

5.2Redis介绍

​ 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 
		解决服务器集群中不同服务器之间数据交换
* 验证码存储
		可以设置数据有效期,记录验证码信息

5.3Redis命令

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

5.4Redis持久化

​ 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作为独立数据库使用

5.5Jedis

​ 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();

Day06分页功能、多表查询

6.1分页功能

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;
            }
        }
    }
}

6.2多表查询

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>

Day07购物流程

1. 购物车

	购物车数据结构
		Cart  CartItem
	使用redis存储购物车数据
	
	添加商品(旅游线路)到购物车
		前端:需要判断是否登录
		后端:使用redis保存当前用户的购物车数据
			1、redis购物车中是否有当前商品
				如果有,数量相加
				如果没有,新增商品到购物车
	查看购物车列表
	
	删除购物项

2. 订单

	订单结算数据展示
		收件人地址列表
		支付方式
		商品清单(购物车中的购物项)	
	提交订单
    	order
    	orderItem 		

Day08微信支付&日志记录

8.1二维码简介

  1. 二维码又称QR Code,QR全称Quick Response,比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
  2. 优势
    • 信息容量大, 可以容纳多达1850个大写字母或2710个数字或500多个汉字
    • 应用范围广, 支持文字,声音,图片,指纹等等…
    • 容错能力强, 即使图片出现部分破损也能使用
    • 成本低, 容易制作
  3. 容错级别
    • L级(低) 7%的码字可以被恢复。
    • M级(中) 15%的码字可以被恢复。
    • Q级(四分)25%的码字可以被恢复。
    • H级(高)30% 的码字可以被恢复。

8.2QRCode

​ 一款基于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>

8.3微信扫码支付简介

  • 申请步骤
    1. 注册公众号 企业/公司| 政府| 媒体
    2. 认证公众号 认证费:300元/次。
    3. 提交资料申请微信支付
    4. 开户成功,登录商户平台进行验证
    5. 在线签署协议
  • 开发文档
    • https://pay.weixin.qq.com/wiki/doc/api/index.html
  • 微信支付接口调用的整体思路:
    • 1、商户生成订单(已经完成)
    • 2、商户调用微信下单接口,获取预交易的链接
    • 3、商户将链接生成二维码图片,展示给用户;
    • 4、支付结果通知:
      • 微信异步通知商户支付结果,商户告知微信支付接收情况
      • 商户如果没有收到通知,可以调用接口,查询支付状态
    • 5、如果支付成功,发货,修改订单状态

8.4微信扫码支付API

  • 请求路径
    • POST , URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder
  • 请求参数
    • appid、mch_id、spbill_create_ip、notify_url、trade_type:是商家自己的信息或固定数据,可以提前配置,因此无需每次请求单独配置,而是统一设置好即可,
    • nonce_str、sign:是为了保证数据安全而添加的验证数据,根据算法去生成,每次请求自动生成即可。
    • body、out_trade_no、total_fee:订单相关信息,需要我们自己填写。
  • 支付结果通知
    • 支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
    • 微信服务会自动向notify_url地址发起POST请求
  • 通知参数
    • return_code
    • return_msg
  • 通信成功,会返回下面信息
    • out_trade_no
    • result_code
  • 我们需要返回给微信的参数
    • return_code
    • return_msg

8.5微信扫码支付SDK

  • 官方已经提供了SDK,供我们使用
  • 微信没有提供maven仓库坐标,因此我们必须下载使用
/**
 * 微信支付工具类
 */
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("【微信支付】微信支付业务失败");
        }
    }
}

8.6内网穿透

  • 内网穿透工具
    • 花生壳(收费)
    • Natapp(免费)

8.7日志记录

  • 介绍
    • 调试日志:记录运行状态,变量等参数信息,异常信息等,方便我们调试程
    • 系统日志:记录用户访问行为,记录程序运行bug
  • 方法增强
    • 继承
    • 装饰器模式:必须手动编写装饰器实现类,进行增强…(回顾filter)
    • 代理模式:不需要手动编写增强的实现类(动态代理…)
  • 动态代理
    • jdk动态代理:要求目标对象和代理对象实现同一个接口【基于接口来创建代理类】
    • cglib动态代理:可以对任意的普通类创建出代理对象【基于继承的思想】

Day09linux基础&Nginx

9.1linux简介及安装

  • 特点:
    • Linux是基于Unix的开源免费的多用户操作系统,相对于windows而言,其运行的稳定性和安全性都有着绝对的优势,因此它几乎成为程序代码运行的最佳系统环境。
  • linux版本:
    • 内核版本:在Linux之父领导下的内核小组开发维护的系统内核的版本号。
    • 发行版本:一些个人/组织/公司在内核版基础上进行二次开发而重新发行的版本号。
  • 通过虚拟机安装:
    1. 安装虚拟机
    2. 虚拟化一台电脑
    3. 安装linux操作系统
      1. 指定CD/DVD linux的iso安装镜像
      2. 虚拟机与物理机鼠标切换 ctrl+alt
      3. 选择中文 简体中文
      4. 上海时间-8个小时
      5. 选择基础设施服务器安装
      6. 指定网络模块开启
      7. 指定密码:123456
      8. 重启登录
  • 通过secureCRT远程连接
    • 远程去连接并操作Linux
    • 企业中常用的有secureCRT、Putty、xshell、SSH Secure等。

9.2Linux目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LehIhKET-1605668885974)(assets\10.png)]

* root目录:超级管理员所在的目录,用~表示

* home目录:普通用户所在的目录

* usr目录:安装软件文件所在的目录

* etc目录:Linux系统管理和配置文件所在的目录

9.3文件夹(目录)操作命令

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 原来位置 复制后新位置(改名)

9.4 文件操作命令

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

9.5 文件压缩命令

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目录下

9.6 文件权限命令

Linux中对每个目录和文件都做了规定,只能由满足条件的用户才能操作,这个规定叫权限。

  • 第一部分:由一个元素组成(类型)
    • l:链接(快捷方式)
    • d:目录(文件夹)
    • -:文件
  • 第二部分:由三个元素组成(当前用户权限)
    • r:read(读) 4
    • w:write(写) 2
    • x:execute(执行) 1
  • 第三部分:由三个元素组成(组内用户权限)
    • r:read(读) 4
    • w:write(写) 2
    • x:execute(执行) 1
  • 第四部分:由三个元素组成(其他用户权限)
    • r:read(读) 4
    • w:write(写) 2
    • x:execute(执行) 1
* 语法
		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	   给所有人添加对此文件操作的所有权限

9.7 其他命令

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

9.8Linux网络

网络(卡)服务

* 查看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

9.9Nginx

  • 介绍
    • 一款开源免费的轻量级 Web 服务器。
    • Nginx性能非常优秀,官方测试能够支撑5万并发链接,并且 cpu、内存等资源消耗却非常低,运行非常稳定。
    • Nginx的功能有很多,我们主要使用它来做静态资源服务器负载均衡服务器反向代理服务器
  • 反向代理服务器
    • 代理: 给某个对象提供一个代理对象,并由代理对象控制原对象的引用
      • 正向代理: 对客户端进行代理(例如VPN)
      • 反向代理: 对服务端进行代理
    • 反向代理就是对服务端进行代理,作为客户端,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再响应给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
  • 负载均衡服务器
    • 负载均衡*(Load Balance)*意思就是将一份负载分摊到多个操作单元上进行执行
  • windows版安装和使用
1. 官网地址:
	http://nginx.org/

2. 绿色解压版

3. 启动:
	双击nginx.exe即可启动程序,提示放行防火墙,就消失了,其实是启动成功了

4. 访问:
	在浏览器输入:http://localhost

5. dos命令行关闭:
	 nginx.exe -s stop
	 
6. 文件目录
	conf	配置文件存放目录
		nginx.conf	Nginx核心配置文件
	html	存放静态资源目录
  • nginx与tomcat区别
1. 存放的文件(资源)形式
	Nginx是http服务器,只能解析静态文件
	Tomcat是web中间件(本质上是一个servlet),能解析jsp和静态文件
	
2. 用途
	nginx可以作为反向代理服务器,负责均衡服务器,静态资源存放服务器
	tomcat能作为jsp容器使用,静态资源存放服务器
	
3. 性能
	nginx支持5W+并发,tomcat的并发只能在200-400之间

Day10项目部署到linux平台

10.1常见的安装方式

  1. 二进制发布包(绿色免安装)

    • 软件已经针对具体平台编译打包发布开发人员拿到安装包之后只要解压,修改配置即可使用
  2. RPM安装包

    • 软件已经按照redhat的包管理工具规范RPM进行打包发布,需要获取到相应的软件RPM发布包,然后用RPM命令进行安装。
    * rpm命令安装
    	语法:  rpm 参数  安装包
    	参数:
            -v 显示指令执行过程
            -h 表示显示进度
            -q 查询包是否已经安装
            -a 查看所有安装的软件
            -i 安装软件
            -U 更新升级
            -e 卸载软件
            --nodeps 不验证软件的相互关联性 
    * 常用命令:
        安装:rpm  -ivh  rpm文件
        升级:rpm  -Uvh  rpm文件
        卸载:rpm  -e --nodeps 软件名
        查看所有安装的软件:rpm -qa | grep 具体名
    
  3. YUM在线安装

    • 软件已经以RPM规范打包,但发布在了网络上的一些服务器上,可用yum在线安装服务器上的rpm软件,并且会自动解决软件安装过程中的库依赖问题。
    yum install 软件名
    yum localinstall rpm包  使用yum安装本地rpm包[此过程会自动解决依赖]
    
  4. 源码包

    • 此种安装包软件以源码工程的形式发布,需要程序员自行编译安装
    • 解压------>配置------->编译-------->安装

10.2上传与下载

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工具

10.3软件安装

  • JDK安装
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
  • Tomcat安装
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 
  • Nginx安装
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  #重新加载配置
  • MySQL安装
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;
  • Redis安装
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

10.4项目部署

  • 环境确认
* 语法
		netstat -antup
		netstat -antup | grep 端口号
		
* 参数解释		
		-antup	查看当前正在使用的udp和tcp协议的端口号和进程号
  • 数据库迁移
    1. 用MySQL将windows的数据库进行备份
    2. 再用MySQL还原到linux的数据库中
  • Tomcat部署项目
    1. 对maven进行package打包
    2. 使用FTP将war包上传到linux服务器
    3. 部署到tomcat中的webapps目录

10.5nginx配置

  • 反向代理

修改 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

10.6其他

  1. 伪DNS映射

    • C:\Windows\System32\drivers\etc\hosts
  2. notpad++工具对linux的配置文件进行文本编辑
    al/redis/bin/redis.conf

  3. 防火墙放行端口
    firewall-cmd --zone=public --add-port=6379/tcp --permanent
    firewall-cmd --reload

  4. 关闭redis
    /usr/local/redis/bin/redis-cli shutdown


## 10.4项目部署

- **环境确认**

```markdown
* 语法
		netstat -antup
		netstat -antup | grep 端口号
		
* 参数解释		
		-antup	查看当前正在使用的udp和tcp协议的端口号和进程号
  • 数据库迁移
    1. 用MySQL将windows的数据库进行备份
    2. 再用MySQL还原到linux的数据库中
  • Tomcat部署项目
    1. 对maven进行package打包
    2. 使用FTP将war包上传到linux服务器
    3. 部署到tomcat中的webapps目录

10.5nginx配置

  • 反向代理

修改 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

10.6其他

  1. 伪DNS映射
    • C:\Windows\System32\drivers\etc\hosts
  2. notpad++工具对linux的配置文件进行文本编辑
    • 最新版本NppFtp插件

你可能感兴趣的:(javaee)