spring @value

spring @value 在spring 3.0中,可以通过使用@value,对一些如xxx.properties文件 中的文件,进行键值对的注入,例子如下: 1 首先在applicationContext.xml中加入: <beans xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"> </beans> 的命名空间,然后 <util:properties id="settings" location="WEB-INF/classes/META-INF/spring/test.properties" /> 3 创建test.properties abc=123 import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @RequestMapping("/admin/images") @Controller public class ImageAdminController { private String imageDir; @Value("#{settings[’test.abc’]}") public void setImageDir(String val) { this.imageDir = val; } } 这样就将test.abc的值注入了imageDir中了 维护记录 时间 修改内容 原因 2026-10-09 修复本地 Hugo 构建的 Raw HTML 警告:代码/配置放入代码块,正文中的尖括号占位符改为行内代码;categories 改为 Java 正文中的 HTML/XML 片段被当作原始 HTML 丢弃;文件名/URL/标题按规范调整

Created 7076-11-07 · Updated 9096-10-09 · 1 min · 65 words · -

Java Callable, Future 和 FutureTask

Java Callable, Future 和 FutureTask 创建线程有两种方式,一种是直接继承 Thread,另外一种就是实现 Runnable 接口。 这两种方式都有一个缺陷就是: 在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.5 开始,JDK 提供了 Callable 和 Future, 通过它们可以在任务执行完毕之后得到任务执行结果。 今天我们就来讨论一下 Callable、Future 和 FutureTask 三个类的使用方法。以下是本文的目录大纲: Callable 与 Runnable Future FutureTask 使用示例 Callable 与 Runnable java.lang.Runnable 是一个接口,里面只声明了一个 run() 方法 public interface Runnable { public abstract void run(); } 由于run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果。 Callable 位于 java.util.concurrent 包下,它也是一个接口,在它里面也只声明了一个方法,只不过这个方法叫做 call(): public interface Callable<V> { V call() throws Exception; } 可以看到,这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。 那么怎么使用 Callable 呢? 一般情况下是配合 ExecutorService 来使用的,在 ExecutorService 接口中声明了若干个 submit 方法的重载版本: ...

Created 26266-11-26 · Updated 9096-10-09 · 2 min · 412 words · -

canvas

canvas <canvas></canvas> 是html5出现的新标签,像所有的dom对象一样它有自己本身的属性、方法和事件,其中就有绘图的方法,js能够调用它来进行绘图 维护记录 时间 修改内容 原因 2026-10-09 修复本地 Hugo 构建的 Raw HTML 警告:代码/配置放入代码块,正文中的尖括号占位符改为行内代码;categories 改为 Web 正文中的 HTML/XML 片段被当作原始 HTML 丢弃;文件名/URL/标题按规范调整

Created 29296-11-29 · Updated 9096-10-09 · 1 min · 21 words · -

websocket

websocket https://docs.oracle.com/javaee/7/tutorial/doc/websocket.htm http://blog.csdn.net/chifengxin/article/details/14521093 https://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/ 如何理解 TCP/IP, SPDY, WebSocket 三者之间的关系? http://www.zhihu.com/question/20097129 维护记录 时间 修改内容 原因 2026-10-09 修复本地 Hugo 构建的 Raw HTML 警告:代码/配置放入代码块,正文中的尖括号占位符改为行内代码;categories 改为 Network 正文中的 HTML/XML 片段被当作原始 HTML 丢弃;文件名/URL/标题按规范调整

Created 29296-11-29 · Updated 9096-10-09 · 1 min · 28 words · -

Gradle Properties

Gradle的Properties http://hugozhu.myalert.info/2014/07/23/47-use-gradle-properties-to-set-alternative-android-build-tools.html 目录 问题背景 解决方案 修改build.gradle使用变量设置版本号 在setting.gradle中设置缺省的版本 在gradle.properties文件中重载版本号 命令行使用 参考链接 问题背景 团队一起在开发一个Android项目,工程师有的使用Eclipse,有个使用Intellij IDEA,有的使用Android Studio。每个人安装的Android SDK build-tools可能都不一样,有的是19.0.3,有的是19.1.0,不同版本的build-tools对Gradle Plugin也有相应的要求,如19.0.3对应的是com.android.tools.build:gradle:0.10.+,19.1.0对应的是com.android.tools.build:gradle:0.12.+,下面是一个典型的build.gradle配置文件。 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.10.+' } } apply plugin: 'android-library' android { compileSdkVersion 19 buildToolsVersion 19.0.3 defaultConfig { minSdkVersion 8 targetSdkVersion 19 } } 在合作开发中遇到的一个尴尬的问题是,IDEA最新版还不能很好的支持Gradle Plugin 0.12+,而Android Studio最新版则要求使用0.12+。大家又共用一个Git仓库。可能的解决方案是, 从 Git checkout 出来的项目需要有一个基础的版本号,但是开发者可以在本地通过一处文件 (不check in到git) 来重载版本号。 解决方案 Gradle支持三种Properties, 这三种Properties的作用域和初始化阶段都不一样,下面分别列出了其部分特点。: System Properties: 可通过gradle.properties文件,环境变量或命令行-D参数设置 2. 可在setting.gradle或build.gradle中动态修改,在setting.gradle中的修改对buildscript block可见; 所有工程可见,不建议在build.gradle中修改 多子工程项目中,子工程的gradle.properties会被忽略掉,只有root工程的gradle.properties有效; Project Properties: 可通过gradle.properties文件,环境变量或命令行-P参数设置,优先级是: 可在build.gradle中动态修改,但引用不存在的project properties会立即抛错 动态修改过的project properties在buildscript block中不可见 Project ext properties: 可在项目的build.gradle中声明和使用,本工程和子工程可见 不能在setting.gradle中访问 如果有多处设置,加载次序如下 (注意: gradle 2.0是这样的, 1.10~1.12有bug) , 后面的覆盖前面的设置 ...

Created 3036-12-03 · Updated 9096-10-09 · 2 min · 217 words · -

nginx proxy_pass

nginx proxy_pass 功能 Nginx 的ngx_stream_proxy_module和ngx_http_proxy_module两个模块中,都有 proxy_pass 指令。其主要功能是为后端做代理,协议转发,请求转发等。 二、 用法和区别 官网介绍 ngx_stream_proxy_module 的 proxy_pass 语法:proxy_pass address; 默认值:— 场景:server 段 说明:设置代理服务器的地址。代理地址可以是域名或者IP加端口,也可以是一个UNIX的socket路径 ngx_http_proxy_module 的 proxy_pass 语法:proxy_pass URL; 默认值:— 场景:location 段,location中的if段,limit_except段 说明:设置后端代理服务器的地址和协议,还可以附加可选的URI映射。协议可以是 http 或者 https。地址可以是域名或者IP,可以附加指定端口,也可以是UNIX的socket路径,路径要放在unix: 和 : 之间 区别 从上面的各自说明可以看出两个 proxy_pass 指令都是做后端的代理配置。 除了应用场景的段不同之外,ngx_stream_proxy_module 的 proxy_pass 只能转发域名或IP加端口的请求,即端口转发。 ngx_http_proxy_module 的 proxy_pass 除了包含前者的功能外,还可以实现协议转发,如 http 和 https 与 UNIX socket 三者的相互转发,另外还有很实用的URI转发 用法示例 3.1 ngx_stream_proxy_module 的 proxy_pass server { listen 8000; proxy_pass 127.0.0.1:8080; # IP+端口转发 } server { listen 8000; proxy_pass test.com:8080; # 域名+端口转发 } server { listen [::1]:8000; proxy_pass unix:/tmp/stream.socket; # UNIX socket转发 } 3.2 ngx_http_proxy_module 的 proxy_pass ...

Created 18186-12-18 · Updated 9096-10-09 · 2 min · 419 words · -

将 HTML5 封装成 Android 应用 APK 文件的几种方法

将HTML5封装成android应用APK文件的几种方法 http://mobile.51cto.com/android-386448.htm 越来越多的开发者热衷于使用html5+JavaScript开发移动Web App。不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数。一方面,用户在使用习惯上,不喜欢在浏览器上输入复杂的网址;另一方面,Html5 Web App 存放在服务器端,在每次使用时需要进行数据传递,会造成流量浪费。有些开发者不想接触复杂的JAVA代码,那么,有什么办法,既可以使用HTMl5开发应 用,又可以将其简单封装成APK文件呢? 一、Android SDK中的WebView 1.在要Activity中实例化WebView组件: WebView webView = new WebView(this); 2.调用WebView的loadUrl()方法,设置WevView要显示的网页: 互联网用: webView.loadUrl(“http://www.31358.com”); 本地文件用: webView.loadUrl(“file:///android_asset/XX.html”); 本地文件存放在: assets 文件中 3.调用Activity的setContentView( )方法来显示网页视图 4.用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面 5.需要在AndroidManifest.xml文件中添加权限,否则会出现Web page not available错误。 <uses-permission android:name="android.permission.INTERNET" /> 缺点: 如果是载入的是普通网页,没有什么问题,但如果是html5,封装后,在android2.3以上才能正常访问,android2.2及以下,SDK中的WebView还没完全支持HTML5 下面是具体例子: MainActivity.java package com.android.webview.activity; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.webkit.WebView; public class MainActivity extends Activity { private WebView webview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //实例化WebView对象 webview = new WebView(this); //设置WebView属性,能够执行Javascript脚本 webview.getSettings().setJavaScriptEnabled(true); //加载需要显示的网页 webview.loadUrl("http://www.31358.cn/"); //设置Web视图 setContentView(webview); } @Override //设置回退 //覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法 public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { webview.goBack(); //goBack()表示返回WebView的上一页面 return true; } return false; } 在AndroidManifest.xml文件中添加权限 ...

Created 30306-12-30 · Updated 9096-10-09 · 1 min · 184 words · -

Disable Browser Back Button 禁用浏览器的后退按钮

禁用浏览器的后退按钮 浏览器的后退按钮是AJAX开发时候最让人头疼的一块,有的时候遇到这种问题,实在没有结果的情况下我们只能交给用户去学习适应,本文从缓存、JS跳转等方面阐述了如何绕过此问题,还是很值得我们借鉴的,虽然解释语言是ASP,但估计不会造成理解障碍。如果各位有什么其它的方法,不妨拿出来分享一下: ) 浏览器的后退按钮使得我们能够方便地返回以前访问过的页面,它无疑非常有用。但有时候我们不得不关闭这个功能,以防止用户打乱预定的页面访问次序。本文介绍网络上可找到的各种禁用浏览器后退按钮方案,分析它们各自的优缺点和适用场合。 一、概述 曾经有许多人问起,“怎样才能’禁用’浏览器的后退按钮?",或者"怎样才能防止用户点击后退按钮返回以前浏览过的页面?“在ASP论坛上,这个问题也是问得最多的问题之一。遗憾的是,答案非常简单: 我们无法禁用浏览器的后退按钮。 起先我对于居然有人想要禁用浏览器的后退按钮感到不可思议。后来,看到竟然有那么多的人想要禁用这个后退按钮,我也就释然 (想要禁用的只有后退按钮,不包括浏览器的前进按钮) 。因为在默认情况下,用户提交表单之后可以通过后退按钮返回表单页面 (而不是使用"编辑"按钮!) ,然后再次编辑并提交表单向数据库插入新的记录。这是我们不愿看到的。 因此我就决定要找出避免出现这种情况的方法。我访问了许多网站,参考了这些网站所介绍的各种实现方法。如果你经常访问ASP编程网站,本文所介绍的部分内容你可能已经见到过。本文的任务是把各种可能的方法都介绍给大家,然后找出最好的方法! 二、禁止缓存 在我找到的许多方案中,其中有一种建议禁止页面缓存。具体是使用服务器端脚本,如下所示: <% Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response.Expires = 0 Response.CacheControl = "no-cache" %> 这种方法非常有效!它强制浏览器重新访问服务器下载页面,而不是从缓存读取页面。使用这种方法时,编程者的主要任务是创建一个会话级的变量,通过这个变量确定用户是否仍旧可以查看那个不适合通过后退按钮访问的页面。由于浏览器不再缓存这个页面,当用户点击后退按钮时浏览器将重新下载该页面,此时程序就可以检查那个会话变量,看看是否应该允许用户打开这个页面。 例如,假设我们有如下表单: <% Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response.Expires = 0 Response.CacheControl = "no-cache" If Len(Session("FirstTimeToPage")) > 0 then ' 用户已经访问过当前页面,现在是再次返回访问。 ' 清除会话变量,将用户重定向到登录页面。 Session("FirstTimeToPage") = "" Response.Redirect "/Bar.asp" Response.End End If ' 如果程序运行到这里,说明用户能够查看当前页面 ' 以下开始创建表单 %> <form method=post action="SomePage.asp"> <input type=submit> </form> 我们借助会话变量FirstTimeToPage检查用户是否是第一次访问当前页面。如果不是第一次 (即Session(“FirstTimeToPage”)包含某个值) ,那么我们就清除会话变量的值,然后把用户重新定向到一个开始页面。这样,当表单提交时 (此时SompePage.asp被打开) ,我们必须赋予FirstTimeToPage一个值。即,在SomePage.asp中我们需要加上下面的代码: ...

Created 6066-01-06 · Updated 9096-10-09 · 1 min · 181 words · -

Nutch hello world

Nutch hello world download and install ant download and install Cygwin download HBase 0.94.14 http://mirrors.cnnic.cn/apache/hbase/stable/hbase-0.98.9-hadoop2-bin.tar.gz config java_home in .bashrc Download a source package http://mirror.bit.edu.cn/apache/nutch/2.2.1/ cd apache-nutch-2.2.1 Run ant Now there is a directory runtime/local which contains a ready to use Nutch installation. Customize your crawl properties Add your agent name in the value field of the http.agent.name property in conf/nutch-site.xml, for example: <property> <name>http.agent.name</name> <value>My Nutch Spider</value> </property> Edit the file conf/regex-urlfilter.txt and replace ...

Created 6066-01-06 · Updated 9096-10-09 · 1 min · 199 words · -

zookeeper

zookeeper [16/11/21 03:20:30:030 CST] main-SendThread(192.168.50.100:2181) WARN zookeeper.ClientCnxn: Session 0x0 for server 192.168.50.100/<unresolved>:2181, unexpected error, closing socket connection and attempting reconnect 检查zookeeper包版本和连接的服务端版本,有可能是版本不一致 https://blog.csdn.net/richie696/article/details/112910751 向 zookeeper 发送 stat 命令 查询 zookeeper版本 echo stat | socat - TCP:192.168.50.100:2181 server # docker docker run \ --name zookeeper \ -p 2181:2181 \ -v /etc/localtime:/etc/localtime:ro \ -v zookeeper-conf:/conf \ -v zookeeper-data:/data \ -v zookeeper-datalog:/datalog \ -d \ zookeeper # podman podman run \ --name zookeeper \ -p 2181:2181 \ -v /etc/localtime:/etc/localtime:ro \ -e ZOO_4LW_COMMANDS_WHITELIST=* \ -d \ zookeeper # conf, data volume podman run \ --name zookeeper \ -p 2181:2181 \ -v /etc/localtime:/etc/localtime:ro \ -v zookeeper-conf:/conf \ -v zookeeper-data:/data \ -v zookeeper-datalog:/datalog \ -e ZOO_4LW_COMMANDS_WHITELIST=* \ -d \ zookeeper:3.7.0 # client docker run -it --rm zookeeper zkCli.sh -server 127.0.0.1 #zkCli.sh #连接zookeeper bin/zkCli.sh -server localhost:2181 #创建节点 create /k0 v0 # 删除一个节点 delete /k0 install download zookeeper cp zoo_sample.cfg zoo.cfg ...

Created 14146-01-14 · Updated 9096-10-09 · 3 min · 443 words · -

SSH 端口转发, ssh port forward

SSH 端口转发, ssh port forward 端口转发, ssh port forward 比如在一台远程主机上运行着 Grafana: 192.168.50.100:32178, 但是 192.168.50.100 只对 192.168.50.50 开放了 22 端口, 我想从 192.168.50.50 访问 192.168.50.100 的 Grafana 就可以用 ssh 的端口转发 # -L: local port forwarding # 在 192.168.50.50 上执行 ssh -L 32179:192.168.50.100:32178 192.168.50.100 -l user0 # 32179 本地端口, 用户可以在 192.168.50.50 上用浏览器直接访问本地的 32179 端口的 grafana, http://127.0.0.1:32179 # 192.168.50.100:32178, 要访问的 ip 和 端口, 在 192.168.50.50 上访问 127.0.0.1:32179 就相当于访问 192.168.50.100:32178 # 192.168.50.100 -l user0, ssh 连接的主机和用户名, 这里用了默认的 ssh 22 端口 ssh -L 2000:192.168.50.11:5432 192.168.50.10 -l root # 2000 本地端口 # 192.168.50.11 目标主机 # 5432 目标端口 # 192.168.50.10 跳板机, 运行 ssh 服务端的主机, 并且 从192.168.50.10 能访问 192.168.50.11:5432 https://wangdoc.com/ssh/port-forwarding.html ...

Created 18186-01-18 · Updated 9096-10-09 · 2 min · 424 words · -

archlinux wireless

archlinux wireless https://wiki.archlinux.org/index.php/Wireless_network_configuration ip link set wlp3s0 up wifi-menu -o netctl start <profile> netctl enable <profile> netctl start wlp0s26f7u5-w1100n ——deleted sudo wpa_supplicant -i wlp0s26f7u5 -c /etc/wpa_supplicant/wpa_supplicant.conf -d sudo dhcpcd wlp0s26f7u5 维护记录 时间 修改内容 原因 2026-10-09 修复本地 Hugo 构建的 Raw HTML 警告:代码/配置放入代码块,正文中的尖括号占位符改为行内代码;categories 改为 Linux 正文中的 HTML/XML 片段被当作原始 HTML 丢弃;文件名/URL/标题按规范调整

Created 26266-04-26 · Updated 9096-10-09 · 1 min · 48 words · -

JPA 视图查询

JPA的视图查询 http://blog.csdn.net/chaijunkun/article/details/8442406 本文出处: http://blog.csdn.net/chaijunkun/article/details/8442406,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。 昨天晚上遇到一个需求,每天早上要生成一份报告给各个部门的Leader。实现方式基本上确定为HTML格式的电子邮件。但是数据方面犯了难。原因在于数据库中存储的数据是跨表的,而且还要做count统计,这样得到的结果就不是原生的MySQL表,我用的又是JPA技术。我们知道,使用JPA第一步就是映射实体,每一张表就至少对应一个实体 (力求严谨,因为联合主键时一张表会对应两个对象) 。可是对于灵活的查询尤其是连接查询,并不存在一个真正的表与其对应,怎么样才能解决呢?来,我们来举个"栗子" 假设我们有两张表,一张学院表,一张学生表。学院表里存着学院ID和学院名称,学生表里存着学生的基本信息,包括学号、学院ID和学生姓名 (其它较复杂的属性我们不看了) ,正如下面的建表语句所示: -- ---------- -- Table structure for `depts` -- ---------- DROP TABLE IF EXISTS `depts`; CREATE TABLE `depts` ( `deptId` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '学院ID', `deptName` varchar(50) NOT NULL COMMENT '学院名称', PRIMARY KEY (`deptId`) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; -- ---------- -- Records of depts -- ---------- INSERT INTO `depts` VALUES ('1', '哲学院'); INSERT INTO `depts` VALUES ('2', '经济学院'); INSERT INTO `depts` VALUES ('3', '法学院'); INSERT INTO `depts` VALUES ('4', '教育学院'); INSERT INTO `depts` VALUES ('5', '文学院'); INSERT INTO `depts` VALUES ('6', '历史学院'); INSERT INTO `depts` VALUES ('7', '理学院'); INSERT INTO `depts` VALUES ('8', '工学院'); INSERT INTO `depts` VALUES ('9', '农学院'); INSERT INTO `depts` VALUES ('10', '医学院'); INSERT INTO `depts` VALUES ('11', '军事学院'); INSERT INTO `depts` VALUES ('12', '管理学院'); INSERT INTO `depts` VALUES ('13', '艺术学院'); 再建立一个学生表,再随便往里面插入点数据: ...

Created 20206-05-20 · Updated 9096-10-09 · 4 min · 791 words · -

Java Object Layout(jol)

Java Object Layout(jol) http://bboniao.com/openjdk/2014-06/java-object-layoutjol.htm http://openjdk.java.net/projects/code-tools/jol/ hg clone http://hg.openjdk.java.net/code-tools/jol/ jol cd jol mvn clean install pom.xml添加依赖 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>1.0-SNAPSHOT</version> </dependency> 代码 public static void main(String[] args) { int size = 10; List<Integer> list = new ArrayList<Integer>(size); for (int i = 0; i < size; i++) { list.add(i); } //虚拟机信息 out.println(VMSupport.vmDetails()); //打印类内部的占用 out.println(ClassLayout.parseClass(ArrayList.class).toPrintable()); //打印实例内部的占用 out.println(ClassLayout.parseClass(ArrayList.class).toPrintable(list)); //打印实例外部的占用 out.println(GraphLayout.parseInstance(list).toPrintable()); //打印实例各个依赖的占用,并汇总 out.println(GraphLayout.parseInstance(list).toFootprint()); } 输出 ...

Created 21216-05-21 · Updated 9096-10-09 · 2 min · 399 words · -

Java LockSupport, park unpark

“Java LockSupport, park unpark” LockSupport.park 调用后,线程状态是 WAITING LockSupport.park() 和 unpark(),与object.wait()和notify()的区别? 面向的主体不一样。LockSuport主要是针对Thread进行阻塞处理,可以指定阻塞队列的目标对象,每次可以指定具体的线程唤醒。Object.wait()是以对象为纬度,阻塞当前的线程和唤醒单个(随机)或者所有线程。 实现机制不同。虽然LockSuport可以指定monitor的object对象,但和object.wait(),两者的阻塞队列并不交叉。object.notifyAll()不能唤醒LockSupport的阻塞Thread. 阻塞和唤醒是对于线程来说的,LockSupport的park/unpark更符合这个语义,以"线程"作为方法的参数, 语义更清晰,使用起来也更方便。而wait/notify的实现使得"线程"的阻塞/唤醒对线程本身来说是被动的,要准确的控制哪个线程、什么时候阻塞/唤醒很困难, 要不随机唤醒一个线程 (notify) 要不唤醒所有的 (notifyAll) 。 LockSupport.park() (以下简称 park() ) 可能是 java.util.concurrent 包最重要的函数了,因为很多 java.util.concurrent 中的功能类都是利用 park() 来实现它们各自的阻塞。在 park() 之前 Java 也有过类似功能的函数——suspend(),相应的唤醒函数是 resume()。不过 suspend() 有个严重的问题是父线程有可能在调用 suspend() 之前子线程已经调用了 resume(),那么这个 resume() 并不会解除在它之后的 suspend(),因此父线程就会陷入永久的等待中。相比于 suspend(),park() 可以在以下几种情况解除线程的等待状态: 在 park() 前曾经调用过该线程的 unpark() 进而获得了一次"继续执行的权利",此时调用 park() 会立即返回,并且消耗掉相应的"继续执行的权利"。 在 park() 进入等待状态之后,有其他线程以该线程为目标调用 unpark()。 在 park() 进入等待状态之后,有其他线程以该线程为目标调用 interrupt()。 在 park() 进入等待状态之后,有可能会没有理由地解除等待状态。 (这也是为什么推荐在循环体中调用 park(),并在返回之后再次检查条件是否满足。) 其中第一条就可以保证 park() 不会遇到和 suspend() 同样的问题。 最简单的使用 park() 是这样的 ...

Created 25256-05-25 · Updated 9096-10-09 · 5 min · 1046 words · -

HTML id, name, class

HTML id、name、class http://blog.csdn.net/ithomer/article/details/8080912 HTML中id、name、class 区别 分类: Script2012-10-17 13:53 27969人阅读 评论(7) 收藏 举报 classhtmlcssinput服务器applet HTML 中 id与name 区别 一个name可以同时对应多个控件,比如checkbox和radio 而id必须是全文档中唯一的 id的用途 id是HTML元素的Identity,主要是在客户端脚本里用。 label与form控件的关联,如 <label for="MyInput">My Input</label> <input id="MyInput" type="text"> for属性指定与label关联的元素的id,不可用name替代 脚本中获得对象: IE支持在脚本中直接以id (而不是name) 引用该id标识的对象。 例如上面的input,要在脚本中获得输入的内容,可以直接以 MyInput.value来获得。如果用DOM的话,则用document.getElementById(“MyInput”).value; 如果要用name的话,通常先得到包含控件的form,例如document.forms[0],然后从form再引用name,注意这样得到的是经过计算后将发送给服务器的值 name的用途 主要是用于获取提交表单的某表单域信息, 作为可与服务器交互数据的HTML元素的服务器端的标示,比如input、select、textarea、框架元素(iframe、frame、 window的名字,用于在其他frame或window指定target )和button等,这些元素都与表单(框架元素作用于form的target)提交有关,浏览器会根据name来设定发送到服务器的request, 在表单的接收页面只接收有name的元素, 所以赋ID的元素通过表单是接收不到值的。 我们可以在服务器端根据其Name通过Request.Params取得元素提交的值。在form里面,如果不指定name,就不会发送到服务器端。 HTML元素Input type=‘radio’分组,我们知道radio button控件在同一个分组类,check操作是mutex的,同一时间只能选中一个radio,这个分组就是根据相同的name属性来实现的。 建立页面中的锚点,我们知道link是获得一个页面超级链接,如果不用href属性,而改用name,如: ,我们就获得了一个页面锚点,如Experience (XP),详见 示例 作为对象的Identity,如Applet、Object、Embed等元素。比如在Applet对象实例中,我们将使用其name来引用该对象。 在IMG元素和MAP元素之间关联的时候,如果要定义IMG的热点区域,需要使用其属性usemap,使usemap="#name"(被关联的MAP元素的Name)。 某些特定元素的属性,如attribute,meta和param。例如为Object定义参数<PARAM NAME = "appletParameter" VALUE = "value">或Meta中<META NAME = "Author" CONTENT = "Dave Raggett">。 当然HTML元素的name属性在页面中也可以起那么一点ID的作用,因为在DHTML对象树中,我们可以使用document.getElementsByName来获取一个包含页面中所有指定Name元素的对象数组。Name属性还有一个问题,当我们动态创建可包含Name属性的元素时,不能简单的使用赋值element.name = “…“来添加其Name,而必须在创建Element时,使用document.createElement(’<element name = "myName"></element>’)为元素添加Name属性。这是什么意思啊?看下面的例子就明白了。 ...

Created 2026-06-02 · Updated 9096-10-09 · 2 min · 243 words · -

html input

html input <input type="value0"> hidden 定义隐藏的输入字段。 Hidden 对象代表一个 HTML 表单中的某个隐藏输入域。 这种类型的输入元素实际上是隐藏的。这个不可见的表单元素的 value 属性保存了一个要提交给 Web 服务器的任意字符串。如果想要提交并非用户直接输入的数据的话,就是用这种类型的元素。 在 HTML 表单中 <input type="hidden"> 标签每出现一次,一个 Hidden 对象就会被创建。 您可通过遍历表单的 elements[] 数组来访问某个隐藏输入域,或者通过使用document.getElementById()。 http://www.w3school.com.cn/jsref/dom_obj_hidden.asp http://www.wiloon.com/?p=6529 维护记录 时间 修改内容 原因 2026-10-09 修复本地 Hugo 构建的 Raw HTML 警告:代码/配置放入代码块,正文中的尖括号占位符改为行内代码;categories 改为 Web 正文中的 HTML/XML 片段被当作原始 HTML 丢弃;文件名/URL/标题按规范调整

Created 10106-06-10 · Updated 9096-10-09 · 1 min · 46 words · -

Windows netsh 端口转发

windows netsh 端口转发 http://aofengblog.blog.163.com/blog/static/631702120148573851740/ 在windows上用netsh动态配置端口转发 下载LOFTER客户端 使用多个虚拟机,将开发环境和工作沟通环境分开 (即时通,办公系统都只能在windows下使用…) ,将开发环境的服务提供给外部访问时,需要在主机上通过代理配置数据转发。 VirtualBox提供了端口转发的功能,可以将主机中的端口转发至指定IP的虚拟机中的端口,支持TCP协议和UDP协议。但有一个缺点: 需要重启虚拟主机才生效。 其实在Windows中,如果想做端口转发,可以使用Windows自身携带的服务:netsh,使用netsh interface portproxy指令,新增和修改配置信息后,即时生效,并且重启系统后配置信息仍然存在,非常方便。适用于WindowsXP、Windows7,其他的版本还没有试过,支持IPv4和IPv6,但是只支持TCP协议。 新增端口转发 命令 netsh interface portproxy add v4tov4 - 添加通过 IPv4 的 IPv4 和代理连接到的侦听项目。 netsh interface portproxy add v4tov6 - 添加通过 IPv6 的 IPv4 和代理连接到的侦听项目。 netsh interface portproxy add v6tov4 - 添加通过 IPv4 的 IPv6 和代理连接到的侦听项目。 netsh interface portproxy add v6tov6 - 添加通过 IPv6 的 IPv6 和代理连接到的侦听项目。 命令语法 以netsh interface portproxy add v4tov4为例,其语法格式如下: netsh interface portproxy add v4tov4 [listenport=]<integer>|<servicename> [connectaddress=]<IPv4 address>|<hostname> [[connectport=]<integer>|<servicename>] [[listenaddress=]<IPv4 address>|<hostname>] [[protocol=]tcp] 参数: ...

Created 13136-06-13 · Updated 9096-10-09 · 3 min · 431 words · -

Iterator, Enumeration

Iterator, Enumeration http://www.cnblogs.com/skywang12345/p/3311275.html Iterator和Enumeration区别 在Java集合中,我们通常都通过 “Iterator(迭代器)” 或 “Enumeration(枚举类)” 去遍历集合。今天,我们就一起学习一下它们之间到底有什么区别。 我们先看看 Enumeration.java 和 Iterator.java的源码,再说它们的区别。 Enumeration是一个接口,它的源码如下: package java.util; public interface Enumeration<E> { boolean hasMoreElements(); E nextElement(); } Iterator也是一个接口,它的源码如下: package java.util; public interface Iterator<E> { boolean hasNext(); E next(); void remove(); } 看完代码了,我们再来说说它们之间的区别。 (01) 函数接口不同 Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。 Iterator只有3个函数接口。Iterator除了能读取集合的数据之外,也能数据进行删除操作。 (02) Iterator支持fail-fast机制,而Enumeration不支持。 Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK 1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、Hashtable实现Enumeration时,添加了同步。 而Iterator 是JDK 1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的: 当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。 第2部分 Iterator和Enumeration实例 下面,我们编写一个Hashtable,然后分别通过 Iterator 和 Enumeration 去遍历它,比较它们的效率。代码如下: 按 Ctrl+C 复制代码 按 Ctrl+C 复制代码 ...

Created 27276-06-27 · Updated 9096-10-09 · 1 min · 95 words · -

MemCache

MemCache http://blog.csdn.net/hjm4702192/article/details/7894080 Memcach什么是Memcache Memcache集群环境下缓存解决方案 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。 Memcache是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。 Memcached是以守护程序方式运行于一个或多个服务器中,随时会接收客户端的连接和操作 为什么会有Memcache和memcached两种名称 其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,知道我的意思了吧。一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。 Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。Memcached由Danga Interactive开发,用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。 上网baidu了很多东西,几乎都差不多,而且基于java的说的很少,所有只有在研究了各个其他语言类的应用后再来尝试在java上进行简单的操作应用。先从memcached上进行说明,memcached的最新版是采用c语言进行开发和设计的,据说旧版的是采用perl语言开发的,而且它是一个应用软件来的,是作为缓存服务器的服务器端运行在服务器上的,需要使用特定的语言编写客户端与其进行通信来进行数据的缓存和获取。通常我们是把memcached安装运行在web服务器上,然后通过对需要的数据进行缓存,据我目前所知,所有数据的缓存设置和存取操作,以及数据的更新后替换操作全部需要程序来进行,而不是自动进行的 (自动不知道能不能成功,呵呵) 。下面从一个实际的例子来应用memcached。 如何要下载的话,到http://danga.com/memcached/下载memcached。 Ubuntu下安装Memcached 编译前,请先确认gcc、make、patch等编译工具是否已安装,并可正常使用。 安装Libevent Libevent是一个异步事件处理软件函式库,以BSD许可证释出。Memcached依赖Libevent,因此必须先编译安装Libevent。 检测libevent 安装是否成功,输入: # ls -al /usr/lib | grep libevent 会出现如下结果 (不同的机器可能有不同的输出) : yangfei@yangfei-laptop:~$ ls -al /usr/lib |grep libevent lrwxrwxrwx 1 root root 21 2009-07-19 08:45 libevent-1.4.so.2 -> libevent-1.4.so.2.1.3 -rwxr-xr-x 1 root root 301588 2009-07-19 08:45 libevent-1.4.so.2.1.3 -rw-r-r- 1 root root 386638 2009-07-19 08:45 libevent.a lrwxrwxrwx 1 root root 26 2009-07-19 08:45 libevent_core-1.4.so.2 -> libevent_core-1.4.so.2.1.3 ...

Created 28286-06-28 · Updated 9096-10-09 · 11 min · 2211 words · -