【原文】http://flowercat.iteye.com/blog/380859
位运算符用来对二进制位进行操作 ,Java中提 供 了 如 下所 示 的 位 运 算符 :
位 运 算 符 (>>,<<,>>>,&,|,^,~ ) ,位运 算 符 中 ,除 ~ 以 外 ,其余 均 为 二 元 运 算 符 。 操 作 数 只 能 为 整 型 和字 符 型 数 据 。
基础知识
补码
所有的整数类型(除了char 类型之外)都是有符号的整数。这意味着他们既能表示正数,又能表示负数。 Java使用 补 码 来 表 示 二
进 制 数 ,在补 码 表 示 中 ,最高 位 为 符号 位 ,正数 的 符 号 位 为 0,负数 为 1。补 码 的 规 定 如 下 :
对 正 数 来 说 ,最高 位 为 0,其余 各 位 代 表 数 值 本 身 (以二 进制 表 示 ),如 +42的补码 为 00101010。
对 负 数 而 言 ,把该 数 绝 对 值 的 补 码 按 位 取 反 ,然后 对 整 个数 加 1,即得 该 数的 补 码 。 如 -42的补 码 为 11010110 (00101010 按 位 取 反 11010101 +1=11010110 )
用 补 码 来 表 示 数 ,0的补 码 是 唯 一 的 ,都为 00000000。 (而在 原码 ,反码 表 示中 ,+0和 -0的表
示 是 不 唯 一 的 ,可参 见 相 应 的 书 籍 )。而 且 可 以用 111111表示 -1的补 码 (这也 是 补 码 与 原 码 和
反 码 的 区 别 )。
类型长度
整 型
整型常 量 在 机 器 中 占 32位 ,具有 int型的 值 ,对于 long型值 ,则要在 数 字 后 加 L或 l,如
123L表示 一 个 长 整 数 ,它在 机 器 中 占 64位。整 型 变 量 的 类 型 有 byte、 short、 int、
long四种 。 下面 列 出各 类 型 所 在 内 存 的 位 数 和 其表 示 范 围 。
数据类型 描述 所占位数
Integers
byte Byte-length integer 8-bit two's complement
short Short integer 16-bit two's complement
int Integer 32-bit two's complement
long
Long integer 64-bit two's complement
Real numbers
float Single-precision floating point 32-bit IEEE 754
double Double-precision floating point 64-bit IEEE 754
Other types
char A single character 16-bit Unicode character
boolean A boolean value (true or false) true or false
int类型 是 最 常 使 用 的 一 种 整 数 类 型 。 它 所 表 示的 数 据 范 围 足 够 大 ,而且 适 合 于
32位、64位处 理 器 。 但 对 于 大 型 计 算 ,常会 遇 到 很 大 的 整 数 ,超出 int类型 所 表 示 的 范 围 ,这时
要 使 用long类型 。
由 于 不 同 的 机 器 对 于 多字 节 数 据 的 存 储 方 式 不 同 ,可能 是 从 低 字 节 向 高 字 节 存 储 ,也
可能 是 从 高 字 节 向 低 字 节 存 储 ,这样 ,在分 析 网 络 协 议 或 文 件 格 式 时 ,为了 解 决 不 同 机 器 上
的字 节 存 储 顺 序 问 题 ,用 byte类型 来 表 示 数 据 是 合 适 的 。 而 通 常 情 况 下 ,由于 其 表 示 的 数 据
范围 很 小 ,容易 造 成 溢 出 ,应避 免 使 用 。
short类 型 则 很 少 使 用 ,它限 制 数 据 的 存 储 为 先 高 字 节 ,后低 字 节 ,这样 在 某 些 机 器 中 会出错 。
整型 变 量 的 定 义 ,如 :
byte b; //指定变量b为byte型
short s; //指定变量s为short型
int i; //指定变量i为int型
long l; //指定变量l为long型
浮 点 型 (实型 )数据
实型 变 量 的 类 型 有 float和 double两种 ,下表 列 出 这 两 种 类 型 所 占 内 存 的 位 数 和 其 表示 范
围。
数据类型 所占位数 数的范围
float 32 3.4e-038~3.4e+038
double 64 1.7e-308~1.7e+308
双精 度 类 型 double比单 精 度 类 型 float具有 更 高 的 精 度 和 更 大 的 表 示 范 围 ,常常 使 用 。
(三)实型 变 量 定 义 ,如
float f; //指 定 变 量 f为 float型
double d; //指 定 变 量 d为 double型
[注 ]与 C、 C++不同 ,Java中没 有 无 符 号 型 整 数 ,而且 明 确 规 定 了 整 型 和 浮 点 型 数 据 所 占 的
内存 字 节 数 ,这样 就 保 证 了 安 全 性 、 鲁 棒 性 和 平 台 无 关 性。
Java 位运算符
Java 定义的位运算(bitwise operators )直接对整数类型的位进行操作,这些整数类型包括long,int,hort,char,and byte 。表4-2 列出了位运算:
运算符
结果
~
按位非(NOT)(一元运算)
&
按位与(AND)
|
按位或(OR)
^
按位异或(XOR)
>>
右移
>>>
右移,左边空出的位以0填充 ;无符号右移
<<
左移
&=
按位与赋值
|=
按位或赋值
^=
按位异或赋值
>>=
右移赋值
>>>=
右移赋值,左边空出的位以0填充 ;无符号左移
<<=
左移赋值
详细解释
按位非(NOT)
按位非也叫做补,一元运算符NOT“~”是对其运算数的每一位取反。例如,数字42,它的二进制代码为:
00101010
经过按位非运算成为
11010101
按位与(AND)
按位与运算符“&”,如果两个运算数都是1,则结果为1。其他情况下,结果均为零。看下面的例子:
00101010 42 &00001111 15
00001010 10
按位或(OR)
按位或运算符“|”,任何一个运算数为1,则结果为1。如下面的例子所示:
00101010 42 | 00001111 15
00101111 47
按位异或(XOR)
按 位异或运算符“^”,只有在两个比较的位不同时其结果是 1。否则,结果是零。下面的例子显示了“^”运算符的效果。这个例子也表明了XOR
运算符的一个有用的属性。注意第二个运算数有数字1的位,42对应二进制代码的对应位是如何被转换的。第二个运算数有数字0的位,第一个运算数对应位的数
字不变。当对某些类型进行位运算时,你将会看到这个属性的用处。
00101010 42 ^ 00001111 15
00100101 37
位逻辑运算符的应用
下面的例子说明了位逻辑运算符:
// Demonstrate the bitwise logical operators.
class BitLogic {
public static void main(String args[]) {
String binary[] = {"0000", "0001", "0010", "0011", "0100", "0101",
"0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110",
"1111"
};
int a = 3; // 0 + 2 + 1 or 0011 in binary
int b = 6; // 4 + 2 + 0 or 0110 in binary
int c = a | b;
int d = a & b;
int e = a ^ b;
int f = (~a & b) | (a & ~b);
int g = ~a & 0x0f;
System.out.println(" a = " + binary[a]);
System.out.println(" b = " + binary[b]);
System.out.println(" a|b = " + binary[c]);
System.out.println(" a&b = " + binary[d]);
System.out.println(" a^b = " + binary[e]);
System.out.println("~a&b|a&~b = " + binary[f]);
System.out.println(" ~a = " + binary[g]);
}
}
在 本例中,变量a与b对应位的组合代表了二进制数所有的 4 种组合模式:0-0,0-1,1-0 ,和1-1
。“|”运算符和“&”运算符分别对变量a与b各个对应位的运算得到了变量c和变量d的值。对变量e和f的赋值说明了“^”运算符的功能。字符串
数组binary 代表了0到15
对应的二进制的值。在本例中,数组各元素的排列顺序显示了变量对应值的二进制代码。数组之所以这样构造是因为变量的值n对应的二进制代码可以被正确的存储
在数组对应元素binary[n] 中。例如变量a的值为3,则它的二进制代码对应地存储在数组元素binary[3] 中。~a的值与数字0x0f
(对应二进制为0000 1111 )进行按位与运算的目的是减小~a的值,保证变量g的结果小于16。因此该程序的运行结果可以用数组binary
对应的元素来表示。该程序的输出如下:
a = 0011 b = 0110 a|b = 0111 a&b = 0010 a^b = 0101 ~a&b|a&~b = 0101 ~a = 1100
左移运算符
左移运算符<<使指定值的所有位都左移规定的次数。它的通用格式如下所示:
value << num
这 里,num 指定要移位值value
移动的位数。也就是,左移运算符<<使指定值的所有位都左移num位。每左移一个位,高阶位都被移出(并且丢弃),并用0填充右边。这意味着
当左移的运算数是int 类型时,每移动1位它的第31位就要被移出并且丢弃;当左移的运算数是long
类型时,每移动1位它的第63位就要被移出并且丢弃。
在对byte 和short类型的值进行移位运算时,你必须小心。因为你知道Java 在对表达式求值时,将自动把这些类型扩大为 int
型,而且,表达式的值也是int 型。对byte 和short类型的值进行移位运算的结果是int
型,而且如果左移不超过31位,原来对应各位的值也不会丢弃。但是,如果你对一个负的byte 或者short类型的值进行移位运算,它被扩大为int
型后,它的符号也被扩展。这样,整数值结果的高位就会被1填充。因此,为了得到正确的结果,你就要舍弃得到结果的高位。这样做的最简单办法是将结果转换为
byte 型。下面的程序说明了这一点:
// Left shifting a byte value.
class ByteShift {
public static void main(String args[]) {
byte a = 64, b;
int i;
i = a << 2;
b = (byte) (a << 2);
System.out.println("Original value of a: " + a);
System.out.println("i and b: " + i + " " + b);
}
}
该程序产生的输出下所示:
Original value of a: 64
i and b: 256 0
因变量a在赋值表达式中,故被扩大为int 型,64(0100 0000 )被左移两次生成值256 (10000 0000 )被赋给变量i。然而,经过左移后,变量b中惟一的1被移出,低位全部成了0,因此b的值也变成了0。
既然每次左移都可以使原来的操作数翻倍,程序员们经常使用这个办法来进行快速的2 的乘法。但是你要小心,如果你将1移进高阶位(31或63位),那么该值将变为负值。下面的程序说明了这一点:
// Left shifting as a quick way to multiply by 2.
class MultByTwo {
public static void main(String args[]) {
int i;
int num = 0xFFFFFFE;
for(i=0; i<4; i++) {
num = num << 1;
System.out.println(num);
}
}
该程序的输出如下所示:
536870908
1073741816
2147483632
-32
初值经过仔细选择,以便在左移 4 位后,它会产生-32。正如你看到的,当1被移进31 位时,数字被解释为负值。
右移运算符
右移运算符>>使指定值的所有位都右移规定的次数。它的通用格式如下所示:
value >> num
这里,num 指定要移位值value 移动的位数。也就是,右移运算符>>使指定值的所有位都右移num位。下面的程序片段将值32右移2次,将结果8赋给变量a:
int a = 32;
a = a >> 2; // a now contains 8
当值中的某些位被“移出”时,这些位的值将丢弃。例如,下面的程序片段将35右移2 次,它的2个低位被移出丢弃,也将结果8赋给变量a:
int a = 35;
a = a >> 2; // a still contains 8
用二进制表示该过程可以更清楚地看到程序的运行过程:
00100011 35
>> 2
00001000 8
将值每右移一次,就相当于将该值除以2并且舍弃了余数。你可以利用这个特点将一个整数进行快速的2的除法。当然,你一定要确保你不会将该数原有的任何一位移出。
右
移时,被移走的最高位(最左边的位)由原来最高位的数字补充。例如,如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都
在左边补0,这叫做符号位扩展(保留符号位)(sign extension ),在进行右移操作时用来保持负数的符号。例如,–8 >>
1 是–4,用二进制表示如下:
11111000 –8 >>1 11111100 –4
一个要注意的有趣问题是,由于符号位扩展(保留符号位)每次都会在高位补1,因此-1右移的结果总是–1。有时你不希望在右移时保留符号。例如,
下面的例子将一个byte
型的值转换为用十六进制表示。注意右移后的值与0x0f进行按位与运算,这样可以舍弃任何的符号位扩展,以便得到的值可以作为定义数组的下标,从而得到对
应数组元素代表的十六进制字符。
// Masking sign extension.
class HexByte {
static public void main(String args[]) {
char hex[] = {
’0’, ’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’,
’8’, ’9’, ’a’, ’b’, ’c’, ’d’, ’e’, ’f’’
};
byte b = (byte) 0xf1;
System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
}
}
该程序的输出如下:
b = 0xf1
无符号右移
正
如上面刚刚看到的,每一次右移,>>运算符总是自动地用它的先前最高位的内容补它的最高位。这样做保留了原值的符号。但有时这并不是我们想要
的。例如,如果你进行移位操作的运算数不是数字值,你就不希望进行符号位扩展(保留符号位)。当你处理像素值或图形时,这种情况是相当普遍的。在这种情况
下,不管运算数的初值是什么,你希望移位后总是在高位(最左边)补0。这就是人们所说的无符号移动(unsigned shift
)。这时你可以使用Java 的无符号右移运算符>>> ,它总是在左边补0。
下面的程序段说明了无符号右移运算符>>> 。在本例中,变量a被赋值为-1,用二进制表示就是32位全是1。这个值然后被无符号右移24位,当然它忽略了符号位扩展,在它的左边总是补0。这样得到的值255被赋给变量a。
int a = -1; a = a >>> 24;
下面用二进制形式进一步说明该操作:
11111111 11111111 11111111 11111111 int型-1的二进制代码>>> 24 无符号右移24位00000000 00000000 00000000 11111111 int型255的二进制代码
由 于无符号右移运算符>>>
只是对32位和64位的值有意义,所以它并不像你想象的那样有用。因为你要记住,在表达式中过小的值总是被自动扩大为int
型。这意味着符号位扩展和移动总是发生在32位而不是8位或16位。这样,对第7位以0开始的byte
型的值进行无符号移动是不可能的,因为在实际移动运算时,是对扩大后的32位值进行操作。下面的例子说明了这一点:
// Unsigned shifting a byte value.
class ByteUShift {
static public void main(String args[]) {
int b = 2;
int c = 3;
a |= 4;
b >>= 1;
c <<= 1;
a ^= c;
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);
}
}
该程序的输出如下所示:
a = 3
b = 1
c = 6
对于java移位运算的总结:
<!--[if !supportLists]-->1.
<!--[endif]-->对于左移运算,每左移一个位,高阶位都被移出(并且丢弃),并用0填充右边。这意味着当左移的运算数是int
类型时,每移动1位,它的第31位就要被移出并且丢弃;当左移的运算数是long 类型时,每移动1位它的第63位就要被移出并且丢弃。
<!--[if !supportLists]-->2.
<!--[endif]-->左移都可以使原来的操作数翻倍,程序员们经常使用这个办法来进行快速的2
的乘法。但是你要小心,如果你将1移进高阶位(31或63位),那么该值将变为负值。
<!--[if !supportLists]-->3. <!--[endif]-->在对byte
和short类型的值进行移位运算时 , Java将自动把这些类型扩大为 int 型,而且,移位后的值也是int
型;如果左移不超过31位,原来对应各位的值不会丢弃。但是,如果你对一个负的byte 或者short类型的值进行移位运算,它被扩大为int
型后,它的符号也被扩展,结果的高位就会被1填充。因此,为了得到正确的结果,你就要舍弃得到结果的高位。这样做的最简单办法是将移位运算的结果再转换成
byte 型 。
<!--[if !supportLists]-->4.
<!--[endif]-->每右移一次,就相当于将该值除以2并且舍弃了余数。你可以利用这个特点将一个整数进行快速的2的除法。当然,你
一定要确保你不会将该数原有的任何一位移出。
<!--[if !supportLists]-->5. <!--[endif]-->无符号右移(>>>)与右移的区别:
<!--[if !supportLists]-->(1) <!--[endif]-->每一次右移,>>运算符总是自动地用它的先前最高位的内容补它的最高位。这样做保留了原值的符号
<!--[if !supportLists]-->(2) <!--[endif]-->无符号移动总是在高位(最左边)补0。
<!--[if !supportLists]-->6. <!--[endif]-->与C、C++不同,Java中没有无符号型整数,而且明确规定了整型和浮点型数据所占的内存字节数,这样就保证了安全性、鲁棒性和平台无关性。
其他:
(1)BCD码(二到十进制编码)
人们通常习惯使用十进制数,而计算机内部多采用二进制表示和处理数值数据,因此在计算机输入和输出数据时,就要进行由十进制到二进制的转换处理。
把十进制数的每一位分别写成二进制形式的编码,称为二进制编码的十进制数,即二到十进制编码或BCD(Binary Coded Decimal)编码。
BCD码编码方法很多,通常采用8421编码,这种编码方法最自然简单。其方法使用四位二进制数表示一位十进制数,从左到右每一位对应的权分别是23、22、21、20,即8、4、2、1。例如十进制数1975的8421码可以这样得出
1975(D)=0001 1001 0111 0101(BCD)
用四位二进制表示一位十进制会多出6种状态,这些多余状态码称为BCD码中的非法码。BCD码与二进制之间的转换不是直接进行的,当需要将BCD
码转换成二进制码时,要先将BCD码转换成十进制码,然后再转换成二进制码;当需要将二进制转换成BCD码时,要先将二进制转换成十进制码,然后再转换成
BCD码。
(2)字符编码
在计算机中,对非数值的文字和其他符号进行处理时,首先要对其进行数字化处理,即用二进制编码来表示文字和符号。字符编码就是以二进制的数字来对
应字符集的字符,目前用得最普遍的字符集是ANSI,对应ANSI字符集的二进制编码就称为ANSI码,DOS和Windows系统都使用了ANSI码。
在输入过程中,系统自动将用户输入的各种数据按编码的类型转换成相应的二进制形式存入计算机存储单元中;在输出过程中,再由系统自动将二进制编码数据转换
成用户可以识别的数据格式输出给用户。
(3)ASCⅡ码
用七位二进制表示字符的一种编码,使用一个字节表示一个特殊的字符,字节高位为0或用于在数据传输时的校验。附表为标准的ASCⅡ码表。
参考文章
http://blog.csdn.net/huigezhang/article/details/6658029
可以通过dx工具将jar包中所有的类打包编译为一个名为classes.dex的文件,然后通过aapt工具将classes.dex文件重新添加到你的jar包中。命令格式为dx --dex --output=classes.dex destination.jar
aapt add destionation.jar classes.dex。这两个工具都在android sdk目录中的platform/tools目录中
----------------------------------------
将classes.dex与其他资源文件重新打包成一个完整的apk
以上我们假设的情况是应用程序编译后的类文件从apk文件中被剥离出来,下面要做的是如何将上述步骤中得到的classes.dex与apk中的其他文件重新打包成一个可用的apk。
首先将反编译后的classes.dex和原先的app.apk(不含classes.dex)重新压缩成一个完整的app.apk(apk文件可用压缩工具打开),也就是说将classes.dex放进app.apk中。
将下载的AutoSign文件解压,可以看到有signapk.jar(还有个Sign.bat)文件,执行以下命令给app.apk文件签名,就可以生成一个可以运行的apk文件了。
java -jar signapk.jar testkey.x509.pem testkey.pk8 app.apk app_signed.apk
有一天突然翻到了刚工作三个月时候写下的随笔记录,可谓乱七八糟,但读起来津津有味,似乎每个异常每句话都能想到当初的情节. 呵呵,如今工作一年了,好像丢失了里面的一些东西…..
记下来,仅仅是为了回忆.
配置spring时 遇到异常信息如下:org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'bean'.
把<bean></bean>放在,<beans>之中也会显示说找不到’beans’ 纠结!
我怀疑spring.jar版本不够,后来折腾了半天,都没有找到,其实原因很简单 真的很简单:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd ">
</beans>把这段代码赋值到beans.xml文件里面就行了 O(∩_∩)O哈哈~
并且<beans>前面不能有空格,不然也会报错滴,
No error no exception is the best beautiful word!
关于前台后台数据交互和跳转页面的问题,是个很严重的问题,怎么做诺
老大说spring可以和 前台交互,怎么个交互法?struct2标签应该也可以吧,但是就是不知道该怎么弄,焦灼着呢 税
在做项目的过程中,虽然还并没有做出自己想要的功能,但我确实学会了不少,总结如下:
一:
一般情况下一个表中的主键,id int identity(1,1)primary key
这是最常见的咯,用注解的形式标记这种主键也很简单
@Id
@GeneratedValue
@Column(name="RecId")
public int getRecId(){
return RecId;
}
相对来说 我还是喜欢感受四季明显的变化,这样更真实!更能察觉时光变迁。
复合主键个人认为用到的很少,呜呜还是碰到了,由于没有经验,东装西摸,浪费了很长时间才把复合主键配好了,并且还出了很多异常,如下所示:
--一個裱中可以有多個字段組成的主鍵
create table EL_TransIdTable(
TableName nvarchar(50) ,
LastTransId nvarchar(15),
Prefix nchar(5),
DomainId nvarchar(10) primary key(TableName,DomainId)
)
其中 TableName 、DomainId两个字段作为此表的主键
在配置中主要分为两个步骤
1 为符合主键,建立一个复合主键类,这个类包括两个字段,(有几个字段组成主键 就包含几个字段 )这个复合主键类实现Serializable接口,有public 无参的构造方法 重写equals 和hashcode方法
2:在实体类里面用idclass标示复合主键类 详情如下:
package com.barcode.Model;
import java.io.Serializable;
public class TableNameDomainIdPK implements Serializable{//实现接口
public TableNameDomainIdPK(){ //有public无参构造方法
}
private String TableName;
private String DomainId;
public String getTableName() {
return TableName;
}
public void setTableName(String tableName) {
TableName = tableName;
}
public String getDomainId() {
return DomainId;
}
public void setDomainId(String domainId) {
DomainId = domainId;
}
@Override
public int hashCode() { //从写hashCode方法和equals方法
final int PRIME = 31;
int result =1;
result=PRIME*result+((TableName==null)?0:TableName.hashCode());
result=PRIME*result+((DomainId==null)?0:DomainId.hashCode());
return result;
}
@Override
public boolean equals(java.lang.Object obj) {
if(this ==obj){
return true;
}
if(null ==obj ){
return false;
}
final TableNameDomainIdPK other=(TableNameDomainIdPK)obj;
if(DomainId==null){
if(other.DomainId!=null){
return false;
}
}else if(!DomainId.equals(other.DomainId)){
return false;
}
if(TableName==null){
if(other.TableName!=null){
return false;
}
}else if (!TableName.equals(other.TableName)){
return false;
}
return true;
}
}
实体类中的配置如下
package com.barcode.Model;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
@Entity
@Table(name="EL_TransIdTable")
@IdClass(TableNameDomainIdPK.class)
public class EL_TransIdTable implements Serializable {
private String TableName;
private String LastTransId;
private String Prefix;
private String DomainId;
@Id
@Column(name="TableName", nullable = false)
public String getTableName() {
return TableName;
}
public void setTableName(String tableName) {
TableName = tableName;
}
@Column(name="LastTransId")
public String getLastTransId() {
return LastTransId;
}
public void setLastTransId(String lastTransId) {
LastTransId = lastTransId;
}
@Column(name="Prefix")
public String getPrefix() {
return Prefix;
}
public void setPrefix(String prefix) {
Prefix = prefix;
}
@Id
@Column(name="DomainId", nullable = false)
public String getDomainId() {
return DomainId;
}
public void setDomainId(String domainId) {
DomainId = domainId;
}
public void Print_Info(){
System.out.println(this.getDomainId()+this.getLastTransId()+this.getPrefix()+this.getTableName());
}
}
从昨天晚上就一直遇到这个异常:感觉好怪,一条一条的找了很久 还是没有解决:
org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.demo.pojo.Userinfo. Expected:
class java.lang.Integer, got class java.lang.String;
数据库中并没有int类型的字段,为什么会这样?
一字一句的找了一晚上,模模糊糊知道是类型转换为题,终于在今天找到咯^_-
在DAO层 有这样一个方法
public EL_TransIdTable Find_ById(String name){
return this.hibernateTemplate.get(EL_TransIdTable.class, name);//通過domain來修改對應的lastId
}
平时是传给hibernate int类型的id ,现在传给他的是string类型的name 难道他不认识string类型的name?还是给他整容变成int类型了?
public EL_TransIdTable Find_ById(String name){
String hql="select * from EL_TransIdTable el_t where el_t.DomainId='"+name+"'";
String hql="from EL_TransIdTable el_t where el_t.DomainId='"+name+"'";
List list =this.hibernateTemplate.find(hql);
if(list.size()==0){
System.out.println("沒有此用戶");
return null;
}else{
EL_TransIdTable el_t=(EL_TransIdTable)list.get(0);
return el_t;
}
}
这样子就不会报上诉异常了。…… ^_-
解决这个异常后,笑容在由心底绽放在脸上的路途中不幸夭折了,控制台又显示了新的异常—一大推!对自己写的本身就稀烂的代码更加怀疑了,
呜呜,就是这个异常-- java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.MethodNode 我一下午都在逮它,从数据库表中的每个字段,到java中对应的实体类,再到配置文件,一个一个的找,看哪里配错了,泪流满面后,还是没有找到!既然一致的为啥子还说找不到错的字段呢!
Hql语句为啥这么变态,为什么不支持’_’
String hql="select et.tableName,et.lastTransId,et.prefix,et.domainId from EL_TransIdTable et where et.domainId='"+name+"'";
对应表中的字段 第一个字母都是大写的,但是在hql中必须小写。
好像是hql要自己把小写字母转换成大写的,还是他看大写的不顺,只支持小写的呢。?这个最令人费解的问题 –真的好神奇!
哦哦—周末咯,晚上和几个朋友去大吃一顿,暂时放下这一推推变态的Exception吧!
开心每一天 ^_-
其实,具体的字段是不用写的,直接这样写就可以了 “from EL_TransIdTable where et.DomainId=’”+name+”’” 这样写就足够了! 2011年7月29日星期五^_-
* hibernate 中 并不识别* 这个标识,不晓得为啥子
String hql="select * from EL_TransIdTable el_t where el_t.DomainId='"+name+"'";
String hql=" from EL_TransIdTable el_t where el_t.DomainId='"+name+"'";*^_*
这两条语句相差是很大的,
List<EL_TransIdTable> list =this.hibernateTemplate.find(hql);
Iterator<EL_TransIdTable> ita = list.iterator();
while(ita.hasNext()){
EL_TransIdTable elt = (EL_TransIdTable) ita.next();
elt.Print_Info();
}
同样执行这段代码,第一条语句会报错 ,错误类型是classcastexception,类型转换的错误,令人恶心!原因是详细写了字段 hibernate并不知道是否查询所有的字段装进实体类里面,他也不认识* 很郁闷把!是的。不知道这样写对不对!反正目前我是这样理解滴,等下次有了新的感悟和认知再来修改吧。学习就是这样,一步一步循序渐进!加油
有时间看这个网页http://archive.cnblogs.com/a/2048890/ net 增删改查 实体类和数据库帮顶
new java.sql.Date(new java.util.Date().getTime())
java中日期处理
String类型的数据转换成Double类型
((Double.parseDouble((String)listbody.get(7))));
百度得知
Double d = Double.parseDouble(string)
几乎每个数字类都有***.parse***(string)方法的
如果String类型的数据像int类型一样去加一
String s = “2000”
Double d = (Double.paresDouble(s))
d=d+1
System.out.println(d.toString());在把d转换回来就ok啦
虽然可以使原来的数据加1 但是产生了新的问题
------------d的值是:2001.0
------------d的值是:2002.0
------------d的值是:2003.0
这是测试的结果!返回值2001.0 这不是数据库中的int类型,保存数据失败!
泪流满面之后,还得要找别的方法!
啦啦啦啦啦啦啦 ^_-
这样可以 先将String类型的数据转换int类型,然后将int类型加1后在转换成String类型插入数据库中,
是不是还有更好的方法 在插入数据库之前,转换数据类型?
String s=elt.getLastTransId();
Integer i =Integer.valueOf(s);
i = i +1;
String si = i.toString();
elt.setLastTransId(si);
保存数据成功! O~~yeth
学习滴路途是会遇到很多exception滴,加油哈
思考:要不要把类型转换单独写个函数 分个层出来? Biz层?
现在存在的主要问题是:批量修改,和事务管理!基本上上午没做什么正事 ,嘻嘻嘻 下午开干!吃饭咯。^_-
Alter table 表名 with check add constraint FK_主表名_从表名
Foreign key 从表中字段 references 主表中的字段
如果现在有两张表 A 、B 。 A中主键ID B中外键IDA
Alter table B with check add constraint FK_A_B foreign key IDA reference ID
这是我写滴……^_--
额今天似乎什么都没做额!惭愧••~~!~~我有罪,
看了温州事件的相关报道,心真难受,生命就是那么脆弱!经不得其折腾,好好珍惜吧,我们的每天每天 !眼睛不知不觉的模糊!》。
修改指定记录:
String hql=”from EL_TransIdTable el_t where el_t.domainId=’”+DomainId+”’
List<EL_TransIdTable>list=this.hibernateTemplate.find(hql);
If(list.size==0){
System.out.println(“没有查出记录!”);
Return null;
}else{
Iterator<EL_TransIdTable>ita = list.iterator();
While(ita.hasNext){
EL_TransIdTable elt=(EL_TransIdTable)ita.next();
Elt.print_Info();
}
}
MM们喜欢哪种IT男?^_-- 相对很多行业 做开发的男生心性是单纯善良的,
差不多可以这样描述 :两耳不闻窗外事,一心只敲编程码 哈哈!你喜欢那种呢
主外键级联删除
就有那么两张表是主外键关系 主表中的级联先存在 子表中的记录先被删除
主表受约束的控制,子表不受
亲,穷疯了吗?还在为活着买不起房,死了买不起墓而烦恼吗?赶紧拿起电话订购一张动车票吧,可免费参与集体火化,还包埋哦,更有机会参加50万现金的抽奖活动呢。前10名获奖者可额外获得5万元的奖金,先到先得,你值得拥有。亲,真的有这么优惠的,信不信由你,反正我是信了。
我拒绝了所有人的青睐 等你一个不确定的未来
总有一天我的谜底会揭开
今天还要浪费一天时间吗?
关于datetime
select CONVERT(varchar, getdate(), 120 )
2004-09-12 11:06:08
select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),\'-\',\'\'),\' \',\'\'),\':\',\'\')
20040912110608
select CONVERT(varchar(12) , getdate(), 111 )
关于sql时间问题是个非常值得研究的问题,网上有很多关于他的解说,看来掌握他并不是一件很容易滴事情,当然掌握它让人感觉好时尚哇!
select * from EL_PickListTable where UploadDate='2011-07-25 15:02:52.017'--根据上载的时间获取外键RecId做下一步操作
select convert(varchar(5),getdate(),114),convert(varchar(8),getdate(),114),CONVERT(varchar(20),getdate(),120)
相对于很多颜色,我还是偏爱花花绿绿的
不在停留中死亡就是在停留中被开除
关于 spring配置问题:
<context:component-scan base-package=”com.*”/>
//上述 规定所有进行扫描的类,以完成Bean创建和自动依赖注入功能
<mvc:annotation-driven/>
我们必须接受失望,因为他是有限的,我们绝不能失去希望,因为他是无限的!
有些东西弄懂了,就永远懂了,就算痛也只痛一次!值了。
This.columns.add(“ShopID”,{header:”ShopId”,width:100,dataIndex:’shopId’,
Hidden:false,sortable:true,align:”center”});
,url:”ItemMasterManagement/ViewHead.action”
POJO:简单的java对象
关于spring注解http://www.ijser.cn/?p=621
ExtJs中的表格功能甚是强大!堪称强悍!包括:排序、缓存、拖动、隐藏某列、自动显示行号
Web.xml 启用spring容器和spring mvc
<!– Spring 服务层的配置文件 –>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!– Spring 容器启动监听器 –>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!– Spring MVC 的Servlet,它将加载WEB-INF/annomvc-servlet.xml 的
配置文件,以启动Spring MVC模块–>
<servlet>
<servlet-name>annomvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>annomvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
web.xml 中定义了一个名为 annomvc 的 Spring MVC 模块,按照 Spring MVC 的契约,需要在 WEB-INF/annomvc-servlet.xml 配置文件中定义 Spring MVC 模块的具体配置。annomvc-servlet.xml 的配置内容如下所示:
<!– ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 –>
<context:component-scan base-package="com.baobaotao.web"/>
<!– ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射 –>
<bean />
<!– ③:对模型视图名称的解析,即在模型视图名称添加前后缀 –>
<bean
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
</beans>
因 为 Spring 所有功能都在 Bean 的基础上演化而来,所以必须事先将 Controller 变成 Bean,这是通过在类中标注 @Controller 并在 annomvc-servlet.xml 中启用组件扫描机制来完成的,如 ① 所示。
在 ② 处,配置了一个 AnnotationMethodHandlerAdapter,它负责根据 Bean 中的 Spring MVC 注解对 Bean 进行加工处理,使这些 Bean 变成控制器并映射特定的 URL 请求。
而 ③ 处的工作是定义模型视图名称的解析规则,这里我们使用了 Spring 2.5 的特殊命名空间,即 p 命名空间,它将原先需要通过 <property> 元素配置的内容转化为 <bean> 属性配置,在一定程度上简化了 <bean> 的配置。
一个controller对应多个请求 指定参数来选择执行哪个方法
(个人觉得不错!o(╯□╰)o)
@Controller
@RequestMapping("/bbtForum.do") // <—— ① 指定控制器对应URL请求
public class BbtForumController {
@Autowired
private BbtForumService bbtForumService;
// <—— ② 如果URL请求中包括"method=listAllBoard"的参数,由本方法进行处理
@RequestMapping(params = "method=listAllBoard")
public String listAllBoard() {
bbtForumService.getAllBoard();
System.out.println("call listAllBoard method.");
return "listBoard";
}
让请求处理方法处理特定的HTTP请求方法
@Controller
@RequestMapping("/bbtForum.do")
public class BbtForumController {
@RequestMapping(params = "method=createTopic",method = RequestMethod.POST)
public String createTopic(){
System.out.println("call createTopic method.");
return "createTopic";
}
}
这样只有当 /bbtForum.do?method=createTopic 请求以 HTTP POST 方式提交时,createTopic() 方法才会进行处理。
通过这篇文章,我做出了如何通过前台页面访问后台代码,一系列增删改查,现在要学习的是:参数的传输!come on!
入门-深入^_-
规则:spring在如何给处理方法入参自动赋值以及如何将处理方法返回值转化为ModelAndView中的过程中存在一套潜规则 该规则是啥子哟?
RequestMapping
以后开始厚着脸皮问了,我不会解决
/* 函數 updateInfo
* 功能 根據用戶選行編號,更新用戶修改的單號,
* 參數 1:用戶所選取行對應的PK (int)
* 2:用戶更改的單號信息 (String)
* */
@SuppressWarnings("unchecked")
@RequestMapping(value="BarCode/updateRefId.action")
public @ResponseBody Map<String,Object> updateInfo(HttpServletRequest request){
Map<String,Object>map=new HashMap<String,Object>();
String s[]= (request.getParameter("recId").split(","));
String refid=request.getParameter("refId");
System.out.println("批量修改后的單號為-------:"+refid);
for(int i=0;i<s.length;i++){
int RecId=Integer.parseInt(s[i]);
System.out.println("批量修改的主鍵為---------:"+RecId);
EL_PickListTable elp=this.el_PickListTableService.selectByRecId(RecId);
elp.setRefId(refid);
this.el_PickListTableService.updateInfo(elp);
}
map.put("success",true);
map.put("message","成功更新單號!");
return map;
}
@ResponseBody----和@RequestMapping相对应,一个请求一个响应。
Insert into ppcPickList values(‘1’,’001’,’001’,’004’,’005’,’6’,’7’,’8’,’9’,’0’,’11’,’12’,’13’,1,’15’,’16’, GETDATE(),’18’,’19’,’20’,’21’,’22’,23,24,’25’,’26’,27,’28’,’29’,30,’31’,31)
下面要做的是上载功能,和前台与后台数据的结合,!有挑战!
ALTER TABLE [dbo].[MP_MASTER_PLAN_FACTORY] ALTER COLUMN [MP_ID] varchar(501) NOT NULL
GO
Hibernate配置version
在要加锁的表中,添加字段version int类型,在实体类中get方法中添加如下注解
@Version 就可以咯 easy!!!
当两个用户同时对一张表进行修改数据的时候,产生下列异常:
java.lang.IllegalArgumentException: Invalid handler method return value: true
先提交的用户,修改了数据库中的数据,并使version加1,后提交的用户没有修改数据库
这个问题有待解决
ExtJS 解读器:分为 arrayreader、jsonreader、xmlreader
其实在java实体类中一定要标记主键!这个是不能缺少的,一个表中可以没有主键,但是在实体类中就会出错呢。这是个很神奇的问题。刚刚做了上载AX系统的记录表,删除和查询,现在遇到的问题有两个,一:保存上载信息记录 二:TransId如何获取
玛丽玛丽红,o(╯□╰)o
先看一下structs配置:这是在武汉的时候第一次接触structs
<struts>
<!-- 编码设置 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<!-- 相关配置 -->
<package name="json" extends="json-default">
<action name="extjs" >
<result type="json"/>
</action>
</package>
</struts>
原来action不仅仅指向.java文件,也可以指向.js文件 ( ⊙o⊙ )哇 好神奇!
有效地分离数据访问层(DAO)和业务层(SERVICE),使之各司其职,举例说明:如果DAO层访问数据库,得到的数据根据业务需要要进行加密,那么取数据和把数据加密就是2个步骤,访问数据和业务逻辑加工,如果去掉任意一层,那么剩下的那一层就超出工作范围了,所以DAO层就是取数据用的,SERVICE层就是加工数据用的,这就实现了数据访问层和业务逻辑层的有效分离
Service 层、dao 层。各司其职!
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.barcode.Model.ppcInfo
当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
我现在要从两张表中select出需要的信息记录,两张表同时存在refId、picklistNum
我该怎么接受查出来得结果集呢?在查询语句中可以用表名区分,但是实体类里面该怎么区分呢,既然实体类中的成员变量对应表中的字段,那么岂不是重复了?
实体类对应数据库中的一张表,实体类中的每个实例对象对应着表中的字段,对表的操作全部在实体类中进行。。。。。。简单的崩溃!!!---
竟然是繁体中文,另外,看你写了一堆的设置不同bean的同名属性的代码,可以考虑使用BeanUtils的copyProperties方法拷贝Bean同名属性。
----------这位大牛说的确实不错!
之前没做这一步的时候,我就幻想着有这样一个方法就好了,因学识有限,并不知道copyProperties存在,按照你给我的提示,我先是学习了BeanUtils 下的copyProperties用法,后来修改了我的代码,报出这样的异常:java.lang.IllegalArgumentException: argument type mismatch 网上一查:参数类型不匹配,是的,预感也会报参数类型不匹配的错误呢。因为ppc这个表中的字段顺序很“乱”,它里面既有取自elp1表中的个别字段,又有取自elp2表中的个别字段,还有elp1、elp2表中所没有的字段,比如当前更新时间,当前登录用户的计算机名,等。Ppc表这样乱的记录,该怎么copy呢?它要是智能的,你说该多好。
经过试验发现,上述大牛说的行不通,因为我的那个ppc真的是太给力了。
我觉得peter有个很好的习惯,做完之后,总结!
简单登录 Extjs DB^_- 革命尚未成功,我还需努力!
Ext.apply(this,{
store:new Ext.data.Store({
id:"storeMP_item_mas_h"
,reader:new Ext.data.JsonReader({
totalProperty:'total',
successProperty:'success',
idProperty:'id',
root:'records',
messageProperty:'message',
},this.dataRecordMeta)
,fields:this.dataRecordMeta
,url:"BarCode/SelectEL_PLT.action"
,remoteSort:false
,pruneModifiedRecords:true
})
,columns:p[
new Ext.grid.RowNumberer(),sm,
tihs.columns.get("RecId"),
this.columns.get("UploadStatus"),
this.columns.get("Tolocation"),
this.columns.get("TransId"),
this.columns.get("CreatedBy"),
this.columns.get("CreatedDate")
],selModel:sm
,bbar:new Array()
});
function login(){
var form=Ext.getCmp("login").getForm();
form.submit({
//clientValidation: true,
url:"/Env_1/BarCode/selectUser.action",
params:{
},
success: function(form, action) {
Ext.Msg.alert('Success', "恭喜,登陆成功!");
location.href = 'index.jsp';
},
failure: function(form, action) {
switch (action.failureType) {
case Ext.form.Action.CLIENT_INVALID:
Ext.Msg.alert('Failure', 'Form fields may not be submitted with invalid values');
break;
case Ext.form.Action.CONNECT_FAILURE:
Ext.Msg.alert('Failure', 'Ajax communication failed');
break;
case Ext.form.Action.SERVER_INVALID:
Ext.Msg.alert('Failure', "您的输入有误,请核实后重新输入");
loginform.form.reset(); //输入错误后,自动清除文本框中输入的内容
}
}
});
Extjs中 grid控件显示时间,--简单的时间格式 在grid列中添加
注意添加两个属性 红色字体显示
this.columns.add("CreateTime",{header:"CreateTime",width:150,dataIndex:'created_time',xtype:'datecolumn',sortable:true,align:"center",format:'Y-m-d H:i:s'});
现在遇到一个问题:时间在火狐浏览器中显示正常,在IE浏览器显示不正常,是显示空白,这个问题还没有解决,网上有人说要重新写Ext中的一个方法,也有人说IE不支持2009-09-09中的’-’要把它化成2009/09/09
Extjs中如何单机行获取主键、根据主键进行一些操作,恩这个问题值得考虑,应该也很简单吧,只是我现在还没有思路。^_-
,getSelectedRowPK: function() {
var selRecords=this.getSelectionModel().getSelections();
var itemMasterPks=this.recordPk;//獲得紀錄的主鍵
var modelNumber="";
var delParams=new Object();
if(itemMasterPks.length==1){
var singPk=itemMasterPks[0];
for(var i=0;i<selRecords.length;i++){
modelNumber+=selRecords[i].data[singPk]+",";
}
modelNumber=modelNumber.substring(0,modelNumber.length-1);
delParams[singPk]=modelNumber;
}
return delParams;
}我堅信沒有解決不了大大問題,沒有不做的小生意。
当用户修改完一条记录,移往另一条记录时,系统会自动将修改的信息保存到数据库,更新领料单行栏位 这个还没做。重复预算表出现提示这个还没有做。。。加油加油
今天要做的是:
1:修改grid中的值,并将其动态保存到数据库中,
2:在grid中添加下拉框,从数据库中取值放进下拉框中
This.columns.add(“RefId”,{header:”单号”,width:100,dataIndex:’refId’,hidden:false,sortable:true,align:”center"})
我现在还没有做出来,太难了,也不是,嘿嘿,是我一直在玩儿呢 。。下午请教peter,嘿嘿
受益匪浅-------*
function deleteall(){
var values=modfiy();
Ext.MessageBox.confirm( "请确认", "是否要删除选中信息", function(button,text){
if(button=='yes'){
Ext.Ajax.request({
url:'news_query.do',
method:'post',
params:{values:values'},
success:function(req){
var responseObj = Ext.util.JSON.decode(req.responseText);
if(responseObj.success == 'true'){
Ext.Msg.alert("成功提示", responseObj.infor);
}else{
Ext.Msg.alert("错误提示", responseObj.infor);
return;
}}});
}else{
return;
}
});}
原来在一个提示框里面也可以写这么多逻辑代码。甚至还可以访问DB真的是太牛叉了!
..我懂得反抗了,别再逼我!
额 还是一点儿进展都没有! 啊啊啊啊啊。。。。
昨天大家在说我呢。说我还是转行把。做技术支持,做销售,做测试都不错,做开发很辛苦滴,我犹豫了?
一次性批量提交修改了的记录?提交以后后台如何做相应的处理—动态保存数据 呜呜,快来救救我把。
var results={};
var recordArray = store.getModifiedRecords(); //获取已经修改好了的Record记录 var recordOld;
for(var i=0;i< recordArray.length;i++){
items = recordArray[i].getChanges();//分别获取修改了的记录
recordOld = recordArray[i].modified;
for(var key in items){
if( recordOld[key]===”"){
results["item("+key+"#"+recordArray[i].get(”_id”)+”#Insert)”]=items[key];
}else{
results["item("+key+"#"+recordArray[i].get(”_id”)+”#Update)”]=items[key];
}
}
}
在这段代码里面,我们首先获取了已修改了的Record记录数组,之后再遍历这个数组,分别获得每一个修改了的具体字段,再通过判断原始值是不是 为”"(在这里突然想到,如果没有值的话,.modified会不会是null?等有时间了测试一下),当为空代表是新增的数据,否则是修改的数据。通过 这种方式,我们最终得到的resules对象,可以作为一个json对象通过Ajax的params属性直接赋值传递。
resules对象的json字符串例如:[{"item(YN#8888#Insert)":999},{"item(YN#9999#Update)":888}]。
由于本人是使用java struts进行编程,因此后台可以用名叫item的Map进行获取(如何获取不明白的可以搜索下Map-Backed ActionForm的实现方式)。获得的Map的键值分别为:
YN#8888#Insert(键):999(值)
YN#9999#Update(键)::888(值)
这样的话我们就可以分析键来实现具体的业务了。
补充:验证修改了的信息与原始信息是否一致,该步骤可以省略,经过试验发现:只有当修改了单元格的内容(与原始信息)不一致时候,才能显示红色标示,否则不予显示,也就是不用判断是否和原始信息一致咯,哈哈又省了一步。
从数据库中提取数据在下拉框中显示
Eg:
var store=new Ext.data.Store({ //注意这里是Store非JsonStore
id:"FP.Field.Mouldid"
,root:"records"
,reader: new Ext.data.JsonReader({
totalProperty:"total"
,root: "data"
},[{
name:"mouldid"
,type:"string"
},{
name: "mouldname"
,type: "string"
}])
,url:"/GetField/get_head_field.action?field=mouldid"
,remoteSort:true
})
之后displayField 和valueField跟其中的mouldid,mouldname对应!
今天在开始做项目的过程中,真的是纠结要死!本身昨晚上没睡好,精神恍惚着呢,加上项目;老是报错!哎郁闷,后来peter帮忙查,找到是dao层写了个多余的死循环!~~呜呜
崩溃!接着又处理了几个异常。哎关于事件,依然是个很头大的问题慢慢来吧。我不知道我还能——)——多久。
昨天折腾了很久,到快下班的时候peter做出了将更改的记录传递到了后台,接下来的事情就是我做了,恩现在基本上编辑grid单元格后保存到数据库是没问题了,上面的功能是仅仅是针对领料单头!其实领料单头实现这个功能是非常的简单的,因为它只能修改单号,领料单头区域也只有四个字段,只能修改其中的一个字段当然是很简单咯。接下来的领料单行该怎么实现呢?领料单行共有32个字段,其中只有一个是不能编辑的31个都是可以编辑的,如何实现编辑同一行记录后,保存到数据库呢,如何知道同一行grid中哪个单元格被编辑了,怎么动态保存呢?问题依然很棘手!其实才做出了冰山一角!很多细节都没有实现,。额 压力好大。
水瓶座和水瓶座
水瓶座:水瓶座
友情:★★★★
爱情:★★★★
婚姻:★★★
亲情:★★★
在12星座中如果要选到和水瓶座绝配的一对,怕且就是另一个水瓶座啦,因为只有水瓶座才会了解到对方那种异于常人,近乎疯狂的行为和性格,而且彼此对自由、无拘无束的渴望有共鸣,令你们更加亲蜜。
对比其他情侣,你们会平淡一些,似老友多过老公老婆,欠缺热情火花,也时不时会有外遇的倾向,但也互相谅解,始终在一起,对于家庭财务你们不懂控制,钱不是最重要,但因为坚持自己各自要求的物质水平,会带来你们一些失控的情况。
至于性生活,只是你们多种兴趣的其中之一,因此,哪怕有不协调的地方都不会太为意,因为这件事不会影响你们之间的感情。
remoteSort :false /true ooo原来是排序的问题! 费解!
灵感瞬间来了:--- 打开一个网页时先呈现出body区域,然后加载两边的内容最后加载头部的区域,很有动态感的呈现给大家的眼球!无疑是个很不错的方式。额别人都用了
那个下拉框做出来了耶 嘎嘎,
是属性设置错误了,主要是数据库是远程滴还是本地设置反了
var combo_store = new Ext.data.Store({
id:"FrmWarehouseId"
,reader:new Ext.data.JsonReader({
totalProperty:"total"
,root:"records"
},[{name:'frmWarehouse',type:"string"}
,{name:'id',type:"id"}
])
,url:"BarCode/getFrmWarehouse.action"
})
items:[{
xtype:'combo',
name:'frmWarehouse',
fieldLabel:'由仓库',
store:combo_store,//绑定是数据源
mode : 'remote',//设置下拉列表读取数据的模式,local表示本地读取,remote表示远程读取
displayField :'frmWarehouse',//被显示在下拉列表框中的值所对于的字段名,比如本类中省份对应的provice_name
valueField : 'id',//设置数据值对应的字段
forceSelection : true,//是否严格匹配列表中的值,true表示只能输入列表中的值
editable:false,//是否可以编辑
forceSelection : true,//当获取焦点的时候立即选择一个已存在的列表项,与editable:true一起使用,否则无意义
triggerAction : 'all',//单击触发按钮的时候显示全部查询的数据,默认为query,设置all会执行allQuery查询
queryParam :'search_provice',//查询参数,涉及到和后台交互
emptyText:"請選擇由倉庫"
}
项目一点点接近完善!心里偷偷乐!很期待这个ELBase最终能结个大果实。其实这一个多月来,我一直都遇到一个问题,并且一直没有得到解决,因为我感觉太难了,一直逃避着它—浏览器不兼容性,我喜欢火狐,并一直再用它,一次偶然,我在IE上运行了我做的项目,结果乱七八糟的显示,严重的畸形了。当时,我吓坏了,心想着—妈呀,这一个多月来,不是白做了。因为我知道大部分人还是用IE浏览器的。呜呜 心里那个郁闷啊、悲剧啊、死的心都有了。痛定思痛!本人决定暂时逃避这个问题,我把IE删了。哈哈哈。。。
我总是心虚,即使删了IE,问题还是存在,缓了几天,我鼓起勇气开始解决这个问题了。
人啊人就是这个样子的,总是用放大镜来看待未解决的问题!我静下心来仔细看IE报出的错误,从新设置了一下前台界面的宽度,删除了源码中没有使用的变量,再次运行的时候 ,所有的问题都解决了!真的真的。。感觉自己好时尚啊!TRUE! 我想起了华为打广告的一句台词:没有解决不了的大问题,没有不做的小生意!不同的情景想起这句话给人不同的感触。有木有?有。
浏览器不兼容问题还有一个比较严重滴:
IE浏览器日期显示空白
传说要重写一个函数 如下:API中这样写:---
我 调皮 、捣蛋、 喜欢写错别字。 请你记住:这世界上就这么一个我!
date( Mixed value , [String format] ) : Function
将某个值解析成为一个特定格式的日期。
将某个值解析成为一个特定格式的日期。
参数项:
• value : Mixed
要格式化的值
• format : String
任何有效的日期字符串(默认为“月/日/年”)
返回值:
• Function
日期格式函数
在网上copy了一个函数 如下:
Ext.override(Ext.util.Format, {
date : function (v, format, origformat) {
if (!v) {return ""; }
if (!Ext.isDate(v)) {
if (origformat) {
v = Date.parseDate(v, origformat);
}else { v = new Date(Date.parse(v)); }}
return v.dateFormat(format || "m/d/Y"); },
dateRenderer : function(format, origformat) {
return function(v) {
return Ext.util.Format.date(v, format, origformat); };} });
我把它放进了代码里面,没有用!额,不知道该怎么调用这个重写了的函数
传说IE不支持/ 1990/02/14 就没的正常显示了
刚做了一个最新的测试 好像是什么菲测试 挺著名的
得了41分 在41-50的范围内
结果如下:
别人认为你是一个新鲜的、有活力的、有魅力的、好玩的、讲究实际的、而永远有趣的人;一个经常是群众注意力的焦点,但是你是一个足够平衡的人,不至於因此而昏了头。他们也认为你亲切、和蔼、体贴、能谅解人;一个永远会使人高兴起来并会帮助别人的人。
一个女人要是不幸聪明的什么都懂,那就必须同时懂得怎么伪装成什么都不懂
一个女人要是不幸聪明得什么都懂,那就必须同时懂得怎么伪装成什么都不懂
,store:new Ext.data.Store({
id:"storeMp_item_mas_h"
,reader:new Ext.data.JsonReader({
totalProperty:'total',
successProperty:'success',
idProperty:'id',
root:'records',
messageProperty:'message'
},this.dataRecordMeta)
,fields:this.dataRecordMeta
,url:"BarCode/showEL_PickListLine.action"
,method:"GET"
,remoteSort:false
,pruneModifiedRecords:true
,params:this.getSelectedRowPK()
})
多个对象的传递红色字体为主要操作
,updateColumnFn:function(btn){
var obj=this.getSelectedRowPK(); //获得所选择行PK
var me=this;
var selCount=this.getSelectionModel().getCount(); //獲得選擇的紀錄數
if(btn=='yes'){
Ext.MessageBox.prompt("更改領料單頭","單號:",function(bt,text){
obj.refId=text; //获得文本框中输入的值
if(bt=='ok'){
Ext.MessageBox.wait("系統正在更新,請稍後...");
Ext.Ajax.request({
url:"BarCode/updateRefId.action"
,success:me.afterExecuteUpdateRecIdSuccess
,timeout:10000
,scope:this
,params:obj
}); }}); }}
后台如何获取前台传来的多个对象
/* 函数 saveupdate
* 作用 编辑grid单元格后自动保存
* 参数 编辑单元格中的值、对应行主键
* */
@SuppressWarnings("unchecked")
@RequestMapping(value="BarCode/saveupdate.action")
public Map<String,Object>saveupdate(HttpServletRequest request){
Enumeration enu=request.getParameterNames();
Map<String,Object>map=new HashMap<String,Object>();
int RecId = 0;
String refId=null; 多好的一个苗子,终因无人栽培活活的就死了
System.out.println("enu中包含-----"+enu);
String recId=request.getParameter("recId");
System.out.println("當前的主鍵是----"+recId);
RecId=Integer.parseInt(recId);
refId=request.getParameter("refId");//直接通过名字获取
System.out.println("當前被修改的refId------"+refId);
EL_PickListTable elp=this.el_PickListTableService.selectByRecId(RecId);
elp.setRefId(refId);
this.el_PickListTableService.updateInfo(elp);
map.put("success",true);
map.put("message","保存成功!");
return map;
}
说说我下周的计划:一:实现领料单行区域的修改保存—
二:实现对准数的计算
三:细节问题,光标定位
四:。。。
这句话说的多好:女人要是聪明的什么都懂,那就必须懂得怎么伪装什么都不懂。
问题所在一:如何在gridpanel中添加comboBOx ,comboBox中的数据要从数据库中提取
上周买了三本书1:养生杂志2:特品文学3:知音 这个周末 ---幸福蜗居 睡睡觉 做做饭 看看书 听听音乐 偶尔再补个觉
问题所在二: 如何 在项目首页条码输入框中设置光标位置,光标位置如何设置呢。
现在最重要的是:获得修改当前行主键,当前修改的字段,返回后台做相关处理。修改某个字段保存某个字段这个是目前比较理想的解决方法。那么,如何获取当前修改字段呢?
3Q,是这样的:
问题描述:
当我单击领料单头区域中的某行记录时,对应的领料单行会显示出 所选单头对应的全部单行记录,领料单行区域是可编辑的grid单元格,要求是用户编辑了单元格后,自动保存所修改的内容,问题是:后台如何动态的保存修改的记录?难道修改一个单元格就要更新所有记录吗?。之前项目用.net开发的时候,就是这么处理的。可是现在用java重新写,我觉得还这么写不好,因为一条单行记录对应30多个字段,修改一个字段要更新30多个字段,很不爽,我想法有两个:1 编辑一个单元格后,当光标离开该单元格后,保存修改的单元格内容 2 编辑一条单行(可能修改了多个单元格的内容)当当前行号不属于编辑的行号时,保存编辑行号中所有修改的单元格,。不知道我说的你能听明白吗? 这两个想法不论哪个都是只保存修改了的单元格内容,避免了不必要的操作。
不是修改即保存吗?还需要 var x 吗,因为只有一条存在;
当点击进入某一单元格的时候,执行点击事件,获取当前事件对象(即为当前表格单元),进而获取它的内容;
将内容保存在全局变量中;
当光标离开单元格时,执行保存事件,首先或者当前单元格数值,与之前比较,是否发生变化,如没有变化则不做操作;如果发生变化
则获取其表格主键id,传递后台进行保存。
我刚给刘松涛发了个信息,“你无不无聊 闭嘴”,
他每天都给我发信息,有时候我还在上班,有时候我在午休,也有时候我想睡觉。我真的讨厌这样子打扰别人!我知道我做的很不对,心里也有一点点抱歉。这是我的方式。
这是个令人纠结到死的问题
在gridpanel下添加下拉框,妈妈耶 超难做!祈求快点做出来吧
this.columns.add("RecId",{header:"下拉框",width:40,dataIndex:"recId",editor:new Ext.FormPanel.ComboBox({id:'statusCmb',hiddenName:'',store:com,displayField:'frmWarehouse',valueField:'id',editable:false,mode:'remote',triggerAction:'all'})});// 设置下拉框
2011年9月8日星期四 领料单行区域编辑后立即保存该功能终于实现了。。ooo
删除功能相关的函数:
,deleteRecord: function(){
var selCount=this.getSelectionModel().getCount();//獲得選擇的紀錄數
if (selCount==0) {
Ext.Msg.show({
title:'溫馨提示'
,msg: '請選擇要刪除的記錄.'
,buttons: Ext.Msg.OK
,fn: this.executeDelete
,scope:this
,icon: Ext.MessageBox.WARNING
});
} else {
Ext.Msg.show({
title:'溫馨提示'
,msg: '確定要刪除該記錄嗎?'
,buttons: Ext.Msg.YESNO
,fn: this.executeDelete
,scope:this
,icon: Ext.MessageBox.QUESTION
});
}
}
,executeDelete: function(btn) {
if (btn=='yes') {
this.stopEditing( );
Ext.MessageBox.wait("正在刪除 請稍後...");
Ext.Ajax.request({
url:"BarCode/delete.action"
,success:this.afterExecuteDeleteSuccess
,failure:this.afterExecuteDeleteFailure
,timeout:10000
,scope:this
,params:this.getSelectedRowPK()
});
}
}
,afterExecuteDeleteSuccess: function(response,options) {
Ext.MessageBox.hide();
var resp = Ext.decode(response.responseText);
if (resp.success) {
var selRecords=this.getSelectionModel().getSelections();
this.getStore().remove(selRecords);
Ext.Msg.show({title:'溫馨提示',msg:'刪除成功 !',buttons:Ext.Msg.OK,fn:Ext.emptyFn,scope:this,icon:'control-successful-icon'});
}else {
if (resp.message) {
Ext.Msg.show({title:'Error',msg:this.urldecode(resp.message),buttons:Ext.Msg.OK,fn:Ext.emptyFn,scope:this,icon:'control-failed-icon'});
} else {
Ext.Msg.show({title:'Error',msg:'刪除失敗,請與管理員聯繫.',buttons:Ext.Msg.OK,fn:Ext.emptyFn,scope:this,icon:'control-failed-icon'});
}
}
}
女人如果不幸聪明的什么都懂,那她必须懂得 怎么伪装成什么都不懂
今天开始正式入手smartclient了,刚开始觉得和jquery类似和extjs差不多,后来慢慢觉得smartclient有他的个性和特色,只是界面不太喜欢 黑乎乎的。
<html>
<head>
<title>this is a test !</title>
<SCRIPT>var isomorphicDir="../../isomorphic/";</SCRIPT>
<SCRIPT src=/isomorphic/system/modules/ISC_History.js></SCRIPT>_br/index.html> <SCRIPT src=/isomorphic/system/modules/ISC_Core.js></SCRIPT>_br/index.html> <SCRIPT src=/isomorphic/system/modules/ISC_Foundation.js></SCRIPT>_br/index.html> <SCRIPT src=/isomorphic/system/modules/ISC_Containers.js></SCRIPT>_br/index.html> <SCRIPT src=/isomorphic/system/modules/ISC_Grids.js></SCRIPT>_br/index.html> <SCRIPT src=/isomorphic/system/modules/ISC_Forms.js></SCRIPT>_br/index.html> <SCRIPT src=/isomorphic/system/modules/ISC_DataBinding.js></SCRIPT>_br/index.html> <SCRIPT src=/isomorphic/skins/SmartClient/load_skin.js></SCRIPT>_br/index.html></head>
<body>
<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=5 BORDER=0>
<TR><TD clickBtn",
left:50,
top:70,
title:"快单击我*_*",
click:"clickBtnClicked()"
})
function clickBtnClicked(){
isc.warn('单击我干嘛!');
}
function clickBtnClick(){
//如何跳转到另一个页面呢
isc.warn('想提交 没那么简单!');
}
isc.ListGrid.create({
ID: "contactsList",
left: 800, top: 50, width: 300,
fields: [
{name:"salutation", title:"Title"},
{name:"firstname", title:"First Name"},
{name:"lastname", title:"Last Name"}
]
})
//在一个form里面创建页面元素
DynamicForm.create({
ID:"pane1",
autoDraw:false,
titleOrientation:"top",
itemChange : function (){
Page.setUnloadMessage("Exiting the page now will lose changes");
},
//-----------------------------------------select 下拉框 date 日期 radioGroup单选框 checkbox 多选框 textArea 文本域 button 按钮-------------------------------------------------
fields:[
{name:"firstName", title:"姓",editorType:"select",valueMap:["王","李","张"]},
{name:"lastName", title:"名"},
{name:"birthday",title:"出生年月日",editorType:"date"},
{name:"followup",title:"性别",editorType:"radioGroup",valueMap:["猛男","靓女"]},
{name:"hobby",title:"爱好",editorType:"checkbox"},{name:"hobby",title:"爬山",editorType:"checkbox"},
{name:"remark",title:"备注",editorType:"textArea",width:250},
{name:"upload",title:"上传图片",editorType:"upload"},
{name:"submit",title:"提 交",editorType:"button",width:50,click:"clickBtnClick()"},
{name:"reset",title:"重 置",editorType:"reset",width:50}
]
});
DynamicForm.create({
ID:"pane2",
autoDraw:false,
titleOrientation:"top",
itemChange : function () {
Page.setUnloadMessage("Exiting the page now will lose changes");
},
fields:[
{name:"手机号码:", title:"手机号码"},
{name:"移动电话", title:"移动电话"},
{name:"联系地址",title:"地址"},
{name:"City",title:"所在城市"}
]
});
DynamicForm.create({
ID:"pane3",
autoDraw:false,
titleOrientation:"top",
itemChange : function (){
Page.setUnloadMessage("Exiting the page now will lose changes");//当用户填写了页面中的内容、关闭该页面的时候,弹出提示框
},
fields:[
{name:"address", title:"家庭住址"},
{name:"city", title:"所在地址"},
{name:"state", title:"婚姻状态"},
{name:"zip", title:"有小孩否"}
]
});
// whenever history is navigated, call this callback
isc.History.registerCallback("historyCallback(id)");
// on page load, restore tabset state
isc.Page.setEvent("load", "restoreTabSetState()");
function restoreTabSetState() {
isc.Log.logWarn("restoring state");
// if we have history state, our callback will fire. Otherwise, we need to inspect the URL
// to see if there's history ID in there - this is what happens when the user bookmarks one
// of the history URLs, closes the browser, opens a new one and then navigates to the bookmark.
if (!isc.History.haveHistoryState()) {
tabSet.jumpToTab(isc.History.getCurrentHistoryId() || 0);
}
}
function historyCallback(id) {
// the id is the tabNum and null is initial state - which is the first tab.
tabSet.jumpToTab(id == null ? 0 : id);
}
TabSet.create({
ID:"tabSet",
top:50,
left:180,
width:600,
height:400,
rememberHistory : true,
jumpToTab : function (tabNum) {
this.noHistory = true;
// convert string to number
this.selectTab(new Number(tabNum));
this.noHistory = false;
},
tabSelected : function (tabNum) {
if (!this.noHistory && isc.Page.isLoaded()) isc.History.addHistoryEntry(tabNum);
},
tabs:[{title:"个人资料", pane:pane1, width:70},
{title:"联系方式", pane:pane2, width:70},
{title:"隐私秘密", pane:pane3, width:70}
]
});
</script>
</body>
</html>
以上这个是本人刚接触smartclient的测试程序
小程序在火狐和IE上运行会有小小的差异,比如上载upload这个功能在火狐上运行只要单击到上载的文本框就会弹出上载的对话框,单击一次即可弹出,但是IE则不一样,他需要单击两次文本框,单击一次按钮即可上载东东咯。哈哈
这一天都没网络,文档读不懂。。。
最常见的一个语法错误是js代码中丢失逗号
这个网址还是不错滴:
http://www.smskb.com 电话预定火车票
execute
boolean execute()
throws SQLException
在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。一些预处理过的语句返回多个结果,execute 方法处理这些复杂的语句,executeQuery 和 executeUpdate 处理形式更简单的语句。
execute 方法返回一个 boolean 值,指示第一个结果的形式。必须调用 getResultSet 或 getUpdateCount 方法获取该结果,必须调用 getMoreResults 获取任何后续结果。
返回:
如果第一个结果是 ResultSet 对象,则返回 true;如果第一个结果是更新计数或者没有结果,则返回 false
抛出:
SQLException - 如果发生数据库访问错误;在关闭的 PreparedStatement 上调用此方法,或者为此方法提供了参数