MVVM展现框架概述

MVVM模式作为框架核心,包含以下三个部分: l  Model: 模型,业务数据,表示业务中的对象和操作,和view独立。 l  ViewModel: 视图模型,对数据和UI操作,就是与界面(view)对应的Model。。 l  View: 视图,可视化、交互式UI。代表了ViewModel的状态,显示ViewModel的内容。 具体来说,Model仅仅关注数据信息,不关心任何视图操作行为;其不格式化数据或者影响数据在浏览器中的展现,这些都不是它的责任;格式化数据是View层的任务,同时业务逻辑层被封装在ViewModel中,用来和Model进行交互。 View是指应用中和用户直接交互的部分,他是一个交互式的UI来表示ViewModel的状态,View被认为是主动的,而不是被动的,MVVM主动式的View包含数据绑定事件和理解Model和ViewModel的行为,尽管这些行为可以和属性对应,但View仍然需要响应ViewModel的事件,同时View不负责控制状态。 ViewModel是一个专门用于数据转换的Controller,它可以把Model中的信息转换为View中的信息,同时从View传递命令给Model; 综上,MVVM有以下优点: l  MVVM使开发更加容易,使前端开发和后端开发人员互不影响。 l  抽象化View层,减少了代码中的业务逻辑。 l  ViewModel比事件驱动更容易测试。 l  ViewModel的测试不用关心UI的自动化和交互 。                  分类 选型原则 技术选型 1、 采用Ajax技术路线; 2、 支持HTML4、css2.0以上; 3、 支持REST服务调用;    4、支持IE7及以上版本,Chrome10以上版本以及firefox3.5及以上版本。 开源软件 Jquery1.11.1, KnockoutJS 3.2.0 ,bootstrap   2.3.2, RequireJS 2.1.15   KnockoutJS是一个轻量级的MVVM框架,通过简易的UI绑定语法,实现动态更新UI。KnockoutJS的特点: l  声明式绑定:通过简洁易读的data-bind语法,将DOM元素与ViewModel关联起来。 l  UI自动更新:当模型(ViewModel)状态更新时,自动更新UI界面。 l  依赖跟踪:在模型数据间建立隐式的关系链。 l  模板化:快速生成复杂,可嵌套UI模型数据的函数。 l  […]

爬虫入门 手写一个Java爬虫

本文内容 涞源于  罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的?  2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做什么的?  他的主要工作就是 跟据指定的url地址 去发送请求,获得响应, 然后解析响应 , 一方面从响应中查找出想要查找的数据,另一方面从响应中解析出新的URL路径, 然后继续访问,继续解析;继续查找需要的数据和继续解析出新的URL路径  . 这就是网络爬虫主要干的工作.  下面是流程图: 通过上面的流程图 能大概了解到 网络爬虫 干了哪些活  ,根据这些 也就能设计出一个简单的网络爬虫出来. 一个简单的爬虫 必需的功能:   1: 发送请求和获取响应的功能 ;  2: 解析响应的功能 ; 3: 对 过滤出的数据 进行存储 的功能 ; 4: 对解析出来的URL路径 处理的功能 ; 下面是包结构:    下面就上代码: RequestAndResponseTool  类: 主要方法: 发送请求 返回响应 并把 响应 封装成 page 类 ; package com.etoak.crawl.page; import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.params.HttpMethodParams; import java.io.IOException; public class RequestAndResponseTool {     public static Page  sendRequstAndGetResponse(String url) {         Page page = null;         // 1.生成 HttpClinet 对象并设置参数         HttpClient httpClient = new HttpClient();         // 设置 HTTP 连接超时 5s         httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);         // 2.生成 GetMethod 对象并设置参数         GetMethod getMethod = new GetMethod(url);         // 设置 get 请求超时 5s         getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);         // 设置请求重试处理         getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());         // 3.执行 HTTP GET 请求         try { […]

SG-UAP3.0开发平台微服务与isc集成方案具体实现

1.SG-UAP3.0开发平台微服务架构路线 2.SG-UAP3.0开发平台微服务架构 3.SG-UAP3.0开发平台微服务与isc集成方案 项目组所开发的系统在部署阶段,若没有使用分布式服务总线,前端web工程(IDE生成)需集成isc(通过isc_sso完成前端鉴权),前端登录后请求后端并将用户信息传递过去,后端每个微服务需进行登录会话校验(在后端服务添加过滤器,获取用户信息及资源信息,通过调用isc相应接口进行判断此用户是否授权),后端微服务暴露出的restful请求在isc中进行用户权限配置 ,同样,在服务调用服务的时候,调用方需将用户信息传递给被调用方进行鉴权操作 4.SG-UAP3.0开发平台微服务与isc集成方案具体实现 Ø  前端工程添加所需jar包 Ø  在web.xml中加入统一认证过虑器、获取用户信息GetCurrentUser、系统注销IscLogoutServlet、系统注销监听(红框为原有基础上新增内容,表示具备代理能力)。 Ø  微服务端添加jar包 Ø  注意:isc_sm_agent.jar中的iscservicesadapter.properties文件需要配置isc服务地址及isc_appid   Ø  微服务添加过滤器 @Order(1) @WebFilter(filterName = "MicAuthorizeFilter", urlPatterns = "/*") public class MicAuthorizeFilter extends HttpServlet implements Filter{     @Value("${spring.isc_appId}")     private String isc_appId;      //isc资源服务接口     private IResourceService ress = (IResourceService) AdapterFactory.getResourceService();        @Override       public void destroy() {       }          @Override     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)               throws IOException, ServletException {            HttpServletRequest httpRequest = (HttpServletRequest) request;           HttpServletResponse httpResponse = (HttpServletResponse) response;           String url = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length());           if (url.startsWith("/") && url.length() > 1) {               url = url.substring(1).split("/")[0];           }           String iscUserId = httpRequest.getParameter("cl_u_id");           boolean isPer=false;           if(null==httpRequest.getSession(false)){                  if(true==httpRequest.getSession(true).isNew()){                     System.out.println("session没有过期");               }else{                      System.out.println("session已经过期");                    String authorizeState = "timeout";                   PrintWriter pw = null;                    try {                       pw = response.getWriter();                       pw.write(authorizeState);                    } catch (IOException e) {                       e.printStackTrace();                    }finally{                       pw.flush();                       pw.close();                    }                    return;               }             }             if(null==iscUserId||("").equals(iscUserId)){ […]

分布式服务总线

介绍: 为支撑微服务的运行,分布式服务总线将提供服务注册、发现、查询等功能;为支撑微服务路由,提高微服务的可靠性和可扩展性,分布式服务总线将提供路由规则管理、集群扩展、全局负载均衡、容错、并发控制、连接数控制等功能;为监控微服务运作状态,分布式服务总线将提供服务监控、服务方法监控统计等功能;为保障微服务安全,分布式服务总线将提供访问控制、服务鉴权、服务授权等功能。 搜索材料: 序号 名词 相关解释 1 IaaS 为消费者提供处理、存储、网络和其它基础性计算资源,消费者可利用这些资源部署运行任意软件,包括操作系统和应用程序。消费者不管理或控制任何底层的云计算基础设施,但能控制操作系统、储存和部署的应用,还可能对选择网络组件(例如,防火墙)进行有限的控制。 2 PaaS 消费者可以将利用编程语言、类库、服务或工具创建的或已有的应用部署到云基础设施之上,而不需要管理或控制底层的云基础设施,包括网络、存储、主机、操作系统,但是可以控制部署的应用,对应用运行环境进行设置。 3 SaaS 消费者可以使用运营商运行在云计算基础设施上的应用系统。用户可以通过不同的客户端设备访问应用系统,包括瘦客户端接口(例如Web浏览器、基于Web的EMAIL)或者编程接口。消费者不需要管理或控制底层的云计算基础设施,包括网络、存储、服务器、操作系统,甚至是每个应用系统的容量,但是可以对应用系统进行特定的有限的设置。 4 微服务 微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持微服务。一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。 5 微应用 通过一组服务的方式来构建一个应用,服务独立部署在不同的进程中,不同服务通过一些轻量级交互机制来通信,例如RESTful API。每个服务可独立扩展伸缩,并且定义了明确的边界,不同的服务甚至可以采用不同的编程语言来实现,由独立的团队来维护。 6 服务发现 服务发现的基本思想是,任何一个应用的实例能够以编程的方式获取当前环境的细节,而新的实例可以嵌入到现有的应用环境而不需要人工干预。服务发现工具通常是用全局可访问的存储信息注册表来实现,它存储了当前正在运行的实例或者服务的信息。大多数情况下,为了使这个配置具有容错与扩展能力,这个工具以分布式形式存储在多个节点上。 7 服务发布 服务提供者将自己的服务注册到服务注册中心,便于服务消费者来查询或者调用。 8 服务降级 对下游出现超时的非核心服务提供者进行低优先级调用,确保上游核心应用(服务消费者)不被影响。 9 服务限流 服务消费者调用服务提供者时,对所有访问请求都会通过限流模块进行计算,若服务消费者调用量在一定时间内容超过预设阈值,就触发限流策略进行限流处理。 流程: 功能描述 显示可用的权限。 操作步骤 点击权限管理,显示权限列表。 1.权限添加。点击“权限添加”按钮,弹出会话窗,填入对应的信息,红色星号标识的为必填项,点击“提交”按钮进行提交并提示: 权限编辑。点击“编辑”按钮,弹出会话窗,填入对应的内容,点击“提交”按钮提交: 删除权限。点击“删除”按钮,对相应的权限进行删除:

Ajax长轮询

Ajax长轮询属于Ajax轮询的升级版,在客户端和服务端都进行了一些改造,使得消耗更低,速度更快。 "不间断的通过Ajax查询服务端"。 来,小二,先上代码~: Reception.html //客户端 <html> <head>     <title></title>     <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script> </head> <body> </body> <script type="text/javascript">     //前端Ajax持续调用服务端,称为Ajax轮询技术     var getting = {         url:'server.php',         dataType:'json',         success:function(res) {          console.log(res);          $.ajax(getting); //关键在这里,回调函数内再次请求Ajax }                 //当请求时间过长(默认为60秒),就再次调用ajax长轮询         error:function(res){         $.ajax($getting);         } }; $.ajax(getting); </script> </html> server.php: //服务端 <?php//这段AJAX请求时间永不过期set_time_limit(0);     $pdo = new PDO('mysql:dbname=test;host=127.0.0.1','root','root');          $resource = $pdo->query('select * from t1');          $result = $resource->fetchall();while (true) {            if ($result) {        //exits data                  print_r(json_encode(array('success'=>'存在数据,返回')));                     exit(); //输出数据,退出。然后客户端不间断继续发起请求              }    //数据不存在,继续循环。     } ?> 看出了玄机了嘛?长轮询的精髓就在于Ajax的回调函数,继续再次调用Ajax请求(不间断的原理就在这里,成功返回后立即再次调用): $.ajax(getting); 下面是是Ajax 长轮询的图解: 首先请忽略绿色字体的使用限制,然后哪位朋友有可以推荐的画图工具可以推荐给我,我现在用的是忆图图示。 图中有两次请求(本文中的请求默认均为Ajax),第一次很快返回了结果,然后不间断的立即发送第二次请求,但是第二次请求没有获得数据,所以请求迟迟没有返回(被挂在服务器了,但只要有数据就会再次返回),如果第二次的请求返回数据后,第三次请求旋即会立刻发出,这种技术就称为Ajax 长轮询。 用伪代码来表示就是这样: <?php//客户端通过Ajax发起请求if ('客户端发送请求' && '服务端有数据可以返回') {    echo '返回数据给客户端';    echo '客户端通过Ajax继续发起请求,然后继续if判断'; }else{    echo'没有数据可以返回,再次执行一次if判断'; }?> 最关键的地方在于前一次请求结束后,第二次请求立即不间断的发起,这个就叫做Ajax长轮询

Java调用CMD执行Python命令

        // python 自动摘要程序         String pythonVersion = PorpertiesUtil.PYTHON_CMD + " " + path + "chengxu//2.0文章自动摘要提取.py";                      doCmd(pythonVersion); 使用CMD执行命令后, 防止线程阻塞,  开启两个线程进行疏通         public void doCmd(String cmd) throws Exception { final Process process = Runtime.getRuntime().exec(cmd); System.out.println("start run cmd=" + cmd); // 处理InputStream的线程 new Thread() { @Override public void run() { BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null; try { while ((line = in.readLine()) != null) { System.out.println("output: " + line); } } catch (IOException e) { e.printStackTrace(); } finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } }.start(); new Thread() { @Override public void run() { BufferedReader err = new BufferedReader(new InputStreamReader( process.getErrorStream())); String line = null; try { while ((line = err.readLine()) != null) { System.out.println("err: " + line); } } catch (IOException e) { e.printStackTrace(); } finally { try { err.close(); } catch (IOException e) { e.printStackTrace(); } } } }.start(); process.waitFor(); System.out.println("finish run cmd=" + cmd); }

Win10突然断开Wifi并无法连接的解决办法

最近经常遇到用着用着电脑 Wifi 就突然“死亡”的情况,每次都要重启电脑才能解决,很是苦恼。今天在知乎上终于找到了解决的办法,跟着试了一下,果然再没有出过这问题。 1、在 开始按钮 上点击鼠标右键> 设备管理器 2、点击网络适配器 3、在无线网卡条目上点击鼠标右键>属性 4、在属性页切换到“电源管理”选项卡,取消掉“允许计算机关闭设备以节约电源”的勾选 5、切换到“驱动程序”选项卡,点击“更新驱动程序” 6、选择“浏览计算机以查找驱动程序软件” 7、选择“从计算机的设备驱动程序列表中选取” 8、接下来的这个列表中可能会出现很多个不同的驱动程序,一个个点击启用去尝试,直至问题解决。