EOF

EOF EOF(End of File),是ASCII码中的替换字符(Control-Z,代码26) EOF不是特殊字符,而是定义在 <stdio.h> 中的一个常量,一般等于-1。#define EOF (-1) 以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。 ———————————————— 版权声明:本文为CSDN博主「咕咕怪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_38911591/article/details/89605221 EOF (as defined in the C language) is not a character/not an ASCII value. That’s why getc returns an int and not an unsigned char - because the character read could have any value in the range of unsigned char, and the return value of getc also needs to be able to represent the non-character value EOF (which is necessarily negative). ...

2014-07-31 · 1 min · 81 words · -

经度, 纬度, lng, lat

经度, 纬度, lng, lat 经度 longitude lng 116.677 纬度 latitude lat 39.86864

2014-07-31 · 1 min · 12 words · -

缓冲IO, 缓冲I/O, buffered I/O

缓冲IO, 缓冲I/O, buffered I/O 在系统调用的函数中有 STDIN_FILENO 和 STDOUT_FILENO, STDERR_FILENO, 分别对应标准输入(一般使键盘),标准输出 (一般使显示器),标准错误,(他们都是非负整数,属于文件描述符)。一般在老程序中也将他们分别用 0,1,2 代替,但建议还是使用他们的别名。 在标准IO函数中还有stdin,stdout,stderr等是 FILE * 类型,是属于文件指针,属于标准I/O,高级的输入输出函数。在<stdio.h>中。 而STDIN_FILENO等是文件描述符,是非负整数,一般定义为0, 1, 2,属于没有buffer的I/O,直接调用系统调用, 在<unistd.h>zh 。 stdin是文件指针,是FILE *类型 STDIN_FILENO是文件描述符,是int类型的 stdout和STDOUT_FILENO同样。 所以使用fread(,,stdin),而read(STDOUT_FILENO),因为函数的参数类型是不一样的 二. 下面使网上的一篇文章,讲解缓冲IO和不带缓冲IO 首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序,及别的功能,这些函数集合起来就叫做程序接口或应用编程接口(Application Programming Interface,API),我们要在这个系统上编写各种应用程序,就是通过这个API接口来调用系统内核里面的函数。如果没有系统调用,那么应用程序就失去内核的支持。 现在,再聊不带缓存的I/O操作: linix对IO文件的操作分为不带缓存的IO操作和标准IO操作 (即带缓存),刚开始,要明确以下几点: 1:不带缓存,不是直接对磁盘文件进行读取操作,像read()和write()函数,它们都属于系统调用,只不过在用户层没有缓存,所以叫做无缓存IO,但对于内核来说,还是进行了缓存,只是用户层看不到罢了。如果这一点看不懂,请看第二点; 2:带不带缓存是相对来说的,如果你要写入数据到文件上时 (就是写入磁盘上),内核先将数据写入到内核中所设的缓冲储存器,假如这个缓冲储存器的长度是100个字节,你调用系统函数: ssize_t write (int fd,const void * buf,size_t count); 写操作时,设每次写入长度count=10个字节,那么你几要调用10次这个函数才能把这个缓冲区写满,此时数据还是在缓冲区,并没有写入到磁盘,缓冲区满时才进行实际上的IO操作,把数据写入到磁盘上,所以上面说的“不带缓存不是就没有缓存直写进磁盘”就是这个意思。 那么,既然不带缓存的操作实际在内核是有缓存器的,那带缓存的IO操作又是怎么回事呢? 带缓存IO也叫标准IO,符合ANSI C 的标准IO处理,不依赖系统内核,所以移植性强,我们使用标准IO操作很多时候是为了减少对read()和write()的系统调用次数,带缓存IO其实就是在用户层再建立一个缓存区,这个缓存区的分配和优化长度等细节都是标准IO库代你处理好了,不用去操心,还是用上面那个例子说明这个操作过程: 上面说要写数据到文件上,内核缓存 (注意这个不是用户层缓存区)区长度是100字节,我们调用不带缓存的IO函数write()就要调用10次,这样系统效率低,现在我们在用户层建立另一个缓存区 (用户层缓存区或者叫流缓存),假设流缓存的长度是50字节,我们用标准C库函数的fwrite()将数据写入到这个流缓存区里面,流缓存区满50字节后在进入内核缓存区,此时再调用系统函数write()将数据写入到文件 (实质是磁盘)上,看到这里,你用该明白一点,标准IO操作fwrite()最后还是要掉用无缓存IO操作write,这里进行了两次调用fwrite()写100字节也就是进行两次系统调用write()。 如果看到这里还没有一点眉目的话,那就比较麻烦了,希望下面两条总结能够帮上忙: 无缓存IO操作数据流向路径:数据——内核缓存区——磁盘 标准IO操作数据流向路径:数据——流缓存区——内核缓存区——磁盘 三. 下面是一个网友的见解,以供参考: 不带缓存的I/O对是文件描述符操作,下面带缓存的I/O是针对流的。 标准I/O库就是带缓存的I/O,它由ANSI C标准说明。当然,标准I/O最终都会调用上面的I/O例程。标准I/O库代替用户处理很多细节,比如缓存分配、以优化长度执行I/O等。 标准I/O提供缓存的目的就是减少调用read和write的次数,它对每个I/O流自动进行缓存管理 (标准I/O函数通常调用malloc来分配缓存)。它提供了三种类型的缓存: 1) 全缓存。当填满标准I/O缓存后才执行I/O操作。磁盘上的文件通常是全缓存的。 2) 行缓存。当输入输出遇到新行符或缓存满时,才由标准I/O库执行实际I/O操作。stdin、stdout通常是行缓存的。 3) 无缓存。相当于read、write了。stderr通常是无缓存的,因为它必须尽快输出。 ...

2014-07-28 · 1 min · 133 words · -

CSS DIV居中

CSS DIV居中 CSS 如何使DIV层水平居中 今天用CSS碰到个很棘手的问题,DIV本身没有定义自己居中的属性, 网上很多的方法都是介绍用上级的text-align: center然后嵌套一层DIV来解决问题. 可是事实上这样的方法科学吗? 经过网络搜索和亲自实验得出以下结论: 正确的也是对页面构造没有影响的设置如下: 对需要水平居中的DIV层添加以下属性: margin-left: auto; margin-right: auto; 经过这么一番设置问题似乎解决了,在FF中已经居中了,可是在IE中看竟然还是没有居中! 郁闷了一下午,就是找不出问题所在,还特地比较了网上的文章竟然一模一样. 问题到底出在哪里呢? 感谢网友乐天无用帮忙找出了这个邪门问题的原因. 原来是L-Blog默认没有在HTML前加上DTD,于是IE就以HTML而不是XHTML来解释文档. 问题并不在CSS而在XHTML网页本身. 需要加上这样的代码才能使得上述设置有效果: 如果您希望更为严格的XHTML 1.0 Strict或者XHTML 1.1请查阅相关文档. 以上测试均基于Windows XP SP2版IE6和FireFox 1.0最终版. 如何使DIV居中 主要的样式定义如下: body {TEXT-ALIGN: center;} #center { MARGIN-RIGHT: auto; MARGIN-LEFT: auto; } 说明: 首先在父级元素定义TEXT-ALIGN: center;这个的意思就是在父级元素内的内容居中;对于IE这样设定就已经可以了。但在mozilla中不能居中。解决办法就是在子元素定义时候设定时再加上"MARGIN-RIGHT: auto;MARGIN-LEFT: auto; " 需要说明的是,如果你想用这个方法使整个页面要居中,建议不要套在一个DIV里,你可以依次拆出多个div,只 要在每个拆出的div里定义MARGIN-RIGHT: auto;MARGIN-LEFT: auto; 就可以了。 如何使图片在DIV 中垂直居中,用背景的方法。举例: body{BACKGROUND: url(http://www.w3cn.org/style/001/logo_w3cn_194x79.gif) #FFF no-repeat center;} 关键就是最后的center,这个参数定义图片的位置。还可以写成"top left"(左上角)或者"bottom right"等,也可以直接写数值"50 30" 如何使文本在DIV中垂直居中 如果是文字,便不能用背景方法,可以用增高行距的办法变通实现垂直居中,完整代码如下: ...

2014-06-25 · 1 min · 73 words · -

子查询

子查询 子查询是多表查询的一种形式。子查询就是次要查询,它返回的结果数据被用 于主查询的条件中。它返回的结果可以是一行或多行。比如: 例1//返回一条记录 select * from emp where deptno=(select deptno from dept where dept_name=‘SALES’) 例2//返回多条记录 select * from emp where deptno in (select deptno from dept where dept_addr=‘北京’) 由上例可以看出,子查询并不要求两个表有相关字段,只要得到子查询的结果集 就行,用于主查询,而连接查询,则必须要求两个表有相关字段。 2.连接查询是对两个表逐记录 (一行一行地) 进行相关查询,例1可写为连接查询 ,例2不可以写为连接查询,因为子查询返回多行记录。 select * from emp a, dept b where a.deptno= b.deptno and b.dept_name=‘SALES’ 上述形式为内连接,还有外连接 oracle中的字段后面有加号是什么意思,多说一点详细一点 a.emp_no = b.emp_no (+) 不论把(+)写在等号左边项还是右边项,统称为外连接 在内连接中,只返回那些在连接表中有匹配数据的数据行 外连接即在被连接的表中加入一个空行来与没有匹配行的数据进行匹配 比如查询员工所属的部门,总裁不属于任何部门, (老板不属于任何部门,dname 项是空的) select e.emp_name ename,d.dept_name dname from emp e, dept d where e.dept_no=d.dept_no(+) ename dname —————————— sam SALES ...

2014-06-19 · 1 min · 81 words · -

Chrome浏览器运行参数的方法来模拟手机

Chrome 浏览器运行参数的方法来模拟手机 http://www.weste.net/2014/3-26/96040.html 以前我们介绍过如何通过修改Chrome浏览器运行参数的方法来模拟手机访问网站,但是在Chrome 32和33版本以后增加了更加便捷的方法,在开发者工具中只需要设置一下就能方便的模拟各种手机型号的访问效果了。 以前我们介绍过如何通过修改Chrome浏览器运行参数的方法来模拟手机访问网站,但是在Chrome 32和33版本以后增加了更加便捷的方法,在开发者工具中只需要设置一下就能方便的模拟各种手机型号的访问效果了。 方法如下: 打开Chrome浏览器,需要32以后版本的。笔者使用的是Chrome 33版本。 打开"开发者工具",快捷键 (F12或者Ctrl+Shift+i) 。 \ 在"开发者工具"界面的右侧有个"Show drawer"按钮,点击后在"drawer"界面再点击"Emulation"。 \ 这个界面就一目了然了,Device里面可以选择各种手机或者平板设备,大概有20种之多。User Agent和Sensors显示了模拟的数据。点击"Emulate"按钮就可以生效了。 \ 然后就在地址栏里面输入网址吧!看看模拟的效果怎么样? 谷歌Chrome浏览器模拟手机浏览器的方法 (修改启动参数的方法) : http://www.weste.net/2013/5-25/91691.html

2014-06-17 · 1 min · 25 words · -

HashSet, TreeSet, LinkedHashSet

HashSet, TreeSet, LinkedHashSet 在一个set中,是没有重复元素的。这也是使用set最主要的原因之一。Set的实现类有三个: HashSet,TreeSet,LinkedHashSet。什么时候使用哪一种实现类?。简单地说,如果我们想要一个快速的set,那么我们应该使用HashSet;如果我们需要一个已经排好序的set,那么TreeSet应该被使用;如果我们想一个可以根据插入顺序来读取的set,那么LinkedHashSet应该被使用。 接口 Set接口继承了Collection接口。在set中,不允许有重复的元素。每一个元素在set中都是唯一的。我们可以简单地添加元素至一个set中,最后,我们会得到一个自动删除重复元素的set。 HashSet vs. TreeSet vs. LinkedHashSet HashSet 是使用一个哈希表实现的。元素是无序的。add、remove 及contains 方法的时间复杂度是一个常量 O(1)。 TreeSet 是使用红黑树 来实现的。元素在set中被排好序,但是add、remove及contains方法的时间复杂度为O(log(n))。它提供了几个方法用来处理有序的set,比如first(),last(),headSet(),tailSet()等等。 LinkedHashSet LinkedHashSet介于HashSet与TreeSet之间。它由一个执行hash表的链表实现,因此,它提供顺序插入。基本方法的时间复杂度为O(1)。 HashMap和HashSet的区别是Java面试中最常被问到的问题。如果没有涉及到Collection框架以及多线程的面试,可以说是不完整。而Collection框架的问题不涉及到HashSet和HashMap,也可以说是不完整。HashMap和HashSet都是collection框架的一部分,它们让我们能够使用对象的集合。collection框架有自己的接口和实现,主要分为Set接口,List接口和Queue接口。它们有各自的特点,Set的集合里不允许对象有重复的值,List允许有重复,它对集合中的对象进行索引,Queue的工作原理是FCFS算法(First Come, First Serve)。 首先让我们来看看什么是HashMap和HashSet,然后再来比较它们之间的分别。 什么是HashSet HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。 public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。 什么是HashMap HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。 public Object put(Object Key,Object value)方法用来将元素添加到map中。 HashSet和HashMap的区别 对于HashSet而言,它的底层是基于HashMap实现的。HashSet底层使用HashMap来保存所有元素。 HashSet的实现其实非常简单,它只是封装了一个HashMap对象来存储所有的集合元素。所有放入HashSet中的集合元素实际上由HashMap的key来保存,而HashMap的value则存储了一个PRESENT,它是一个静态的Object对象。 HashSet的绝大部分方法都是通过调用HashMap的方法来实现的,因此HashSet和HashMap两个集合在实现本质上是相同的。 注意:由于HashSet的add()方法添加集合元素实际上转变为调用HashMap的put()方法来添加key-value对,当新放入HashMap的Entry中key与集合中原有Entry的key相同 (hashCode()返回值相等,通过equals比较也返回true)时,新添加的Entry的value将覆盖原来Entry的value,但key不会有任何改变。因此,如果向HashSet中添加一个已经存在的元素,新添加的集合元素 (底层由HashMap的key保存)不会覆盖已有的集合元素。 ———————————————— 版权声明:本文为CSDN博主「bear_wr」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/bear_wr/article/details/52275874

2014-06-17 · 1 min · 53 words · -

MQ JMS

MQ JMS http://blog.csdn.net/xyw_blog/article/details/9128165 MQ简介: MQ全称为Message Queue, 消息队列 (MQ) 是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据 (消息) 来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBMWEBSPHERE MQ。 MQ特点: MQ的消费-生产者模型的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。 使用场景: 在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。 JMS简介: JMS即Java消息服务 (Java Message Service) 应用程序接口是一个Java平台中关于面向消息中间件 (MOM) 的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。 定义: JMS (Java Messaging Service) 是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。 简介: JMS是一种与厂商无关的 API,用来访问消息收发系统消息。它类似于JDBC(Java DatabaseConnectivity): 这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务 (有时称为消息中介程序或路由器) 从一个 JMS 客户机向另一个JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成: 报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带: 简单文本(TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。 JMS和MQ的关系: JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件 (MOM) 的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。 支持JMS的开源MQ: 目前选择的最多的是ActiveMQ。 ...

2014-06-11 · 1 min · 178 words · -

JSR168

JSR168 JSR168是Java 规范要求 (Java Specification Request ,JSR) 的缩写,它为创建Portlet建立标准的API。很多重量级的Portal开发商和开源项目组参与了Java标准化组织 (Java Community Process) 创建JSR168标准的过程,并且很多Portal产品开始支持JSR 168。JSR168在2003年10月正式发布。最主要的Portal开发商已经宣布计划支持JSR 168标准,查看JSR 168站点 (http://www.jcp.org/en/jsr/detail?id=168 ) 可以得到目前为止JSR 168支持者的完整列表。 按照Java标准化组织 (Java Community Process) 所述,JSR 168 portlet拥有一个适用于所有Portal客户端的简单的、标准的API,支持多种类型的客户端 (多设备、多浏览器) ,支持本地化和国际化,允许门户应用程序的热部署和重新部署,并且包含声明性安全 (与servlet和企业JavaBean规范中使用的机制相同) 。 现在开发商只需要支持一种Portlet集。结果,更多的ISV提供他们自己的通用的、开箱即用 (out-of-the-box) 的Portal集成构件。这是值得客户高兴的时刻,因为开箱即用的应用程序集成现在无需考虑选择那个Portal开发商就可以使用。 JSR 168意味着在Portal市场上,争夺主导地位的优势不再是哪个开发商拥有最多数目ISV的开箱即用集成。相反,标准化通过使ISV支持他们自己的Porlet统一了这一领域。客户的风险和成本降低,并且不再根据重建Portlet的业务量来选择门户开发商。在选择Portal开发商的时候,主要的决定性因素将是Portal产品与客户企业体系结构的适应程度。 对程序员简而言之,开发符合JSR168规范的Portlet将可以顺利移植到符合该规范的不同Portal平台上!

2014-06-11 · 1 min · 36 words · -

isAssignableFrom

isAssignableFrom isAssignableFrom 是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或接口。 通常调用格式是 Class1.isAssignableFrom(Class2) 调用者和参数都是 java.lang.Class 类型。 而 instanceof 是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例。 格式是: oo instanceof TypeName 第一个参数是对象实例名,第二个参数是具体的类名或接口名,例如 String,InputStream。 用下面的代码进行测试,我们就可以发现他们的不同之处

2014-06-09 · 1 min · 18 words · -

SKU

SKU http://baike.baidu.com/view/276922.htm SKU=Stock Keeping Unit (库存量单位) 。即库存进出计量的单位,可以是以件,盒,托盘等为单位。SKU这是对于大型连锁超市DC (配送中心) 物流管理的一个必要的方法。现在已经被我们引申为产品统一编号的简称,每种产品均对应有唯一的SKU号。单品: 对一种商品而言,当其品牌、型号、配置、等级、花色、包装容量、单位、生产日期、保质期、用途、价格、产地等属性与其他商品存在不同时,可称为一个单品。[1] 概述 编辑 SKU=Stock Keeping Unit(库存量单位),即库存进出计量的单位,可以是以件,盒,托盘等为单位。SKU这是对于大型连锁超市DC (配送中心) 物流管理的一个必要的方法。 流程图 流程图 当下已经被我们引申为产品统一编号的简称,每种产品均对应有唯一的SKU号。[1] 针对电商而言,SKU有另外的注解: SKU是指一款商品,每款都有出现一个SKU,便于电商品牌识别商品。 一款商品多色,则是有多个SKU,例: 一件衣服,有红色、白色、蓝色,则SKU编码也不相同,如相同则会出现混淆,发错货。 补: 英文全称为 stock keeping unit, 简称SKU,定义为保存库存控制的最小可用单位,例如纺织品中一个SKU通常表示: 规格、颜色、款式。 STOCK KEEP UNIT.这是客户拿到商品放到仓库后给商品编号,归类的一种方法. 通常是SKU#是多少多少这样子. 还有的译为存货单元\库存单元\库存单位\货物存储单位\存货保存单位\单元化单位\单品\品种,基于业务还有的是最小零售单位\最小销售单位\最小管理单位\库存盘点单位等;专业物流术语解释为"货格"。 换言之,有助于理解: 首先我们应当了解单品的定义,即指包含特定的自然属性与社会属性的商品种类。对一种商品而言,当其品牌、型号、配置、等级、花色、包装容量、单位、生产日期、保质期、用途、价格、产地等属性与其他商品存在不同时,可称为一个单品。在连锁零售门店中有时称单品为一个SKU (中文译为最小存货单位,例如纺织品中一个SKU通常表示规格,颜色,款式) 。当然,单品与传统意义上的"品种"的概念是不同的,用单品这一概念可以区分不同商品的不同属性,从而为商品采购、销售、物流管理、财务管理以及POS系统与MIS系统的开发提供极大的便利。例如: 单听销售的可口可乐是一个单品SKU,而整扎销售的可口可乐又是一个单品,这两个单品在库存管理和销售是不一样的。而在传统意义上的品种听装的可口可乐是一个品种,不管其销售模式是什么样的。 我们不难看出,无论是国外还是国内的定义和解释中,基本上是三个概念: 品项、编码、单位。 这三个概念代表了三个方面: 品项,品项可以结合上面关于单品、SKU和品种的解释理解。也就是只要属性有不同,那么就是不同的品项 (SKU) 。可以说这是SKU看作是一种产品的角度来分析理解的。属性有很多种,大家容易理解是品牌、型号、配置、等级、花色、生产日期、保质期、用途、价格、产地等,因为他们可以很直观的区分开来;但是包装容量、单位、存放地等就不是那么容易了——难道一支放到一箱,一箱放到一个托盘就不是这个产品了?同样的产品放到亚洲和美洲就不一样了?也就是说同样的产品只要在人们对其进行保存、管理、销售、服务上有不同的方式,那么它 (SKU) 就不再是相同的了。 编码,这个概念是基于信息系统和货物编码管理来说的,用"品项"中介绍为,不同的品项 (SKU) 就有不同的编码。这样,我们才可以依照不同的SKU数据来分析库存、销售状况。当你使用物流或者ERP系统的时候,你会发现SKU#: 12356这样的文本框。长时间这样的状况让很多朋友都认为,SKU就是产品的编码了。但是这里的产品如"品项"所说,并非是一个泛泛的产品的概念,而是很精确的产品概念。 单位,基本上就是基于管理来说的吧,这个名字上是数字化管理方式的产物。但是这里的单位和我们平时的"单位"有什么区别呢?看看产品的包装单位的不同,SKU就不同。也就是说,精确到SKU的管理方式才能适应当下的物流竞争,其实信息系统的使用对它产生了很大的影响。没有精确的编码来区分相同产品的不同SKU就很难进行单位化到SKU的管理方式。

2014-06-09 · 1 min · 54 words · -

JPA JPQL

JPA JPQL http://flowercat.iteye.com/blog/667773 max result entityManager.createQuery(SQL_QUERY).setParameter(arg0,arg1).setMaxResults(10).getResultList();``` JPQL就是一种查询语言,具有与 SQL 相 类似的特征, JPQL 是完全面向对象的,具备继承、多态和关联等特性,和hibernate HQL很相似。 查询语句的参数 JPQL 语句支持两种方式的参数定义方式 : 命名参数和位置参数 。 。在同一个查 询语句中只允许使用一种参数定义方式。 命令参数的格式为: " : + 参数 名" 例: Query query = em.createQuery(“select p from Person p where p.personid=:Id “); query.setParameter(“Id”,new Integer(1)); 位置参数的格式为” ?+ 位置编号” 例: Query query = em.createQuery(“select p from Person p where p.personid=?1 “); query.setParameter(1,new Integer(1)); 如果你需要传递 java.util.Date 或 java.util.Calendar 参数进一个参数查询 ,你需要使用一个特殊的 setParameter() 方法 ,相关的 setParameter 方法定义如下: public interface Query ...

2014-06-06 · 8 min · 1508 words · -

Java转型(向上或向下转型)upcast)和向下转型(downcast)

Java转型(向上或向下转型)upcast)和向下转型(downcast) 在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。 5.13.1 向上转型 我们在现实中常常这样说: 这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念"人"。再例如,麻雀是鸟类的一种 (鸟类的子类) ,而鸟类则是动物中的一种 (动物的子类) 。我们现实中也经常这样说: 麻雀是鸟。这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类。这也符合Java提倡的面向抽象编程思想。来看下面的代码: package a.b; public class A { public void a1() { System.out.println(“Superclass”); } } A的子类B: package a.b; public class B extends A { public void a1() { System.out.println(“Childrenclass”); //覆盖父类方法 } public void b1(){} //B类定义了自己的新方法 } C类: package a.b; public class C { public static void main(String[] args) { A a = new B(); //向上转型 a.a1(); } } 如果运行C,输出的是Superclass 还是Childrenclass?不是你原来预期的Superclass,而是Childrenclass。这是因为a实际上指向的是一个子类对象。当然,你不用担心,Java虚拟机会自动准确地识别出究竟该调用哪个具体的方法。不过,由于向上转型,a对象会遗失和父类不同的方法,例如b1()。有人可能会提出疑问: 这不是多此一举吗?我们完全可以这样写: B a = new B(); a.a1(); 确实如此!但这样就丧失了面向抽象的编程特色,降低了可扩展性。其实,不仅仅如此,向上转型还可以减轻编程工作量。来看下面的显示器类Monitor: package a.b; public class Monitor{ ...

2014-05-30 · 3 min · 438 words · -

detached entity passed to persist

detached entity passed to persist 病理特征: Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.xxx.Xxx 简单地说,发生此异常即是一个游离的对象要被持久化(save)时,其ID既要ORM框架为它生成ID值,而此实体的ID却已然有值。对于新手容易出现此异常,但一些有经验的程序员有时也会碰到此问题,笔者就有一次,故与网友们"分享这次遭遇"。 让ORM为即将要持久的实体生成ID值(ORM的主键策略),是典型的做法,例如有自增长(即便是DBMS来做)、UUID,Hibernate框架则更多。因此,不能手工为此实体赋上ID值。笔者设计主要实体时,通常用UUID作主键,很显然它是字符型的。但是,有时会发现form表单为其赋一个长度为0的字符串,看html代码: <input name="id" type="text" id="id" value=""/> 注意 value="" 如果是增加,则不需要在form表单中安置这么个控件,笔者通常将增加和修改实体在一个form表单中完成,笔者很喜欢用Spring MVC。这时id字段被Spring MVC包装到实体中就有值了(其值是长度为0的空字符串)。ORM保存时上面的异常就来了。解决的办法很多,笔者是为其实体做一个属性编辑器,在编辑器判断ID是否为空且长度是否为0,若是,则置入一个null。在保存前检查一下ID也是一种解决办法。 有时在一对一、一对多保存时,关联方也会存在这种情况,所以关键检查ID字段就可以了 http://howsun.blog.sohu.com/129035715.html

2014-05-30 · 1 min · 29 words · -

spring生成EntityManagerFactory的三种方式

spring生成EntityManagerFactory的三种方式 1.LocalEntityManagerFactoryBean 只是简单环境中使用。它使用JPA PersistenceProvider自动检测机制( according to JPA’s Java SE bootstrapping ),并且大多数情况下,你只能定义一下persistence unit name 例如: 2.从JNDI获取EntityManagerFactory 这个选项是当你应用发布在javaee5的服务器中。你可以参阅自己应用服务器文档,如何发布一个自定义的JPA provider到你的应用服务器中。 例: <jee:jndi-lookup id=“myEmf” jndi-name=“persistence/myPersistenceUnit”/> 当javaee服务器启动时,会自动检测persistence units。实际上,是检测应用包中的META-INF/persistence.xml 文件和web.xml中的persistence-unit-ref,以及定义的environment naming。我理解就是JNDI的name。 一般应用情景是: 在META-INF/persistence.xml中 使用java:/ MySQLDS 获取容器发布的Datesource。 ...

2014-05-29 · 1 min · 200 words · -

JPA的persistence.xml文件

JPA的persistence.xml文件 Posted on 2012-05-24 12:27 CN.programmer.Luxh 阅读(7217) 评论(0) 编辑 收藏 persistence.xml文件必须定义在classpath路径下的META-INF文件夹中。 我们看看基于Hibernate提供的一个比较完整的JPA2.0的persistence.xml文件。 persistence.xml: 复制代码 1 2 <persistence version=“2.0” xmlns=“http://java.sun.com/xml/ns/persistence" 3 xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation=“http://java.sun.com/xml/ns/persistence 5 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 7 <!-必须要有name属性,不能为空 -> 8 9 <!-可选 -> 10 org.hibernate.ejb.HibernatePersistence 11 <!-可选 -> 12 java:/DefaultDS 13 <!-可选 -> 14 ormap.xml ...

2014-05-29 · 1 min · 161 words · -

jpa annotation, 注解

jpa annotation, 注解 http://mzhj.iteye.com/blog/711685 @Embedded 你可以创建一个类被嵌套在实体类中,在这种情况下我们可以使用@Embedded注解。例如,在Hotel类中 可能会有一个Address。 Address是Hotel不可分割的一部分,没有ID, 并且不会被存储在分开的collection中。在这种情况下我们可以使用@Embedded注解 @Entity 标识这个pojo是一个jpa实体 Specifies that the class is an entity. This annotation is applied to the entity class. @Table (name= users ) //指定表名为users @Column @Column(name=“DESC”, nullable=false, length=512) 设置字段类型 通过@Column注解设置,包含的设置如下 .name: 字段名 .unique: 是否唯一 .nullable: 是否可以为空 .inserttable: 是否可以插入 .updateable: 是否可以更新 .columnDefinition: 定义建表时创建此列的DDL .secondaryTable: 从表名。如果此列不建在主表上 (默认建在主表) ,该属性定义该列所在从表的名字。 @Column(name = “user_code”, nullable = false, length=32)//设置属性userCode对应的字段为user_code,长度为32,非空 private String userCode; @Column(name = “user_wages”, nullable = true, precision=12, scale=2)//设置属性wages对应的字段为user_wages,12位数字可保留两位小数,可以为空 ...

2014-05-28 · 3 min · 490 words · -

JPA EntityManager的四个主要方法 ——persist,merge,refresh和remove

JPA EntityManager的四个主要方法 ——persist,merge,refresh和remove public void persist(Object entity) persist 方法可以将实例转换为 managed( 托管 ) 状态。在调用 flush() 方法或提交事物后,实例将会被插入到数据库中。 对不同状态下的实例 A , persist 会产生以下操作 : 如果 A 是一个 new 状态的实体,它将会转为 managed 状态; 如果 A 是一个 managed 状态的实体,它的状态不会发生任何改变。但是系统仍会在数据库执行 INSERT 操作; 如果 A 是一个 removed( 删除 ) 状态的实体,它将会转换为受控状态; 如果 A 是一个 detached( 分离 ) 状态的实体,该方法会抛出 IllegalArgumentException 异常,具体异常根据不同的 JPA 实现有关。 public void merge(Object entity) merge 方法的主要作用是将用户对一个 detached 状态实体的修改进行归档,归档后将产生一个新的 managed 状态对象。 对不同状态下的实例 A , merge 会产生以下操作 : 如果 A 是一个 detached 状态的实体,该方法会将 A 的修改提交到数据库,并返回一个新的 managed 状态的实例 A2 ; ...

2014-05-28 · 1 min · 184 words · -

JPA 实体生命周期

JPA 实体生命周期 JPA 实体生命周期分为4种状态,其实跟HIBERNATE的映射实体差不多。分为: 新建,受管 (托管) ,分离 (游离) ,删除。 新建: 此时的内存中已经创建了实体实例 ( 比如 NEW People() ) ,但是还没有同数据库或持久化上下文进行关联,所以目前它还不是一个标准的持久实体身份。所以对它的任何改变,都不会同步到数据库中。 受管: 此时实体已经在数据库中存在了持久化身份,并且同持久化上下文进行了关联,一般来说,在调用JPA的persist API后,实体实例已处于受管状态了。在修改实体之后,当事务提交,或显示调用flush()操作,实体状态会同步到数据库中。 分离: 还具有持久化身份,但是不在同持久化上下文关联。 删除: 同持久化上下文关联,但是客户已经打算从数据库销毁这一实体。 JPA的EntityManager也为我们准备好了API来完成对这些实体的操作: persist方法将实体变为受管状态,持久化到数据库。merge方法将当前的实体状态合并 (更新) 到当前持久化上下文中。remove方法直接从数据库里销毁实体 (删除) ,remove方法只是将数据库里的实体删除,并没有销毁内存里的实体对象,当事务提交或者调用flush方法,数据库里的实体才会被删除。 http://blog.163.com/oyhj_nicholas/blog/static/323592520107211295105

2014-05-28 · 1 min · 31 words · -

Maven构建之依赖传递

Maven构建之依赖传递 http://a123159521.iteye.com/blog/774322 博客分类: Maven mavenjunit项目管理配置管理Apache 如果断Maven的依赖构建必须每一个项目都指定,那配置是累死人了,比如A依赖了20个项目,B依赖A,那么还要添加20个项目,那就悲剧了,maven有依赖传递的功能。 Transitive Dependency (传递依赖) 你的项目依赖于A,A又依赖于B。你的项目是否要声明你依赖于B? Maven的回答是它帮你自动管理这种依赖的传递,你不需要声明你依赖于B,由Maven来做。 [版本还是要自己指定的.] Dependency Scope (依赖范围) 因此,Maven考虑了6中可能的scope供选择: compile: 默认的scope。编译、测试、打包全都需要。compile参与依赖传递,就是说,你的项目A依赖于B(依赖scope是compile),项目C依赖于你的项目A,那么C也就依赖于B。 provided: 表示JDK或者容器会在Runtime时提供这些(jar),如上面说到的servlet api。provided的东西在编译和测试时会用到,不参与传递依赖。 runtime: 表示编译时不需要,但测试和运行时需要,最终打包时会包含进去。 test: 只用于测试阶段 (测试的编译和测试的运行) ,典型的就是junit的jar。 system: 和provided类似,但要求jar是你的系统里已有的,不会在repository里找,如rt.jar,tools.jar这些。 import: 简单的说,你的项目的pom可以继承另一个项目的pom,从而继承了父项目的依赖关系,但是因为之后single inheritance的限制,所以创造了import,使得你可以"导入"或者说"继承"任何一到多个项目的依赖关系。 依赖管理(dependencyManagement) 实际的项目中,你会有一大把的Maven模块,而且你往往发现这些模块有很多依赖是完全项目的,A模块有个对spring的依赖,B模块也有,它们的依赖配置一模一样,同样的groupId, artifactId, version,或者还有exclusions, classifer。细心的分会发现这是一种重复,重复就意味着潜在的问题,Maven提供的dependencyManagement就是用来消除这种重复的。 为了实现项目间的依赖,一般情况下,web项目依赖于app项目,而app项目很可能依赖于其他的app项目,比如我建了一个util项目,app依赖于util,那么webapp也需要依赖于util,但是我不配置webapp依赖util,验证一下,会不会自动加载依赖包. util项目的构建请参照前讲,接下来看maven配置: util配置; Java代码 收藏代码 <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns=“http://maven.apache.org/POM/4.0.0" xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 demo ...

2014-05-28 · 1 min · 165 words · -