关键名词
ognl表达式语言数组性调用a[‘value’]
Hperviser虚拟化技术(虚拟机监控)
VWvare虚拟机
Linux操作系统Ubuntu、Fedora、Debian
API应用程序编程接口
框架
软件开发中的一套解决方案,不同框架解决的是不同的问题
B/S:浏览器/服务器(三层架构);C/S:客户端/服务器
三层架构:
- 表现层:是用于展示数据的web
- 业务层:是处理业务需求的controller/service(在controller中一般完成对对象的封装,这样在service中只需要处理对象)
- 持久层:是和数据库交互的dao
持久层技术:
JDBC是规范
Spring的JDBCTemplate和Apache的DBUtils都只是(对jdbc封装)工具类MVC模型
model数据模型:用于封装数据
view依据数据模型创建:显示数据(jsp、servlet)
controller交互部分、用于处理程序逻辑
restful风格
@requestMapping(path="/hello/{id}",method=Request.Post)//根据发送类型post和id确认要执行的方法
mybatis框架——————
概述
-
是一个持久层框架,由Java编写
-
封装了jdbc操作的很多细节
-
使开发者只需关注本身,而无需关注驱动、连接等
-
使用ORM思想实现结果集的封装
object relational Mappging对象关系映射,数据库表和实体类及实体类属性对应起来,实现实体类就实现操作数据库表(实体类中的属性要与数据库表的字段名称一致)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QXzun2zS-1577074382355)(F:\TyporaWorkplace\文件\图片\mybatis.jpg)]
配置文件
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/studentscore?useSSL=false&serverTimezone=UTC
username=root
password=123456
jdbc:mysql://localhost:3306/studentscore?useUnicode=true&characterEncoding=utf8//xml中填写
连接池
C3P0
Druid
阿里巴巴连接池实现技术:手动加载(路径)
Properties pro = new Properties();
//加载配置文件!!!前提是在src下,加载输出流
pro.load(JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
//获取dateSource对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
Connection conn=ds.getConnection();//ds有这个方法
type属性
- POOLED采用传统的DataSource规范中的连接池,mybatis中有针对规范的实现
- UNPOOLED采用传统的获取链接的方式,也能实现DataSource的接口,但没有使用池的思想
- JNDI采用服务器提供的技术实现,来获取DataSource对象,不同服务器拿到的DataSource不同(如果不是web或者maven的war工程,不能使用)
Spring JDBC
方法:
JdbcTemplate t=new JdbcTemplate(ds);
update();//执行DML(增删改)语句
queryForMap();//将查询结果封装到map集合中,结果集长度只能是1!!!!!
queryForList();//将结果集封装到list集合中————将一条记录封装到Map集合中,再讲Map集合装载到历史同时集合中
query();//~JavaBean对象中。参数:RowMapper。一般使用BeanPropertyRowMapper实现类(*5),可以完成数据到JavaBean的自动封装
queryForObject();//~为对象。一般用于聚合函数的查询count(id)等
案例:
//普通的更新语句
JdbcTemplate template = new JdbcTemplate(JDBCUtil.getDataSource());
String sql="update t_user set password='123' where id=1;";//————————1
System.out.println(template.update(sql));
String sql="update t_user set password=? where id=?;";//————————1
System.out.println(template.update(sql,'123',1));
//查询结果,结果集存于list中
String sql="select * from emp where id=?";
List<Map<String, Object>> maps = template.queryForList(sql, 1);
for (Map<String, Object> stringObjectMap : maps) {//对结果集进行遍历
System.out.println(stringObjectMap);
}
List<User> list=template.query(sql,new BeanPropertyRowMapper<User>(User.class));//————5框架
for(User user:list){
System.out.println(user);
}
入门搭建
执行案例
入口
class Resources获得文件内容的输入流
class SqlSessionFactoryBuilder接收SqlMapConfig.xml的文档流,构建SqlSessionFactory对象
interface SqlSessionFactory读取SqlMapConfig.xml中连接数据库和mapper映射信息,用来生产处真正操作数据库的SQLSession对象
interface SqlSession (作用:生成接口代理对象;定义通用增删改查方法)
//读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");//根据所给参数,获取字节输入流
//创建SqlSeesionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//使用工厂生产SQLSession对象
SqlSession session = factory.openSession();
//使用SqlSession创建dao接口代理对象
UserDao userDao = session.getMapper(UserDao.class);
//执行
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
//释放
session.close();
in.close();
mybatis配置
<configuration>
<properties resource="jdbcConfig.properties">//对应配置文件
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/studentscore?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
<!-- 主配置环境-->
<environments default="mysql">
<!-- 配置MySQL环境-->
<environment id="mysql">
<!-- 配置事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源-->
<dataSource type="POOLED">
<!-- 配置连接数据库的四个基本信息-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,dao独立的配置文件-->
<mappers>
<mapper resource="com/itheima/dao/UserDao.xml"/>
</mappers>
JavaBean
public class User implements Serializable{}
映射要求
-
映射文件和被映射文件名要规范:IUserMapper.xml(IUserDao.xml)都是IUserDao.java的映射文件
-
映射文件文职必须和dao层包结构相同
-
映射文件配置,id名取值必须是dao接口方法名
<mapper namespace="com.itheima.dao.UserDao"> <select id="findAll" resultType="com.itheima.domain.User" parameterType="">
maven
mvn -v//查看是否安装成功
cd F:\idea使用\day01_eesy_01mybatis
f:
mvn clean//首先找到文件首路径,之后清除项目编译信息
仓库
本地、远程仓库(私服)、中央仓库
周期
clean清除、compile编译、test测试、package打包、install安装、deploy发布
xml:
-
项目自身信息(三个基本信息)
<groupId>org.mybatis</groupId>//公司组织名 <artifactId>mybatis</artifactId>//项目名 <version>3.4.5</version>//版本号
-
项目依赖的jar包信息
<dependencies><dependency> <scope>provided</scope>//处理包的冲突问题
-
项目运行环境信息(Tomcat、jdk)
<build><plugins><plugin> <configuration>//更改端口号 <port>8888</port> </configuration>
OGNL表达式
object graphic navigation language对象图导航语言
获取形式:user.username();而不是user.getUserName();
直接写原因:parameter中已经提供属性所属的类,所以此时不需要写对象名
pojo
属性名称:#{}、${}
使用ognl来解析对象字段的值
动态sql
<select id="findAll" resultMap="userMap" parameterType="user">
select * from t_user where 1=1;//使用where语句则不需要where 1=1,它会自己补
<where>
<if test="userName!=null and 1=1">
and username=#{userName};
</if>
</where>
</select>
JNDI
SpringMVC————
由各种器组成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5tDM6m66-1577074382356)(F:\TyporaWorkplace\文件\图片\springmvc器.JPG)]
入门
项目创建:Maven的maven-achetype-webapp项目(防止项目下载过慢创建:archetypeCatalog:internal)
重点:入门案例、请求参数的绑定、常用注解
//建立请求与处理请求的方法直接的关系(通过前端得虚拟地址直接执行类注解对应的方法)
@requestMapping(path="/hello")//属性:method(RequestMethod.POST)请求方式
<a href="hello">内容</a>
Serializable
当类继承其,则组成javaBean实体,通过属性相同来获取参数等
过滤器
HiddentHttpMethodFilter//过滤器,form只支持get/post,以此来支持put/delete等
中文过滤器
-
request.setChar();
-
<!-- 加中文过滤器--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
响应问题
经过servlet过滤之后的,网页跳转问题
有返回值跳转
通过return返回值与xml文件相配合
return "success";
model存值
设置一个新的网页
model.addAttribute(user);//需要声明isELignored=false,使用model存对象
之后再html中直接用~显示代码
${user.name}
void无返回值跳转网页
通过request请求跳转网页
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);//编写请求转发的程序设置路径
request.sendRedirect(request.getContextPath()+"/index.jsp");//重定位
response.setCharacterEncoding("UTF-8");//解决中文乱码
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("hello");//相应内容
ModelAndView
ModelAndView mv=new ModelAndView();
mv.addObject(user);//与方法二相似
mv.setViewName("success");//与方法一相似
forward、
return "forward:/WEB-INF/pages/success.jsp";//请求转发:直接用关键字跳转
return "redirect:项目名虚拟路径/index.jsp";//重定向
@ResponseBody响应json
//导入jQuery.min.js时,告诉前端控制器,哪些静态资源不拦截:声明js下的所有文件不拦截
<mvc:resources mapping="/js/" location="/js/**"/>
文件上传
前提
注解:
文件下载
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<form enctype="mutipart/form-data" method="Post">//默认为application/x-www-form-urlencoded,请求正文内容的类型为分开为头等
<input type="file">
导入jar包:commons-fileuplo
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>配置文件解析器
</bean>
使用springmvc框架思想使用配置器替代DiskFileItemFactory工厂
将request用框架方法替代HttpServletRequest
异常处理
拦截器:servlet(java web工程都可以用),加/*时,什么都拦
过滤器:springmvc中可以用,只拦controller
SSM
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<mysql.version>5.1.6</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
<!-- aop相关jar包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 测试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- jdbc摸板-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--测试范围-->
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<!-- el表达式/eltl表达式-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 日志的-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!--c3p0连接池-->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
导入时,项目红线
- 原因:太多jar包同时导入时的版本冲突
- 解决:全部注释后一个个导入
spring框架————
全栈级框架,以IOC(控制反转)和AOP(面向切面编程)为内核
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IFCYZmG3-1577074382357)(F:\TyporaWorkplace\文件\图片\spring.JPG)]
core container核心容器ioc
耦合
程序间的依赖关系
解耦:降低程序间的依赖关系
实际开发中:编译期不依赖,运行时才依赖
解决方法:(实质:由编译级错误转化为运行级错误)
- 使用反射(xml配置),避免使用new关键字
- 通过读取配置文件来获取要创建的对象全限定类名
bean
可以被反复使用的组件
IOC
控制反转:资源直接请求,变为将资源交给工厂,进行间接请求以减少依赖(程序耦合),由spring进行依赖维护(依赖注入)
由JdbcDemo1 j=new BeanFactory();变成JdbcDemo1 j=BeanFactory.getBean(“accountJdbc”);
ApplicationContext
//加载核心容器对象的三个方法,使用耦合方法
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");//加载类路径下的配置文件
FileSystemXmlApplicationContext("F:\localMavenWarehouse\bean.xml");//加载磁盘任意路径下的配置文件
AnnotationConfigApplicationContext("");//用于读取注解创建容器
Bean对象
三种创建方式
<bean id="accountDao" class="com.itheima.dao.impl.AcountDaoImpl"></bean>
建立工厂(accountFactory),内设方法为getAccountFactory();
<bean id="accountFactory" class="com.itheima.factory.accountFactory"></bean>
<bean id="accountService" factory-bean="accountFactory" factory-method="getAccountFactory"></bean>
<bean id="accountFactory" factory-bean="com.itheima.factory.accountFactory" factory-method="getAccountFactory"></bean>
作用范围:
scope属性:(指定bean的作用范围)
- singleton:单例的(默认)
- prototype:多例的
- request:作用于web请求
- session:作用于web回话
- global-session:作用于集群环境的回话范围(全局回话范围),若不是集群,它就是session
依赖注入
注入的数据:
- 基本类型与string
- bean类型(在配置文件中或注解中配置bean)
- 复杂类型或集合类型
注入的方式
-
构造函数提供
在AccountServiceImpl中:写属性及get、set方法
标签中:constructor-arg属性
- type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
- index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引位置从0开始
- name:给指定构造函数中指定名称的参数赋值
- value:用于提供基本类型的数据
- ref:用于指定其他的bean类型数据。
缺点:必须提供初始值
<bean id="accountDao" class="com.itheima.dao.impl.AcountDaoImpl"> <constructor-arg name="name" value="王名"></constructor-arg>//默认值,name为实体的属性名 <constructor-arg name="birday" ref="now"></constructor-arg>//使用下面bean对象 </bean> <bean id="now" class="java.util.Date"></bean>//定义新的bean对象,供上面使用
复杂集合的注入:
<bean id="accountDao" class="com.itheima.dao.impl.AcountDaoImpl"> <property name="myList">//名为List myList(); <list> <value>AAA</value> <value>BBB</value> </list> </property> <property name="myStrs">//名为String[] myStrs;的数组 <array> <value>AAA</value> <value>BBB</value> </array> </property> </bean>
-
set方法提供
-
注解提供
生命周期
bean的方法:init-method、destroy-method
注解
创建注解
在pom.xml中加链接,及配置路径:
<context:component-scan base-package="com.itheima"></context:component-scan>//扫描包,寻找以下注解
在实用被调用类AcountServiceImpl前加:
@Component(value="a")
@Autowired//AcountServiceImpl的Dao调用前加入,并省略该的set方法
-
@Component意义相同的注解
@Controller一般用于表现层
@Service一般用于业务层
@Repository一般用于持久层
在调用类中加:
AcountService as = (AcountService) ac.getBean("a");//通过获取类后强制转化,若不设value,“a”则写成acountServiceImpl
注入注解
@Autowired寻找上面的value,自动按照类型注入类(为变量、类、方法前注释),可替代set方法,如果没有该对象报错,有多个该类型挑选
@Qualifier以上基础,再按照名称注入(为类成员不能单独注入)
@Resource直接按照bean的value注入
范围注解
@Scope:属性value
周期注解
@PreDestroy指定销毁的方法
@PostConstruct指定初始化的方法
注解类
@Import(JdbcC.class)//分配置文件,导入其他配置文件,内部的value用于指定其他类的字节码,JdbcC则为子类
获得配置文件
@PropertySource("bean.properties")//在类头,获得配置文件
@Value("${driver}")//在变量头:获得并传入配置文件的值
public String driver;
直接使用变量
事务
通知类型:前置通知、后置、异常、最终、环绕
//获取事务连接
ThreadLocal<Connection> t1=new ThreadLocal<Connection>();//使用ThreadLocal类创建事务连接
Connection conn=t1.get();//先从thread中获得连接
if (conn==null){//若线程上没有连接
conn=dataSource.getConnection();//从数据源(连接池)中获得连接
t1.set(conn);//为事务设置连接
}//抛出异常Exception,打印异常throw new RuntimeException(e);
//事务相关内容
try {
conn.setAutoCommit(false);//开启事务
//*******此处执行语句rt=method.invoke(accountService,args);在环绕通知中有明确的切入方法调用
conn.commit();//提交事务
} catch (SQLException e) {
conn.rollback();//回滚事务
}finally {
//释放事务,不是真正把连接池关闭,而是把获取的连接还回连接池
conn.close();
t1.remove();//将线程和连接池解绑
}
动态代理
目的:使用动态代理进行事务控制
特点:字节码随便用,随用随加载
作用:不修改原码的基础上对方法的增强,并在增强过程中实现一些我们需要实现的功能
分类:基于接口(子类)的动态代理
接口动态代理
要求:代理类至少实现一个接口IProducer
Producer producer;
IProducer pr=(IProducer) Proxy.newProxyInstance(
producer.getClass().getClassLoader(),//ClassLoader类加载器:用于加载代理对象(代理谁写谁)的字节码
producer.getClass().getInterfaces(),
new InvocationHandler() {//如何进行代理的一些参数,用于提供增强的代码
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//proxy代理对象的引用,method当前执行的方法,args执行方法所需参数
return method.invoke(producer,arg[0]*0.8);//参数:proxy,argue后代理的费用
}
});
pr.saleMoney(1000);//对应调用是:System.out.println("代理后钱数="money);
代理后钱数=800
子类动态代理
要求:
- 被代理类不能使最终类
- 需要导入第三方cglib 2.1_3的jar包
Producer cglibProducer=(Producer)Enhancer.create(producer.getClass(),new MethodInterceptor(){
public Object intercept(Object o, Method method, Object[] objects,MethodProxy methodProxy){
return null;//内容同上
}
})
AOP
面向切面编程。通过编译方式和运行期动态代理实现程序功能的统一维护的一种动态代理技术
作用:在程序运行期间,不修改码源对已有方法进行增强(功能增加(过滤))
术语:
- Joinpoint连接点:那些被拦截到的点(接口)
- PointCut切入点:对哪些Joinpoint进行拦截的定义(被增强的连接点)
- advice通知、增强:拦截的目的是通知,提供了公共代码
- introduction引介:在运行期动态的添加一些方法或field
- target代理目标对象(工厂)
- weaving织入:把增强应用到目标对象producer来创建新的代理对象Proxy.newProxyInstance的过程
- proxy代理:一个类被AOP植入增强后,就产生了一个结果代理类
- Aspect切面:是切入点和通知的结合
xml配置
//xml中需要有相应aop网址
//配置spring的IOC,把service对象配置进来
<bean id="accountService" class="com.itheima.service.impl.AcountServiceImpl"></bean>
<bean id="logger" class="com.itheima.utils.Logger"></bean>//配置Logger类
<aop:config>//声明表明开始aop的设置
<aop:aspect id="logAdvice" ref="logger">//配置aop切面,id唯一标识,ref指定通知类bean的id
<aop:before method="printLog" pointcut="excute(public void com.itheima.service.impl.AccountServiceimpl.saveAccount())" pointcut-ref="pt1"></aop:before>//配置通知类型(before是前置通知),method指定Logger类中哪个方法前置通知,pointcut指切入点表达式(对哪个方法进行加强)
<aop:pointcut id="pt1" expression="* com.itheima.service.impl.*.*(..)"></aop:pointcut>//(中express可以省略pointcut属性)
</aop:aspect>
</aop:config>
在执行AcountServiceImpl的方法前,先加入执行Logger类
after还有:before-returning、after-throwing、pointcut、around
切入点表达式
public void com.itheima.service.impl.AccountServiceimpl.saveAccount()
* * *...*(*)//*表示有此参数全执行(public可以省略);内部参数可以写成:(int或java.lang.String)
环绕通知
xml+ProceedingJoinPoint解决切面没有输出的问题
注解
//xml中开启注解AOP的支持
<aop:aspect-autoproxy></aop:aspect-autoproxy>
@Aspect//该类是一个切面类
@Around//方法是~
@EnableAspectJAutoProxy//该类不适用xml的配置方式(当使用@Before时)
JDBCTemplate
与Commons-dbutil都是对JDBC简单的封装
end
运行pigx项目
配置tomcat
配置source
- web-WEB INF 下创建两个文件夹 classes 和 lib
- 在Run/Edit Configuration中设置modules下配置classes输出路径和lib的jar包
- 导入Tomcat的lib
配置tomcat
- project/Structures下添加小老虎
- 并设置Deployments的exploded
1启动服务器前准备:
-
数据库需要建立表和库,会进行自动导入(密码要设置为root)
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'; FLUSH PRIVILEGES;
-
redies环境配置:需要打开Redis与zookeeper任务管理
执行与刷新
redis-server.exe redis-cli.exe -h 127.0.0.1 -p 6379
2后端项目运行:
Nacos服务与发现(网址控制台:管理端口号和IP号)
GateWay/Auth鉴定中心
Admin加载路由,放在redis
CodeGen代码生产
Monitor监控
Deanmon定时任务
mvn clean install//maven导包
3执行ui:
-
npm install npm run dev
node文件导入错误时,一般将node_modules重新删除后,重新cnpm install
新建微服务(跳过登录界面)
配置,并执行项目
跳过登录界面
nacos点击连接注册pigx-demo-dev.yml
postman通过get获取token
通过获取cookie进行cookie后端登录以绕过登录界面直接执行方法
2.1、打开postman新建Request
2.2、url:http://localhost:9999/auth/oauth/token 请求方式为POST //auth模块的访问路径
2.3、Header 添加 Authorization:Basic dGVzdDp0ZXN0 //Basic后有空格
2.4、Body 添加
- username:admin
- password:123456
- scope:server
- grant_type:password
2.5、点击Send即可获取token
3.利用token访问post自定义微服务
新建Request 输入自己的URL 在Header中添加 Authorization:Bearer {已获取到的access_token}; //Bearer后有空格
项目实现增删改查
添加菜单
添加地址时要与view下的路径相对应(.vue省略)
增加图标:
- config/env.js添加地址(每生成新的地址更改一次)
- const/iconList添加图标连接
前端代码
pigx运行原理
request({
url: "/patient/syssocialdetails/insertit",
method: "post",
data: this.formInline
}).then(response => {}
通过虚拟:模块路径/类路径/方法路径,发送请求
vue.config.js拦截相应的虚拟路径order送到路由,寻找相应的predictes中的模块路径,找到相应文件pigx-order中的bootstrap.yml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OIvKXDsE-1577074382360)(F:\TyporaWorkplace\文件\图片\路由.png)]
找到服务与发现的yml文件,并找到数据库相应连接,通过库与SQL语句进行数据执行
微服务定义
目的:将功能分解到各个离散的服务中以实现解决方案的解耦
问题:
- 客户端通过API网关访问
- 服务间通信(服务间调用)
- 同步:对内RPC,对外网防火墙(json、rest)
- 异步:消息队列
- 服务管理(服务注册与发现中心)
- 服务出错解决(容错):重试、限流、熔断、负载均衡、降级
- 服务部署docker(云计算)
传统微服务:
单体式开发:所有功能打在同一个war包里,基本没有外部依赖,部署在javaee容器里
cap理论
-
一致性(Consistency)
更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致
-
可用性(Availability)
服务一直可用,而且是正常响应时间
-
分区容错性(Partition tolerance)
分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务
base理论
-
基本可用(Basically Available)
分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用
-
软状态( Soft State)
允许系统存在中间状态,而该中间状态不会影响系统整体可用性(mysql replication的异步复制)
-
最终一致性( Eventual Consistency)
系统中的所有数据副本经过一定时间后,最终能够达到一致的状态
高并发
提升并发能力的方法:
- 垂直扩展:
- 增强单机硬件性能
- 提升单机架构性能:cache减少io次数、异步增加吞吐量、无锁数据减少响应时间
- 水平扩展:增加服务器数量
- 水平拆分扩充系统性能,主从同步(读写分离)扩充数据库性能
注解
spring boot
@SpringBootConfiguration//继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
@EnableAutoConfiguratio//启动自动配置
@ComponentScan//扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。相当于扫描注解:<context:component-scan>
@ResponseBody//表示该方法的返回结果直接写入HTTP response body中
@Repository//当一个组件代表数据访问层(DAO)的时候,我们使用进行注解
@Service//当一个组件代表业务层时,我们使用进行注解
@Controller//标注一个控制器组件类
@Component//标准一个普通的spring Bean类(可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的)
@Autowired://属于spring注解:给指定的字段或方法注入所需的外部资源,可用于为类的属性、构造器、方法进行注值
@Resource://不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该annotation为目标bean指定协作者Bean。
@GetMapping('/')//配置浏览器访问虚拟路径
@PostConstruct和@PreDestroy方法//实现初始化和销毁bean之前进行的操作
//配置文件
@ConfigurationProperties(prefix=“person”)//(从配置文件中获取值到这里)将配置文件中的每一个属性值,都映射到这个组件(bean)中,!!需要该组件在容器中
@Value("${person.last.name}")//从配置文件中获值(直接给对象赋值)#{11}直接给值
@PropertySource(value={"classpath:p.properties"})//加载指定配置根路径resource下的配置文件
@ImportResource(locations="classpath:p.xml")//放在主配置类上(SpringApplication.run)导入spring的配置文件
@RunWith(SpringRunner.class)//标志该测试类使用此驱动
@SpringBootTest//表示这是一个spring的测试类
@//
@//
@//
@//
@//
@//
@//
@//
@//
以上:
- 被注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变
- @Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上
- @Autowired注解可用于为类的属性、构造器、方法进行注值。
0
springboot请求方式
//都是用来向服务器提交信息
@PostMapping//插入数据,相当于@RequestMapping(method = RequestMethod.POST)
@GetMapping//查询数据,采用明文进行传输相当于@RequestMapping(method = @RequestMethod.GET)
@PutMapping//更新信息
@DeleteMapping//删除数据
@RequstMapping
@SpringCloudApplication//默认会扫描包下所有注解
@RestController=ResponseBody+Controller
参数获取注解
@RequestParam//用来获取多个参数,常用语POST、PUT操作
@RequestBody//利用一个对象去获取前端传过来的数据,get(无请求体)
@PathVariable//url/{param} 时会用到,我们可以通过该注解来获取路径后面的参数来进行GET、DELETE、PUT操作
@RequestHeader//获取消息头
@CookieValue//把指定cookie名称的值传入控制器方法参数
@ModelAttribute//(放在方法、参数)
@SessionAttribute//多次执行控制器方法间的参数共享
@ResponseBody//将方法返回值放进返回体中
@SpringBootApplication//标明一个这是一个springboot主程序类
@JsonProperty//可以实现前端的属性名和后台实体类的属性名不一致问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HDhkHKHN-1577074382363)(F:\TyporaWorkplace\文件\图片\验证注解.png)]
Swagger
当前最好用的Restful API文档生成的开源项目
@ApiOperation(value = “接口说明”, httpMethod = “接口请求方式”, response = “接口返回参数类型”, notes = “接口发布说明”;其他参数可参考源码;
@ApiParam(required = “是否必须参数”, name = “参数名称”, value = “参数具体描述”)
spring家族
https://www.jianshu.com/p/b3e4aaa83a7d
Spring boot
简化新Spring应用的初始搭建以及开发过程,使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置
Spring framework
Java开发最常用的版本,整合了一些核心模块
- spring-aop、spring-aspects、spring-beans、spring-context、spring-core、spring-expression、spring-framework-bom、spring-instrument、spring-jdbc、spring-jms、spring-messaging、spring-orm、spring-oxm、spring-text、spring-tx、sprng-web-reactive、spring-web、spring-webmvc、spring-websocket
Spring Cloud Data Flow
为了方便数据工程师,让他们能专注于分析工作和具体的问题
Spring cloud
引入了云平台连接器(Cloud Connector)和服务连接器(Service Connector)的概念。云平台连接器是一个接口,需要由云平台提供者进行实现,以便库中的其他模块可以与该云平台协同工作。
spring data
用于简化数据库访问
Spring integration
是一种企业级的事件驱动消息框架,你可以用它协同消息、通道、适配器、网关
Spring batch
完全面向Spring的批处理框架,可以应用于企业级大量的数据处理系统,使开发者更容易的访问和利用企业级服务,可以提供大量的,可重复的数据处理功能,包括日志记录/跟踪,事务管理,作业处理统计工作重新启动、跳过,和资源管理等重要功能。
Spring security
安全框架
Spring hateoas
spring boot
不是框架,是一种简化开发流程的方法。唯一提前做好springbean的配置
- 习惯优于配置
- 以前:应用的基本配置用xml(资源文件)、业务开发用注解(注入)
- pojo(java)+业务注解=bean(spring)
springboot配置
yml文件:以数据为中心
导入spring-boot-configuration-processor以后配置文件就有提示
Profile
开发环境动态切换
spring.profiles.active=dev
多加载顺序
高优先级
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ilN1gHUx-1577074382364)(F:\TyporaWorkplace\文件\图片\配置文件加载顺序.JPG)]
slf4j.Logger
日志门面slf4j、日志实现logback
import org.slf4j.Logger;
Logger logger=LoggerFactory.getLogger(getClass());
logger.trace();//追踪替代sout
logger.debug();//调试信息
logger.info();//自己定义的信息(输出)
logger.warn();//警告
logger.error();//错误,记录异常
//配置
logging.level.com.atguigu=trace;//设置日志级别
logging.file
logging.path=生成日志路径
Thymeleaf引擎
类似于(Velocity/Freemarker/jsp)模板引擎
1导入thymleaf的dependency
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
2HTML中导入相应链接
不用严格遵守W3s条例
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
语法
<div th:text="${money}"></div>
更改springboot默认版本方法:
properties中使用thymeleaf-layout-dialect.version属性
springboot内容
docker
虚拟化容器技术
spring data数据访问、jpa/mybatis整合
redis缓存服务器
用redis缓存管理
消息
全文检索
任务(邮件、定时、异步)
以spring security为底层的安全
zookeeper分布式
监控管理(运维)
连接池
C3P0/DBCP/BoneCP/HiKariCP(最快)
Tkmybatis
@Table描述数据库表信息
@Id指定表主键字段,无属性值
@Column:描述数据库字段信息,主要属性有name(字段名)、columnDefinition、insertable、length、nullable(是否可为空)
springcloud
Vuepress个人博客
需要在json文件夹下运行,之后通过网址进行访问
vuepress dev docs
Docker
比起虚拟机技术WVware(独占)实现了Sever(CPU)的共享
dockers引擎是一个包含以下主要组件的客户端服务器应用程序
- 有CLI命令行工具的客户端
- REST API指示守护进程怎么做
- 守护进程且运行时间较长的服务器
镜像(创建docker容器的模板)image——类,容器(独立运行的一个或一组应用)container——对象
PDA手持移动终端
杀死进程
C:\Users\username>netstat -o -n -a | findstr :8080
TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 3116
C:\Users\username>taskkill /F /PID 3116
支付宝支付模块
导入外部jar包
alipay-sdk-java-4.3.0.jar
mvn install:install-file -DgroupId=com.alipay -DartifactId=sdk-java -Dversion=4.3.0 -Dpackaging=jar -Dfile=alipay-sdk-java-4.3.0.jar
<dependency>
<groupId>com.alipay</groupId>
<artifactId>sdk-java</artifactId>
<version>4.3.0</version>
</dependency>