java listen_JavaWeb之Filter、Listener

昨天和大家介绍了一下JSON的用法,其实JSON中主要是用来和数据库交互数据的。今天给大家讲解的是Filter和Listener的用法。

一、Listenner监听器

1.1、定义

Javaweb中的监听器是用于监听web常见对象HttpServletRequest,HttpSession,ServletContext。

1.2、监听器的作用

监听web对象创建与销毁.

监听web对象的属性变化

监听session绑定javaBean操作.

1.3、监听机制中的概念

事件----一件事情

事件源---产生这件事情的源头

注册监听---将监听器与事件绑定,当事件产生时,监听器可以知道,并进行处理。

监听器---对某件事情进行处理监听的一个对象

二、JavaWeb中常见的监听器

2.1、创建一个监听器的步骤

创建一个类,实现需要监听器的接口

重写接口中的方法

在web.xml中配置注册该监听器

2.2、监听域对象的创建与销毁

监听ServletContext创建与销毁 ServletContextListener

监听HttpSession创建与销毁 HttpSessionListener

监听HttpServletRequest创建与销毁 ServletRequestListener

下面为大家展示的实例,首先我们的实例在jsp中进行的话,我们要明确这三个域对象什么时候被jsp创建什么时候又被销毁呢。

在ServletContext中是服务器开启的时候就被创建,当服务器关闭的时候就被销毁

在session中,jsp里的page指令中可以配置默认是ture的,所以当你加载这个jsp页面的时候session就被创建了,而销毁的话就有

四种方法:默认超时30分钟、关闭服务器、invalidate()方法、setMaxInactiveInterval(int interval) 可以设置超时时间,在servlet中

需要通过request.getSseeion()来创建session。

在request中,发送请求服务器就会创建它,当响应产生时,request对象就会销毁。在jsp页面的话,你加载开始创建,加载完就销毁了。

2.2.1、实例:监听域对象的创建与销毁

这里只演示一个,其他的两个同理都是这样子操作的。

HttpServletListener监听器

a.创建类,实现HttpServletListener接口,并重写方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagetest;importjavax.servlet.http.HttpSessionEvent;importjavax.servlet.http.HttpSessionListener;public class MyHttpSessionListener implementsHttpSessionListener {

@Overridepublic voidsessionCreated(HttpSessionEvent arg0) {

System.out.println("session被创建了");

}

@Overridepublic voidsessionDestroyed(HttpSessionEvent arg0) {

System.out.println("session被销毁了");

}

}

View Code

b.在web.xml中的配置

28277d0f7aae1bef4da4464d76b31baf.png

c.在newFile.jsp中测试

注:在jsp中我添加了invalidate方法来测试销毁

3edfd38f4dae822d223fa28490a84bdf.png

d.结果

8ed7887860f2215adcea10604c427fef.png

2.3、监听域对象的属性变化

监听ServletContext属性变化 ServletContextAttributeListener

监听HttpSession属性变化 HttpSessionAttributeListener

监听HttpServletRequest属性变化 ServletRequestAttributeListener

2.3.1、实例:监听域对象的实例变化

a.创建一个MyServletRequest类继承ServletRequestAttributeListener接口,并实现改接口方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagetest;importjavax.servlet.ServletRequestAttributeEvent;importjavax.servlet.ServletRequestAttributeListener;public class MyServletRequest implementsServletRequestAttributeListener{

@Overridepublic voidattributeAdded(ServletRequestAttributeEvent arg0) {

System.out.println("requestAttribute添加了属性");

}

@Overridepublic voidattributeRemoved(ServletRequestAttributeEvent arg0) {//TODO Auto-generated method stub

System.out.println("requestAttribute被移除了");

}

@Overridepublic voidattributeReplaced(ServletRequestAttributeEvent arg0) {//TODO Auto-generated method stub

System.out.println("requestAttribute被替换了");

System.out.println(arg0.getName()+arg0.getValue());

}

}

View Code

b.在web.xml中注册该监听器

test.MyServletRequest

c.在jsp测试一下

14a7193a4620fd9b886af793280db036.png

结果:

f2b354e16543bb8cbafcad8edbfc8064.png

当我们在添加一个removeAttribute()方法时

491e517aa39b4a1cf1cd276737727ad9.png

2.4、监听session绑定javabean

2.4.1、HttpSessionBindingListener(这个是用javabean去实现的,所以不需要去注册)

用于监听javaBean对象是否绑定到了session域

创建一个User去实现HttpSessionBindingListener接口

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagetest;importjavax.servlet.http.HttpSessionBindingEvent;importjavax.servlet.http.HttpSessionBindingListener;public class User implementsHttpSessionBindingListener {privateString name;private intage;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

@Overridepublic voidvalueBound(HttpSessionBindingEvent arg0) {

System.out.println("User对象被session绑定了!");

}

@Overridepublic voidvalueUnbound(HttpSessionBindingEvent arg0) {

System.out.println("User对象解除session绑定了!");

}

}

View Code

在jsp页面中测试

061fc3463375792656254be2220afefe.png

结果:

371fd418ea54acbbc580baa4e7eaa2e4.png

注意:不需要再web.xml中去配置该监听器,在执行setAttrubute()方法的时候自动去识别该监听器

2.4.2.HttpSessionActivationListener

用于监听javaBean对象的活化与钝化。

HttpSessionActivationListener如果javaBean实现了这个接口,那么当我们正常关闭服务器时,session中的javaBean对象就会被钝化到我们指定的文件中。

当下一次在启动服务器,因为我们已经将对象写入到文件中,这时就会自动将javaBean对象活化到session中。

首先我们要明白什么是活化与钝化等下单独写一篇文章介绍活化与钝化

a2b02190b491049e09b1433291c2fd40.png

我们还需要个context.xml文件来配置钝化时存储的文件

三、Filter

接下来为大家讲解的是Filter,这个相对于Listener来说就重要的多了,它的应用非常的广泛,主要是起到一个过滤、拦截的作用。

3.1、Filter的定义

Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。执行过滤任务的对象,这些任务是针对对某一资源(servlet 或静态内容)的请求或来自某一资源的响应执行的,抑或同时针对这两者执行。

3.2、怎么创建一个过滤器

创建一个类实现Filter接口

重写接口中方法 doFilter方法是真正过滤的

在web.xml文件中配置

注意:在Filter的doFilter方法内如果没有执行chain.doFilter(request,response)那么资源是不会被访问到的。

3.3、实例

首先我创建了一个MyFilter.java实现Filter接口

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.jxlg.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;public class MyFilter implementsFilter{

@Overridepublic voiddestroy() {

}

@Overridepublic voiddoFilter(ServletRequest req, ServletResponse res,

FilterChain chain)throwsIOException, ServletException {

System.out.println("doFilter执行了");

chain.doFilter(req, res);//放行

System.out.println("执行完返回到客户端");

}

@Overridepublic void init(FilterConfig arg0) throwsServletException {

}

}

View Code

在web.xml中配置过滤器

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

MyFilter

com.jxlg.filter.MyFilter

MyFilter

/demo1

View Code

写一个servlet让MyFilter进行过滤

53ae10f8f6677ef7f8a44f87333ece64.png

结果

27aff5ee25a5e0c23507980b132282c3.png

3.4、FilterChain

FilterChain 是 servlet 容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。

问题:怎样可以形成一个Filter链?

只要多个Filter对同一个资源进行拦截就可以形成Filter链

问题:怎样确定Filter的执行顺序?

由来确定,在web.xml文件中哪一个过滤器的放到了前面谁就先执行。

3.5、Filter的生命周期

Servlet生命周期:

实例化 --》 初始化--》 服务--》 销毁

当服务器启动,会创建Filter对象,并调用init方法,只调用一次.

当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.

当服务器关闭时,会调用Filter的destroy方法来进行销毁操作.

3.6、FilterConfig

在Filter的init方法上有一个参数,类型就是FilterConfig.

FilterConfig它是Filter的配置对象,它可以完成下列功能

1.获取Filtr名称

2.获取Filter初始化参数

3.获取ServletContext对象。

怎么获取到一个filterConfig对象

c696b75f1a860f6554a0df927b53cdc4.png

fiterConfig中的方法

5098855a1c458ccd95c4c38a36bf1fd3.png

实例:获取web.xml文件中的字符编码,用来过滤,告知服务器请求用的是什么编码。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.jxlg.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;public class MyFilterConfig implementsFilter {privateFilterConfig filterConfig;

@Overridepublic voiddestroy() {

}

@Overridepublic voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throwsIOException, ServletException {//通过filterConfig来获取配置信息中的初始化参数

String encoding = filterConfig.getInitParameter("encoding");

request.setCharacterEncoding(encoding);

chain.doFilter(request, response);//放行

}

@Overridepublic void init(FilterConfig filterConfig) throwsServletException {this.filterConfig =filterConfig;

}

}

View Code

web.xml中的配置信息

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

MyFilterConfig

com.jxlg.filter.MyFilterConfig

encoding

UTF-8

MyFilterConfig

/*

View Code

3.7、Filter配置

基本配置

filter名称

Filter类的包名.类名

filter名称

路径

关于其它配置

1.

完全匹配 以”/demo1”开始,不包含通配符*

目录匹配 以”/”开始 以*结束

扩展名匹配 *.xxx 不能写成/*.xxx

2.

它是对指定的servlet名称的servlet进行拦截的。

3.

可以取的值有 REQUEST FORWARD ERROR INCLUDE

它的作用是:当以什么方式去访问web资源时,进行拦截操作.

1.REQUEST 当是从浏览器直接访问资源,或是重定向到某个资源时进行拦截方式配置的 它也是默认值

2.FORWARD 它描述的是请求转发的拦截方式配置

3.ERROR 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

4.INCLUDE 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

四、使用Fliter实现自动登录

这个例子就是一个简单的登录验证与数据库交互,我们使用Fliter来实现自动登录。

思路分析:

72283ed613eb3686b3d8d47f34f787c2.png

login.jsp

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

${msg}

用户名:密码:

自动登陆

View Code

FindUserServlet.java

这里获取了表单提交的数据,然后如果按了自动登录,我们就会把用户名和密码保存到cooki中去

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.jxlg.web.servlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.jxlg.web.domain.User;importcom.jxlg.web.service.UserService;public class FindUserServlet extendsHttpServlet {public voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {//获取表单数据

String username = request.getParameter("username");

String password= request.getParameter("password");//处理业务逻辑

UserService us = newUserService();

User user=us.findUser(username,password);if(user!=null){

String autoLogin= request.getParameter("autoLogin");

Cookie cookie= new Cookie("user",user.getUsername()+"&"+user.getPassword());

cookie.setPath("/");if(autoLogin!=null){//将用户名和密码保存到cookie中

cookie.setMaxAge(60*60*24*7);

}else{//清除cookie

cookie.setMaxAge(0);

}

response.addCookie(cookie);//把cookie保存到客户端

request.getSession().setAttribute("u", user);

request.getRequestDispatcher("/home.jsp").forward(request, response);

}else{

request.setAttribute("msg", "用户名或密码输入错误,请重新登陆");

request.getRequestDispatcher("/login.jsp").forward(request, response);

}

}public voiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

doGet(request, response);

}

}

View Code

UserService

这里是service业务层代码

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

ackage com.jxlg.web.service;importjava.sql.SQLException;importcom.jxlg.Dao.UserDao;importcom.jxlg.web.domain.User;public classUserService {

UserDao ud= newUserDao();publicUser findUser(String username, String password) {try{returnud.findUser(username,password);

}catch(SQLException e) {

e.printStackTrace();

}return null;

}

}

View Code

UserDao

这里是DAO实现类,与数据库交互,我这里是用的是C3P0连接池,和dbUtils与数据库交互

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.jxlg.Dao;importjava.sql.SQLException;importorg.apache.commons.dbutils.QueryRunner;importorg.apache.commons.dbutils.handlers.BeanHandler;importcom.jxlg.util.C3P0Util;importcom.jxlg.web.domain.User;public classUserDao {public User findUser(String username, String password) throwsSQLException {

QueryRunner qr= newQueryRunner(C3P0Util.getDateSource());return qr.query("select * from user where username=? and password=?", new BeanHandler(User.class),username,password);

}

}

View Code

home.jsp

登录成功跳转的界面

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

View Code

MyFilter

这是一个过滤器,记住一定要去web.xml配置,如果我们在longin.jsp中选择了自动登录的话,我们可以直接访问home.jsp实现自动登录。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.jxlg.web.domain;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.jxlg.web.service.UserService;public class MyFilter implementsFilter{

@Overridepublic voiddestroy() {

}

@Overridepublic voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain Chain)throwsIOException, ServletException {//转化两个对象

HttpServletRequest req =(HttpServletRequest)request;

HttpServletResponse res=(HttpServletResponse) response;

String uri=req.getRequestURI();//System.out.println(uri);///StudentLogin/login.jsp

String path =req.getContextPath();

path=uri.substring(path.length());//System.out.println(path);///login.jsp

if("/login.jsp".equals(path)||"/servlet/findUserServlet".equals(path)){

User user= (User) req.getSession().getAttribute("u");//如果用户没有登录过,我们就执行登录操作。

if(user==null){//得到cookies数组

Cookie[] cookies =req.getCookies();

String username="";

String password="";//从cookie中找到想要的user对象

for(int i=0;cookies!=null&&i

String value= cookies[i].getValue(); //tom&123

String[] values = value.split("&");

username= values[0];

password= values[1];

}

}//执行登录操作

UserService us = newUserService();

User u=us.findUser(username, password);//如果登录成功,把user保存到session中

if(user!=null){

req.getSession().setAttribute("u", u);

}

}

}//放行

Chain.doFilter(request, response);

}

View Code

开发中遇到的问题

1.在写MyFilter中,在遍历保存在客户端的cookie的时候,我没有家伙写cookies!=null,这样会导致空指针异常

2.在使用HttpServletRequest时,记住在Filter中一定要记住,进行转化,因为在Filter中是ServletRequest对象。

3.因为我在Filter中web.xml文件中配置的url-pattern是当前应用的所有url,所以当我们请求的每一个资源都会调用Filter进行过滤,但是我们并不需要在login.jsp等也自动登录,所以就记得要排除掉这些。

提供源码,收好不谢:

链接:http://pan.baidu.com/s/1c1K6UJ2 密码:mewe

五、全局编码的过滤器

前言:

ef71b9d72938b7237237c607d088a1e6.png

使用过滤器对post请求的乱码进行过滤,测试之后是没有问题的,但是当我们是get请求的时候,我们该怎么去处理呢?

怎样可以做成一个通用的,可以处理post,get所有的请求的?

在java中怎样可以对一个方法进行功能增强?

1.继承

2.装饰设计模式

1.创建一个类让它与被装饰类实现同一个接口或继承同一个父类

2.在装饰类中持有一个被装饰类的引用

3.重写要增强的方法

分析:我们获取请求参数无非就三种方式:getParameter、getParameterValues、getParameterMap.

我们知道getParameter与getParameterValue方法可以依赖于getParamterMap方法来实现。

login.jsp

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

username:
username:

View Code

LoginServlet

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

String name1= request.getParameter("username1");

String name= request.getParameterValues("username")[0];

System.out.println(name);

System.out.println(name1);

}

View Code

MyFilter

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.itheima.filter;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.util.Map;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletRequestWrapper;public class MyFilter implementsFilter {public void init(FilterConfig filterConfig) throwsServletException {

}public voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throwsIOException, ServletException {

HttpServletRequest req=(HttpServletRequest) request;//解决post方式//req.setCharacterEncoding("UTF-8");

req = newMyRequest(req);

chain.doFilter(req, response);

}public voiddestroy() {

}

}//实现与被包装对象相同的接口//定义一个与被包装类相对象的引用//定义一个构造方法,把被包装对象传过来//对于不需要改写方法,直接调用//对于无需要改写方法,写自己的方法体

class MyRequest extendsHttpServletRequestWrapper {

HttpServletRequest request;//是用于接收外部传递的原始的request

publicMyRequest(HttpServletRequest request) {super(request);//是因为父类没有无参数构造

this.request =request;

}/** @Override public String getParameter(String name) { name =

* request.getParameter(name);//乱码 try { return new

* String(name.getBytes("iso-8859-1"),"UTF-8"); } catch

* (UnsupportedEncodingException e) { e.printStackTrace(); } return null; }*/@OverridepublicString getParameter(String name) {

Map map =getParameterMap();return map.get(name)[0];

}

@OverridepublicString[] getParameterValues(String name) {

Map map =getParameterMap();returnmap.get(name);

}private boolean flag = true;

@Overridepublic MapgetParameterMap() {

Map map = request.getParameterMap();//乱码

if(flag) {for (Map.Entrym : map.entrySet()) {

String[] values=m.getValue();for (int i = 0; i < values.length; i++) {try{

values[i]= newString(

values[i].getBytes("iso-8859-1"), "UTF-8");

}catch(UnsupportedEncodingException e) {

e.printStackTrace();

}

}

}

flag= false;

}returnmap;

}

}

View Code

68f724bad5a33d9a9f6bd2ca7369ecb7.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java jasypt_Jasypt

软件简介Jasypt这个Java类包为开发人员提供一种简单的方式来为项目增加加密功能&#xff0c;包括&#xff1a;密码Digest认证&#xff0c;文本和对象加密&#xff0c;集成hibernate&#xff0c;SpringSecurity(Acegi)来增强密码管理。Jasypt开发团队推出了Java加密工具Jasypt 1…

ZABBIX监控JAVA日志文件

最近开发人员有一个需求&#xff0c;监控java程序的报错日志&#xff0c;如日志中包含“ERROR”关键字的信息&#xff0c;就邮件告警&#xff0c;以下是具体实现方法。 一、创建模板以上是已经创建好的模板&#xff0c;名为“Template App Java logs”创建应用集二、创建监控项…

如何快速把音乐转成MP3格式

身边有这样一群朋友经常搞音乐&#xff0c;仿佛生活的乐趣只有音乐&#xff0c;不能也能理解&#xff0c;谁没有点自己的爱好呢&#xff1f;但是如果想要在茫茫人海中成为佼佼者&#xff0c;并不是这么容易的&#xff0c;但是我们要在速度上赢更多的人&#xff0c;所以写了这篇…

JavaWeb学习笔记(九)--HttpServletResponse

web服务器接收到客户端的HTTP请求&#xff0c;会针对每一次请求&#xff0c;分别创建一个用于代表请求的request对象和代表响应的response对象。 request和response对象既然代表请求和响应&#xff0c;那我们要获取客户端提交过来的数据&#xff0c;只需要找request对象即可。要…

centos 6.5 yum java_Centos6.5 yum 安装jdk1.8

centos 6.5 安装卸载jdk-- 查看有没有预装jdk版本java -version-- 查看已安装的版本rpm -qa|grep java-- 卸载预装版本 rpm -e --nodeps 命令卸载rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64-- 查找可以安装的jdk列表yum search java | grep -i --color J…

【PHP 扩展开发】Zephir 基础篇

上一篇 《Zephir 简介》 简单介绍了环境搭建&#xff0c;编写了一个的简单示例。这一篇继续介绍 Zephir 基础。 基本语法Zephir 中&#xff0c;每个文件都必须有且只有一个类&#xff0c;每个类都必须有一个命名空间&#xff0c;目录结构必须与所使用的类和命名空间的名称相匹配…

左偏树 P3377【模板】左偏树(可并堆)

题目传送门 代码&#xff1a; /* code by: zstu wxk time: 2019/03/01 */ #include<bits/stdc.h> using namespace std; #define Fopen freopen("testdata.in","r",stdin); freopen("_out.txt","w",stdout); #define LL long lo…

mycat mysql ha 方案_7、基于 HA 机制的 Mycat 高可用--mycat

在实际项目中&#xff0c;Mycat 服务也需要考虑高可用性&#xff0c;如果 Mycat 所在服务器出现宕机&#xff0c;或 Mycat 服务故障&#xff0c;需要有备机提供服务&#xff0c;需要考虑 Mycat 集群。1、 高可用方案使用 HAProxy Keepalived 配合两台 Mycat 搭起 Mycat 集群&a…

python canvas画移动物体_如何实现Canvas图像的拖拽、点击等操作

上一篇Canvas的博文写完后&#xff0c;有位朋友希望能对Canvas绘制出来的图像进行点击、拖拽等操作&#xff0c;因为Canvas绘制出的图像能很好的美化。好像是想做炉石什么的游戏&#xff0c;我也没玩过。Canvas在我的理解中就好像在一张画布上绘制图像&#xff0c;它只能看到却…

python plot map_使用matplotlibbasemap在边界打印

我在绘制多边形时遇到了困难&#xff0c;例如&#xff0c;在使用matplotlib basemap生成的地图边界上绘制多边形。在下面的示例中&#xff0c;地图边界由日期线指定。我试图通过指定三角形顶点的坐标来绘制一个跨越日期线的三角形。当所有的坐标都在地图内时&#xff0c;这种方…

SQL查询语句 group by后, 字符串合并

合并列值 --******************************************************************************************* 表结构&#xff0c;数据如下&#xff1a; id value ----- ------ aa bb aaa bbb ccc 需要得到结果&#xff1a; id values ------ ----------- aa,bb aaa…

Git 基础 —— 常用命令

Git 基础学习系列 Git 基础 —— 安装 配置 别名 对象Git 基础 —— 常用命令Git 基础 —— 常见使用场景Git基础 —— Github 的使用git init 创建 Git 本地仓库 远端无仓库&#xff0c;本地无仓库&#xff0c;本地新建一个仓库 git init git_learning 远端有仓库&#xff0c;…

linux 访问Windows 共享文件的方法

2019独角兽企业重金招聘Python工程师标准>>> 1 安装Samba服务 2 启动 samba服务 /etc/init.d/smb restart 3 安装插件 cifs解决只读挂载&#xff1a;yum install cifs-utils.x86_64 4 在windows下共享一个可以用的文件夹 5 将 windows 共享文件夹挂载到linux上 命令…

基于Blink构建亲听项目以及全链路debug项目实时响应能力

案例与解决方案汇总页&#xff1a;阿里云实时计算产品案例&解决方案汇总 本文全面总结了大数据项目组在亲听项目以及全链路debug项目上进行的实时流处理需求梳理&#xff0c;架构选型&#xff0c;以及达成效果 一、背景介绍 1.1亲听项目 亲听项目专注于帮助用户收集、展示、…

在既有系统中打通Apache Ignite、MySQL和Node.js

为什么80%的码农都做不了架构师&#xff1f;>>> 介绍 在本系列的第一篇文章中&#xff0c;安装了Node.js、Ignite的Node.js瘦客户端包&#xff0c;并且测试了一个示例应用。在本文中&#xff0c;可以看一下Ignite在处理其它数据源&#xff08;比如关系数据库&#…

java hashmap 的api_JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)

一、集合Collection1. 集合介绍变量&#xff1a;表示的内存中的一个空间&#xff0c;只能保存确定类型的单个数据数组&#xff1a;表示的是内存中的多个连续的空间&#xff0c;这些空间中可以存储多个同类型的数据。后期继续学习面向对象技术&#xff0c;我们在程序中开始创建对…

dbunit java_java - 错误地抛出了Java DBUnit AmbiguousTableNameException - 堆栈内存溢出

我正在尝试DBUnit(2.6.0)&#xff0c;我正在尝试导出我的完整数据库(PostgreSQL)。 但是抛出以下异常&#xff1a;线程“main”中的异常org.dbunit.database.AmbiguousTableNameException&#xff1a;FLYWAY_SCHEMA_HISTORY这是正确的行为&#xff0c;因为我有两个具有相同名称…

Idea项目中常见错误及笔记(Old)

1、Idea基础设置&#xff1a; File-->settings--> 1>修改字体&#xff1a;Font 2>修改编码格式&#xff1a;File Encodings(全部UTF-8,右下方复选框勾中--防止程序中的汉字转为ASCII码) 3>修改行号&#xff1a;Appearance&#xff1a;show line numbers show me…

java接口服务编排_GOKU API Gateway CE V3.1.0 发布:新增服务编排、配置版本管理等...

Goku API Gateway (中文名&#xff1a;悟空 API 网关)是一个基于 Golang 开发的微服务网关&#xff0c;能够实现高性能 HTTP API 转发、服务编排、多租户管理、API 访问权限控制等目的&#xff0c;拥有强大的自定义插件系统可以自行扩展&#xff0c;并且提供友好的图形化配置界…

maxcompute 2.0复杂数据类型之array

2019独角兽企业重金招聘Python工程师标准>>> 1. 含义 类似于Java中的array。有序、可重复。 2. 场景 什么样的数据&#xff0c;适合使用array类型来存储呢&#xff1f;这里列举了几个我在开发中实际用到的场景。 2.1 标签类的数据 为什么说标签类数据适合使用array类…