java 数字格式化 补0

java 数字格式化 补0 DecimalFormat df = new DecimalFormat(“0000000”); System.out.println(df.format(1)); output: 0000001

2012-06-26 · 1 min · 11 words · -

java thread id, name

java thread id, name Thread.currendThread().getName() 这个可以返回线程对象的ID 设置线程名 public class Thread3 { public static void main(String[] args){ RunnableTest rt = new RunnableTest(); //定义两个线程,他们引用相同的数据 Thread t1 = new Thread(rt); Thread t2 = new Thread(rt); //设置线程的名字 t1.setName("线程1"); t2.setName("线程2"); //运行后,线程1 和线程2会交替运行 t1.start(); t2.start(); } }

2012-06-22 · 1 min · 41 words · -

HttpSessionBindingListener

HttpSessionBindingListener 捕获Session事件的意义: 记录网站的客户登录日志 (登录,退出信息等) 统计在线人数 等等还有很多,呵呵,自己想吧……总之挺重要的。 Session代表客户的会话过程,客户登录时,往Session中传入一个对象,即可跟踪客户的会话。在Servlet中,传入Session的对象如果是一个实现HttpSessionBindingListener接口的对象 (方便起见,此对象称为监听器) ,则在传入的时候 (即调用HttpSession对象的setAttribute方法的时候) 和移去的时候 (即调用HttpSession对象的removeAttribute方法的时候或Session Time out的时候) Session对象会自动调用监听器的valueBound和valueUnbound方法 (这是HttpSessionBindingListener接口中的方法) 。 由此可知,登录日志也就不难实现了。 另外一个问题是,如何统计在线人数,这个问题跟实现登录日志稍微有点不同,统计在线人数 (及其信息) ,就是统计现在有多少个Session实例存在,我们可以增加一个计数器 (如果想存储更多的信息,可以用一个对象来做计数器,随后给出的实例中,简单起见,用一个整数变量作为计数器) ,通过在valueBound方法中给计数器加1,valueUnbound方法中计数器减1,即可实现在线人数的统计。当然,这里面要利用到ServletContext的全局特性。(有关ServletContext的叙述请参考Servlet规范),新建一个监听器,并将其实例存入ServletContext的属性中,以保证此监听器实例的唯一性,当客户登录时,先判断ServletContext的这个属性是否为空,如果不为空,证明已经创建,直接将此属性取出放入Session中,计数器加1;如果为空则创建一个新的监听器,并存入ServletContext的属性中。 举例说明: 实现一个监听器: // SessionListener.java import java.io.*; import java.util.*; import javax.servlet.http.*; //监听登录的整个过程 public class SessionListener implements HttpSessionBindingListener { public String privateInfo= " “; //生成监听器的初始化参数字符串 private String logString= " “; //日志记录字符串 private int count=0; //登录人数计数器 public SessionListener(String info){ this.privateInfo=info; } public int getCount(){ return count; } public void valueBound(HttpSessionBindingEvent event) ...

2012-06-22 · 2 min · 241 words · -

cookie, session

cookie, session 具体来说cookie机制采用的是在客户端保持状态的方案。它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持。cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力. 而session机制采用的是一种在客户端与服务器之间保持状态的解决方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。而session提供了方便管理全局变量的方式 session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。 就安全性来说: 当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。 正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie 从网络服务器观点看所有HTTP请求都独立于先前请求。就是说每一个HTTP响应完全依赖于相应请求中包含的信息 状态管理机制克服了HTTP的一些限制并允许网络客户端及服务器端维护请求间的关系。在这种关系维持的期间叫做会话(session)。 Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie规范。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies 理解session机制 session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构 (也可能就是使用散列表) 来保存信息。 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 – 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用 (如果检索不到,可能会新建一个) ,如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。 保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。 由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://…../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 另一种是作为查询字符串附加在URL后面,表现形式为http://…../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。 为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。 另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单 <form name="testform" action="/xxx"> <input type="text"> </form> 在被传递给客户端之前将被改写成 <form name="testform" action="/xxx"> <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764″> <input type="text"> </form> 这种技术现在已较少应用,笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。 实际上这种技术可以简单的用对action应用URL重写来代替。 在谈论session机制的时候,常常听到这样一种误解"只要关闭浏览器,session就消失了"。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。 ...

2012-06-22 · 1 min · 176 words · -

Servlet Session

Servlet Session http://developer.51cto.com/art/200907/134673.htm 本文向您介绍Servlet Session机制,包括会话管理机制、事件监听等,并结合具体的示例讲解了一个基于Servlet Session登陆系统的实现。 一、 Servlet的会话管理机制 HttpSession接口提供了存储和返回标准会话属性的方法。标准会话属性如会话标识符、应用数据等,都以"键-值"对的形式保存。简而言之,HttpSession接口提供了一种把对象保存到内存、在同一用户的后继请求中提取这些对象的标准办法。在会话中保存数据的方法是setAttribute(String s, Object o),从会话提取原来所保存对象的方法是getAttribute(String s)。 每当新用户请求一个使用了HttpSession对象的JSP页面,JSP容器除了发回应答页面之外,它还要向浏览器发送一个特殊的数字。这个特殊的数字称为"会话标识符",它是一个唯一的用户标识符。此后,HttpSession对象就驻留在内存之中,等待同一用户返回时再次调用它的方法。 在客户端,浏览器保存会话标识符,并在每一个后继请求中把这个会话标识符发送给服务器。会话标识符告诉JSP容器当前请求不是用户发出的第一个请求,服务器以前已经为该用户创建了HttpSession对象。此时,JSP容器不再为用户创建新的HttpSession对象,而是寻找具有相同会话标识符的HttpSession对象,然后建立该HttpSession对象和当前请求的关联。 会话标识符以Cookie的形式在服务器和浏览器之间传送。如果客户端不支持cookie,运用url改写机制来保证会话标识符传回服务器。 二、 Servlet Session事件侦听 HttpSessionBindingEvent类 定义 public class HttpSessionBindingEvent extends EventObject 这个事件是在监听到HttpSession发生绑定和取消绑定的情况时连通HttpSessionBindingListener的。这可能是一个session被终止或被认定无效的结果。 事件源是HttpSession.putValue或HttpSession.removeValue。 构造函数 public HttpSessionBindingEvent(HttpSession session, String name); 通过引起这个事件的Session和发生绑定或取消绑定的对象名构造一个新的HttpSessionBindingEvent。 方法 1、getName public String getName(); 返回发生绑定和取消绑定的对象的名字。 2、getSession public HttpSession getSession(); 返回发生绑定和取消绑定的session的名字。 HttpSessionBindingListener接口 定义 public interface HttpSessionBindingListener 这个对象被加入到HTTP的session中,执行这个接口会通告有没有什么对象被绑定到这个HTTP session中或被从这个HTTP session中取消绑定。 方法 1、valueBound public void valueBound(HttpSessionBindingEvent event); 当一个对象被绑定到session中,调用此方法。HttpSession.putValue方法被调用时,Servlet引擎应该调用此方法。 2、valueUnbound public void valueUnbound(HttpSessionBindingEvent event); 当一个对象被从session中取消绑定,调用此方法。HttpSession.removeValue方法被调用时,Servlet引擎应该调用此方法。 Session的事件处理机制与swing事件处理机制不同。Swing采用注册机制,而session没有;当任一session发生绑定或其他事件时,都会触发HttpSessionBindingEvent ,如果servlet容器中存在HttpSessionBindingListener的实现类,则会将事件作为参数传送给session侦听器的实现类。在HttpSessionBindingEvent 中可以通过getsession得到发生绑定和取消绑定的session的名字,而侦听器可以据此做更多处理。 因此,对session的事件侦听,只需实现HttpSessionBindingListener即可。 从servlet2.3增加了 HttpSessionEvent (This is the class representing event notifications for changes to sessions within a web application) HttpSessionActivationListener (Objects that are bound to a session may listen to container events notifying them that sessions will be passivated and that session will be activated.) HttpSessionAttributeListener (This listener interface can be implemented in order to get notifications of changes to the attribute lists of sessions within this web application.) 分别执行不同的任务,处理基本相同。 三、 例子 (zz) 捕获Servlet Session事件的意义: 1、 记录网站的客户登录日志 (登录,退出信息等) 2、 统计在线人数 3、 等等还有很多,呵呵,自己想吧……总之挺重要的。 Session代表客户的会话过程,客户登录时,往Session中传入一个对象,即可跟踪客户的会话。在Servlet中,传入Session的对象如果是一个实现HttpSessionBindingListener接口的对象 (方便起见,此对象称为监听器) ,则在传入的时候 (即调用HttpSession对象的setAttribute方法的时候) 和移去的时候 (即调用HttpSession对象的removeAttribute方法的时候或Session Time out的时候) Session对象会自动调用监听器的valueBound和valueUnbound方法 (这是HttpSessionBindingListener接口中的方法) 。由此可知,登录日志也就不难实现了。 另外一个问题是,如何统计在线人数,这个问题跟实现登录日志稍微有点不同,统计在线人数 (及其信息) ,就是统计现在有多少个Session实例存在,我们可以增加一个计数器 (如果想存储更多的信息,可以用一个对象来做计数器,随后给出的实例中,简单起见,用一个整数变量作为计数器) ,通过在valueBound方法中给计数器加1,valueUnbound方法中计数器减1,即可实现在线人数的统计。当然,这里面要利用到ServletContext的全局特性。(有关ServletContext的叙述请参考Servlet规范),新建一个监听器,并将其实例存入ServletContext的属性中,以保证此监听器实例的唯一性,当客户登录时,先判断ServletContext的这个属性是否为空,如果不为空,证明已经创建,直接将此属性取出放入Session中,计数器加1;如果为空则创建一个新的监听器,并存入ServletContext的属性中。 举例说明: 实现一个监听器: ...

2012-06-22 · 2 min · 343 words · -

HttpSessionListener

HttpSessionListener Session创建事件发生在每次一个新的session创建的时候,类似地Session失效事件发生在每次一个Session失效的时候。 这个接口也只包含两个方法,分别对应于Session的创建和失效: public void sessionCreated(HttpSessionEvent se); public void sessionDestroyed(HttpSessionEvent se); 我的web应用上想知道到底有多少用户在使用? 在网站中经常需要进行在线人数的统计。过去的一般做法是结合登录和退出功能,即当用户输入用户名密码进行登录的时候计数器加1,然后当用户点击退出按钮退出系统的时候计数器减1。这种处理方式存在一些缺点,例如: 用户正常登录后,可能会忘记点击退出按钮,而直接关闭浏览器,导致计数器减1的操作没有及时执行;网站上还经常有一些内容是不需要登录就可以访问的,在这种情况下也无法使用上面的方法进行在线人数统计。 我们可以利用Servlet规范中定义的事件监听器 (Listener) 来解决这个问题,实现更准确的在线人数统计功能。对每一个正在访问的用户,J2EE应用服务器会为其建立一个对应的HttpSession对象。当一个浏览器第一次访问网站的时候,J2EE应用服务器会新建一个HttpSession对象 ,并触发 HttpSession创建事件 ,如果注册了HttpSessionListener事件监听器,则会调用HttpSessionListener事件监听器的sessionCreated方法。相反,当这个浏览器访问结束超时的时候,J2EE应用服务器会销毁相应的HttpSession对象,触发 HttpSession销毁事件,同时调用所注册HttpSessionListener事件监听器的sessionDestroyed方法。 import javax.servlet.http.HttpSessionListener; import javax.servlet.http.HttpSessionEvent; public class SessionCounter implements HttpSessionListener { private static int activeSessions =0; /* Session创建事件 */ public void sessionCreated(HttpSessionEvent se) { ServletContext ctx = event.getSession( ).getServletContext( ); Integer numSessions = (Integer) ctx.getAttribute("numSessions"); if (numSessions == null) { numSessions = new Integer(1); } else { int count = numSessions.intValue( ); numSessions = new Integer(count + 1); } ctx.setAttribute("numSessions", numSessions); } /* Session失效事件 */ public void sessionDestroyed(HttpSessionEvent se) { ServletContext ctx=se.getSession().getServletContext(); Integer numSessions = (Integer)ctx.getAttribute("numSessions"); if(numSessions == null) numSessions = new Integer(0); } else { int count = numSessions.intValue( ); numSessions = new Integer(count - 1); } ctx.setAttribute("numSessions", numSessions); } } 在这个解决方案中,任何一个Session被创建或者销毁时,都会通知SessionCounter 这个类,当然通知的原因是必须在web.xml文件中做相关的配置工作。如下面的配置代码: demo.listener.SessionCounter</listener-class> </listener> 以下两种情况下就会发生sessionDestoryed (会话销毁) 事件: 1.执行session.invalidate()方法时 。 既然LogoutServlet.java中执行session.invalidate()时,会触发sessionDestory()从在线用户 列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行操作了,所以LogoutServlet.java的内容现在是 这样。 ...

2012-06-22 · 1 min · 208 words · -

ServletContextListener

ServletContextListener http://www.cnblogs.com/kentyshang/archive/2007/06/26/795878.html ServletContextListener处理Web应用的 servlet上下文(context)的变化的通知。这可以解释为,好像有个人在服务器旁不断地通知我们服务器在发生什么事件。那当然需要监听者了。因 此,在通知上下文(context)初始化和销毁的时候,ServletContextListner非常有用。 import javax.servlet.ServletContextListener; import javax.servlet.ServletContextEvent; import javax.servlet.*; public class MyListener implements ServletContextListener { private ServletContext context = null; /* 这个方法在Web应用服务被移除,没有能力再接受请求的时候被调用。 */ public void contextDestroyed(ServletContextEvent event){ //Output a simple message to the server's console System.out.println("The Simple Web App. Has Been Removed"); this.context = null; } // 这个方法在Web应用服务做好接受请求的时候被调用。 public void contextInitialized(ServletContextEvent event){ this.context = event.getServletContext(); //Output a simple message to the server's console System.out.println("The Simple Web App. Is Ready"); } } ...

2012-06-22 · 1 min · 189 words · -

java BC/Bouncy Castle

java BC/Bouncy Castle 我们知道,Java标准库提供了一系列常用的哈希算法。 但如果我们要用的某种算法,Java标准库没有提供怎么办? 方法一: 自己写一个,难度很大; 方法二: 找一个现成的第三方库,直接使用。 BouncyCastle就是一个提供了很多哈希算法和加密算法的第三方库。它提供了Java标准库没有的一些算法,例如,RipeMD160哈希算法。 download bcprov-jdk16-146.jar add jar to ‘$JAVA_HOME$jrelibext’ java.security file in %JAVA_HOME%/jre/lib/security directory add the following line like : List of providers and their preference orders (see above): security.provider.1=sun.security.provider.Sun security.provider.2=sun.security.rsa.SunRsaSign security.provider.3=com.sun.net.ssl.internal.ssl.Provider security.provider.4=com.sun.crypto.provider.SunJCE security.provider.5=sun.security.jgss.SunProvider security.provider.6=com.sun.security.sasl.Provider security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI security.provider.8=sun.security.smartcardio.SunPCSC security.provider.9=org.bouncycastle.jce.provider.BouncyCastleProvider https://www.bouncycastle.org/

2012-06-21 · 1 min · 46 words · -

maven -pl 选项

maven -pl 选项 mavenApache工作 在一个多模块的 maven 项目中,build 时如果不希望 build 项目中的所有模块,可以使用 -pl 选项来指定实际 build 的模块,各个模块之间使用逗号 (,) 分隔。 如何通过 -pl 选项来指定项目中的顶级模块呢?或许有人会说不需要,可以使用 -N 选项。的确 -N 选项可以使 maven 不会递归到子模块中运行。通过 -pl 选项也是可以指定顶级模块的。 maven 在使用 -pl 选项指定的值过滤模块的时候,通过两种方式,一是把 -pl 选项的值当做 groupId:artifactId 来查找,其次把 -pl 选项的值作为相对路径来查找,相对于用户运行 maven 时的工作目录。 例如有以下项目结构: all [org.apache.maven:test] |- m-1 [org.apache.maven:m1] |- m-2 [org.apache.maven:m2] 如果想通过 -pl 选项来指定顶级模块 all 和 m-1 模块,可以使用一下这么命令: mvn -pl org.apache.maven:test,m-1 clean install ps:上面的逻辑参见代码 org.apache.maven.project.ProjectSorter.findProject。 -EOF-

2012-06-19 · 1 min · 63 words · -

web service

web service http://www.cnblogs.com/hanlsheng/archive/2011/01/20/1940367.html 第一章 设计一个简单的web service接口 本章主要内容: 你将学会如何设计一个简单的web service接口 穿越网络提供跨平台操作 假设你想为大众或者业务伙伴提供一种这样的服务: 他们向你发送两个字符串,你把两个字符串进行连接,然后返回给他们。当然在现实世界中,你将提供一些更有用更复杂的服务。 此服务有几个必须满足的需求: 首先,用户可以使用不同的语言( 比如Java,C# 等)以及不同的平台( Windows,Linux等)。你提供的服务对于不同的语言和平台必须是可以访问的。第二,用户可以通过网络对你的服务进行访问。而且必须能够穿越防火墙。 给定了以上需求,最佳的解决方案是提供一个所谓的"web service"。比如,你可以在主机( www.ttdev.com)上提供可访问的web service( 通过/SimpleService 访问,见下图),所以URL全称是: http: www.ttdev.com/SimpleService. 这被称为web service的"endpoint"( 终端,端点)。web service 可以支持一个或者多个操作。在这个例子中,一个操作被命名为"concat": 然而,你希望为你的每一个web service 操作提供全球唯一标识,这样别人也可以拥有名称为"concat"的操作。如何实现呢?很简单,你可以在名称"concat"前面声明一个"namespace"( 命名空间,比如http: ttdev.com/ss). namespace( 命名空间)的作用同java 中包的作用非常类似,只是表示形式不用而已,包的表示形式为 com.ttdev.foo。全球唯一标识是由namespace和操作名称组成的。Operation(操作)的名称,比如"concat"被称为local name( 本地名称)。全球唯一标识被称为QName( qualified name)。 你可能想知道命名空间(如http: ttdev.com/ss)有什么含义。答案是:没有什么特别的含义。即使这个命名空间是一个URL,但不意味着你能通过浏览器进行访问会获得一个可访问页面。对你来说唯一重要的一点是,这个标识是全球唯一的。因为我已经注册了这个域名ttdev.com,所以它一定是全球唯一的。 值得注意的一点是, namespace (命名空间)与endpoint(终端,端点)是完全不同的概念。endpoint是真实的服务提供地点,而namespace仅仅是一个唯一标识符号。我可以轻易的把服务部署在另外的服务器上,这样web service将会有不同的 endpoint,但是 web service的操作唯一标识( 命名空间+本地名称)可以保持不变。 2.RPC 类型的web service 你的concat 操作将包含两个参数。一个名称为"s1"为string 类型。另一个名称为"s2"同样是string类型。返回值同样是一个string类型: 然而,上图中的string 类型是什么含义呢?是Java的 string类型吗?不是,因为它必须是语言中立的。幸运的是,XML schema spec 定义了一些基本的数据类型,其中包括string类型。每一个数据类型都有一个QName 作为其id。比如: ...

2012-06-17 · 2 min · 311 words · -

java string api

java string api 按tab分割 String[] segments = line.split("\t"); //按tab分割 char c="abc".charAt(1); /** * 将元数据前补零,补后的总长度为指定的长度,以字符串的形式返回 * @param sourceDate * @param formatLength * @return 重组后的数据 */ public static String frontCompWithZore(int sourceDate,int formatLength) { /* * 0 指前面补充零 * formatLength 字符总长度为 formatLength * d 代表为正数。 */ String newString = String.format("%0"+formatLength+"d", sourceDate); return newString; }

2012-06-14 · 1 min · 51 words · -

java switch

java switch 关于java中switch使用的一些说明 switch(表达式) { case 常量表达式1:语句1; …. case 常量表达式2:语句2; default:语句; } default就是如果没有符合的case就执行它,default并不是必须的. case后的语句可以不用大括号. switch语句的判断条件可以接受int,byte,char,short,不能接受其他类型. 一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break,利用这一特性可以让好几个case执行统一语句. 例如: switch(x) { case 1: case 2: case3: System.out.println(“haha”); break; case4: System.out.println(“hehe”); }

2012-06-13 · 1 min · 29 words · -

joda time, time zone

joda time, time zone DateTime dt = new DateTime(DateTimeZone.forOffsetHours(8)); dt=dt.withZone(DateTimeZone.forOffsetHours(-5)); DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ"); System.out.println(dtf.print(dt)); String s="2012-06-27T20:00:00+08:00"; DateTime dt2= dtf.parseDateTime(s) ; System.out.println(dtf.print(dt2));

2012-06-13 · 1 min · 22 words · -

servlet listener

servlet listener Listener是一种观察者模式的实现: 我们在web.xml中配置listener的时候就是把一个被观察者放入的观察者的观察对象队列中,当被观察者触发了注册事件时观察者作出相应的反应。在jsp/servlet中具体的实现是在web.xml中注册Listener,由Container在特定事件发生时呼叫特定的实现Listener的类。 总体上说servlet中有主要有3类事件既: Servlet上下文事件、 会话事件与请求事件总共有8个listener接口,我们在web.xml中注册时对应上自己对相应接口的实现类即可: Servlet中的Listener和Event: 在JSP 2.0/Servlet 2.4中,共有八个Listener接口,六个Event类别。 Listener接口 Event类 ServletContextListener ServletContextEvent ServletContextAttributeListener ServletContextAttributeEvent HttpSessionListener HttpSessionEvent HttpSessionActivationListener HttpSessionAttributeListener HttpSessionBindingEvent HttpSessionBindingListener ServletRequestListener ServletRequestEvent ServletRequestAttributeListener ServletRequestAttributeEvent 分别介绍: 1.ServletContextListener [接口方法] contextInitialized(), contextDestroyed() [接收事件] ServletContextEvent [触发场景] 在Container加载Web应用程序时 (例如启动 Container之后) ,会呼叫contextInitialized(),而当容器移除Web应用程序时,会呼叫contextDestroyed()方法。 2. ServletContextAttributeListener [接口方法] attributeAdded()、 attributeReplaced()、attributeRemoved() [接收事件] ServletContextAttributeEvent [触发场景] 若有对象加入为application (ServletContext) 对象的属性,则会呼叫attributeAdded(),同理在置换属性与移除属性时,会分别呼叫attributeReplaced()、attributeRemoved()。 3. HttpSessionListener [接口方法] sessionCreated(), sessionDestroyed () [接收事件] HttpSessionEvent [触发场景] 在session (HttpSession) 对象被创建或被消毁时,会分别调用这两个方法。 4. HttpSessionAttributeListener [接口方法] attributeAdded()、 attributeReplaced()、attributeRemoved() [接收事件] HttpSessionBindingEvent ...

2012-06-10 · 1 min · 162 words · -

Servlet Filter

Servlet Filter @Servlet里的过滤器的主要作用 1,判断用户是否登录。 2,网络聊天系统或论坛,功能是过滤非法文字 3,统一解决编码 @Servlet3.0之前怎么创建一个过滤器 1,生成一个普通的class类,实现Filter接口(javax.servlet.Filter)。 2,重写接口里面的三个方法: init,doFilter,destroy。 其中的doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息 (包括表单数据、cookie和HTTP请求头) 的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参数为FilterChain,此参数用来调用servlet或JSP页。 3,然后在web.xml配置过滤器。 具体例子:1.首先写一个权限过滤filter类,实现Filter接口 <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> ```java import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.FilterChain; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpServletResponse; public class RightFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; //如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法 //就要把此request对象构造成HttpServletRequest HttpServletResponse res = (HttpServletResponse) response; HttpSession session = req.getSession(true); //从session里取的用户名信息 String username = (String) session.getAttribute("username"); //判断如果没有取到用户信息,就跳转到登陆页面 if (username == null || "".equals(username)) { //跳转到登陆页面 res.sendRedirect("http://"+req.getHeader("Host")+"/login.jsp"); } else { //已经登陆,继续此次请求 chain.doFilter(request,response); //调用FilterChain对象的doFilter方法 //Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数 //在调用此对象的doFilter方法时,激活下一个相关的过滤器 //如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活 } } public void destroy() { } } ## 2.然后在web.xml里配置需要登陆权限验证的JSP文件: ## a.如果是某个具体的JSP文件(如a.jsp)需要登陆验证 ## <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < web-app > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> ... <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < filter > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < filter-name > right filter-name > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < filter-class > com.taihuatalk.taihua.common.RightFilter filter-class > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> filter > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < filter-mapping > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < filter-name > right filter-name > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < url-pattern > /a.jsp url-pattern > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> filter-mapping > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> ... <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> web-app > ## b.如果是某一个目录(如a/目录)整个目录下的文件都需要登陆验证: ## <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < web-app > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> ... <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < filter > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < filter-name > right filter-name > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < filter-class > com.taihuatalk.taihua.common.RightFilter filter-class > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> filter > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < filter-mapping > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < filter-name > right filter-name > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> < url-pattern > /a/* url-pattern > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> filter-mapping > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> ... <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> web-app > <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> ## ## _@Servlet3.0中的创建过滤器: 使用@WebFilter_ ## @WebFilter用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是value、urlPatterns、servletNames三者必需至少包含一个,且value和urlPatterns不能共存,如果同时指定,通常忽略value的取值): ## 属性名类型描述 ## 1.filterNameString指定过滤器的name属性。 ## 2.valueString[]该属性等价于urlPatterns属性。但是两者不应该同时使用。 ## 3.urlPatternsString[]指定一组过滤器的URL匹配模式。等价于标签。 ## 4.servletNamesString[]指定过滤器将应用于哪些Servlet。取值是@WebServlet中的name属性的取值,或者是web.xml中的取值。 ## 5.dispatcherTypesDispatcherType指定过滤器的转发模式。具体取值包括: ## ◆ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。 ## ◆initParamsWebInitParam[]指定一组过滤器初始化参数,等价于标签。 ## ◆asyncSupportedboolean声明过滤器是否支持异步操作模式,等价于标签。 ## ◆descriptionString该过滤器的描述信息,等价于标签。 ## ◆displayNameString该过滤器的显示名,通常配合工具使用,等价于标签。 ## 一个简单的示例: ## @WebFilter(filterName = "AuthenticateFilter", urlPatterns ={"/stock.jsp", "/getquote"}) public class AuthenticateFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String username = ((HttpServletRequest) request).getParameter("uname"); String password = ((HttpServletRequest) request).getParameter("password"); if (username == null || password == null) { ((HttpServletResponse) response).sendRedirect("index.jsp"); ## } if (username.equals("admin") && password.equals("admin")) { chain.doFilter(request, response); ## } else { ((HttpServletResponse) response).sendRedirect("index.jsp"); ## } } public void destroy() { } ## public void init(FilterConfig filterConfig) { } } ## 如此配置之后,就可以不必在web.xml中配置相应的和元素了,容器会在部署时根据指定的属性将该类发布为过滤器。 ## ## _具体Servlet3.0相关的内容请参考: http://blog.csdn.net/flfna/archive/2010/05/16/5598201.aspx_ ## Filter 技术是Servlet 2.3 新增加的功能. Filter的使用户可以改变一 个request或修改一个response。 Filter 不是一个servlet,它不能产生一个response,但是他能够在一个request到达servlet之前预先处理request,也可以在一个响应离开 servlet时处理response。 一个filter 包括: 以常规的方式调用资源 (即,调用servlet或JSP页面) 。 利用修改过的请求信息调用资源。 ③调用资源,但在发送响应到客户机前对其进行修改。 ④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。 2. 在servlet被调用之前检查servlet request; 3. 根据需要修改request头和request数据; 4. 根据需要修改response头和response数据; 5. 在servlet被调用之后截获. Filter和servlet的对应关系为多对多的关系 ,也就是说你可以配置一个filter 到一个或多个servlet;而一个servlet可以有多个filter。几个实用的filter 包括: 用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLT filter等. 一个filter必须实现javax.servlet.Filter接口并定义三个方法: 1.void setFilterConfig(FilterConfig config) //设置filter 的配置对象; 2. FilterConfig getFilterConfig() //返回filter的配置对象; 3. void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) //执行filter 的工作. 服务器每次只调用setFilterConfig方法一次准备filter 的处理;调用doFilter方法多次以处理不同的请求.FilterConfig接口有方法可以找到filter名字及初始化参数信息.服务器可以设置 FilterConfig为空来指明filter已经终结. 每一个filter从doFilter()方法中得到当前的request及response.在这个方法里,可以进行任何的针对request及 response的操作.(包括收集数据,包装数据等).filter调用chain.doFilter()方法把控制权交给下一个filter.一个 filter在doFilter()方法中结束.如果一个filter想停止request处理而获得对response的完全的控制,那它可以不调用下 一个filter. 一个filter可以包装request 或response以改变几个方法和提供用户定制的属性.Api2.3提供了HttpServletRequestWrapper 和HttpServletResponseWrapper来实现.它们能分派最初的request和response.如果要改变一个方法的特性,必须继 承wapper和重写方法.下面是一段简单的日志filter用来记录所有request的持续时间. 当server调用setFilterConfig(),filter保存config信息.在doFilter()方法中通过config信息得到 servletContext.如果要运行这个filter,必须去配置到web.xml中.以tomcat4.01为例: <filter> <filter-name> log //filter 名字 ```xml 1.2 Servlet过滤器的基本原理 ...

2012-06-10 · 6 min · 1253 words · -

Java Override Overload 重写、覆盖、重载、多态

‘Java Override Overload 重写、覆盖、重载、多态’ 重写、覆盖、重载、多态几个概念的区别分析 Java方法的重写 (Overiding) 和重载 (Overloading) 是Java多态性的不同的表现。 Overriding是父类与子类之间多态性的一种表现; Overloading是一个类中多态性的一种表现。 override->重写(=覆盖)、overload->重载、polymorphism -> 多态 override是重写 (覆盖) 了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写 (重新实现) 父类中的方法。 重写 (覆盖) 的规则: 重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载. 重写方法的访问修饰符一定要大于被重写方法的访问修饰符 (public>protected>default>private) 。 重写的方法的返回值必须和被重写的方法的返回一致; 重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类; 被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。 静态方法不能被重写为非静态的方法 (会编译出错) 。 overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。 重载的规则: 在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序 (参数类型必须不一样) ; 不能通过访问权限、返回类型、抛出的异常进行重载; 方法的异常类型和数目不会对重载造成影响; 多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是: 继承是子类使用父类的方法,而多态则是父类使用子类的方法。 一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。 举个例子: public class Shape { public static void main(String[] args){ Triangle tri = new Triangle(); System.out.println("Triangle is a type of shape? " + tri.isShape());// 继承 Shape shape = new Triangle(); System.out.println("My shape has " + shape.getSides() + " sides."); // 多态 Rectangle Rec = new Rectangle(); Shape shape2 = Rec; System.out.println("My shape has " + shape2.getSides(Rec) + " sides."); //重载 } public boolean isShape(){ return true; } public int getSides(){ return 0 ; } public int getSides(Triangle tri){ //重载 return 3 ; } public int getSides(Rectangle rec){ //重载 return 4 ; } } class Triangle extends Shape { public int getSides() { //重写,实现多态 return 3; } } class Rectangle extends Shape { public int getSides(int i) { //重载 return i; } } 注意Triangle类的方法是重写,而Rectangle类的方法是重载。对两者比较,可以发现多态对重载的优点: ...

2012-06-10 · 2 min · 303 words · -

Servlet.Filter

Servlet.Filter filter功能.它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个"servlet chaining"(servlet 链).一个filter 包括: 在servlet被调用之前截获; 在servlet被调用之前检查servlet request; 根据需要修改request头和request数据; 根据需要修改response头和response数据; 在servlet被调用之后截获. 你能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用.几个实用的filter 包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLT filter等. 一个filter必须实现javax.servlet.Filter接口并定义三个方法: 1.void setFilterConfig(FilterConfig config) //设置filter 的配置对象; FilterConfig getFilterConfig() //返回filter的配置对象; void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) //执行filter 的工作. 服务器每次只调用setFilterConfig方法一次准备filter 的处理;调用doFilter方法多次以处理不同的请求.FilterConfig接口有方法可以找到filter名字及初始化参数信息.服务器可以设置 FilterConfig为空来指明filter已经终结. 每一个filter从doFilter()方法中得到当前的request及response.在这个方法里,可以进行任何的针对request及 response的操作.(包括收集数据,包装数据等).filter调用chain.doFilter()方法把控制权交给下一个filter.一个 filter在doFilter()方法中结束.如果一个filter想停止request处理而获得对response的完全的控制,那它可以不调用下 一个filter. 一个filter可以包装request 或response以改变几个方法和提供用户定制的属性.Api2.3提供了HttpServletRequestWrapper 和HttpServletResponseWrapper来实现.它们能分派最初的request和response.如果要改变一个方法的特性,必须继 承wapper和重写方法.下面是一段简单的日志filter用来记录所有request的持续时间. public class LogFilter implements Filter { FilterConfig config; public FilterConfig getFilterConfig() { return config; } @Override public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ServletContext context = getFilterConfig().getServletContext(); long bef = System.currentTimeMillis(); try { System.out.println("before do filter"); chain.doFilter(request, response); // no chain parameter needed here } catch (IOException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (ServletException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } long aft = System.currentTimeMillis(); context.log("Request to " + request.getRemoteAddr() + ": " + (aft - bef)); System.out.println("log filter..."+ (aft - bef)); } @Override public void destroy() { //To change body of implemented methods use File | Settings | File Templates. } } 当server调用setFilterConfig(),filter保存config信息.在doFilter()方法中通过config信息得到servletContext.如果要运行这个filter,必须去配置到web.xml中.以tomcat4.01为例: ...

2012-06-10 · 2 min · 222 words · -

context-param&init-param

‘context-param&init-param’ 的作用: web.xml的配置中配置作用 1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: 和 2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文. 3.容器将转化为键值对,并交给ServletContext. 4.容器创建中的类实例,即创建监听. 5.在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得ServletContext = ServletContextEvent.getServletContext(); context-param的值 = ServletContext.getInitParameter(“context-param的键”); 6.得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早. 换句话说,这个时候,你对中的键值做的操作,将在你的WEB项目完全启动之前被执行. 7.举例.你可能想在项目启动之前就打开数据库. 那么这里就可以在中设置数据库的连接方式,在监听类中初始化数据库的连接. 8.这个监听是自己写的一个类,除了初始化方法,它还有销毁方法.用于关闭应用前释放资源.比如说数据库连接的关闭. web.xml里面可以定义两种参数: (1)application范围内的参数,存放在servletcontext中,在web.xml中配置如下: <context-param> <param-name>context/param</param-name> <param-value>avalible during application</param-value> </context-param> <context-param> <param-name>cpn</param-name> <param-value>cpv</param-value> </context-param> (2)servlet范围内的参数,只能在servlet的init()方法中取得,在web.xml中配置如下: ...

2012-06-10 · 1 min · 80 words · -

servlet3.0

servlet3.0 http://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本 (Servlet 2.5) 的基础上提供了若干新特性用于简化 Web 应用的开发和部署。其中有几项特性的引入让开发者感到非常兴奋,同时也获得了 Java 社区的一片赞誉之声: 异步处理支持: 有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。 新增的注解支持: 该版本新增了若干注解,用于简化 Servlet、过滤器 (Filter) 和监听器 (Listener) 的声明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了。 可插性支持: 熟悉 Struts2 的开发者一定会对其通过插件的方式与包括 Spring 在内的各种常用框架的整合特性记忆犹新。将相应的插件封装成 JAR 包并放在类路径下,Struts2 运行时便能自动加载这些插件。现在 Servlet 3.0 提供了类似的特性,开发者可以通过插件的方式很方便的扩充已有 Web 应用的功能,而不需要修改原有的应用。 新增的注解支持 Servlet 3.0 的部署描述文件 web.xml 的顶层标签 有一个 metadata-complete 属性,该属性指定当前的部署描述文件是否是完全的。如果设置为 true,则容器在部署时将只依赖部署描述文件,忽略所有的注解 (同时也会跳过 web-fragment.xml 的扫描,亦即禁用可插性支持,具体请看后文关于 可插性支持的讲解) ;如果不配置该属性,或者将其设置为 false,则表示启用注解支持 (和可插性支持) 。 ...

2012-06-10 · 2 min · 382 words · -

XHR与fetch

XHR与fetch XMLHttpRequest 是一个内建的浏览器对象,它允许使用 JavaScript 发送 HTTP 请求。 虽然它的名字里面有 “XML” 一词,但它可以操作任何数据,而不仅仅是 XML 格式。我们可以用它来上传/下载文件,跟踪进度等。 现如今,我们有一个更为现代的方法叫做 fetch,它的出现使得 XMLHttpRequest 在某种程度上被弃用。 在现代 Web 开发中,出于以下三种原因,我们还在使用 XMLHttpRequest: 历史原因:我们需要支持现有的使用了 XMLHttpRequest 的脚本。 我们需要兼容旧浏览器,并且不想用 polyfill (例如为了使脚本更小)。 我们需要做一些 fetch 目前无法做到的事情,例如跟踪上传进度。 https://zh.javascript.info/xmlhttprequest <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>title0</title> <!–css–> <!--javascript--> <script type="text/javascript"> window.onload = function () { console.log('window.onload') } function func0(){ // 1. Create a new XMLHttpRequest object let xhr = new XMLHttpRequest(); // 2. Configure it: GET-request for the URL /article/.../load xhr.open('GET', 'http://localhost:8000'); // 3. Send the request over the network xhr.send(); // 4. This will be called after the response is received xhr.onload = function () { if (xhr.status !== 200) { // analyze HTTP status of the response console.log(`Error ${xhr.status}: ${xhr.statusText}`); // e.g. 404: Not Found } else { // show the result console.log(`Done, got ${xhr.response.length} bytes`); // response is the server } xhr.onprogress = function (event) { if (event.lengthComputable) { console.log(`Received ${event.loaded} of ${event.total} bytes`); } else { console.log(`Received ${event.loaded} bytes`); // no Content-Length } }; xhr.onerror = function () { console.log("Request failed"); }; } } function func1(){ fetch('http://localhost:8000').then(function(response) { console.log('response') console.log(response.json()); return response.json(); }).then(function(data) { console.log('data') console.log(data); }).catch(function() { console.log("Booo"); }); } </script> </head> <body> body0 <button type="button" onclick="func0()">button0</button> <button type="button" onclick="func1()">button1</button> </body> </html>

2012-06-10 · 1 min · 199 words · -