Log4J

Log4J

apache推出的开源免费日志处理类库

使用步骤

1. 导入log4j-xxx.jar
2. 在src目录下新建log4j.properties(不能改!!!)

log4j.properties文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//第一行写的是五种错别级别中的哪一种 是输出到console输出台 还是可以到文件LOGFILE

//五种错误: fatal(致命错误 程序员无法解决) > error(错误) > warn(警告) > info(普通信息) > debug(调试信息)

log4j.rootCategory=INFO, CONSOLE


//以下是关于输出到控制台的信息

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender //使用的是这个类
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout //输出
log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n //输出格式


//以下是关于输出到项目下面的信息

log4j.appender.LOGFILE=org.apache.log4j.FileAppender //使用这个类
log4j.appender.LOGFILE.File=axis.log //输出的文件名称
log4j.appender.LOGFILE.Append=true //是否开启了添加功能(就是往文件里面存)
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n //输出的格式

输出pattern的几个表达式:

%C                       包名+类名
%d{YYYY-MM-dd HH:mm:ss}  时间
%L   行号
%m   信息
%n   换行

settings 标签(全局配置文件)

在mybatis全局配置文件中通过settings标签控制mybatis全局开关

我们鼠标放到configuration上面就会弹出下面标签的顺序和使用个数

配置步骤

1. 准备好jar包 + 实体类 + mybatis全局配置文件 + log4j.properties配置文件
2. configuration标签下写settings标签
    <settings>
        <setting name="LogImpl" value="LOG4J"/>      //settings里面属性就是LogImpl  然后值取log4j
    </settings>

3. log4j可以配置指定内容日志(可以控制输出检查错误)

配置步骤第三步分析:


parameterType 属性(mapper包内配置)

在mapper包里的xml配置文件中 select delete等标签的parameterType可以控制参数类型

配置步骤

1. 需要在mapper包里的xml里面去配置select标签
2. 需要在test测试类里面调用

具体分析

1. 分析mapper包配置文件的具体写法

#{}获取参数

    1. 使用索引       从0开始
    2. 使用#{param1}  从1开始

    里面只有一个参数 --#{随便写}
    参数是对象 --#{属性名}
    参数是map  --#{key}

实现代码:

1
2
3
<select id="selById" resultType="com.bjsxt.pojo.People" parameterType="int">  //原来基础上加parametType属性 里面放的是你传进来数字的类型
select * from people where id=#{0} //#{0} 就是把测试类里面的参数(属性就是parameterType的值)传进来
</select>

2. test测试类session调用

三种方法使用:

    1.session里面的selectList()和selectOne()是第二个参数传入
    2.session里面的selectMap()就是第三个参数传入

实现代码:

1
2
People p=session.selectOne("com.bjsxt.mapper.selById",1);  //传入查询id=1的值
System.out.println(p); //输出结果

3. ${} 和 #{} 区别(面试题)

#{}  索引获取 / param1获取指定位置参数 并且在SQL语句内使用?占位符
${}  字符串拼接 默认去找${内容}中内容的get/set方法 (如果写数字 就是一个数字)

Mybatis全局配置文件详解

全局配置文件内容

transactionManager属性中type取值

 

  1. JDBC    事务管理使用JDBC原生事务管理方式
  2. MANAGED  把事务管理转交给其他容器(spring框架)

setAutoMapping(false);

dataSource中type取值

  1. POOLED   使用数据库连接池
  2. UNPOOLED  不使用数据库连接池,和直接使用JDBC一样
  3. JNDI    为了使用如spring或者应用服务器这类的容器

数据库连接池

在内存中开辟一块空间,存放多个数据库连接对象

JDBC tomcat Pool

直接由tomcat产生数据库连接池

  • 图示

实现JDBC tomcat Pool步骤

  1. 在web项目的WebContent/META-INF存放context.xml文件

  1. 书写十个属性(前四个是数据库属性)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>    
<Context>
<Resoure
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/eesy"
username="root"
password="njdxrjgc7777777."
maxActive="50" //运行的最大数字
maxIdle="10" //等待的最大数字
name="test"
auth="Container" //由tomcat自动启动
maxWait="10000" //等待最大实现
type="java.sql.DataSoure" //我去name找到数据库连接池的时候对象什么样子

/>
</Context>

三种查询方式 session.方法

selectList()结果需要遍历

selectOne()结果只是变量/一行数据

selectMap()结果只查某列的值


Mybatis(eclipse详细)

用eclipse配置环境

导入相关的jar包

src下新建全局配置mybatis.xml文件(编写JDBC的四个变量)

2.1 xml引入DTD(在mybatis.chm找)

1
2
3
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

2.2 如果导入DTD后续没有自动提示

2.3 编写和jdbc以及连接数据库有关的资源(自动提示)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<configuration>    
<!-- default引用environment的id 当前使用环境 -->
<environments default="default">
<!-- 声明使用的环境 -->
<environment id="default">
<!--使用原生JDBC事务-->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="uri" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="njdxrjgc7777777."/>
</dataSource>
</environment>
</environments>
</configuration>

新建实体类名Mapper.xml(编写sql语句S)##

3.1 xml引入DTD(在mybatis.chm找)

1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

*3.2 xml相当于实体类(xml全路径) 以及实现方法和返回值类型(实体类全路径) *

1
2
3
4
5
6
7
8
9
10
11
12
<mapper namespace="com.bjsxt.FlowerMapper"> <!-- 实现类的全路径namespace -->
<!--
id:方法名
parameterType:定义参数类型
resultType:返回值类型 如果返回值是list 在resultType中写List的泛型 因为mybatis对jdbc封装 一行一行读取数据

-->
<select id="selAll" resultType="com.bjsxt.pojo.Flower">
select * from flower
</select>

</mapper>

编写测试类

1.需要生产SqlSession

2.然后我们知道要用工厂设计模式–所以使用对应的SqlSessionFactory接口

3.我们通过ctrl+t打开查看接口实现类–需要关联外部文件夹–选择mybatis-3-mybatis-3.2.7文件的src

4.通过分析接口实现类发现是有参构造方法–需要新建Configuration类

5.因为实例化比较麻烦 –使用构建者模式快速构建对象 – 然后build需要字节流 –所以要用字节流去加载写好的主配置文件

6.使用建造好的实体生产SqlSession –list接xml配置文件的sql执行结果 –for输出

7.最后就是要关闭连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Test {
public static void main(String[] args) throws IOException {

//因为建造者模式的build需要一个字节流 我们需要将主配置文件导入
InputStream is = Resources.getResourceAsStream("mybatis.xml");

//使用工厂设计模式
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is); //build(Reader reader) 要用字节流

//生产SqlSession
SqlSession session=factory.openSession();

//调用配置类
List<Flower> list=session.selectList("com.bjsxt.FlowerMapper.setAll"); //找的是xml的namespace全路径
for(Flower flower:list)
{
System.out.println(flower.toString());
}

//关闭(不关的话和数据库还是长连接状态)
session.close();

}
}

相当于实现类的xml需要加载到主配置文件内

要在mybatis.xml里面加载我们的相当于实现类的xml的全路径

1
2
3
<mappers>
<mapper resource="com/bjsxt/mapper/FlowerMapper.xml"></mapper>
</mappers>

总体结构

1: mapper包:存放xml配置文件(相当于实现类的那个xml)
    功能:
         1.1 mapper里面存放namespace自己的全路径
         1.2 我们写的是select(还可以使用其他的) 然后id是需要写的方法名字 resultType写返回值给实体类的全路径
         1.3 select里面要写sql语句

2: pojo包:里面存放的是实体类
    功能:
          2.1 里面写所有数据库属性还有set/get方法 以及tostring方法(test类输出)

3: test包:里面存放测试类
    功能:
            3.1 读取主配置文件
            3.2 使用工厂设计模式和建造者模式创建sqlsession
            3.3 调用配置的xml文件全路径+方法名
            3.4 使用完断开连接

4: 主配置文件:主要用于写使用的JDBC数据池和mysql的配置 以及加载我们的xml(相当于实现类)
    功能:
            4.1 使用transactionManager写原生JDBC事务
            4.2 使用dataSource书写数据池和property的标签写mysql的配置
            4.3 然后mappers就写各种实现类的配置xml(中间写resource就是xml的全路径)        

Mybatis(idea+maven)

框架概念

使用框架前后对比

之前的MVC结构与框架对比:

持久层(Dao)技术解决方案

1. JDBC技术:
           Connection        获取连接
        PreparedStatement   提前处理sql语句
            ResultSet       处理sql语句获得结果

2. Spring的JdbcTemplate(工具类):
        Spring对jdbc的简单封装

3. Apache的DBUtils(工具类):
        和Spring的JdbcTemplate很像,也是简单封装

4. 数据池:
    彻底死掉的C3P0(ssh里面的h框架的内置数据池)
    咸鱼翻身的DBCP
    功能全面的Druid(阿里云)
    性能无敌的HikariCP

Mybatis框架概述

内部封装了jdbc,使开发者只需要关注sql语句本身,而不用花费精力去处理加载驱动、创建连接等工作。

通过xml或者注解的方式将执行的各种statement配置起来,并且通过java对象和statement中的sql动态参数进行映射生成最终的sql语句,最后由框架执行sql语句并且将结果映射给java对象并且返回。

通过ORM思想(Object Relational Mappging 对象关系映射)解决了实体和数据库映射的问题,对jdbc的api底层访问细节,使我们不用于jdbc的api打交道,就可以完成数据库的持久化操作


Mybatis环境搭建

前期环境准备

1.新建数据库

1
2
3
4
5
6
7
8
9
10
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龙'),(45,'传智播客','2018-03-04 12:04:06','男','北京金燕龙'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'小马宝莉','2018-03-08 11:44:00','女','北京修正');

2.通过无骨架的创建方式创建maven工程

3.通过pom.xml文件去添加mybatis和mysql的jar包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.itheima</groupId>
<artifactId>day01_easy_01mybatis</artifactId>
<version>1.0-SNAPSHOT</version>

<packaging>jar</packaging> <!--通过jar包-->

<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId> <!--通过Mybatis官网找到的框架 只需要更改版本号-->
<version>3.4.5</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <!--需要mysql-->
<version>5.1.6</version>
</dependency>

<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId> <!--日志文件-->
<version>1.2.12</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId> <!--单元测试-->
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>

</project>

书写代码框架

1.main/java里书写domain和dao层代码

dao层IUserDao类:

1
2
3
public interface IUserDao {
List<User> findAll(); //接口写查询所有的方法
}

domain层的User类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class User implements Serializable {
//和数据库保持一致
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public Date getBirthday() {
return birthday;
}

public void setBirthday(Date birthday) {
this.birthday = birthday;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}

2.创建Mybatis的主配置文件 sqlMapConfigxml(需要导入外部的约束(就是前面的四行))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--Mybatis的主配置文件-->
<configuration>
<!--配置环境 default和id必须一致-->
<environments default="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--连接数据库的四个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy"/>
<property name="username" value="root"/>
<property name="password" value="njdxrjgc7777777."/>
</dataSource>
</environment>
</environments>

<!--指定映射配置文件的位置 映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="com/itheima/dao/IUserDao.xml"/>
</mappers>

</configuration>

3.创建映射配置文件 IUserDao.xml((需要导入外部的约束(就是前面的四行))

1
2
3
4
5
6
7
8
9
10
11

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.dao.IUserDao">
<!--配置查询所有-->
<select id="findAll">
select * from user;
</select>
</mapper>

Mybatis的xml配置开发

拷贝日志文件(log4j.properties)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

书写Test类

在src/test/java里面写Test类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class MybatisTest {
public static void main(String[] args) throws IOException {
//1.读取配置文件
InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml"); //读取我们的mybatis主配置文件

//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(in); //构建流(怎么解析我们不用管)

//3.使用工厂生产SqlSession对象
SqlSession session=factory.openSession();

//4.使用SqlSession创建Dao接口的代理对象
IUserDao userDao=session.getMapper(IUserDao.class); //没有实现类 我们用代理对象去做

//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user:users)
{
System.out.println(user);
}

//6.释放资源
session.close();
in.close();
}
}

更改IUserDao.xml映射文件(增加结果封装到哪里)

1
2
3
<select id="findAll" resultType="com.itheima.domain.User">   <!--我们要把结果封装到User才可以-->
select * from user;
</select>

测试执行

1.最终的入门程序格式:

2.代码执行结果:


xml开发方式中设计模式分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//1.读取配置文件
InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml"); //读取我们的mybatis主配置文件

//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(in); //构建者模式

//3.使用工厂生产SqlSession对象
SqlSession session=factory.openSession(); //工厂模式

//4.使用SqlSession创建Dao接口的代理对象
IUserDao userDao=session.getMapper(IUserDao.class); //没有实现类 我们用代理对象去做

//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user:users)
{
System.out.println(user);
}

//6.释放资源
session.close();
in.close();

每一步的解析:


Mybatis注解开发

准备之前的所有东西

1.将pom导入的jar文件写在新的项目的pom.xml里面

2.将上面用xml配置方式的src/java和resource以及test测试类全部拷贝进新项目

进行xml更改为注解方式

3.删除之前的IUserDao.xml的配置方式(里面写的是查询语句和最后返回给User封装)

4.在IUserDao的接口里面使用Select注解(把之前的xml方式的东西挪到里面)

1
2
3
4
public interface IUserDao {
@Select("select * from user")
List<User> findAll();
}

5.那么要删除SqlMapConfig.xml的Mybatis主配置(之前是链接xml的位置 现在是直接找到类名)

1
2
3
4
5
<!--指定映射配置文件的位置 映射配置文件指的是每个dao独立的配置文件-->
<!--如果使用注解来配置文件,此处应该用class属性指定被注解的dao全限定类名-->
<mappers>
<mapper class="com.itheima.dao.IUserDao"/>
</mappers>

Nginx

Nginx(反向代理)

场景需求

  
  原来是1w个访问要去使用tomcat会导致并发太高,然后我们可以通过多开Tomcat服务器从而来分担。所以引入了nginx来分配tomcat。这种方式也叫做反向代理

Nginx概述

  
  Nginx是一款高性能http服务器/反向代理服务器/电子邮件(IMAP/POP3)代理服务器。官方测试nginx能支撑5w的并发连接,而且cpu和内存等资源消耗比较低。

应用场景

1. 网页静态服务器

2. 动态服务器(部署在tomcat里面,通过nginx反向代理搭建集群)

3. 虚拟主机(可以实现一台服务器虚拟出多个网站)

4. 反向代理和负载均衡 


Nginx安装

环境准备

1. 安装gcc环境(之前redis安装就已经安装好了)

1
yum install gcc-c++

2. 安装第三方的开发包(PCRE zlib Openssl)

1
2
3
yum install -y pcre pcre-devel
yum install -y zlib-devel
yum install -y openssl openssl-devel
  • PCRE
    PCRE(Perl Compatible Regular Expressions)是一个 Perl 库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库。

  • zlib
    zlib 库提供了很多种压缩和解压缩的方式,nginx 使用 zlib 对 http 包的内容进行 gzip,所以需要在 linux 上安装 zlib 库。

  • OpenSSL
    OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在 ssl 协议上传输 http),所以需要在 linux安装 openssl 库。

上传解压

3. 通过rz 上传nginx文件并且tar -zxvf解压

4. 当面目录下输入以下文字 会生成makeFile文件

1
2
3
4
5
6
7
8
9
10
11
12
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi

5. 执行make指令编译 执行make install指令下载


Nginx启动

启动步骤

1. mkdir /var/temp/nginx/client -p 创建子目录

2. 进入到Nginx目录下的sbin目录 然后执行nginx即可

3.打开nginx之后浏览器打开(直接输入linux里面的ip地址)

4.通过 ps aux|grep nginx 查看进程

其他操作指令(目录站在nginx/sbin里面)

1
2
3
4
5
6
7
1. 启动Nginx   ./nginx

2. 查看进程 ps aux|grep nginx

3. 关闭Nginx ./nginx -s stop // ./nginx -s quit

4. 重启Nginx 1.先关闭后启动 2.刷新配置文件 ./nginx -s reload

静态资源部署

更改nginx/conf/nginx.conf配置文件

通过EditPlus5去进行设置ftp

1. 打开文件-FTP-设置FTP服务器-然后输入信息

2. 根据左上角目录去找左下角对应的目录文件然后右边更改

3. 每次更新之后弹窗选择确定就可以提交更新

4. 更改后的信息解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

worker_processes 1;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

server {
listen 80;
server_name localhost;


location / {
root index;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

}

准备好index文件复制到nginx目录下

1.使用FileZilla软件也可以使用ftp上传

2.更改nginx.conf配置里面的root

3. 重启nginx之后(./nginx -s reload)浏览器打开就自动跳转到了index页面


虚拟主机-端口绑定

配置文件解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

worker_processes 1;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

server {
listen 81; # 默认端口号码
server_name localhost; # 写的是域名或者ip地址配置


location / {
root index; # 默认访问资源的目录
index index.html index.htm; # 默认访问资源名称
}

error_page 500 502 503 504 /50x.html; # 错误页面
location = /50x.html {
root html;
}
}

server {
listen 82;
server_name localhost;

location / {
root regist;
index regist.html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}

往linux再上传需要的静态网页文件

1.还是跟之前一样通过filezilla软件上传到nginx文件下面

2.通过浏览器(记得输入不同的端口号)即可

总结

1
2
其实就是刚才的静态资源配置多配置一个server{} 然后要多有一个端口(我一个是81/一个是82)
然后就可以通过IP地址+不同的端口就可以进行访问

配置文件内部需要增加一个server{}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

server {
listen 82;
server_name localhost;

location / {
root regist;
index regist.html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}

虚拟主机 域名绑定

举例

1.按上面81和82端口的例子:去hosts文件加一个域名绑定

2.我们就可以通过www.ceshi.com然后加上端口访问

更改server里的server_name

我们就可以通过www.ceshi.com然后加上端口访问


反向代理

正向代理(针对客户端)

需求:学生通过主机去找网络连接(VPN)

反向代理(针对服务器端)

需求:通过网络去找部署在linux上的tomcat服务器
    1. 直接访问:tomcat并发低(负载大)
    2. 反向代理:搭建tomcat集群,出现反向代理服务器。由服务器分发到tomcat去,还可以增加在给tomcat时候防火墙提高安全性

反向代理准备

1.将需要的项目打包成war上传(rz)到tomcat的webapps目录下

2.执行tomcat/bin里面的startup.sh 能够通过浏览器打开即可

配置反向代理

1.修改Nginx配置(server{}之前写)

1
2
3
	upstream tomcat-travel{
server 192.168.209.128:8080; # tomcat浏览器的地址配给nginx
}

2.修改nginx.conf配置

1
2
3

1. 将server{}里面的root index注释掉
2. 在下面加 proxy_pass http://tomcat-travel; # tomcat-tarvel可以随便起

3.访问

1
2
3
1. 浏览器输入:server里面的server_name(一般是localhost 但是也可以通过绑定域名(hosts文件改))
2. 然后他这个网络internet会去找nginx代理主机(proxy_pass)
3. 代理主机就去找upstream里面的tomcat

总结

1. 之前的演示:将静态网页直接放在nginx文件夹下 我们通过配置server{}端口和域名然后直接从浏览器访问到了tomcat
2. 反向代理:
    2.1 准备:
        项目打包成war文件放在tomcat/webapps里面 然后通过在nginx配置文件加upstream和更改掉访问的root index 从而加proxy_pass达到功能
    2.2 访问:
        现在就是浏览器写server里面的域名 -->  因为nginx里面配备了proxy_pass所以会到nginx --> http://后面的会去找upstream里面的tomcat -->  从而反向回来反馈到浏览器。
3. 总结:
     因为域名输入后他不知道到底是nginx还是tomcat给的回应,所以后面的两个相当于封装起来提供了安全性

访问时候的分析:


负载均衡

我们搭建很多的tomcat形成tomcat集群(使得nginx寻找的几率相等)

1.需要很多linux机器上拥有tomcat(演示时候是一台linux放三个tomcat)

2.(将tomcat文件复制两份然后依次进去更改其他两个的端口)

3.启动每个linux的tomcat(启动三个tomcat服务器)

4.然后每个linux上的nginx配置反向代理(更改nginx配置文件内部upstream加server(因为端口不一样))

5.通过访问器访问就会不同几率的访问不同的tomcat(配置文件里面可以改浏览器title名称来区别)


Linux部署

Linux部署

修改项目

druid.properties中将url后面加characterEncoding=utf-8

还需要将本地的数据库转成sql文件导入到linux中的数据库中

更改绝对路径为相对路径(localhost:8080)

java里面maven使用插件package打包成war文件

将war包上传到linux的目录下 启动tomcat

通过windows浏览器: localhost:8080/项目名

总结

  其实就是将项目打包成war包然后放在linux里面通过tomcat启动,我们就可以通过windows去启动。

Linux网络知识

Linux权限

以root目录下的文件为例:

权限分为四部分(- — — —(1333))

文件类型(-)

- 表示 文件
d 表示 文件夹
l 表示 连接

当前用户对该文件拥有的权限(—)

r 表示 读(read)
w 表示 写(write)
x 表示 可执行(excute)

当前组内用户对该文件的权限(—)

r 表示 读(read)
w 表示 写(write)
x 表示 可执行(excute)

其他组对该文件的权限(—)

r 表示 读(read)
w 表示 写(write)
x 表示 可执行(excute)

权限管理 chmod

chmod u=?,g=?,o=? xxx

u:当前用户
g:当前组内用户
o:其他组用户

可以选择填写参数 rwe(三者都可以)    

例如: chmod u=rwx,g=rx,o=rx a.txt  对a.txt文件进行更改

chmod ??? xxx

r: 4
w: 2 
x: 1

可以选择填写数字配对 (三者都可以)    

例如: chmod 775 a.txt  对a.txt文件进行更改

修改ip

配置主机名

hostname 查看主机名

重启后无效:
    hostname xxx 修改主机名

永久生效:
    修改/etc/sysconfig/network文件

配置IP地址

重启后无效:
    ifconfig 查看(修改)ip地址
       例:ifconfig eth0 192.168.12.22 修改ip地址

永久生效:
    修改/etc/sysconfig/network-scripts/ifcfg-eth0文件
       例:
          1. vim /etc/sysconfig/network-scripts/ifcfg-eth0
          2. 修改两个参数(ONBOOT改为yes/ BOOTPROTO改为static)
          3. 添加四行(IP地址/子网掩码/网络地址/广播地址)

例如我将我的ip为192.168.209.128:


域名映射(本机生效)

/etc/hosts文件用于在通过主机名进行访问时做ip地址解析
相当于windows的 C:\Windows\System3\drivers\etc\hosts文件

1. vim etc/homes 进入文件

2. 按i插入 192.168.209.128 itcast01 一行

3. 通过ping itcast也可以进行(以前都是ping192.168.209.128的一行)


网络服务管理 service

指定服务 service network

service network status   查看指定服务的状态
service network stop     停止指定服务
service network start    启动指定服务
service network restart  重启指定服务

service --status–all    查看系统中所有后台服务
netstat –nltp           查看系统中网络进程的端口监听情况

防火墙设置 service iptables

防火墙根据配置文件/etc/sysconfig/iptables来控制本机的”出”、”入”网络访问行为。
    service iptables status 查看防火墙状态
    service iptables stop 关闭防火墙
    service iptables start 启动防火墙
    chkconfig  iptables off 禁止防火墙自启

Vim

Vim编译器

linux通过vim编译器来编译文件

具有三种模式:命令行 插入 底行模式


具体操作

  • vim aa.txt :  通过命令行模式进入aa.txt文件内部

  • 按 i o a :   进入插入模式

    i  当前位置前插入
    I  当前行首插入
    a  当前位置后插入
    A  当前行尾插入
    o  当前行之后插入一行
    O  当前行之前插入一行
  • 按住ESC键 –> 输入:wq   进入底行模式


maven

1.maven定义

1.1 maven解释

Maven是Apache旗下的一个开源项目,是一款用于管理和构建java项目的工具

官网:https://maven.apache.org/

Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。

开源项目:https://www.apache.org/index.html#projects-list

1.2 maven三大作用

image-20231222144237371

1.2.1 方便的依赖管理

  • 方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题
image-20231222144337794

当使用maven进行项目依赖(jar包)管理,则很方便的可以解决这个问题。 我们只需要在maven项目的pom.xml文件中,添加一段如下图所示的配置即可实现。

image-20231222144507762

1.2.2 统一项目结构

image-20231222144604821

1.2.3 标准的项目构建流程

  • maven提供了标准的、跨平台(Linux、Windows、MacOS) 的自动化项目构建方式
image-20231222144643383

Maven提供了一套简单的命令来完成项目构建

image-20231222144725994

2.maven安装

1.安装压缩包解压即可使用(避免中文路径)

2.配置环境(依靠于JAVA_HOME)
    2.1 添加MAVEN_HOME变量
    2.2 在path里面添加上面的变量

3.调试测试
    cmd输入 mvn -v

认识了Maven后,我们就要开始使用Maven了,那么首先我们要进行Maven的下载与安装。

2.1 下载

下载地址:https://maven.apache.org/download.cgi

image-20231222145200791

2.2 安装步骤

Maven安装配置步骤:

  1. 解压安装
  2. 配置仓库
  3. 配置Maven环境变量

1、解压 apache-maven-3.6.1-bin.zip(解压即安装)

建议解压到没有中文、特殊字符的路径下。如课程中解压到 E:\develop 下。

解压缩后的目录结构如下:

  • bin目录 : 存放的是可执行命令。(mvn 命令重点关注)
  • conf目录 :存放Maven的配置文件。(settings.xml配置文件后期需要修改)
  • lib目录 :存放Maven依赖的jar包。(Maven也是使用java开发的,所以它也依赖其他的jar包)

2、配置本地仓库

2.1、在自己计算机上新一个目录(本地仓库,用来存储jar包)

image-20231222151451665

2.2、进入到conf目录下修改settings.xml配置文件

1). 使用超级记事本软件,打开settings.xml文件,定位到53行

2). 复制标签,粘贴到注释的外面(55行)

3). 复制之前新建的用来存储jar包的路径,替换掉标签体内容

image-20231222151509447

3、配置阿里云私服

由于中央仓库在国外,所以下载jar包速度可能比较慢,而阿里公司提供了一个远程仓库,里面基本也都有开源项目的jar包。

进入到conf目录下修改settings.xml配置文件:

1). 使用超级记事本软件,打开settings.xml文件,定位到160行左右

2). 在标签下为其添加子标签,内容如下:

1
2
3
4
5
6
<mirror>  
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
image-20231222151536565

注意配置的位置,在 中间添加配置。如下图所示:

image-20221130161346565

==注: 只可配置一个(另一个要注释!) ,不然两个可能发生冲突,导致jar包无法下载!!!!!!!==

4、配置环境变量

Maven环境变量的配置类似于JDK环境变量配置一样

1). 在系统变量处新建一个变量MAVEN_HOME

  • MAVEN_HOME环境变量的值,设置为maven的解压安装目录
image-20231222151719668

2). 在Path中进行配置

  • PATH环境变量的值,设置为:%MAVEN_HOME%\bin
image-20231222151754933

3). 打开DOS命令提示符进行验证,出现如图所示表示安装成功

1
mvn -v
image-20231222151744058

3.仓库种类和关系

1. 本地仓库(默认本地仓库有jar包,没有就去中央仓库下载jar包)  ---自己计算机上的一个目录(用来存储jar包)
2. 远程仓库(私服):如果没有可以从中央仓库和本地仓库上传  ---一般由公司团队搭建的私有仓库
3. 中央仓库(最大的几个T的jar包):要使用必须有网!!  ---由Maven团队维护的全球唯一的。仓库地址:https://repo1.maven.org/maven2/

初次安装maven需要配置仓库和jar包

image-20231222142729079

直接导入一个maven仓库解压

image-20231222142814691

当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包

  • 如果有,则在项目直接引用

  • 如果没有,则去中央仓库中下载对应的jar包到本地仓库

如果还可以搭建远程仓库(私服),将来jar包的查找顺序则变为: 本地仓库 –> 远程仓库–> 中央仓库


4.maven标准目录结构

有规则的管理项目:

src/main/java目录     核心代码部分
src/main/resources    配置文件部分
src/test/java        测试代码部分(Junit单元测试)
src/test/resources   测试配置文件
src/main/webapps      页面资源(js css 图片等等)

5.maven常用命令

1. mvn clean      删除       target目录和内容(万一是别人项目 你先删除了编译信息在进行其他的)
2. mvn compile    进行编译   target目录下生成ServletTest的class文件
3. mvn test       进行测试   target目录下生成test测试类的文件
4. mvn package    进行打包   java工程执行package成jar包 web工程成war包
5. mvn install    进行安装   将上述的步骤整合之后将war包发布到本地仓库

6.maven生命周期

6.1 三套生命周期

Maven的生命周期就是为了对所有的构建过程进行抽象和统一。 描述了一次项目构建,经历哪些阶段。

在Maven出现之前,项目构建的生命周期就已经存在,软件开发人员每天都在对项目进行清理,编译,测试及部署。虽然大家都在不停地做构建工作,但公司和公司间、项目和项目间,往往使用不同的方式做类似的工作。

Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完美的,易扩展的项目构建生命周期。这个生命周期包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤。

Maven对项目构建的生命周期划分为3套(相互独立):

image-20231222151946972
  • clean:清理工作。

  • default:核心工作。如:编译、测试、打包、安装、部署等。

  • site:生成报告、发布站点等。

三套生命周期又包含哪些具体的阶段呢, 我们来看下面这幅图:

image-20231222152034828

我们看到这三套生命周期,里面有很多很多的阶段,这么多生命周期阶段,其实我们常用的并不多,主要关注以下几个:

• clean:移除上一次构建生成的文件

• compile:编译项目源代码

• test:使用合适的单元测试框架运行测试(junit)

• package:将编译后的文件打包,如:jar、war等

• install:安装项目到本地仓库

Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际工作。在Maven的设计中,实际任务(如源代码编译)都交由插件来完成。

image-20231222152115977

IDEA工具为了方便程序员使用maven生命周期,在右侧的maven工具栏中,已给出快速访问通道

image-20231222152157918

生命周期的顺序是:clean –> validate –> compile –> test –> package –> verify –> install –> site –> deploy

我们需要关注的就是:clean –> compile –> test –> package –> install

说明:在同一套生命周期中,我们在执行后面的生命周期时,前面的生命周期都会执行。

思考:当运行package生命周期时,clean、compile生命周期会不会运行?

​ clean不会运行,compile会运行。 因为compile与package属于同一套生命周期,而clean与package不属于同一套生命周期。

image-20231222152306933

6.2 两种执行方式

在日常开发中,当我们要执行指定的生命周期时,有两种执行方式:

  1. 在idea工具右侧的maven工具栏中,选择对应的生命周期,双击执行
  2. 在DOS命令行中,通过maven命令执行
image-20231222152421701

6.2.1 在idea中执行生命周期

  • 选择对应的生命周期,双击执行

image-20231222152651661

compile:

image-20231222152704261

test:

image-20231222152720890

package:

install:

image-20231222152833957

clean:

image-20231222152906234

6.2.2 在cmd命令行执行生命周期

1.进入到DOS命令行

image-20231222153015559 image-20231222153030559

7.maven概念模型图(三个部分)

image-20231222142916980

  • 项目对象模型 (Project Object Model)
  • 依赖管理模型(Dependency)
  • 构建生命周期/阶段(Build lifecycle & phases)

7.1 项目对象模型

image-20231222153541833

以上图中紫色框起来的部分属于项目对象模型,就是将我们自己的项目抽象成一个对象模型,有自己专属的坐标,如下图所示是一个Maven项目:

image-20231222153609509

坐标,就是资源(jar包)的唯一标识,通过坐标可以定位到所需资源(jar包)位置

image-20231222153712457

7.2 依赖管理模型

image-20231222153739430

以上图中紫色框起来的部分属于依赖管理模型,是使用坐标来描述当前项目依赖哪些第三方jar包

image-20231222153755668

7.3 构建生命周期/阶段

image-20231222153513016

以上图中紫色框起来的部分,就是用来完成标准化构建流程 。当我们需要编译,Maven提供了一个编译插件供我们使用;当我们需要打包,Maven就提供了一个打包插件供我们使用等。


8.maven使用步骤

idea继承maven插件

1. 一定要在创建项目的地方更改

image-20231222143000019

2. 第一步改配置的环境和xml文件

image-20231222143033773

3. 加属性防止因为断网不能创建maven

image-20231222143203838

使用骨架创建maven的java工程

1. 新建项目 –> maven –> 选择骨架的quickstart

image-20231222143231648

2. 选择填写公司/项目名/版本信息

image-20231222143010870

3. 确定信息

image-20231222143053804

4. 然后进入之后第一次需要配置环境 选择右下角第二个的自动导入的英文

image-20231222143117701

5. 自己新建resources文件 去右键更新为资源root

image-20231222143133194

不使用骨架创建maven的java工程

1. 只是不选择骨架 其他的都一样

2. 创建后直接有框架不需要更多的添加

image-20231222143304027

使用骨架创建maven的web工程

1. 还是选择maven –> 选择webapp的骨架

image-20231222143313055

2. 其他的和java步骤一样 –> 自己手动建立java文件并且右键改为source root

image-20231222143321013


9.maven工程servlet实例

1. 更改java的配置 让java也可以创建jsp文件

image-20231222143338906

2. 新建servlet包 –> 新建servlet类 –> 配置路径

image-20231222143350573

3. servlet报错需要导入jar包 –> pom配置相关的jar

image-20231222143411545

4. 如果本地仓库没有就百度maven中央仓库 –> 找要的jar下载弹出界面拷贝里面的代码即可

5. 编写代码 –> 最右边列选择Maven –> 选择m的符号输入 tomcat:run执行tomcat

image-20231222143420547

6. tomcat出现jar冲突 –> 添加scope范围 让jsp和servlet的只是在写代码时候有用 执行时使用tomcat插件

7. pom里面添加设置(设置成我们的tomcat7)

1
2
3
4
5
6
7
8
9
10
11
12
13
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>9999</port>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>

8. pom给jdk添加配置(设置成我们的jdk1.8)

1
2
3
4
5
6
7
8
9
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin>

9. 类似于7和8的步骤可以创建模板

image-20231222143534403 image-20231222143527363

10.maven的jave工程取mysql数据

准备数据库

image-20231222143552715

准备domain包的类去接里面的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Items {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

pom里面写需要的mysql和junit的jar包

1
2
3
4
5
6
7
8
9
10
11
12
13
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>

准备dao包和实现类impl包

dao层代码

1
2
3
public interface ItemsDao {
public List<Items> findAll() throws Exception;
}

daoImpl层代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class ItemsDaoImpl implements ItemsDao {
public List<Items> findAll() throws Exception{

List<Items> list=new ArrayList<Items>(); //去接结果
Connection connection=null;
PreparedStatement pst=null;
ResultSet rs=null;
try{
//1.加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
connection=DriverManager.getConnection("jdbc:mysql:///maven","root","njdxrjgc7777777.");
//3.获取真正操作数据的对象
pst=connection.prepareCall("select * from items");
//4.执行数据库操作
rs = pst.executeQuery();
//5.查询结果转成java的list集合
while(rs.next()){
Items items=new Items();
items.setId(rs.getInt("id"));
items.setName(rs.getString("name"));
list.add(items);
}

} catch (Exception e){
e.printStackTrace();
}finally{
connection.close();
pst.close();
rs.close();
}

return list;
}
}

准备test层代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ItemsTest {
@Test
public void findAll() throws Exception {
ItemsDao dao=new ItemsDaoImpl(); //面向接口编程
List<Items> list=dao.findAll(); //得到结果给list集合
for (Items items:list)
{
System.out.println(items.getId()); //增强for循环输出结果
System.out.println(items.getName());
}

}

}

image-20231222143602869


11.总结

image-20231222143619632

1.实现类必须要有的四要素:
    数据库驱动(看你用的oracle还是mysql)
    连接数据库的地址 url
    数据库用户名称 info
    数据库密码 password

    //1.加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
     //2.获取连接对象
            connection=DriverManager.getConnection("jdbc:mysql:///maven","root","njdxrjgc7777777.");

2.相比于web开发其实就是利用maven更规格化。jar可以通过pom去直接映射的找(不用直接导入项目内)。直接利用maven的五个指令就可以操作。

12.依赖管理

12.1 依赖配置(4步)

依赖:指当前项目运行所需要的jar包。一个项目中可以引入多个依赖:

例如:在当前工程中,我们需要用到logback来记录日志,此时就可以在maven工程的pom.xml文件中,引入logback的依赖。具体步骤如下:

  1. 在pom.xml中编写标签

  2. 标签中使用引入坐标

  3. 定义坐标的 groupId、artifactId、version

    image-20231222154224519

    4.点击刷新按钮,引入最新加入的坐标

  • 刷新依赖:保证每一次引入新的依赖,或者修改现有的依赖配置,都可以加入最新的坐标

image-20231222154215574

注意事项:

  1. 如果引入的依赖,在本地仓库中不存在,将会连接远程仓库 / 中央仓库,然后下载依赖(这个过程会比较耗时,耐心等待)
  2. 如果不知道依赖的坐标信息,可以到mvn的中央仓库(https://mvnrepository.com/)中搜索

12.2 依赖传递

12.2.1 依赖具有传递性(默认有传递性)

我们现在使用了maven,当项目中需要使用logback-classic时,只需要在pom.xml配置文件中,添加logback-classic的依赖坐标即可。

在pom.xml文件中只添加了logback-classic依赖,但由于maven的依赖具有传递性,所以会自动把所依赖的其他jar包也一起导入。

image-20231222154452825
  • 依赖传递可以分为:
  1. 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  2. 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
image-20231222160055585
  • 例如:
image-20231222154535310

12.2.2 排除依赖(加exclusions标签)

  • 排除依赖:指主动断开依赖的资源。(被排除的资源无需指定版本)
image-20231222155025411

12.3 依赖范围(默认任何位置)

在项目中导入依赖的jar包后,默认情况下,可以在任何地方使用。

image-20231222155602597

12.3.1 限制依赖适用范围(加scope标签)

作用范围:

  1. 主程序范围有效(main文件夹范围内)

  2. 测试程序范围有效(test文件夹范围内)

  3. 是否参与打包运行(package指令范围内)

scope标签的取值范围(像修饰符一样):

scope 主程序 测试程序 打包(运行) 范例
compile(默认) Y Y Y log4j
test - Y - junit
provided Y Y - servlet-api
runtime - Y Y jdbc驱动

13. 分模块设计与开发(一个项目关联其他项目jar包)

分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分

分模块设计我们在进行项目设计阶段,就可以将一个大的项目拆分成若干个模块,每一个模块都是独立的

image-20231227160112385
  • 针对之前的项目就可以拆分多个子项目完成,在通用组件pom.xml文件中引用即可
image-20231227155302652

在各自项目内配置需要的依赖(pom.xml),然后再通同组件内调用其他依赖

image-20231227160832361

14.继承与聚合

Maven打包方式:

  • ==jar:普通模块打包==,springboot项目基本都是jar包(内嵌tomcat运行)

  • ==war:普通web程序打包==,需要部署在外部的tomcat服务器中运行

  • ==pom:父工程/聚合工程==,该模块不写代码,仅进行依赖管理

14.1 继承(加parent标签)

将各个项目共同的依赖 –提取–> 父工程

image-20231227170204299
  • 概念:

继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承(==单一继承==)

  • 作用:

==简化依赖配置、统一管理依赖==

  • 实现:
1
2
3
4
5
6
<parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<relativePath>....</relativePath> 设定父工程的pom.xml文件位置[如果不指定,将从本地仓库/远程仓库查找该工程]
</parent>

14.1.1 步骤

  • 1.创建父工程,在父工程的pom.xml文件中设置打包方式为pom(默认jar) –====
image-20231227171512978
  • 2.在子工程的pom.xml文件中,配置继承关系 –====和里面的====
image-20231227171729961

【注意:当配置了父工程之后,子工程坐标的就可以删除,因为会自动继承父工程】

  • 3.在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖【子工程可以删除】)
image-20231227172956947

14.1.2 版本锁定(加dependencyManagemen标签)

在maven中,父工程pom.xml文件通过==标签==来==统一管理依赖版本==

  • 思路:
image-20231227174014699

各个项目不同的依赖,父工程pom.xml文件中通过dependencyManagement统一版本,并不会将这个依赖直接引入进来。子工程调用的时候就不用写version版本标签

要修改就在父工程区修改【但是子工程必须要调用,因为父工程只是统一版本了但是没有引入啊!!】

image-20231227172837396 image-20231227172956947

==版本锁定就是在继承(可以不调用,会自动继承父类的)的前提上,子工程必须调用(同一版本不引入依赖,只是管理)但是可以省略版本号就行==

14.1.3 自定义属性/引用属性(加自定义标签)

==集中的集中管理== –也可以在父工程中将版本号统一在properties标签内设定自定义标签lombok.version,然后在其他依赖引入的version位置加入

image-20231227174344711
  • 举例:
image-20231227174621891

14.1.4 区别对比

image-20231227175310417
  • 文字对比
image-20231227175439177

面试题:<dependencyManagement><dependencies> 的区别是什么?

  • <dependencies> 是直接依赖,在父工程配置了依赖,子工程会直接继承下来。
  • <dependencyManagement> 是统一管理依赖版本,不会直接依赖,还需要在子工程中引入所需依赖(无需指定版本)

14.2 聚合(加modules标签)

对所有聚合的子模块统一操作==快速构建项目==

  • 聚合:

    将多个模块组织成一个整体,同时进行项目的构建。

  • 聚合工程:

    一个不具有业务功能的“空”工程(有且仅有一个pom文件) 【一般来说,继承关系中的父工程 == 聚合关系中的聚合工程】

  • 作用:

    快速构建项目(无需根据依赖关系手动构建,直接在聚合工程上构建即可)

  • 实现:

1
2
3
4
5
6
<!--聚合其他模块-->
<modules>
<module>../tlias-pojo</module>
<module>../tlias-utils</module>
<module>../tlias-web-management</module>
</modules>

在maven中,我们可以在聚合工程中通过 <modules> 设置当前聚合工程所包含的子模块的名称。

==那此时,我们要进行编译、打包、安装操作,就无需在每一个模块上操作了。只需要在聚合工程上,统一进行操作就可以了==

14.3 继承和聚合的对比

  • 作用

    • 聚合用于快速构建项目

    • 继承用于简化依赖配置、统一管理依赖

  • 相同点:

    • 聚合与继承的pom.xml文件打包方式均为pom,通常将两种关系制作到同一个pom文件中

    • 聚合与继承均属于设计型模块,并无实际的模块内容

  • 不同点:

    • 聚合是在聚合工程中配置关系,聚合可以感知到参与聚合的模块有哪些

    • 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己

15.私服

  • 私服:是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题。

  • 依赖查找顺序:

    • 本地仓库

    • 私服仓库

    • 中央仓库

  • 注意事项:私服在企业项目开发中,一个项目/公司,只需要一台即可(无需我们自己搭建,会使用即可)。

image-20231227195332519

16.配置文件pom.xml详细解释(基本能遇到的标签)

16.1 项目相关

image-20231227181949935

16.2 父工程相关

image-20231227182027419

16.3 自定义属性/引用属性

image-20231227182105218

16.4 聚合相关

image-20231227182137893

16.5 项目依赖相关

image-20231227182259350

16.6 打包相关

image-20231227182323163

redis配合ajax实现显示下拉列表省份

需求分析

1. 提供:index.html页面,页面中有一个省份 下拉列表
2. 页面加载完成后 发送ajax请求,加载所有省份

搭建环境

新建数据库

导入jar和配置文件以及各种包

druid连接池配置文件

1
2
3
4
5
6
7
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///day23
username=root
password=njdxrjgc7777777.
initialSize=5
maxActive=10
maxWait=3000

jedis.properties配置redis文件

1
2
3
4
host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10

dao层及daoImpl层实现

dao层

1
2
3
public interface ProvinceDao {
public List<Province> findAll();
}

daoimpl层

1
2
3
4
5
6
7
8
9
10
11
12
public class ProvinceDaoImpl implements ProvinceDao {
//1.获取数据库连接池对象
private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<Province> findAll() {
//1.定义sql
String sql="select * from province";
//2.执行sql
List<Province> list=template.query(sql,new BeanPropertyRowMapper<Province>(Province.class));
return list;
}
}

domain层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Province {
private int id;
private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

service和servlet层

service层

1
2
3
4
5
6
public interface ProvinceService {
public List<Province> findAll();

public String findAllJson() throws JsonProcessingException;

}

service实现层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class ProvinceServiceImpl implements ProvinceService {
//面向接口编程
private ProvinceDao dao=new ProvinceDaoImpl();

@Override
public List<Province> findAll() {
//调用dao实现
return dao.findAll();
}

//使用redis缓存
@Override
public String findAllJson() throws JsonProcessingException {
//1.先从redis中查询数据
//1.1先获取redis客户端连接
Jedis jedis = JedisPoolUtils.getJedis(); //调用写好的数据池工具类
String province_json = jedis.get("province"); //获取key值为province

//2.判断json数据是否为null
if(province_json==null||province_json.length()==0) //redis里面没有数据
{
//2.1从数据中查询
List<Province> ps = dao.findAll();
//2.将list序列化为json
ObjectMapper mapper=new ObjectMapper();
province_json=mapper.writeValueAsString(ps);
//2.3将json数据存入redis
jedis.set("province",province_json); //获取key值为province
//2.4归还连接
jedis.close();
}
return province_json;
}

}

servlet层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@WebServlet("/provinceServlet")   //配置路径 名字改为小写
public class ProvinceServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.调用service
ProvinceService service=new ProvinceServiceImpl();
String json=service.findAllJson();
System.out.println(json);

//3.响应结果
response.setContentType("application/json;charset=utf-8"); //json中文乱码
response.getWriter().write(json); //直接响应给客户端
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}

redis数据池工具类和前端页面

redis数据池工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
1.加载配置文件
2.配置连接池的参数
3.提供获取连接的方法
*/
public class JedisPoolUtils {
private static JedisPool jedisPool;
static{
//读取配置文件
InputStream is=JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties"); //使用类加载器
//创建properties对象
Properties pro=new Properties();
//关联文件
try {
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//获取数据 设置到JedisPoolConfig中
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
//初始化JedisPool
jedisPool=new JedisPool(config,pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));
}

//获取连接的方法
public static Jedis getJedis(){
return jedisPool.getResource();
}

}

前端index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
$(function(){
//发送ajax请求 加载所有省份数据
$.get("provinceServlet",{},function (data) {
//[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]
//1.获取select
var province=$("#province");
//2.遍历json数组
$(data).each(function () {
//3.创建<option>
var option="<option name='"+this.id+"'>"+this.name+"</option>"; //相当于<option name=‘1’>北京<option>需要动态变化 ‘’拼接字符串
//4.使用select的append追加option
province.append(option);
});
});
});
</script>
</head>
<body>

<select id="province">
<option>--请选择省份--</option>
</select>

</body>
</html>

总结

###注意

1.使用redis缓存比较适合:一些不经常发生变化的数据。
2.数据库的数据一旦发生改变,则需要更新缓存。
3.数据库的表执行 增删改的相关操作,需要将redis缓存数据情况,再次存入
4.在service对应的增删改方法中,将redis数据删除。

###使用心得

发现redis就是在第一次还是需要查数据库,然后service要给redis缓存起来,但是第二次开始已经从缓存redis去取。这种就比较适合于数据变动不大的情况,如果增删改三种操作的话就不太适合了。而且这个小demo是把处理放在service层去做(redis在此)。

###ajax序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//1.先从redis中查询数据
//1.1先获取redis客户端连接
Jedis jedis = JedisPoolUtils.getJedis(); //调用写好的数据池工具类
String province_json = jedis.get("province"); //获取key值为province

//2.判断json数据是否为null
if(province_json==null||province_json.length()==0) //redis里面没有数据
{
//2.1从数据中查询
List<Province> ps = dao.findAll();
//2.将list序列化为json
ObjectMapper mapper=new ObjectMapper(); //调用jar里面的ObjectMapper类
province_json=mapper.writeValueAsString(ps); //调用方法直接转为json
//2.3将json数据存入redis
jedis.set("province",province_json); //获取key值为province
//2.4归还连接
jedis.close();
}

执行demo(我用的tomcat7.0版本一定要在web.xml里面改成2.5)

打开服务器–客户端–查询


,