如何网页微信授权
1、引导用户进入授权页面同意授权,获取code
- 配置菜单地址的时候, 把自己的地址放在回调参数中,
- 并且设置scope,如果scope的值是base就只能openid, 如果是userinfo 用户页面会弹出是否同意授权页面,同意以后,可以拿用户的的昵称、性别、所在地
2、通过code换取网页授权access_token(与基础支持中的access_token不同).
- 微信回调我们第一步配置的自己的回调地址的时候,request里就有code, 所以直接通过HttpServletRequest 就可以拿code. String code=req.getParameter(“code”);
- 拿到code以后,发一个请求到微信的接口,并且把code放在request里面。微信就会返回access_token和openid
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
- 如果还需要拿用户信息,可以发送请求到微信接口,把openid和access_token放在请求里面。
Vue.js 是什么?
Vue.js是一个MVVM框架。 可以拆分成:View — ViewModel — Model三部分。
最直接的体现就是通过v-model 实现 input框的双向绑定
Java的反射机制是什么?
Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用
反射的实现三种方式
- getClass方法
- 通过Class的静态方法. Class.forName(“类名”)
- 直接通过new. Class a=new Test.class
SpringCould的运行原理
- Eureka(服务发现):各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
- Ribbon(客服端负载均衡):服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
- Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
- Hystrix(熔断器):发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
- Zuul(路由网关):如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务
什么是Spring?
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架
什么是IOC?
IOC就是控制反转, 以前一个类需要调用另外一个类的时候,会在代码中创建一个被调用者的对象。Spring里面,不需要在代码里面创建对象,spring会根据配置注入一个被调者的对象。所以就是把两个类依赖的控制权交给了spring容器,所以叫控制反转。 其中注入被调用者对象的过程就是依赖注入(DI)。
什么是AOP?
AOP就是面向切面编程。通常用来实现权限认证、日志、事务。
Spring Boot是什么?有什么作用?
- Spring Boot使编码变简单
- SpringBoot帮助开发者快速启动一个Web容器 自带tomcat
- Spring Boot使部署变简单
编码练习1
代码:
package com.zz.util;
import lombok.Data;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @Description: java类作用描述
* @Author: Bsea
* @CreateDate: 2019/6/22$ 19:30$
*/
@Data
public class TreeData {
public String childNode;
public String parentNode;
public int value;
List<TreeData> listTreeData;
List<TreeData> l1=new ArrayList();
public static void main(String[] args) {
List<TreeData> list=new ArrayList();
TreeData treeData=new TreeData();
TreeData t1=new TreeData();
t1.childNode="ROOT";
t1.value=1;
TreeData t2=new TreeData();
t2.childNode="A";
t2.parentNode="ROOT";
t2.value=2;
TreeData t3=new TreeData();
t3.childNode="B";
t3.parentNode="ROOT";
t3.value=3;
TreeData t4=new TreeData();
t4.childNode="C";
t4.parentNode="A";
t4.value=7;
TreeData t5=new TreeData();
t5.childNode="D";
t5.parentNode="B";
t5.value=6;
TreeData t6=new TreeData();
t6.childNode="E";
t6.parentNode="B";
t6.value=5;
list.add(t1);
list.add(t2);
list.add(t3);
list.add(t4);
list.add(t5);
list.add(t6);
treeData.listTreeData=list;
List<TreeData> ls=treeData.getTreeData("B");
System.out.println(Arrays.toString(ls.toArray()));
}
List getTreeData(String childNode){
// List<TreeData> l1=new ArrayList();
System.out.println("childNode****"+childNode);
for(TreeData t:this.listTreeData){
System.out.println("t.parentNode****"+t.parentNode);
if(t.parentNode!=null&&t.parentNode.equals(childNode)){
l1.add(t);
System.out.println("t.childNode****"+t.childNode);
getTreeData(t.childNode);
}
}
return l1;
}
}
编码练习2
代码
package com.zz.util;
import java.io.*;
/**
* @Description: java类作用描述
* @Author: Bsea
* @CreateDate: 2019/6/22$ 20:56$
*/
public class Test {
public static void main(String[] args) throws IOException {
Test test=new Test();
System.out.println("统计的数据》》》》》"+test.getTotal("C:\\bsea\\wp\\20191\\usermanager\\src\\main\\java\\com\\zz\\util\\t.txt"));
}
public int getTotal(String path) throws IOException {
BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(new File(path))));
String str=reader.readLine();
int total=0;
while (str!=null){
String[] ss= str.split(";");
if(ss.length>1){
int v=Integer.parseInt(ss[1]);
//total=total+v;
total+=v;
}
str=reader.readLine();
}
return total;
}
}
break,continue的区别
break是终止当前循环(注意break是能终止一层for循环)
continue 是跳过本次循环,循环继续。
mysql 分页查询
- select * from table limit 0,10; 表示从0开始,一共查10记录
- 分页sql格式是:select * from table limit (start-1)*pageSize,pageSize; 其中start是页码,pageSize是每页显示的条数。
- 比如每页显示20行, 那么第一页 select * from table limit 0,20; 第二页 select * from table limit 20,20; ,第三页 select * from table limit 40,20;
Spring Bean的作用域
一共5个
-
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例。默认情况就是单列
-
prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
-
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
-
session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
-
globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效
Java 实现单列模式
双重验证。 保证效率和线程安全
package com.zz.util;
/**
* @Description: java类作用描述
* @Author: Bsea
* @CreateDate: 2019/6/22$ 21:43$
* 双重验证。 保证效率和线程安全
*/
public class Singletondemo3 {
private static Singletondemo3 s=null;
public static Singletondemo3 getSingleton()
{
if(s==null){
synchronized (Singletondemo3.class){
if(s==null) {
s = new Singletondemo3();
}
}
}
return s;
}
private Singletondemo3(){
}
}