ice world

There is nothing too difficult if you put your heart into it.
posts - 104, comments - 103, trackbacks - 0, articles - 0

2011年4月16日

这个问题很多小伙伴都遇到了,网上搜罗了半天也没找到太好、太完美的解决办法,有人说是因为安装IE11时联网了,导致自动打了补丁,这个补丁可以自动检查IE主页是否损坏,可以通过卸载相应的补丁解决,我同时又找到了另外一个通过修改hosts文件的方法,貌似目前解决了我的问题,修改方法如下: 使用记事本打开 C:\Windows\System32\drivers\etc\hosts 文件,在最下面追加一行: 127.0.0.1 ieonline.microsoft.com

posted @ 2016-08-12 10:47 IceWee 阅读(867) | 评论 (0)编辑 收藏

将JDK中BIN文件夹下的 msvcr71.dll 这个文件复制到 TOMCAT 中的 BIN 下

posted @ 2016-01-18 13:43 IceWee 阅读(416) | 评论 (0)编辑 收藏

有段日子没做记录了,这段日子一直在排雷(前人埋下的隐患代码,或者直接说bug),今天这个雷让我排了将近大半天,因为是正式上线的系统,只能看后台日志,不能调试,打印出的异常信息不完整,种种的条件不充分,导致问题很难定位。标题上的两个异常,第一个一看就明白是插入的数值大于数据库字段长度,第二个多是因为Number类型的字段导致,比如精度不足。

我们的这次问题原因是程序员在做除法运算时没有对除数进行非零判断,导致计算出来的数值非法,插入数据库失败,请看代码:
public static void main(String[] args) {
        
double a = 10;
        
double b = 0;
        
double c = 0;
        
        
double m = a/c;
        
double n = b/c;
        
        System.out.println(m);
        System.out.println(n);
    }

经过计算后,m和n的值分别是多少?没在实际开发中遇到的可能不知道,或者你有个好习惯不会出现这样的bug,请看结果:
Infinity
NaN

被除数非零,除数为零做除法的结果是字符串“Infinity”,翻译成中文就是“无限”,你的中学数学老师可能说过;
被除数为零,除数为零做触发的结果是字符串“NaN”,即不是有效的数字。

就是这个“Infinity”花费了我一小天的时间才定位。下面详述问题定位的方法。

异常1:ORA-01438: value larger than specified precision allowed for this column
了解点数据库的打眼一看就知道插入的数值超过了表字段长度,但你知道是哪个表哪个字段吗?我不知道,于是网上查阅了下,Oracle数据库服务器在Linux上。

命令行登陆到数据库所在服务器,进入Oracle的安装目录,假设是/opt/oracle/
进入到如下目录:/opt/oracle/admin/实例名/udump
中间的数据库实例名根据实际情况修改,udump目录下会有一堆的.trc文件,这些文件记录了所有操作当前数据库出现异常的堆栈信息。为了定位问题,我将该目录下的所有.trc文件都删除了(当然,删除之前把udump目录整个备份了),再进行一次系统的业务操作,查看一下udump目录,发现立刻生成一个新 的.trc文件,打开查看(内容片段):
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning
, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
ORACLE_HOME 
= /u01/app/oracle/product/10.2/db_1
System name:    AIX
Node name
:    gsdj1
Release
:    1
Version
:    6
Machine
:    00CFD4644C00
Instance name
: bjwd1
Redo thread mounted by this instance: 1
Oracle process number
: 132
Unix process pid
: 48300280, image: oracle@gsdj1

*** SERVICE NAME:(bjwd) 2014-03-28 16:48:05.683
*** SESSION ID:(2969.439612014-03-28 16:48:05.683
*** 2014-03-28 16:48:05.683
ksedmp
: internal or fatal error
ORA
-01438: value larger than specified precision allowed for this column
Current SQL statement 
for this session:
insert into CP_TEMP_STOCKTRAN (APPLY_ID, ALIEN, CER_TYPE, CER_NO, TRANS_AM, TRANS_AM_PR, TRANS_TYPE, TRANS_DATE, ENDORSOR, BLIC_TYPE, ALIEN_ID, ENDORSOR_ID, STOCKTRAN_ID) values (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13)

黄色背景红色字体的SQL就是罪魁祸首,这仅仅能定位发生问题的数据库表,字段还得自己排查。异常1让我定位到了这里,这时想起了异常2。


异常2: Could not synchronize database state with session
之前也搜索过这个异常,多数是由于Number类型的字段导致。冷静的思考一下,平常我们在做表设计时,会把文字类型的字段设置大一些,Number类型的精度也会根据实际业务进行设计,但往往Number类型的字段最容易出问题:
1、如果将非Number值插入该字段,比如字符串
2、如果插入的数值精度过多,如字段设计Number(10,2),也就是最大支持8为整数和两位小数,要插入34.121313就会失败

根据表名定位到hibernate的映射文件以及实体类,再从业务功能入口(一个action方法)搜索,终于定位到一个业务接口做了该实体类的保存代码,定位到了那个字段,定位到了做除法没有判断除数是否为0。








posted @ 2014-03-28 18:54 IceWee 阅读(831) | 评论 (0)编辑 收藏

网络配置:
临时(重丢失)
ifconfig eth0 192.168.1.xxx netmask 255.255.xxx.0


永久(重启有效)
vi /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
        address 192.168.1.xxx
        netmask 255.255.xxx.0
        network 192.168.1.1
        broadcast 192.168.1.255
        gateway 192.168.1.1
        
# dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 202.106.196.115


由于非法关机导致重启后无法联网

ifconfig eth0 192.168.1.xxx netmask 255.255.xxx.0 

route add default gw 192.168.1.1

重启后配置丢失,所以必须在重启之前执行:
apt-get update

apt-get install ifupdown

不能联网是因为非法关机导致ifup脚本丢失





posted @ 2014-01-24 10:50 IceWee 阅读(869) | 评论 (0)编辑 收藏

源机器:192.168.1.1
备份机器:192.168.1.2

前提条件:
1、两台机器的网络是连通的
2、两台机器必须同时安装了SVN服务器

假设:
源机器上需要同步的库名为autoSync,访问地址为:svn://192.168.1.1/autoSync,对其具备读写权限的账户:sync/sync

备份机器配置:
1、创建与源机器库名相同的空库
# 假设备份机器的SVN根目录建立在 /home/backup/svn/repository下
svnadmin create /home/backup/svn/repository/autoSync

2、配置备份机器上的autoSync
分别修改conf下的svnserve.conf、passwd、authz,根据实际情况配置,假设创建了用户sync/sync,对库autoSync具备读写权限,配置方法略,配置完成后启动SVN服务

3、创建并修改pre-revprop-change文件
cd /home/backup/svn/repository/autoSync/hooks
cp pre
-revprop-change.tmpl pre-revprop-change
vi pre-revprop-change

将文件末尾的“exit 1”改为“exit 0”即可,保存退出
REPOS="$1"
REV
="$2"
USER
="$3"
PROPNAME
="$4"
ACTION
="$5"

if
[ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

echo
"Changing revision properties other than svn:log is prohibited" >&2
exit
0

增加可执行权限
chmod 755 pre-revprop-change

4、初始化
命令:
svnsync init --username 用户名 --password 密码 备份机器库URL 源机器库URL

说明:
用户名和密码是对源机器SVN库具备读写权限的SVN用户

示例:
svnsync init --username sync --password sync svn://192.168.1.2/autoSync svn://192.168.1.1/autoSync

5、首次同步
首次同步即为一次全备份过程,在此期间请停止客户端段源机器哦一切操作(提交代码等)
命令:
svnsync sync 备份机器库URL
示例:
svnsync sync svn://192.168.1.2/autoSync

源机器配置
6、增量自动同步配置
创建并修改post-commit文件
# 假设源机器的SVN根目录建立在 /home/svn/repository下
cd /home/svn/repository/autoSync/hooks
cp post
-commit.tmpl post-commit
vi post
-commit

在文件末尾追加:svnsync sync --non-interactive 备份机器库URL --username 用户名 --password 密码

说明:
用户名和密码是对备份机器SVN库具备读写权限的SVN用户

示例:
svnsync sync --non-interactive svn://192.168.1.2/autoSync --username sync --password sync

7、术语
配置完成,今后客户端再向SVN(192.168.1.1)提交文件时,会自动触发源机器(192.168.1.1)向备份机器(192.168.1.2)提交更新

8、版本库UUID一致性
首先查看源机器库的UUID,假设得到的是:fcdcbee9-6be3-4575-8d4a-681ec15ad8e0
svnlook uuid svn://192.168.1.1/autoSync

更新备份机器库的UUID为源机器库的UUID
svnadmin setuuid svn://192.168.1.2/autoSync fcdcbee9-6be3-4575-8d4a-681ec15ad8e0




posted @ 2014-01-23 11:08 IceWee 阅读(616) | 评论 (0)编辑 收藏

本文记录的安装步骤是基于基本安装后的Debian,启动后漆黑一片,只有命令行,采用在线安装方式,因此配置中国的镜像软件源能提高软件的下载速度,首先配置软件源。

备份源文件
# cp /etc/apt/sources.list /etc/apt/sources.list.bak

编辑源文件
# nano /etc/apt/sources.list

注释掉本地光盘源这一行,注释后如:
# deb cdrom:[Debian GNU/Linux 6.0.7 _Squeeze_ - Official amd64 NETINST Binary-1 20130223-18:50]/ squeeze main

取消下面两行官方源前面的注释
deb http://security.debian.org/ squeeze/updates main
deb-src http://security.debian.org/ squeeze/updates main

追加163的镜像源地址
deb http://mirrors.163.com/debian/ squeeze main non-free contrib
deb http://mirrors.163.com/debian/ squeeze-proposed-updates main contrib non-free
deb http://mirrors.163.com/debian-security/ squeeze/updates main contrib non-free
deb-src http://mirrors.163.com/debian/ squeeze main non-free contrib
deb-src http://mirrors.163.com/debian/ squeeze-proposed-updates main contrib non-free
deb-src http://mirrors.163.com/debian-security/ squeeze/updates main contrib non-free
deb http://ftp.sjtu.edu.cn/debian/ squeeze main non-free contrib
deb http://ftp.sjtu.edu.cn/debian/ squeeze-proposed-updates main contrib non-free
deb http://ftp.sjtu.edu.cn/debian-security/ squeeze/updates main contrib non-free
deb-src http://ftp.sjtu.edu.cn/debian/ squeeze main non-free contrib
deb-src http://ftp.sjtu.edu.cn/debian/ squeeze-proposed-updates main contrib non-free
deb-src http://ftp.sjtu.edu.cn/debian-security/ squeeze/updates main contrib non-free

保存修改
# ctrl + o 回车
退出
# ctrl + x

更新源
# apt-get update

更新系统
# apt-get upgrade

安装SVN服务器
# apt-get install subversion subversion-tools

安装完成后可以运行命令查看SVN服务器版本信息
# svnserve --version

配置SVN
首先创建版本库的根目录,如位置:/home/svn/repository,所有项目都将在该目录下创建相应子文件夹
# mkdir –p /home/svn/repository

创建项目版本库test(仅为演示)
# svnadmin create /home/svn/repository/test


修改SVN配置文件
nano /home/svn/repository/test/conf/svnserve.conf

以下为文件内容:
### This file controls the configuration of the svnserve daemon, if you
### use it to allow access to this repository.  (If you only allow
### access through http: and/or file: URLs, then this file is
### irrelevant.)

### Visit http://subversion.tigris.org/ for more information.

[general]
### These options control access to the repository for unauthenticated
### and authenticated users.  Valid values are "write", "read",
### and "none".  The sample settings below are the defaults
# 未授权配置为禁止访问none,已授权配置为可以读写write
anon-access = none
auth-access = write
### The password-db option controls the location of the password
### database file.  Unless you specify a path starting with a /,
### the file's location is relative to the directory containing
### this configuration file.
### If SASL is enabled (see below), this file will NOT be used.
### Uncomment the line below to use the default password file.
# 用户数据库文件,配置授权用户,当前使用的文件是和svnserve.conf在相同目录下的passwd文件,也可以指定其他绝对路径文件,如:/home/svn/passwd
password-db = passwd
### The authz-db option controls the location of the authorization
### rules for path-based access control.  Unless you specify a path
### starting with a /, the file's location is relative to the the
### directory containing this file.  If you don't specify an
### authz-db, no path-based access control is done.
### Uncomment the line below to use the default authorization file.
# 授权文件,配置如同用户配置
authz-db = authz
### This option specifies the authentication realm of the repository.
### If two repositories have the same authentication realm, they should
### have the same password database, and vice versa.  The default realm
### is repository's uuid.
# realm = My First Repository

[sasl]
### This option specifies whether you want to use the Cyrus SASL
### library for authentication. Default is false.
### This section will be ignored if svnserve is not built with Cyrus
### SASL support; to check, run 'svnserve --version' and look for a line
### reading 'Cyrus SASL authentication is available.'
# use-sasl = true
### These options specify the desired strength of the security layer
### that you want SASL to provide. 0 means no encryption, 1 means
### integrity-checking only, values larger than 1 are correlated
### to the effective key length for encryption (e.g. 128 means 128-bit
### encryption). The values below are the defaults.
# min-encryption = 0
# max-encryption = 256


保存
# ctrl + o 回车

退出
# ctrl + x

配置用户
# nano passwd

以下为文件内容:
### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.

[users]
# harry = harryssecret
# sally = sallyssecret
IceWee = IceWee

增加用户IceWee,密码也为IceWee,=号两侧需要有空格,保存(ctrl + o 回车)退出(ctrl + x)

配置访问权限
# nano authz

以下为文件内容:
### This file is an example authorization file for svnserve.
### Its format is identical to that of mod_authz_svn authorization
### files.
### As shown below each section defines authorizations for the path and
### (optional) repository specified by the section name.
### The authorizations follow. An authorization line can refer to:
###  - a single user,
###  - a group of users defined in a special [groups] section,
###  - an alias defined in a special [aliases] section,
###  - all authenticated users, using the '$authenticated' token,
###  - only anonymous users, using the '$anonymous' token,
###  - anyone, using the '*' wildcard.
###
### A match can be inverted by prefixing the rule with '~'. Rules can
### grant read ('r') access, read-write ('rw') access, or no access
### ('').

[aliases]
# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average

[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe
developers = IceWee

# [/foo/bar]
# harry = rw
# &joe = r
# * =

# [repository:/baz/fuz]
# @harry_and_sally = rw
# * = r

[/]
* = r
IceWee = rw
@developers = rw

[/tags]
IceWee = rw

默认所有用户可读取根,IceWee可以读写根。可以分别对子目录进行授权,如上的tags目录,IceWee具有读写权限,以及IceWee所在的组developers也具备读写权限。

启动SVN服务器
# svnserve -d -r /home/svn/repository
-d含义为后台运行(daemon),-r指定的根目录,如访问test应该使用这样的地址 svn://hostname:port/test

停止SVN服务
# killall svnserve

备份还原命令,与oracle的备份有些类似
导出
# svnadmin dump /home/svn/repository/test > /home/bak/test.dump

导入
# svnadmin load /home/svn/repository/demo < /home/bak/demo.dump
导入前提:
必须先创建要导入版本库目录,如上的demo,则需要做以下操作
# svnadmin create /home/svn/respository/demo
修改svnserve.conf、passwd、authz等文件,前面已介绍


 





posted @ 2014-01-17 15:48 IceWee 阅读(1190) | 评论 (0)编辑 收藏


2013年12月10日
---------------------------
冒泡排序
void bubble(int[] array) {
       
boolean swaped = true;
       
for (int t = 1; t < array.length && swaped; t++) {
            swaped
= false;
           
for (int i = 0; i < array.length - t; i++) {
               
if (array[i] > array[i + 1]) {
                  
int temp = array[i];
                    array[i]
= array[i + 1];
                    array[i
+ 1] = temp;
                    swaped
= true;
                }

            }

        }

    }


2013年11月26日
---------------------------
1、String的split方法
平常总是这样用,String str = "a,b,c,d,e"; String[] arr = str.split(",");
其实还可以这样用,String lan = "Java;C#?C++:C"; String si = lan.split("[;?:]"); 返回的是字符串数组{"Java", "C#", "C++", "C"}


2013年11月21日
---------------------------

1、Java对象池知多少?
示例:String s1 = "abc"; String s2 = "abc"; s1 == s2 返回ture还是false?只要不是new出来的都先从对象池中读取,因此结果为true,两个变量指向的是同一块内存空间地址。

Java除了String类使用了对象池以外,还有5个基本类型的封装类:Byte、Short、Integer、Long和Character,例如:Integer inA = 20; Integer inB = 20; 那么 inA == inB 的结果为true,其他类与此相同,不做示例。

特别注意:
(1)浮点型的两个封装类Float和Double并没有参与对象池;
(2)整形封装类(Byte、Short、Integer和Long)只有数值小于或等于127时才使用对象池,例如:Integer x = 128; Integer y = 128; x == y的结果为false。

2、Java变量命名规范
A. String #name = "Joe";
B. int $age = 30;
C. Double _height = 174.4;
D. float ~temp = 37.6;
以上A到D,哪个无法通过编译?答案是A和D,因为Java变量名只允许字母、下划线(_)、美元符($)开头,那么 int _ = 30; String $$ = "I DO";可以吗?答案是完全可以,但很少有人这样定义变量名,虽然没有违法命名规范,但最后我估计程序员自己都会被自己绕晕。

3、0和1能标识布尔值吗?
int flag = 0;
if (flag) {
    System.out.print("error");
}
error会打印吗?不会,因为根本就不会编译通过,编译器会提示flag是int类型而不是boolean类型,如果你会有这种想法可能之前学过C,C总的0和1可以标识布尔的。

4、静态导入
例:
ClassA.java
package bing.test.sub1;

public class ClassA {
  
public static final int MAX_INT = Integer.MAX_VALUE;
}



ClassB.java
package bing.test.sub2;

import static bing.test.sub1.ClassA.MAX_INT;

public class ClassB {
 
public static void main(String[] args) {
System.out.println(MAX_INT);
  }

}

输出:2147483647。不仅仅可以静态导入其他类的静态属性还可以导入静态方法,这些特性在实际开发中很少见。









posted @ 2013-11-21 12:49 IceWee 阅读(448) | 评论 (0)编辑 收藏

Apache Commons的FTPClient局域网上传文件速度本应该很快的,但却在实际开发中发现上传一个文件蜗牛速度,都是因为调用了如下API:

ftpClient.storeFile(fileName, inputStream)

原因是因为默认缓冲区大小是1024,也就是1K,当然慢了,在调用上传API之前重新修改以下默认设置即可,如将缓冲区改为10M,API:

ftpClient.setBufferSize(1024 * 1024 * 10)

posted @ 2013-09-13 16:32 IceWee 阅读(6668) | 评论 (0)编辑 收藏

第一步,查询锁表信息
--查询被锁住的数据库对象
select object_name, machine, s.sid, s.serial#
 
from v$locked_object l, dba_objects o, v$session s
where l.object_id = o.object_id
  
and l.session_id = s.sid;


第二步,杀死数据库会话
--杀死数据库会话
alter system kill session '207,707'; -- 207为SID, 707为SERIAL#


第三步,如果第二步无法杀死会话,报ORA-00031,那么只能杀死UNIX/LINUX系统进程了
--查询当前操作的系统进程ID
select spid, osuser, s.program
 
from v$session s, v$process p
where s.paddr = p.addr
  
and s.sid = 207; -- 207为SID


第四步,根据查询到的系统PID,杀掉进程
kill -9 24664 // 24664为UNIX/LINUX系统进程ID



posted @ 2013-08-23 10:20 IceWee 阅读(507) | 评论 (0)编辑 收藏

     摘要: 备用。Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;...  阅读全文

posted @ 2013-07-27 11:53 IceWee 阅读(1416) | 评论 (0)编辑 收藏

Java获取本地IP地址方法网上搜一箩筐,但基本上都是获得一个IP,实际开发中一台电脑很可能有多个IP地址,如多网卡,或者安装了VM Ware虚拟机,就会虚拟出其他的网卡,那么传统的方法得到的一个IP地址就不全面了,下面贴出获取本机IP列表的方法:
/**
     * IceWee 2013.07.19
     * 获取本地IP列表(针对多网卡情况)
     *
     * 
@return
     
*/

    
public static List<String> getLocalIPList() {
        List
<String> ipList = new ArrayList<String>();
        
try {
            Enumeration
<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
            NetworkInterface networkInterface;
            Enumeration
<InetAddress> inetAddresses;
            InetAddress inetAddress;
            String ip;
            
while (networkInterfaces.hasMoreElements()) {
                networkInterface 
= networkInterfaces.nextElement();
                inetAddresses 
= networkInterface.getInetAddresses();
                
while (inetAddresses.hasMoreElements()) {
                    inetAddress 
= inetAddresses.nextElement();
                    
if (inetAddress != null && inetAddress instanceof Inet4Address) // IPV4
                        ip = inetAddress.getHostAddress();
                        ipList.add(ip);
                    }

                }

            }

        }
 catch (SocketException e) {
            e.printStackTrace();
        }

        
return ipList;
    }




posted @ 2013-07-19 11:10 IceWee 阅读(4336) | 评论 (1)编辑 收藏

项目开发组建立后一般要统一开发环境,一般是指开发环境,开发工具的版本和设置,其中编码设置是个较为重要的部分,其重要性不言而喻。以下为eclipse编码设置方法(将默认编码改为UTF-8为例):

1.工作空间的编码(这样以后新建的文件也是新设置的编码格式) 
   
eclipse->window->preferences->General->workspaceTypes->Other->UTF-8->OK

2.工程的编码

Project->Properties->General->Resource->Other->UTF-8->OK

3.某类文件的编码
 
eclipse->window->preferences->General->Content Types->右侧找到需要修改的文件的类型(如JAVA,JSP等)->在下面的Default encoding,输入框中输入UTF-8->点击Update->OK

4、单个文件的编码
 
在包资源管理器视图,右键点击文件->属性,改变文本文件编码格式为UTF-8

posted @ 2013-06-17 14:15 IceWee 阅读(801) | 评论 (0)编辑 收藏

进来的看官使用的是win7吧?!是64位的吧!?安装了eclipse的subclipse插件了吧!每次用到SVN插件时都会弹出如下的对话框,虽然不影响使用但是很不爽是不是啊?LZ也是一个有丁点儿强迫症的人,我想干掉这个弹出框!

稍后上图,服务器估计挂了!!

解决方法:
Window-Preferences-Team-SVN,在SVN接口的下拉框可以看到,默认选择的是JavaHL(JNI) Not Available,手动更改为SVNKit(Pure Java) SVNKit v1.3.5.7406,OK,enjoy it!

错误提示框:


修改前:


修改后:

posted @ 2013-03-18 15:13 IceWee 阅读(78841) | 评论 (6)编辑 收藏

一、Redhat上VNC Server配置
本文以当前Linux系统未安装VNC服务器为基本,如果已安装请跳过第1节!

前提:
1.连接到互联网,将使用yum在线安装VNC服务器
2. 确认 SSH 在运行

1.安装 TigerVNC Server

# yum search tigervnc-server


返回大概如下内容:

tigervnc-server.x86_64 : A TigerVNC Server
tigervnc-server-applet.noarch : Java TigerVNC Viewer applet for TigerVNC Server
tigervnc-server-module.x86._
64 : TigerVNC Mode to Xorg
...


第一行即是我们要安装的VNS服务器,第二行是客户端,执行

# yum install tigervnc-server.x86_64


回车后会有一次安装确认,输入y后回车即可安装,安装完毕后返回到命令行输入光标,执行

# vncserver


会提示输入验证密码,至少6位,该密码是客户端连接时用到的。


2.配置图形界面
修改配置文件,激活图形界面,执行命令:

# vi /root/.vnc/xstartup


注释掉这行

#twm & // 注释该行


末尾增加一行

gnome-session & // 增加该行


保存退出


3.启动VNC服务
执行命令

# /etc/init.d/vncserver start

# service vncserver start


启动后提示:

Starting VNC server: no displays configured [FAILED]


解决方法:
执行命令

# vim /etc/sysconfig/vncservers


修改最后两行如:

VNCSERVERS="1:root"
VNCSERVERARGS
[1]="-geometry 1024x768"


说明:

第一行为服务配置,当前只配置了一个VNC服务,使用用户root启动,如果还需要使用其他用户登陆,可以修改VNCSERVERS的值如:“1:root 2:tiger”(tiger为系统另一存在用户)。第二行可以注释,是配置窗口分辨率的,需要去掉后面的-localhost


VNC Server随系统自动启动
执行命令

# sudo chkconfig --level 345 vncserver on


4.停止VNC服务

执行命令

# /etc/init.d/vncserver stop

# service vncserver stop


二、Windows借助VNC Viewer访问Linux
首先安装RealVNC,从互联网下载获得
开始 - Run VNC Viewer,输入IP地址,后面的:1代表使用root用户登陆,在RH上配置的1:root,如果想使用其他用户登陆则调整冒号后的数字即可,密码就是先前配置的。
 


解决连接不上问题的方法

执行命令,查看VNC监听的端口是什么,在防火墙中开放端口即可

# netstat -ntupl|grep vnc


返回列表如:

1. tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 4411/Xvnc 
2. tcp 0 0 0.0.0.0:6001 0.0.0.0:* LISTEN 4411/Xvnc 
3. tcp 0 0 :::6001 :::* LISTEN 4411/Xvnc


修改防火墙配置文件,开放5901端口即可

# vi /etc/sysconfig/iptables


可以复制22端口一行,黏贴修改即可,重新启动防火墙服务

# service iptables restart


 


 

posted @ 2013-02-22 17:46 IceWee 阅读(21920) | 评论 (2)编辑 收藏

基本信息
操作系统:CentOS Release 6.3 (Final)
内核版本:Kernel Linux 2.6.32-279.el6.x86_64
JDK版本:Oracle ®Java SE Development Kit 7u15 (1.7.0_15-b03)
JBoss版本:JBoss Application Server 7.1.1
安装包: jdk-7u15-linux-x64.rpm、jboss-as-7.1.1.Final.zip

安装准备
上传安装文件
将JDK和JBoss安装文件(先解压成目录)上传到服务器,目录随意,如:/home/下

开始安装
JDK安装
使用root登陆系统,打开命令行窗口,先为安装文件授权

# chmod 755 jdk-7u15-linux-x64.rpm


执行安装

# rpm -ivh jdk-7u15-linux-x64.rpm


自动安装到目录 /usr/java 下

 

JDK配置
Root登陆执行

# vi /etc/profile


增加下面内容

JAVA_HOME=/usr/java/jdk1.7.0_15
CLASSPATH
=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
PATH
=$JAVA_HOME/bin:$PATH


保存退出,执行如下命令立即生效以上环境配置

# source /etc/profile


JDK版本检测,执行:

# java – version

返回JDK版本信息

JBoss安装
JBoss为绿色版本,不需要安装,解压即可使用,和Tomcat一样,下面将JBoss目录移动到一个相对规范的位置,Root登陆执行

# mv /home/jboss-as-7.1.1.Final /usr/jboss-as-7.1.1.Final


OK,安装完毕,配置一下环境变量,执行

# vi /etc/profile


增加下面内容

JBOSS_HOME=/usr/jboss-as-7.1.1.Final


启动服务

# /usr/jboss-as-7.1.1.Final/bin/standalone.sh

访问,在浏览器地址栏中输入:http://127.0.0.1:8080,出现欢迎界面,证明启动成功!

停止服务
可以在启动终端窗口按键 CTRL + C,即可完全停止JBoss服务

局域网访问
http://xxx.xx.xx.xxx:8080是不能访问的,如果想让局域网内的其他机器访问必须要修改JBoss配置,方法如下:
编辑jboss-as-7.1.1.Final\standalone\configuration\standalone.xml,找到

<interface name="public">
    <inet-address value
="${jboss.bind.address:127.0.0.1}"/>
</interface>


127.0.0.1修改为JBoss所在机器的IP地址即可,但是依旧无法访问,是因为Linux防火墙没有开放8080端口,执行:

# vi /etc/sysconfig/iptables


发现有一行

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
复制它把22改成8080追加该行后面保存退出!

创建管理员用户

# ./add-user.sh

 

What type of user do you wish to add?
 a) Management User (mgmt-users.properties)
 b) Application User (application-users.properties)
(a):

回车

Enter the details of the new user to add.
Realm (ManagementRealm) :                      //回车,默认
Username :                                               // 管理员用户名,如:admin
Password :                                                // 管理员密码,如:jboss
Re-enter Password :                                  // 重复密码


管理员控制台访问

http://127.0.0.1:9990/console
如果也想在其他局域网机器上访问管理员控制台,防火墙需要开放端口9990,修改standalone.xml

<interface name="management">
  <inet-address value
="${jboss.bind.address.management:127.0.0.1}"/>
</interface>


同样将127.0.0.1修改为JBoss所在机器的IP地址

posted @ 2013-02-22 17:12 IceWee 阅读(5017) | 评论 (0)编辑 收藏

1、先用system和密码登陆SQLPLUS(如果不能直接以sys登陆到sqlplus的话),进入到sql*plus之后,可以通过conn /as sysdba转变为sysdba身份连接到数据库
2、开始修改编码
shutdown immediate;  // 停止oracle服务以及监听。如果服务停止,这部可省略
startup mount;
alter system enable restricted session;
alter system set job_queue_processes=0; // 初始化设置job
alter database open;
alter database character set internal_use utf8; //设置编码 (alter database character set internal_use ZHS16GBK;)(alter database character set internal_use WE8ISO8859P1;)
shutdown immediate;  // 关闭
startup;  // 重启
至此编码已经设置完成。

posted @ 2013-02-21 16:01 IceWee 阅读(300) | 评论 (0)编辑 收藏



基本信息
WLS版本:Oracle ® Weblogic Server 11g Release 1 (10.3.6)
安装包: jrockit-jdk1.6.0_37-R28.2.5-4.1.0-linux-x64.bin、wls1036_generic_x64.jar
操作系统:CentOS Release 6.3 (Final)
内核版本:Kernel Linux 2.6.32-279.el6.x86_64
JDK版本:Oracle ®JRockit JDK R28.2.5 for Java SE 6 (1.6.0_37)

安装准备
上传安装文件
将JDK和
WLS安装文件上传到服务器,目录随意,如:/home/下

开始安装
JDK安装
使用root登陆系统,打开命令行窗口,先为安装文件授权,自行进入安装文件所在目录,执行

# chmod a+x jrockit-jdk1.6.0_37-R28.2.5-4.1.0-linux-x64.bin


执行安装命令

# ./ jrockit-jdk1.6.0_37-R28.2.5-4.1.0-linux-x64.bin


弹出安装图形界面
 


Next


默认安装路径在root/jrockit-…,依个人习惯进行修改


保持默认,Next


Done


安装完成后在命令行执行命令查看安装JDK版本信息,执行
# java -version

如图

JDK配置
执行
# vi /etc/profile

在export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL上面增加下面内容
export JAVA_HOME=/usr/java/jrockit-jdk1.6.0_37-R28.2.5-4.1.0 
export PATH
=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH 
export CLASSPATH
=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

保存退出,执行如下命令立即生效以上环境配置
# source /etc/profile


WLS安装
为全部用户授权,让全部用户具备执行安装文件的权限(Linux比较墨迹,习惯就好了),执行
# chmod a+x wls1036_generic_x64.jar

执行安装命令
# java –jar wls1036_generic_x64.jar

弹出图形化安装界面


Next


默认安装路径 /root/Oracle/middleware,可根据个人习惯修改,Next


取消勾选“I wish to…”,Next


取消勾选“I wish to…”,Continue


Yes


保持默认,典型安装,Next


默认选择上文配置好的JDK,Next


Next


Next


安装过程中


Done


弹出QUICKSTART窗口,点击“Getting started with…”


可以新建域或扩展已存在的,Next


Next


根据实际情况修改域名称,Next


输入管理员密码,要求8位以上,为了好记示例中用了weblogic11,Next


Next


Next


Create





配置完成


启动服务器
示例:
# cd /opt/oracle/Middleware/user_projects/domains/vcl_domain/bin
# ./startWebLogic.sh &

启动完成后可以进入管理员控制台部署WEB项目等操作,帐号weblogic/weblogic11
http://xxx.xxx.xx.xx:7001/console







posted @ 2013-02-18 17:02 IceWee 阅读(2869) | 评论 (1)编辑 收藏

基本信息

操作系统:CentOS Release 6.3 (Final)
内核版本:Kernel Linux 
2.6.32-279.el6.x86_64
Oracle版本:Oracle 11g Release2
安装包:linux.x64_11gR2_database_1of2.zip、linux.x64_11gR2_database_2of2.zip


安装准备

上传安装文件

将两个压缩文件覆盖解压后得到文件夹database,借助SSH工具上传到服务器上,目录如:/home/database

创建组

# groupadd dba
# groupadd oinstall

 
创建用户
 

# useradd –g oinstall –G dba oracle

 
修改用户密码  

# passwd oracle


创建安装目录

# mkdir -p /opt/oracle/product/11.2/db_1

# mkdir -p /opt/oraInventory

# mkdir -p /opt/oracle/oradata

# mkdir -p /var/opt/oracle


设置目录的所有者、所属组和权限

# chown -R oracle.oinstall /opt/oracle

# chown -R oracle.oinstall /opt/oracle/oradata

# chown -R oracle.oinstall /opt/oracle/product/11.2/db_1

# chown -R oracle.dba /opt/oraInventory

# chown oracle.dba /var/opt/oracle

# chmod -R 775 /opt/oracle

# chmod -R 755 /var/opt/oracle


设置用户oracle的环境变量

# su – oracle
# vim /home/oracle/.bash_profile


在文件中添加如下:

export ORACLE_BASE=/opt/oracle

export ORACLE_HOME
=$ORACLE_BASE/product/11.2/db_1

export ORACLE_SID
=orcl

export ORACLE_OWNER
=oracle

export ORACLE_TERM
=vt100

export PATH
=$PATH:$ORACLE_HOME/bin:$HOME/bin

export PATH
=$ORACLE_HOME/bin:$PATH

LD_LIBRARY_PATH
=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib

export LD_LIBRARY_PATH

CLASSPATH
=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

CLASSPATH
=$CLASSPATH:$ORACLE_HOME/network/jlib

export CLASSPATH

PATH
=$PATH:/usr/sbin; export PATH

PATH
=$PATH:/usr/bin; export PATH

ORA_NLS33
=$ORACLE_HOME/nls/admin/data


保存退出,执行以下命令使得配置立刻生效或使用Oracle重登陆系统

# source $HOME/.bash_profile

 
开始安装

进入数据库安装文件(database文件夹)所在目录,如:/home/,为所有用户授权

# chmod –R 777 database

 

切换到oracle用户,使用oracle重登陆或使用下面命令切换用户

# su – oracle

 

进入database目录,运行安装文件开始安装

# ./runInstaller


进入图形化界面,一步步安装,取消勾选I wish…(依照个人),点击Next,弹出确认框再点Yes


三选一界面,选择第二项:Install database software only


保持默认:Singel instance database installation,点击Next
 
 
选择产品语言,默认英语,附加选择了简体中文,点击Next


选择数据库版本,默认企业版,点击Next


配置Oracle安装目录,由于安装前环境变量的配置,安装程序自动读取配置,自动选择好了Oracle Base和Software Location如图所示,点Next


同上,Oracle Inventory Directory目录也自动选择好了,oraInventory Group Name选择安装前创建的组dba,点击Next


保持默认,两个组都选择的dba,点击Next


装检查中


查结束,不满足条件列表


解决以上错误,新建命令行窗口,切换到root用户,需要输入root的密码

# su – root

修改进程数和最大会话数的设置,执行
# vi /etc/security/limits.conf

(在该文件的最后追加下面四行)
oracle   soft    nproc   2047
oracle   hard    nproc  
16384
oracle   soft    nofile
  1024
oracle   hard    nofile  
65536

系统内核参数设置
# vi /etc/sysctl.conf

(在该文件后追加以下内容)
kernel.sem = 250 32000 100 128
net
.ipv4.ip_local_port_range = 9000 65500
fs
.file-max = 6815744
net
.core.rmem_default = 262144
net
.core.rmem_max = 4194304
net
.core.wmem_default = 262144
net
.core.wmem_max = 1048576
fs
.aio-max-nr = 1048576

保存退出,立即生效执行:
# cd /etc
# sysctl -p

安装以下列表中的包(使用yum在线安装),其中pdksh-5.2.14没有找到,不安装也没有问题
-libaio-0.3.105(i386)
-libaio-devel-
0.3.105(i386)
-libaio-devel-
0.3.105(x86_64)
-glibc-
2.3.4-2.41(i686)
-compat-libstdc++-
33-3.2.3(i386)
-compat-libstdc++-
33-3.2.3(x86_64)
-gcc-c++-
3.4.6(x86_64)
-elfutils-libelf-devel-
0.97(x86_64)
-libgcc-
3.4.6(i386)
-libstdc++-
3.4.6(i386)
-unixODBC-
2.2.11(i386)
-unixODBC-
2.2.11(x86_64)
-unixODBC-devel-
2.2.11(i386)
-unixODBC-devel-
2.2.11(x86_64)
-pdksh-
5.2.14(x86_64)

以上步骤完成后点击按钮Check Again,发现不满足列表并没有清除,而是少了一些,此时勾选右侧复选框Ignore all即可向下安装了,直到安装完成。


安装监听器

使用oracle用户登陆系统或在命令行窗口切换到oracle用户,执行
# netca

进入图形化配置,直接默认下一步,到最后完成,其中你也可以修改监听去的名称,协议,端口。




 








 




安装完成后可以使用如下命令来查看监听是否配置成功
# ps –ef


安装数据库程序

执行

# dbca


进入图形化配置界面,几乎全Next








配置全局数据库名称,如果该服务器只安装这一个数据库建议使用orcl,鉴于习惯作




备配置四个内置超级管理员密码,建议统一密码,便于记忆用

提示密码过于简单,不管它,点击Yes














到这数据库实例就算创建完成了!并且会自动启动!
PS:10g客户端连接11g服务器需要手动修改客户端文件,如下:

X:\oracle\product\10.2.0\client_1\network\ADMIN


文件名:
tnsnames.ora
修改前不要忘记备份原文件,手动配置要连接的11g数据库连接信息,如:

ORCL_11g =
  (DESCRIPTION
=
    (ADDRESS_LIST
=
      (ADDRESS
= (PROTOCOL = TCP)(HOST = 172.25.78.88)(PORT = 1521))
    )
    (CONNECT_DATA
=
      (SID
= orcl)
      (SERVER
= DEDICATED)
    )
  )


其中:
ORCL_11g为本地连接服务名
172.25.78.88为数据库所在服务器IP
你会发现CONNECT_DATA内部和10g的配置不同,这就是区别,导致PL/SQL连不上11g




 

posted @ 2013-01-30 16:56 IceWee 阅读(19772) | 评论 (2)编辑 收藏

 
此问题一般发生在Myeclipse 保存文件并自动部署时候。
Errors occurred during the build.
Errors running builder 'DeploymentBuilder' on project '项目名'.
java.lang.NullPointerException

有一种产生此错误的原因是因为此项目不不是由myeclipse创建的。
所以你需要检查.project 文件。
并且添加 <nature>com.genuitec.eclipse.j2eedt.core.webnature</nature>


然后重新打开项目。

posted @ 2012-09-27 10:27 IceWee 阅读(9142) | 评论 (0)编辑 收藏

出现以下异常信息,一般删除下Tomcat的work目录即可
严重: IOException while loading persisted sessions: java.io.EOFException
java
.io.EOFException
    at java
.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280)
    at java
.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
    at java
.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
    at java
.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
    at org
.apache.catalina.util.CustomObjectInputStream.<init>(CustomObjectInputStream.java:58)
    at org
.apache.catalina.session.StandardManager.doLoad(StandardManager.java:246)
    at org
.apache.catalina.session.StandardManager.load(StandardManager.java:204)
    at org
.apache.catalina.session.StandardManager.startInternal(StandardManager.java:491)
    at org
.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org
.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5282)
    at org
.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org
.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
    at org
.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
    at org
.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
    at org
.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:649)
    at org
.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1585)
    at java
.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java
.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java
.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java
.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java
.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java
.lang.Thread.run(Thread.java:662)
2012-7-12 10:08:04 org.apache.catalina.session.StandardManager startInternal
严重
: Exception loading sessions from persistent storage
java
.io.EOFException
    at java
.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280)
    at java
.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
    at java
.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
    at java
.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
    at org
.apache.catalina.util.CustomObjectInputStream.<init>(CustomObjectInputStream.java:58)
    at org
.apache.catalina.session.StandardManager.doLoad(StandardManager.java:246)
    at org
.apache.catalina.session.StandardManager.load(StandardManager.java:204)
    at org
.apache.catalina.session.StandardManager.startInternal(StandardManager.java:491)
    at org
.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org
.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5282)
    at org
.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org
.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
    at org
.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
    at org
.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
    at org
.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:649)
    at org
.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1585)
    at java
.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java
.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java
.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java
.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java
.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java
.lang.Thread.run(Thread.java:662)

posted @ 2012-07-12 10:15 IceWee 阅读(688) | 评论 (0)编辑 收藏

多系统(异构系统)进行交互时,一种良好的方式便是调用Web Service,本示例基于Apache组织的CXF,为了方便起见特将服务端和客户端写在同一个工程下,实际项目中是不可能的,但是客户端却依赖于服务端的Web Service接口,那么可以通过导出jar的方式。

环境:
MyEclipse10
JDK6
Tomcat7
CXF2.5
Spring3

示例项目结构图:


如上图所示,全部依赖的第三方库都在lib中,下面贴出全部代码。
IHelloService.java
package bing.server;

import javax.jws.WebService;

/**
* <p>
* WebService接口
* </p>
*
*
@author IceWee
* @date 2012-7-6
*
@version 1.0
*/

@WebService
public interface IHelloService {

   
public String sayHello(String username);
   
}


HelloServiceImpl.java
package bing.server;

import javax.jws.WebService;

/**
* <p>
* WebService实现类
* </p>
*
*
@author IceWee
* @date 2012-7-6
*
@version 1.0
*/

@WebService(endpointInterface
= "bing.server.IHelloService", serviceName = "HelloService")
public class HelloServiceImpl implements IHelloService {

    @Override
   
public String sayHello(String username) {
       
return "hello, " + username;
    }


}


HelloServiceClient.java
package bing.client;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import bing.server.IHelloService;

/**
* <p>
* WebService调用方-客户端
* </p>
*
*
@author IceWee
* @date 2012-7-6
*
@version 1.0
*/

public class HelloServiceClient {

   
public static void main(String[] args) {
        ApplicationContext context
= new ClassPathXmlApplicationContext("applicationContext-client.xml");
        IHelloService helloService
= (IHelloService) context.getBean("client");
        String response
= helloService.sayHello("Peter");
        System.out.println(response);
    }


}


applicationContext-server.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws
="http://cxf.apache.org/jaxws"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans.xsd
                       http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
>
   
<!--
        ***注意***
        手动添加的内容:
        xmlns:jaxws="http://cxf.apache.org/jaxws"
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
    
-->
   
   
<import resource="classpath:META-INF/cxf/cxf.xml" />
   
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
   
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

   
<jaxws:endpoint id="helloService" implementor="bing.server.HelloServiceImpl" address="/helloService" />
       
</beans>

applicationContext-client.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws
="http://cxf.apache.org/jaxws"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans.xsd
                       http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
>
   
<!--
        ***注意***
        手动添加的内容:
        xmlns:jaxws="http://cxf.apache.org/jaxws"
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
    
-->
   
   
<import resource="classpath:META-INF/cxf/cxf.xml" />
   
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
   
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

   
<bean id="client" class="bing.server.IHelloService" factory-bean="clientFactory" factory-method="create" />

   
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
       
<property name="serviceClass" value="bing.server.IHelloService" />
       
<property name="address" value="http://localhost:8080/CXFDemo/ws/helloService" />
   
</bean>
</beans>

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns
="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
>
 
<display-name>CXFDemo</display-name>
 
 
<context-param>
     
<param-name>contextConfigLocation</param-name>
     
<param-value>classpath:applicationContext-server.xml</param-value>
 
</context-param>

 
<listener>
   
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 
</listener>
 
 
<servlet>
   
<servlet-name>CXFServlet</servlet-name>
   
<display-name>CXFServlet</display-name>
   
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
   
<load-on-startup>1</load-on-startup>
 
</servlet>
 
<servlet-mapping>
   
<servlet-name>CXFServlet</servlet-name>
   
<url-pattern>/ws/*</url-pattern>
 
</servlet-mapping>
 
<welcome-file-list>
   
<welcome-file>index.jsp</welcome-file>
 
</welcome-file-list>
</web-app>

所有项目都已配置完成,可以发布到Tomcat了,在浏览器中输入:http://localhost:8080/CXFDemo/ws,返回如图:


从上图中可以看到我们对外发布的WebService接口,点击蓝色超链接,返回如图:

到此,证明我们的Web Service已经发布成功,可以进行调用测试了。运行HelloServiceClient,返回如图:


全文完!


























posted @ 2012-07-06 17:29 IceWee 阅读(51116) | 评论 (27)编辑 收藏

本演示例程是继Java Tomcat SSL 服务端/客户端双向认证(一),密钥库可证书的生成脚本不再重复黏贴,仅仅是用程序来代替浏览器访问服务端。
例程中使用到了Apache HttpClient库,版本为4.1.3
全部依赖库:
commons-logging-1.1.1.jar
httpclient-4.1.3.jar
httpcore-4.1.4.jar
httpmime-4.1.3.jar(上传文件使用)

在(一)中的程序包中创建一个客户端类:HttpsClient
HttpsClient.java
package com.icesoft.client;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class HttpsClient {
   
   
private static final String KEY_STORE_TYPE_JKS = "jks";
   
private static final String KEY_STORE_TYPE_P12 = "PKCS12";
   
private static final String SCHEME_HTTPS = "https";
   
private static final int HTTPS_PORT = 8443;
   
private static final String HTTPS_URL = "https://127.0.0.1:8443/HttpClientSSL/sslServlet";
   
private static final String KEY_STORE_CLIENT_PATH = "E:/ssl/client.p12";
   
private static final String KEY_STORE_TRUST_PATH = "E:/ssl/client.truststore";
   
private static final String KEY_STORE_PASSWORD = "123456";
   
private static final String KEY_STORE_TRUST_PASSWORD = "123456";

   
public static void main(String[] args) throws Exception {
        ssl();
    }

   
   
private static void ssl() throws Exception {
        HttpClient httpClient
= new DefaultHttpClient();
       
try {
            KeyStore keyStore 
= KeyStore.getInstance(KEY_STORE_TYPE_P12);
            KeyStore trustStore 
= KeyStore.getInstance(KEY_STORE_TYPE_JKS);
            InputStream ksIn
= new FileInputStream(KEY_STORE_CLIENT_PATH);
            InputStream tsIn
= new FileInputStream(new File(KEY_STORE_TRUST_PATH));
           
try {
                keyStore.load(ksIn, KEY_STORE_PASSWORD.toCharArray());
                trustStore.load(tsIn, KEY_STORE_TRUST_PASSWORD.toCharArray());
            }
finally {
               
try { ksIn.close(); } catch (Exception ignore) {}
               
try { tsIn.close(); } catch (Exception ignore) {}
            }

            SSLSocketFactory socketFactory
= new SSLSocketFactory(keyStore, KEY_STORE_PASSWORD, trustStore);
            Scheme sch
= new Scheme(SCHEME_HTTPS, HTTPS_PORT, socketFactory);
            httpClient.getConnectionManager().getSchemeRegistry().register(sch);
            HttpGet httpget
= new HttpGet(HTTPS_URL);
            System.out.println(
"executing request" + httpget.getRequestLine());
            HttpResponse response
= httpClient.execute(httpget);
            HttpEntity entity
= response.getEntity();
            System.out.println(
"----------------------------------------");
            System.out.println(response.getStatusLine());
           
if (entity != null) {
                System.out.println(
"Response content length: " + entity.getContentLength());
                BufferedReader bufferedReader
= new BufferedReader(new InputStreamReader(entity.getContent()));
                String text;
               
while ((text = bufferedReader.readLine()) != null) {
                    System.out.println(text);
                }

                bufferedReader.close();
            }

            EntityUtils.consume(entity);
        }
finally {
            httpClient.getConnectionManager().shutdown();
        }

    }


}



启动Tomcat,运行HttpsClient,控制台返回:


OK,和使用浏览器访问得到的结果一模一样!

全文完!

posted @ 2012-06-05 09:32 IceWee 阅读(5197) | 评论 (1)编辑 收藏

     摘要: SSL——Secure Sockets Layer双向认证(个人理解):客户端认证:客户端通过浏览器访问某一网站时,如果该网站为HTTPS网站,浏览器会自动检测系统中是否存在该网站的信任证书,如果没有信任证书,浏览器一般会拒绝访问,IE会有一个继续访问的链接,但地址栏是红色,给予用户警示作用,即客户端验证服务端并不是强制性的,可以没有服务端的信任证书,当然是否继续访问完全取...  阅读全文

posted @ 2012-06-04 17:36 IceWee 阅读(32812) | 评论 (22)编辑 收藏

     摘要: 之前使用到了NIO的FileChannel做文件快速阅读,后来发现存在一个巨大的BUG,使用它会一直不释放文件句柄,即生成MD5的文件不能操作(移动或删除等),这个BUG网上吵得沸沸扬扬,至今没有解决,毕竟是SUN的BUG,解铃还需系铃人啊!咱只好乖乖的使用文件分块读取的方法,这种方式要求生成MD5和验证的时候得使用相同的缓存大小。MD5Utils.javaCode highlighting pr...  阅读全文

posted @ 2012-06-01 17:57 IceWee 阅读(3472) | 评论 (1)编辑 收藏

这个类一般在记录程序日志时可能会用到。
ExceptionUtil.java
/**
 * <p>
 * 异常工具类
 * </p>
 * 
 * 
@author IceWee
 * @date 2012-4-19
 * 
@version 1.0
 
*/

public class ExceptionUtil {

    
/**
     * <p>
     * 将异常堆栈信息以字符串的格式返回
     * </p>
     * 
     * 
@param e 异常对象
     * 
@return
     
*/

    
public static String createStackTrackMessage(Exception e) {
        StringBuffer messsage 
= new StringBuffer();
        
if (e != null{
            messsage.append(e.getClass()).append(
"").append(e.getMessage()).append("\n");
            StackTraceElement[] elements 
= e.getStackTrace();
            
for (StackTraceElement stackTraceElement : elements) {
                messsage.append(
"\t").append(stackTraceElement.toString()).append("\n");
            }

        }

        
return messsage.toString();
    }

    
}


posted @ 2012-05-26 11:45 IceWee 阅读(669) | 评论 (0)编辑 收藏

     摘要: 实际开发中可能会用到压缩或解压缩,底层借助于apache的zip,依赖jar文件:ant-1.7.1.jarZipUtilsTester.javaCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->public static void&...  阅读全文

posted @ 2012-05-26 10:51 IceWee 阅读(5563) | 评论 (1)编辑 收藏

     摘要: 本文中的Base64Utils.java在其他随笔中已经贴出。Java证书生成命令如下,不做过多解释,可先到网上查询下资料,本文仅提供工具类代码:把生成的密钥库和证书都放到类的同包下。Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->keytool&nb...  阅读全文

posted @ 2012-05-21 17:14 IceWee 阅读(15694) | 评论 (8)编辑 收藏

     摘要: 该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行。RSA加密对明文的长度是有限制的,如果加密数据过大会抛出如下异常:Code highlighting produced by Actipro CodeHighlighter (freeware)ht...  阅读全文

posted @ 2012-05-19 16:54 IceWee 阅读(42629) | 评论 (7)编辑 收藏

     摘要: 之前写了DES加解密,AES几乎与之相同,不同的是底层key的位数而已,不过这些对于我们使用者都是透明的。AESUtils.javaCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->package demo.security;import&nb...  阅读全文

posted @ 2012-05-19 13:43 IceWee 阅读(11792) | 评论 (2)编辑 收藏

     摘要: 本工具类经过测试可用,之前写的没有使用CipherInputStream和CipherOutputStream,生成的加密文件与源文件大小不一致,加密时没有问题,解密时总是抛出如下异常:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->Exception...  阅读全文

posted @ 2012-05-19 13:19 IceWee 阅读(30856) | 评论 (3)编辑 收藏

之前开发的环境为:
JDK5/TOMCAT5.5
现在的开发环境为:
JDK6/TOMCAT5.5

登陆地图界面地图无法加载,IE左下角黄色警告,点开显示“dojo未定义”,GG,BD了一晚上,真是众说纷纭,各有各的情况,直到见到了JDK版本这一说我恍然大悟,我的环境确实变了,迅速装上了JDK5,登陆地图,OK。。。

posted @ 2012-05-16 23:07 IceWee 阅读(2656) | 评论 (0)编辑 收藏

className.class.getResourceAsStream

 
一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类Test.class ,同时有资源文件config.properties

那么,应该有如下代码:

//前面没有“/”代表当前类的目录

InputStream is1 = Test.class.getResourceAsStream("config.properties");
System.out.println(is1);// 不为null

 

第二:在Test.class目录的子目录下,例如:com.x.y 下有类Test.class ,同时在 com.x.y.prop目录下有资源文件config.properties

那么,应该有如下代码:

//前面没有“/”代表当前类的目录

InputStream is2 = Test.class.getResourceAsStream("prop/config.properties");
System.out.println(is2);//不为null

 

第三:不在同目录下,也不在子目录下,例如:com.x.y 下有类Test.class ,同时在 com.m.n 目录下有资源文件config.properties

那么,应该有如下代码:

//前面有“/”,代表了工程的根目录

InputStream is3 = Test.class.getResourceAsStream("/com/m/n/config.properties");

System.out.println(is3);//不为null

ClassLoader.getSystemResourceAsStream

className.class.getResourceAsStream 的第三种取得的路径一样,但少了“/”

 

InputStream is4 = ClassLoader.getSystemResourceAsStream("properties/PayManagment_Config.properties");
System.out.println(is4);//不为null

posted @ 2012-05-04 13:31 IceWee 阅读(9131) | 评论 (0)编辑 收藏

这种写法一般都会在基类中看到,而且是使用了JAVA泛型的,比如我们J2EE中的BaseDAO什么的,请看代码,其实简写了,分开写就明了了。


基类:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public abstract class SuperClass<T> {

    
private Class<T> beanClass;

    @SuppressWarnings(
"unchecked")
    
public SuperClass() {
        
super();
        ParameterizedType parameterizedType 
=  (ParameterizedType) getClass().getGenericSuperclass();
        Type[] types 
= parameterizedType.getActualTypeArguments();
        beanClass 
= (Class<T>) types[0];
    }


    
public Class<T> getBeanClass() {
        
return beanClass;
    }


    
public void setBeanClass(Class<T> beanClass) {
        
this.beanClass = beanClass;
    }

    
    
public static void main(String[] args) {
        SuperClass
<Cat> superClass = new SubClass();
        System.out.println(superClass.getBeanClass());
    }

    
}


子类:
public class SubClass extends SuperClass<Cat> {
   
   
public SubClass() {
       
super();
    }

   
}


class Cat {

   
public Cat() {
       
super();
    }

}


运行SuperClass后控制台会打印:
class com.stos.test.generic.Cat

看到运行结果你可能就清楚了,就是获取实际的泛型类。








posted @ 2012-04-27 09:13 IceWee 阅读(7537) | 评论 (2)编辑 收藏

原文地址:

http://code.google.com/p/swfobject/wiki/documentation



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
<head> 
<title>SWFObject - step 1</title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
</head> 
<body> 
<div> 

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420"> 
<param name="movie" value="myContent.swf" /> 
<!--[if !IE]>--> 
<object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420"> 
<!--<![endif]--> 
<p>Alternative content</p> 
<!--[if !IE]>--> 
</object> 
<!--<![endif]--> 
</object> 

</div> 
</body> 
</html>


posted @ 2011-11-04 14:16 IceWee 阅读(9067) | 评论 (0)编辑 收藏

在安装有些软件的时候,会向注册表中写入大量信息,但长度却超出了注册表的默认限值,此时就会报改错,如图:



错误信息和实际原因简直风马牛不相及,你可能会困惑许久。解决方法:

开始-运行,输入:regedit,确定后打开注册表编辑器

修改注册表:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

Key: RegistrySizeLimit

Type: REG_DWORD

Value: ffffffff (4294967295)

 

如果在注册表中没有找到RegistrySizeLimit 键,可以通过在“HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control”右面窗口中新建RegistrySizeLimit的DWORD键值,并设该值为ffffffff




posted @ 2011-10-12 15:27 IceWee 阅读(17410) | 评论 (3)编辑 收藏

实际开发中很可能有删除指定下标元素的需求,这次我就遇到了,为了简单起见,我把数字下标加1了,也就是说要删除第一个元素需要传入参数1而不是0,下面为代码,如果不喜欢可以修改代码!
/**
 
* 删除指定下标的数组元素
 
*/
Array.prototype.remove = function(index){
    
if (isNaN(index) || index < 1 || index > this.length) {
        return;
    }
    
for(var i = 0; i < this.length; i++){
        
if (i == index - 1) {
            
for(var j = i; j < this.length; j++){
                this[j] 
= this[j+1];
            }
            this.length 
= this.length - 1;
            break;
        }
            
    }
}




posted @ 2011-09-10 07:46 IceWee 阅读(1753) | 评论 (0)编辑 收藏

原文出自【雪的痕迹】
原文地址:http://www.java3z.com/cwbwebhome/article/article8/852.html

java做的系统给人的印象是什么?占内存!说道这句话就会有N多人站出来为java辩护,并举出一堆的性能测试报告来证明这一点。其实从理论上来讲java做的系统并不比其他语言开发出来的系统更占用内存,那么为什么却有这么N多理由来证明它确实占内存呢?两个字,陋习。

(1)别用new Boolean()
在很多场景中Boolean类型是必须的,比如JDBC中boolean类型的set与get都是通过Boolean封装传递的,大部分ORM也是用Boolean来封装boolean类型的,比如:

ps.setBoolean("isClosed",new Boolean(true));
ps.setBoolean("isClosed",new Boolean(isClosed));
ps.setBoolean("isClosed",new Boolean(i==3));

通常这些系统中构造的Boolean实例的个数是相当多的,所以系统中充满了大量Boolean实例小对象,这是相当消耗内存的。Boolean类实际上只要两个实例就够了,一个true的实例,一个false的实例。

Boolean类提供两了个静态变量:
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);

需要的时候只要取这两个变量就可以了,
比如:
ps.setBoolean("isClosed",Boolean.TRUE);
那么象2、3句那样要根据一个boolean变量来创建一个Boolean怎么办呢?可以使用Boolean提供的静态方法:
Boolean.valueOf()

比如:
ps.setBoolean("isClosed",Boolean.valueOf(isClosed));
ps.setBoolean("isClosed",Boolean.valueOf(i==3));

因为valueOf的内部实现是:return (b ? TRUE : FALSE);
所以可以节省大量内存。相信如果Java规范直接把Boolean的构造函数规定成private,就再也不会出现这种情况了。

(2)别用new Integer
和Boolean类似,java开发中使用Integer封装int的场合也非常多,并且通常用int表示的数值通常都非常小。SUN
SDK中对Integer的实例化进行了优化,Integer类缓存了-128到127这256个状态的Integer,如果使用Integer.valueOf(int
i),传入的int范围正好在此内,就返回静态实例。这样如果我们使用Integer.valueOf代替new
Integer的话也将大大降低内存的占用。如果您的系统要在不同的SDK(比如IBM
SDK)中使用的话,那么可以自己做了工具类封装一下,比如IntegerUtils.valueOf(),这样就可以在任何SDK中都可以使用这种特性。

(3)用StringBuffer代替字符串相加
这个我就不多讲了,因为已经被人讲过N次了。我只想将一个不是笑话的笑话,我在看国内某“著名”java开发的WEB系统的源码中,竟然发现其中大量的使用字符串相加,一个拼装SQL语句的方法中竟然最多构造了将近100个string实例。无语中!

(4)过滥使用哈希表
有一定开发经验的开发人员经常会使用hash表(hash表在JDK中的一个实现就是HashMap)来缓存一些数据,从而提高系统的运行速度。比如使用HashMap缓存一些物料信息、人员信息等基础资料,这在提高系统速度的同时也加大了系统的内存占用,特别是当缓存的资料比较多的时候。其实我们可以使用操作系统中的缓存的概念来解决这个问题,也就是给被缓存的分配一个一定大小的缓存容器,按照一定的算法淘汰不需要继续缓存的对象,这样一方面会因为进行了对象缓存而提高了系统的运行效率,同时由于缓存容器不是无限制扩大,从而也减少了系统的内存占用。现在有很多开源的缓存实现项目,比如ehcache、oscache等,这些项目都实现了FIFO、MRU等常见的缓存算法。

(5)避免过深的类层次结构和过深的方法调用
因为这两者都是非常占用内存的(特别是方法调用更是堆栈空间的消耗大户)。

(6)变量只有在用到它的时候才定义和实例化。

(7)尽量避免使用static变量
类内私有常量可以用final来代替。

java内存管理的思想(主要来源于thinking in java)

Java内存管理特点
Java一个最大的优点就是取消了指针,由垃圾收集器来自动管理内存的回收。程序员不需要通过调用函数来释放内存。


1、Java的内存管理就是对象的分配和释放问题。

在Java中,程序员需要通过关键字new为每个对象申请内存空间
(基本类型除外),所有的对象都在堆
(Heap)中分配空间。
对象的释放是由GC决定和执行的。
在Java中,内存的分配是由程序完成的,而内存的释放是由GC完成的,这种收支两条线的方法简化了程序员的工作。但也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。

GC释放空间方法:
监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。当该对象不再被引用时,释放对象。


2、内存管理结构
Java使用有向图的方式进行内存管理,对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情况。

将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象
(连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。

3、使用有向图方式管理内存的优缺点
Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。
这种方式的优点是管理内存的精度很高,但是效率较低。


++:
另外一种常用的内存管理技术是使用计数器,例如COM模型采用计数器方式管理构件,它与有向图相比,精度行低(很难处理循环引用的问题),但执行效率很高。


★ Java的内存泄露
Java虽然由GC来回收内存,但也是存在泄露问题的,只是比C++小一点。


1、与C++的比较

c++所有对象的分配和回收都需要由用户来管理。即需要管理点,也需要管理边。若存在不可达的点,无法回收分配给那个点的内存,导致内存泄露。存在无用的对象引用,自然也会导致内存泄露。
Java由GC来管理内存回收,GC将回收不可达的对象占用的内存空间。所以,Java需要考虑的内存泄露问题主要是那些被引用但无用的对象——即指要管理边就可以。被引用但无用的对象,程序引用了该对象,但后续不会再使用它。它占用的内存空间就浪费了。
如果存在对象的引用,这个对象就被定义为“活动的”,同时不会被释放。


2、Java内存泄露处理

处理Java的内存泄露问题:确认该对象不再会被使用。
典型的做法——
把对象数据成员设为null
从集合中移除该对象
注意,当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。


例子:

List myList=new ArrayList();
for (int i=1;i<100; i++) {
    Object o=new
    Object();
    myList.add(o);
    o=null;
}
//此时,所有的Object对象都没有被释放,因为变量myList引用这些对象。

当myList后来不再用到,将之设为null,释放所有它引用的对象。之后GC便会回收这些对象占用的内存。


★ 对GC操作
对GC的操作并不一定能达到管理内存的效果。

GC对于程序员来说基本是透明的,不可见的。我们只有几个函数可以访问GC,例如运行GC的函数System.gc(),System.。
但是根据Java语言规范定义,
System.gc()函数不保证JVM的垃圾收集器一定会执行。因为,不同的JVM实现者可能使用不同的算法管理GC。通常,GC的线程的优先级别较低。

JVM调用GC的策略有很多种,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是平缓执行GC,有的是中断式执行GC。但通常来说,我们不需要关心这些。除非在一些特定的场合,GC的执行影响应用程序的性能,例如对于基于Web的实时系统,如网络游戏等,用户不希望GC突然中断应用程序执行而进行垃圾回收,那么我们需要调整GC的参数,让GC能够通过平缓的方式释放内存,例如将垃圾回收分解为一系列的小步骤执行,Sun提供的HotSpot
JVM就支持这一特性。


★ 内存泄露检测
市场上已有几种专业检查Java内存泄漏的工具,它们的基本工作原理大同小异,都是通过监测Java程序运行时,所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化。开发人员将根据这些信息判断程序是否有内存泄漏问题。这些工具包括Optimizeit
Profiler,JProbe Profiler,JinSight , Rational 公司的Purify等。

在运行过程中,我们可以随时观察内存的使用情况,通过这种方式,我们可以很快找到那些长期不被释放,并且不再使用的对象。我们通过检查这些对象的生存周期,确认其是否为内存泄露。


★ 软引用
特点:只有当内存不够的时候才回收这类内存,同时又保证在Java抛出OutOfMemory异常之前,被设置为null。
保证最大限度的使用内存而不引起OutOfMemory异常。
在某些时候对软引用的使用会降低应用的运行效率与性能,例如:应用软引用的对象的初始化过程较为耗时,或者对象的状态在程序的运行过程中发生了变化,都会给重新创建对象与初始化对象带来不同程度的麻烦。


用途:

可以用于实现一些常用资源的缓存,实现Cache的功能
处理一些占用内存大而且声明周期较长,但使用并不频繁的对象时应尽量应用该技术


★ java程序设计中有关内存管理的经验

1.最基本的建议是尽早释放无用对象的引用。如:...
A a = new A();
//应用a对象
a = null; //当使用对象a之后主动将其设置为空
….
注:如果a 是方法的返回值,不要做这样的处理,否则你从该方法中得到的返回值永远为空,而且这种错误不易被发现、排除

2.尽量少用finalize函数。它会加大GC的工作量。
3.如果需要使用经常用到的图片,可以使用soft应用类型。它尽可能把图片保存在内存中
4.注意集合数据类型,包括数组、树、图、链表等数据结构,这些数据结构对GC来说,回收更为复杂。
5.尽量避免在类的默认构造器中创建、初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费
6.尽量避免强制系统做垃圾内8.尽量做远程方法调用类应用开发时使用瞬间值变量,除非远程调用端需要获取该瞬间值变量的值。
9.尽量在合适的场景下使用对象池技术以提高系统性能。存的回收,增长系统做垃圾回收的最终时间
7.尽量避免显式申请数组空间

posted @ 2011-08-24 10:25 IceWee 阅读(4583) | 评论 (0)编辑 收藏

上个礼拜卸了ArcIMS装上了ArcGIS Server9.3,感觉使用起来比ArcIMS简单了,安装也比较简单,除了选择下安装目录外一直是下一步。

ESRI公司不是想把一切都WEB化嘛!就是桌面能做的WEB也可以!所以安装后有个定向到ArcGIS Server Manager的网页链接,点击后即可发布地图服务。

但是我安装后怎么都进不去,当然要注意的一点是你用什么帐号登陆?默认的管理员帐号是arcgismanager,密码是你在安装Post Install的时候指定的,没错,就是它,可死活就是进不去呢?先搁下。有人喜欢用管理员帐号登陆,那么没问题,你只需要将当前登陆的管理员或其他用户添加到agsadmin和agsusers两个用户组中即可。当你登陆到Windows操作系统的时候发现增加了这三个用户,看起来很不爽,你根本不会用他们登陆操作系统,那么这里有个隐藏账户的注册表文件,你可以复制下来保存成“任意名称.reg”,双击运行即可

系统登陆界面中隐藏某账户

Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList] "arcgismanager"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList] "ArcGISSOC"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList] "ArcGISSOM"=dword:00000000

 

言归正传,为啥我用arcgismanager/密码 登陆不进去了呢?密码我明明记得,或者我用系统管理员(前提是已经将管理员加入了那两个用户组中)登陆也不行?我左思右想,终于想到了,之前查过资料,网上有人说需要关闭防火墙,我突然想起该事来!怎么早没想起?!害得我卸载重装了一遍还是不行!没文化真可怕,记忆力差咱就多博客吧!大脑不行,咱用文字记录!

posted @ 2011-06-27 15:11 IceWee 阅读(2381) | 评论 (0)编辑 收藏

     摘要: 前言:

我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同。其实将java程序打包成exe也需要这个可执行jar文件。
  阅读全文

posted @ 2011-06-05 16:27 IceWee 阅读(386) | 评论 (0)编辑 收藏

FlexBuilder3.0(FB3)插件的安装要求系统中已经存在eclipse,就像当初的MyEclipse一样(MyEclipse5.5-),现在MyEclipse强大了,直接All In One了,把eclipse吃到肚子里了,所以再不用咱们选eclipse目录了,后话。。。eclipse版本要求3.2、3.3或3.4,所以为了能够顺利安装FlexBuilder3.0(FB3),事先要做的是解压一个eclipse(3.2、3.3或3.4)到任意目录,完成FlexBuilder3.0(FB3)的安装

如FlexBuilder3.0(FB3)安装在了如下目录:

E:\Program Files\Adobe\Flex Builder 3 Plug-in

到该目录下将eclipse目录拷贝到MyEclipse的dropins目录下,我的目录结构:D:\Program Files\MyEclipse\MyEclipse 9\dropins,之后将eclipse重命名,如FlexBuilder3,启动MyEclipse就有FlexBuilder3的支持了

MyEclipse好像从7开始装插件的方式就变了,多了个dropins目录,你可以随意将下载下来的eclipse插件放到该目录下,移除也简单

网上的通过代码将插件的.jar文件都追加到bundles.info文件中,我觉得不够清晰,个人感觉将插件拷贝到dropins目录下的方式较低碳环保

posted @ 2011-05-21 14:10 IceWee 阅读(2061) | 评论 (1)编辑 收藏

ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程

以前没有遇到过这个错误,一般常见的就是ORA-12514,这个错误是第一次遇到,我们是用SSH框架的,数据库链接由spring来管理,所以不担心连接不能及时释放的问题。但是现在数据库不只是我们做web的在使用,还有做通讯的同事,今天上午突然发现PL/SQL连不上数据库了,报的就是这个错误。

网上查找资料发现出现这个问题是由于Oracle的会话数不够导致的,使用命令“show parameter processes;”,返回

 

NAME                                         TYPE          VALUE
-----------------------------------     -------------    ------------
aq_tm_processes                       integer          0
db_writer_processes                  
integer           1
gcs_server_processes                 
integer          0
job_queue_processes                 
integer          10
log_archive_max_processes        
integer          2
processes                                 
integer           150

 

可见当前最大连接数是150,于是我到数据库服务器使用DBA登陆,结果也登陆不上,报错ORA-12520,看来问题很严重啊!我查看了listener.log,发现有个IP创建了很多的链接,最终锁定问题原因,就是因为同事没有及时释放连接导致连接数不够。解决此法最好是程序上注意,使用后及时释放,如果你写的是循环,那就很危险了。也可以修改最大连接数,如果服务器能顶得住。

posted @ 2011-05-18 11:46 IceWee 阅读(845) | 评论 (0)编辑 收藏

在网页中使用自定义右键菜单,实现上皆为使用javascript禁用浏览器默认的右键菜单,然后在网页中响应鼠标右键事件,弹出自定义的菜单。

类似右键菜单的组件网上很多。一般而言,改变浏览器的默认菜单应当慎用,这会使多数用户感到不习惯。但是在企业Web应用中,用户的使用环境更加可控,在这种应用中使用自定义右键菜单会更加适合。

以下列举几款比较成熟的jQuery右键菜单插件,我们将逐一介绍,请读者自行比较,并根据自己的需求选择。

文直通车

posted @ 2011-05-01 16:49 IceWee 阅读(1353) | 评论 (0)编辑 收藏

     摘要: 经常用谷歌百度的人会觉得他们自动提示下拉框很酷,而且用来起很方便。最近由于业务需求,我们也需要这样的功能,网络上搜刮了一下,但却遇不到自己满意的,于是决定取长补短,自己重构。由于平常很少写类似控件或小工具的脚本,顶多写点简单的校验脚本,所以写了这个东东花费了我3天时间,当然3天也不全是一直扑到它身上,毕竟还有其他的工作,通过这次练习,自己对protype的熟悉又更近了一步。  阅读全文

posted @ 2011-04-24 03:41 IceWee 阅读(872) | 评论 (0)编辑 收藏

     摘要:
最近使用PD比较频繁,也被PD给搞的焦头烂额,网上好的东西还是比较多的,摘了点留作备用。




sql语句中表名与字段名前的引号去除:

打开cdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code的标签的Charcter case选项设置成Uppercase或者Lowercase,只要不是Mixed Case就行!
或者选择Database->Edit current database->Script->Sql->Format,有一项CaseSensitivityUsingQuote,它的 comment为“Determines if the case sensitivity for identifiers is managed using double quotes”,表示是否适用双引号来规定标识符的大小写, 可以看到右边的values默认值为“YES”,改为“No”即可!
或者在打开pdm的情况下,进入Tools-Model   阅读全文

posted @ 2011-04-23 15:24 IceWee 阅读(880) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2011-04-18 14:09 IceWee 阅读(4566) | 评论 (0)编辑 收藏

 实际开发中,如果用的是Oracle数据库,那么备份还原数据库的命令会经常用到

DOS环境下(开始-运行-CMD),在命令行输入,exp 用户名/密码@数据库连接名 owner=用户名 file="盘符:\文件名.dmp" log="盘符:\日志文件名.log",日志可选,回车即可。

导出/备份命令:

exp admin/password@orcl owner=admin file="D:\orcl.dmp" log="D:\orcl.log"


其中admin和password是连接到orcl数据库的登录名和密码,orcl是通过数据库工具建立的数据库连接时取的别名,file和log用于导出文件的数据存储和日志存储,由自己指定任意名。

导入/还原命令:

imp admin/password@orcl file="D:\orcl.dmp" log="D:\orcl.log" fromuser=other touser=admin


posted @ 2011-04-18 13:59 IceWee 阅读(243) | 评论 (0)编辑 收藏

     摘要: 由于工作需要,今天要在电脑上安装SQL Server 2005。以往的项目都是使用Oracle,MS的数据库还真的没怎么用过,安装Oracle已经轻车熟路,但装SQL Server好像还有点小麻烦,所以记录下来,以留备用。
-------------------------------------------------------------------------------------------------

操作系统:Microsoft Windows 7 旗舰版(32位)

数据库版本:SQL Server 2005 简体中文开发板

数据库下载链接:http://222.132.81.146/rj/cs_sql_2005_dev_all_dvd.rar

文件解压密码:www.mofang.net

----------------------------------------------------------------------------------------  阅读全文

posted @ 2011-04-18 13:53 IceWee 阅读(619) | 评论 (0)编辑 收藏

话不多说,请看代码!
/** left (outer) join */ 
/** Standard SQL Syntax */
select * from a left outer join b on a.id = b.id;
/** Oracle SQL Syntax */
select * from a, b where a.id = b.id(+); 

/** right (outer) join */ 
/** Standard SQL Syntax */
select * from a right outer join b on a.id = b.id; 
/** Oracle SQL Syntax */
select * from a, b where a.id(+= b.id; 

/** (inner) join */ 
/** Standard SQL Syntax */
select * from a inner join b on a.id = b.id; 
/** Oracle SQL Syntax */
select * from a, b where a.id = b.id; 

/** (full) join */ 
/** Standard SQL Syntax */
select * from a full join b on a.id = b.id; 
/** Oracle SQL Syntax */
select * from a, b where a.id = b.id(+union select * from a, b where a.id(+= b.id;

posted @ 2011-04-18 13:32 IceWee 阅读(247) | 评论 (0)编辑 收藏

记不清是从QQ哪个版本开始,去除了右键“添加到QQ表情”注册表项的写入,所以在浏览网页时看到搞笑或者自己想要的图片时,想快速保存到QQ表情里的右键快捷方式没有了,需要我们自己导入注册表。

自己创建记事本文件,写入内容: 

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\添加到QQ表情]"contexts"=dword:00000002@="E:\\Program Files (x86)\\Tencent\\QQ\\Bin\\AddEmotion.htm"

需要手动修改的是最后一行,修改成你自己的QQ安装目录即可,注意分隔符是\\

FireFox的解决方案:

上面仅仅解决了Internet Explorer,对于火狐是无效的,火狐有个叫IE Tab的插件,下面是官方简介:

 

IE Tab - an extension from Taiwan, features: Embedding Internet Explorer in tabs of Mozilla/Firefox

这样就可以在火狐和IE之间自由切换了,这方法有点不完美,没办法!

IE Tab安装直通车:

https://addons.mozilla.org/zh-CN/firefox/search/?q=IE+Tab&cat=all&x=0&y=0

选择最新版安装,第一版不支持FF4.0,我装的IE Tab2!

posted @ 2011-04-17 20:07 IceWee 阅读(425) | 评论 (0)编辑 收藏

 在SQL Server 2000 中加载驱动和URL路径的语句是

String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
String dbURL 
= "jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sample";

 

而SQL Server 2005 中加载驱动和url的语句则为

String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String dbURL 
= "jdbc:sqlserver://localhost:1433; DatabaseName=sample";

 

果写法错误将会找不到驱动.

posted @ 2011-04-16 14:36 IceWee 阅读(157) | 评论 (0)编辑 收藏

新项目需求,要在页面中加载一个叫“大卫三角形”的图形,还是GB(国标)中的东西,在网上搜索了一下“大卫三角形”,无果,也不知道什么东西,而且根据 什么画出来的也不清楚。领导让试试,看能不能画出来。事前从未使用过开发语言画图,Windows的画板倒是用过,连Photoshop都不会用,汗!而 且不是用手握着画笔或者鼠标在屏幕上乱写乱画,是用程序语言将图画出。


在网上搜寻关于使用JAVA画图的信息,知道了JAVA 2D,又下了几个用Graphics2D画图的例子,看了看Java核心API。开始着手画图。不画不知道,画了才知道,开发Windows画图和其他画 图软件的程序员都为我们做了多少贡献,因为用程序画图简直太麻烦了,一点一点的描,一线一线的连。像我画这个图还要经过很多次的计算,主要是计算坐 标,Graphics2D能画的东西很多,但是要在User Space里给它指定坐标。

经过不到两天的努力,终于完成了这幅“大卫三角形”!虽然是硬画出来的,并无什么计算公式而言(况且我也不会啊!),但还是有些激动,毕竟是第一次用程序画图么!


发布到WEB,最终“大卫三角形”的摸样:

posted @ 2011-04-16 14:32 IceWee 阅读(2379) | 评论 (2)编辑 收藏

最近在写一个tab标签控件,用到了childNodes,节点可以用childNodes[0]来获取其第一个节点,但是有些节点是有隐藏节点的,即便 你不写,它也是存在的,我就遇到了这么个主儿,table,我曾两次受到它的折磨,想要的东西得不到,想要的效果出不来,都拜它所赐!那是因为用 table.childNodes[0]得到的并不是你在HTML里写的第一个<tr>节点,而是一个tbody的节点,即便你不写,它也是 存在的,所以当你想得到第一个tr节点时你必须这样写:table.childNodes[0].childNodes[0]。就是如此!

posted @ 2011-04-16 14:29 IceWee 阅读(1203) | 评论 (0)编辑 收藏

最近经常要调整系统中的一些页面,虽然不是专业的美工,但也要略知一二才能应付得了。

例一:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>table.html</title>
<meta http-equiv="content-type" content="text/html; charset=GBK">
<style type="text/css">
<!--
body
{
margin
: 0px;
}
//
-->
</style>
</head>
<body>
<table height="100%" width="100%" cellSpacing="0" cellPadding="0"
border
="2" bordercolor="black">
<tr>
<td height="100%" width="200px" bgcolor="red">

</td>
<td height="100%" width="10px" bgcolor="green">

</td>
<td height="100%" width="100%" bgcolor="blue">

</td>
</tr>
</table>
</body>
</html>

上面的效果为整个页面呈现蓝色,看起来没什么奇怪的,因为第三个td设置了宽度为100%,所以前两个td的宽度自然被挤没了。只要把红色的100%去掉留空,或者干脆不写宽度,那么正是想看到的结果,第三个td占用剩余的文档宽度。

例二:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>table.html</title>
<meta http-equiv="content-type" content="text/html; charset=GBK">
<style type="text/css">
<!--
body
{
margin
: 0px;
}
//
-->
</style>
</head>
<body>
<table height="100%" width="100%" cellSpacing="0" cellPadding="0"
border
="2" bordercolor="black">
<tr>
<td height="200px" width="100%" bgcolor="red">

</td>
</tr>
<tr>
<td height="100px" width="100%" bgcolor="green">

</td>
</tr>
<tr>
<td height="100%" width="100%" bgcolor="blue">

</td>
</tr>
</table>
</body>
</html>

这次table改为三行,宽度都为100%,三个tr分整个文档的高度,第三个td的高度100%,根据例一的经验,第三个tr应该会占据其余两个tr的 高度,也就是和例一一样的效果,满屏蓝色。但是结果却不是想象中的那样。接着把100%换为空串或去掉高度的设置,效果都一样。这不能用什么来解释,只能 记住,这就是td设置高度和宽度的差别。

posted @ 2011-04-16 14:28 IceWee 阅读(414) | 评论 (0)编辑 收藏

使用Ajax调用Action获取XML字符串,其中包含中文,使用如下代码输出:
ServletOutputStream out = response.getOutputStream();
request.setAttribute("xmlTree", tree);
   out.print(tree);

在JDK1.5平台运行一切正常,在JDK1.6平台运行抛出异常:

严重: Servlet.service() for servlet action threw exception
java.io.CharConversionException: Not an ISO 8859-1 character: 全
at javax.servlet.ServletOutputStream.print(ServletOutputStream.java:89)
at com.xjgc.rsm.web.action.ProblemtypeAction.createTypeTree(ProblemtypeAction.java:282)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
at com.xjgc.rsm.web.action.ProblemtypeAction.execute(ProblemtypeAction.java:37)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.extremecomponents.table.filter.AbstractExportFilter.doFilter(AbstractExportFilter.java:49)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)

异常的大概意思是说非ISO-8859-1编码,确实,我使用的GBK。而且第一行就是

at javax.servlet.ServletOutputStream.print(ServletOutputStream.java:89)

问题可能出现在ServletOutputStream上,于是用PrintWriter替换了ServletOutputStream,运行正确,如:

PrintWriter pw = response.getWriter();
pw.print(tree);


posted @ 2011-04-16 14:25 IceWee 阅读(2213) | 评论 (0)编辑 收藏

之前就出现过许多次这种情况,大概出现前都是项目的迁移,这必然导致环境的差异,如从公司的JDK1.5迁移到家里的JDK1.6,eclipse自带有JDK的jar包,可以使用本地的也可以使用自带的,于是作出如下操作:

点击eclipse上的服务器图标,选择Configure server - Servers - Tomcat - Tomcat x.x - JDK 选择本机上安装的JDK即可,Apply。启动Tomcat,OK!

posted @ 2011-04-16 14:22 IceWee 阅读(1424) | 评论 (0)编辑 收藏

项目中需要上传一些较大的文件,都是一些压缩备份文件,动不动就几百M。系统框架SSH,必然用Struts。而Struts提供了 FormFile类来上传文件。起初一切正常,上传下载的都没问题,但过了一段时间后客户提出大于300M的文件上传不上去。测试后发现果真如此,但是后台并不报错,直接返回下面的forward了。因为是初次使用,下面就是我一小天行走的过程。

起初,我开始到处搜寻网上的上传文件下载,很多人用的都是apache得commons-fileupload.jar这个组件,而且代码都贴出了,我随便下了一个小demo,屡试不爽,别说300,500M也能传上去,而且也用了Struts,我开始犯晕。我试着将我的环境与demo得环境代码尽量相似,至少主要代码应该差不多。我将目前系统中的上传附件代码改成了demo中的:

DiskFileUpload upload = new DiskFileUpload();
List uploadList 
= upload.parseRequest(request);


但是每次使用uploadList.size();时获取到得都是0,根本传布了。我更晕了。。。

我再次仔细的对比demo和系统,最后发现demo中没有使用Struts的FormBean,会不会是这里的问题?于是我将demo中也增加了 FormBean类,标签都用上了Struts的标签,这次果然demo也失效了。。。终于被我发现,都是FormBean的问题,但现在我又不可能舍弃 FormBean,因为不仅仅是附件,还有别的很重要的一些属性,代码都写好了,不可能大范围修改,那咋办?

为什么fileupload可以传那么大,而你struts却传不上大于300M的文件?再次搜索,终于发现原因,Struts在写 FormFile类时借助的是fileupload中的API,设置的默认大小为250M,难怪传不上去!如何设置更大一些或更小一些呢?这样:

在Struts配置文件的mapping标签后加上

<controller maxFileSize="1024M" />


看到这个小标签页不用解释什么了吧!我设置了1G,现在传只要小于1G的附件都没问题了!

posted @ 2011-04-16 14:20 IceWee 阅读(1455) | 评论 (0)编辑 收藏

平常只用日期,很少精确到时间,今天偶尔用到了时间,发现小时比本机时间小了8个小时,操作系统是WIN7。时区设置也是+8北京。在网上搜索到可能是注册表坏了,下了一个XP的注册表导入后恢复正常了。

原帖地址:http://huiy.javaeye.com/blog/200512

问题描述:Window XP 系统自己能够读取正确的时间,但是用java获取的时间始终与北京时间相差八个小时。
原因分析:
1.系统本身时区设置错误(可以排除,上面已经交代系统能够获取正确时间
2.注册表出现异常。
注册表对应项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
解决之道:
1.备份Time Zones这一项
2.从正常的并且是相同系统的机器中导出该项,然后倒入到自己机器中

上招不行,还有一招!

1.找到jdk 的安装路径 找到 如:
a) C:\Program Files\Java\jdk1.5.0\jre\lib\zi\Etc;
b) C:\Program Files\Java\jdk1.5.0\jre\lib\zi;
c) C:\Program Files\Java\jre1.5.0\lib\zi\Etc;
d) C:\Program Files\Java\jre1.5.0\lib\zi;
这四个文件路径下找到 GMT 文件 进行删除(注意:在删除之前将其文件备份一下,以防万一);在 C:\Program Files\Java\jdk1.5.0\jre\lib\zi\Etc 下找到 GMT-8 文件复制一份 重命名为 CMT ,将其原来 的 GMT 文件覆盖掉即可!

posted @ 2011-04-16 14:17 IceWee 阅读(993) | 评论 (0)编辑 收藏

前不久终于从XP升级到WIN7了,感觉真的很不错,非常新鲜、漂亮,当然也有些小不快,比如说一些开发软件不兼容,要下载VISTA版本的才可以正确运行。最近又遇到了一个小问题,就是软件中文乱码,上次出现乱码的软件竟然是 360卫士,但很快就解决了,大家都知道360的更新速度,几天就更新一次,目前的版本一切正常。这个是软件上的解决方案,等于自己什么也没做,全靠奇虎了。我刚刚下载了一个叫QQCar的小软件,启动后竟然是乱码,首先我的系统是英文版本的,安装的汉化语言包,貌似没有汉化好,因为启动和关闭的时候都没显示“启动 Windows”和“关闭”而是显示“starting windows”和"log off""shut down"一类英文,但是笔记本上安装的都一切正常。

最后,切入正题,解决乱码:

设置区域和语言就不说了,想必都知道,就是因为这个已经设置好了还是乱码才有此文章的。

最后一招是通过修改注册表来完成的。

将[HKEY_CURRENT_USER-Control Panel-International-Locale]的键值修改为00000804,重启电脑,再次运行乱码的软件,OK。

PS:这个键值本来为00000409,我不知道代表何意,解决方法完全来源于网络,但确实解决了乱码问题。

posted @ 2011-04-16 14:16 IceWee 阅读(694) | 评论 (0)编辑 收藏

最近和Office啊、PDF啊、Visio等打交道挺多,突然昨天突然发现.doc/.docx/.xls/.pdf/.vsd/.mpp/.ppt/.pptx/.xls/.xlsx等后缀的文件类型图标都无法显示了,显示成未识别的图标样式,于是一顿神搜,很多说改注册表,但我觉得麻烦,放弃了。最后解决方案是从同事那里拷过来那些需要的文件到自己的文件夹下。

出现这种情况的原因是由于C:\Windows\Installer中的必要文件夹丢失,下面列出我丢失的文件夹列表:

Office2007:{90120000-0011-0000-0000-0000000FF1CE}

AdobeReader:{AC76BA86-7AD7-2052-7B44-A93000000001}

Visio2007:{90120000-0051-0000-0000-0000000FF1CE}

Project2007:{90120000-003B-0000-0000-0000000FF1CE}

第一步,到同事的机器里找到以上的文件夹拷贝到自己的机器上

第二步,如果文件类型图标还没恢复,手动设置一下打开方式,并且亲自浏览应用程序的目录。

posted @ 2011-04-16 14:15 IceWee 阅读(954) | 评论 (0)编辑 收藏

网站上的文章用什么存储?使用Oralce用CLOB存储,Java操作CLOB的方法网上很多,可是发现读取后显示在网页上和录入时的格式完全不同,该有的段落已经不复存在,由于页面中使用的是textarea标签而不是强大的网页文本编辑器,所以要自己处理格式的问题了,下面是我找到的一个专业函数,使用它将前台传过来的文章字符串转义一下再存入数据库,这次再读取出来的文章就有段落的显示了。
/** 
 * 格式化文章信息,保持文章的格式(保存时用) 
 * 
@param str 
 * 
@return 
 
*/

public String HTMLEncode(String str) {
    str 
= str.replace(">""&gt;"); 
    str 
= str.replace("<""&lt;");    
    
char ch;    
    ch 
= (char32// space    
    str = str.replace(String.valueOf(ch), "&nbsp;");    
    ch 
= (char34// ''    
    str = str.replace(String.valueOf(ch), "&quot;");    
    ch 
= (char39// '    
    str = str.replace(String.valueOf(ch), "&#39;");    
    ch 
= (char13// carriage return    
    str = str.replace(String.valueOf(ch), "");    
    ch 
= (char10// new line    
    str = str.replace(String.valueOf(ch), "<BR>");    
    
return str;
}

posted @ 2011-04-16 14:13 IceWee 阅读(1055) | 评论 (5)编辑 收藏

以前都是用SSH框架,spring借助的是Tomcat的dbcp数据源,最近做网站也没用什么框架,直接Sservlet+JSP,依旧用的 Tomcat的dbcp做数据源,经常发现网络不好时连接就获取不到了,那是因为池子中的连接都已经无效了,Tomcat数据源的自动重连貌似配置较为复杂,很多人建议用proxool做数据源,下面是proxool的配置方法:

1.下载proxool,自己到网站http://proxool.sourceforge.net/download.html随便下载一个版本,解压后进入目录lib,会得到两个jar文件,分别为proxool-0.9.1.jar(版本不同可能名称有所不同)和proxool-cglib.jar,将这两个jar文件拷贝到项目的WEB-INF/lib下

2.配置web.xml,需要配置proxool的Servlet,如下:

<servlet>
    
<servlet-name>proxoolServletConfigurator</servlet-name>
    
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator
    
</servlet-class>
    
<init-param>
        
<param-name>xmlFile</param-name>
        
<param-value>WEB-INF/proxool.xml</param-value>
    
</init-param>
    
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
    
<servlet-name>proxooladmin</servlet-name>
    
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet
    
</servlet-class>
</servlet>
<servlet-mapping>
    
<servlet-name>proxooladmin</servlet-name>
    
<url-pattern>/proxooladmin</url-pattern>
</servlet-mapping>


3.创建proxool.xml文件,将此文件放在与web.xml同级目录下,即WEB-INF下

<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
    
<proxool>
        
<alias>testDB</alias>
        
<driver-url>jdbc:oracle:thin:@192.168.1.229:1521:orcl</driver-url>
        
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        
<driver-properties>
            
<property name="user" value="test_user" />
            
<property name="password" value="password" />
        
</driver-properties>
        
<maximum-connection-count>10</maximum-connection-count>
        
<minimum-connection-count>5</minimum-connection-count>
        
<prototype-count>5</prototype-count>
        
<test-before-use>true</test-before-use>
        
<house-keeping-sleep-time>180000</house-keeping-sleep-time>
        
<house-keeping-test-sql>select CURRENT_DATE from dual</house-keeping-test-sql>
    
</proxool>
</something-else-entirely>

上面的<test-before-use>true</test-before-use>据说是用来自动重连的,也就是在网络错误或数据库重启等等原因导致与数据库断开,每次获取连接前都会检查,如果现在池子中的连接已经无效将会重新创建


4.在java中获取数据库连接的代码

Connection con = DriverManager.getConnection("proxool.testDB");


posted @ 2011-04-16 14:11 IceWee 阅读(370) | 评论 (0)编辑 收藏

这些日子一直在使用visio画软件界面,今个是礼拜一,早早来到公司就开始画,当选中某个元素/对象后,按“方向键”进行微调时竟然不管用,伴随的是滚动条来回滚动,上网一查,原来是不小心按到了“scroll num lock”键,再按一次,果然正常了。

posted @ 2011-04-16 14:05 IceWee 阅读(2640) | 评论 (1)编辑 收藏

今天遇到了一个很头疼的问题,整整找了一个下午解决方案,原本就是一个table里有两行,可第一行的内容就是和底边有很大的空间,因为用到了表格控件,内容都是动态生成的,最后查看源代码,是控件自动增加了一个form标签,问题就出现在这个form标签上。

其实我有遇到过form会占空间的情况,但一直没解决方案,今天终于找到了两种:

第一种,通过HTML写死的方式,不要将form标签方到<tr><td>的里面或者外面,应该这样<tr><form><td>

第二种,通过CSS的方式,在form标签里增加样式:<form style="margin: 0; padding: 0;">

我是用第二种方式解决的,比较靠谱一些

posted @ 2011-04-16 14:03 IceWee 阅读(235) | 评论 (0)编辑 收藏

安装Adobe Reader的时候抛出了这个提示,导致安装失败!

首先,我是在虚拟机上安装AR,虚拟机上只有一个磁盘C,安装的番茄花园SP3系统。

解决方法:

开始-运行,输入regedit后回车,进入注册表编辑器

编辑-查找,输入“D:\”,会发现有很多键值是指向D盘的,而当前系统只有C盘,自然找不到,将所有的D修改成C后就可以了。

posted @ 2011-04-16 14:02 IceWee 阅读(207) | 评论 (0)编辑 收藏

最近项目中需要用到jfreechart,以前只是简单的玩玩而已,一直没有真正的应用到实际项目中,今天在画图的时候可把自己折磨惨了,就一个小小的tooltip死活不出来。


我用的Spring + Struts,有很多人用jfreechart都是写的Servlet,其实用Struts是一样的。

我起初在Struts的Action中使用org.jfree.chart.ChartUtilities。writeChartAsPNG(java.io.OutputStream out, JFreeChart chart, int width, int height) 方法,将生成的JFreeChart对象写到输出流中,return自然是null,这样做界面可以显示Action写过来的图片,但是没有 tooltip的出现。后来我发现很多人都不是直接把图片写到流中的,而是在JSP页面通过<img>标签来显示图片的。于是我也使用了主流方式显示图片,使用chartName = ServletUtilities.saveChartAsPNG(chart, width, height, info, session);将图片文件名设置请求属性发给JSP页面,页面通过图片标签显示图片,结果图片依旧显示正常,但是tooltip还是没有出来,由于刚刚用这东西,一点都不了解,于是开以往项目中是如何写的,我发现别人的代码中有这样一行:ChartUtilities.writeImageMap(pw, chartName, info, false);这是将图片地图写到流中,而且页面的图片标签中也多了个usermap属性,我仿佛有点清醒了,于是效仿着做了一下,tooltip果真出现了。

JSP代码:

<%    
        JFreeChart chart 
= (JFreeChart)request.getAttribute("chart");    
        
String chartName = Common.generateChart(chart, session, new PrintWriter(out), 760410);
%>


Common的generateChart方法就是放回图片的文件名,并且将图片地图写入到当前的流中。

Java代码:

public static String generateChart(JFreeChart chart, HttpSession session,
            PrintWriter pw, 
int width, int height) {
        String chartName 
= "";
        
try {
            ChartRenderingInfo info 
= new ChartRenderingInfo(
                    
new StandardEntityCollection());
            chartName 
= ServletUtilities.saveChartAsPNG(chart, width, height,
                    info, session);
            
/** 将图片地图写入PW中 */
            ChartUtilities.writeImageMap(pw, chartName, info, 
false);
            pw.flush();
        }
 catch (Exception e) {
            e.printStackTrace();
        }

        
return chartName;
    }


起初我并没有使用Common这个方法,而是直接将这个方法中的代码写在了Struts的Action中,发现无效,而且在pw.flush()一行出现了异常,流这里太烂!哎!提示刷新后就不能再return了。于是去掉这行后图片正常显示,但没有tooltip。我怀疑是Struts中用 response获取的PrintWriter并不是返回到JSP中用out封装的PrintWriter,根本就不是,还怀疑什么,这不是废话嘛!所以在当前流中并没有图片地图,自然不显示tooltip了。

显示图片的IMG标签

<img src="<%=request.getContextPath()%>/<%=chartName%>" height="100%" border=0 usemap="#<%=chartName%>" >



posted @ 2011-04-16 13:59 IceWee 阅读(915) | 评论 (0)编辑 收藏

最近项目中使用了window.open()函数打开新窗口,并且在新的窗口中进行一系列操作,当然要涉及到表单的提交与返回,页面跟随刷新,我的机器上测试通过,我用IE7。但是发布到服务器上发现,弹出的窗口中页面不刷新,也就是表单没有提交,不!表单已经提交了,而是页面没有返回,页面只是闪了一下,页面还是那个页面。这肯定又是IE版本导致的问题。看似没什么代码与IE版本关系那么大啊?!最后发现,以前程序里连接触发JS函数 href里写的都是“#”,而我写的则是“javascript:void(0)”,会不会是这里的问题呢!于是我将“#”替换了 “javascript:void(0)”,OK!万事大吉!果然是这个小东西在捣鬼!

IE6:<a href="#" onclick="func()">xxx</a>

IE7:<a href="#" onclick="func()">xxx</a> 或者 <a href="javascript:void(0)" onclick="func()">xxx</a>

posted @ 2011-04-16 13:50 IceWee 阅读(320) | 评论 (0)编辑 收藏

     摘要: 仿照腾讯的Token写的验证码生成程序Java类代码: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->package icewee.image;import java.awt.BasicStroke;import ja...  阅读全文

posted @ 2011-04-16 13:49 IceWee 阅读(294) | 评论 (0)编辑 收藏

今天下午公司内部搞了一个小调查,每名员工都要将自己填好的文档上传,其中就遇到了这个方框打勾的问题,需要在复选中打勾以表示自己的选择,这下可给广大同志们出了个小题儿,列出方案:

完美指数:★★★★★

方案3,使用word的高级功能域,一般人没用过吧!

域代码:eq \o\ac(□,√),使用方法:工具栏-插入-域,将代码拷贝到“{}”中后按一下F9就可以看到效果了。

完美指数:★★★☆☆

方案2,用画图软件将两个符号叠加,美中不足的是变成了图片而不再是符号。

完美指数:★★☆☆☆

方案1,先添加符号“√”,选中对号后点击word工具栏上的字符边框,就是那个A

posted @ 2011-04-16 13:40 IceWee 阅读(4709) | 评论 (0)编辑 收藏

最近有个小项目中自己负责word报表的生成,开发语言是C#,我是做JAVA的,临时用一下而已。发现微软的在线MSDN是个好东西,很强大,基本需要的东西都在里面可以找到,比如word的创建、打开、关闭等等一系列的操作DEMO代码。

我主要是将现有的模板填入数据保存文档即可。主题是TABLE填值,检索TABLE主要是通过下标,如:

WordDoc.Tables[6]

其中WordDoc的类型是Word.Document,就是当前操作的word文档,上面的代码是获取当前文档中的第六个表格,这里要注意一下, 我们惯性会认为是第七个表格,但这就是微软的不同,没有采用数组索引的方式,如果当初数组也这么设计,下标从1开始,我们学习的时候不知道省多少事。

开发过程中遇到了一个小难题就是合并单元格(纵向),没有设计横向的合并,现将合并的代码贴出来备用:

/// <summary>
/// 纵向单元格合并 
/// 说明:如合并了第一行第一列和第二行第一列两个单元格,则单元格cell(2, 1)已经不存在,继续操作会有异常, 
/// 只有通过cell(1, 1)来获取合并后的单元格 
/// /<summary>
/// <param name="table"></param>
/// <param name="startRowIndex"></param>
/// <param name="columnIndex"></param>

private static void verticalCellMerge(Word.Table table, int startRowIndex, int columnIndex)
{    
    
string previousText = table.Cell(startRowIndex++, columnIndex).Range.Text;    // 保存对比文字    
    int previousRowIndex = startRowIndex - 1;    // 因刚已经+1了,所以再减回去    
    for (int i = startRowIndex; i <= table.Rows.Count; ++i) // 遍历所有行的columnIndex列,发现相同的合并,从起始行的下一行开始对比    
    {        
        
string currentText = table.Cell(i, columnIndex).Range.Text;        
        
if (previousText.Equals(currentText))        
        
{            
            table.Cell(previousRowIndex, columnIndex).Merge(table.Cell(i, columnIndex)); 
// 合并先前单元格和当前单元格            
            table.Cell(previousRowIndex, columnIndex).Range.Text = currentText;    // 因为合并后并没有将单元格内容去除,需要手动修改            
            table.Cell(previousRowIndex, columnIndex).Select();            
            WordApp.Selection.ParagraphFormat.Alignment 
= WdParagraphAlignment.wdAlignParagraphCenter;    // 水平居中显示            
            table.Cell(previousRowIndex, columnIndex).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; // 垂直居中        
        }
        
        
else        
        
{            
            previousText 
= currentText; // 将对比文字替换为当前的内容            
            previousRowIndex = i;   // 检索到不同的内容,将当前行下标置为先前行下标,用于合并        
        }
    
    }

}


/// <summary>
/// 横向单元格合并
/// 注意:在合并单元格后必须将纵列数减去1
/// 如第一行第一列和第一行第二列合并后,原第一行第三列将变成第一行第二列,这就是在合并后i不加1的原因
/// </summary>
/// <param name="WordApp"></param>
/// <param name="table"></param>
/// <param name="startColumnIndex"></param>
/// <param name="rowIndex"></param>

private static void horizontalCellMerge(Word.Application WordApp, Word.Table table, int startColumnIndex, int rowIndex)
{    
    
string previousText = table.Cell(rowIndex, startColumnIndex).Range.Text;    // 保存对比文字    
    int previousColumnIndex = startColumnIndex++;    // 保存先前对比列下标    
    int colCount = table.Columns.Count;    
    
for (int i = startColumnIndex; i <= colCount;) // 遍历所有行的columnIndex列,发现相同的合并,从起始行的下一行开始对比    
    {        
        
string currentText = table.Cell(rowIndex, i).Range.Text;        
        
if (previousText.Equals(currentText))        
        
{            
            table.Cell(rowIndex, previousColumnIndex).Merge(table.Cell(rowIndex, i)); 
// 合并先前单元格和当前单元格            
            table.Cell(rowIndex, previousColumnIndex).Range.Text = currentText;    // 因为合并后并没有将单元格内容去除,需要手动修改            
            table.Cell(rowIndex, previousColumnIndex).Select();            
            WordApp.Selection.ParagraphFormat.Alignment 
= WdParagraphAlignment.wdAlignParagraphCenter;    // 水平居中显示            
            table.Cell(rowIndex, previousColumnIndex).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; // 垂直居中            
            --colCount;        
        }
        
        
else        
        
{            
            previousText 
= currentText; // 将对比文字替换为当前的内容            
            previousColumnIndex = i++;   // 检索到不同的内容,将当前行下标置为先前行下标,用于合并        
        }
    
    }

}

方法注释已经很详细就不再赘述。

最后遇到的问题是无格式的段落检索,因为在生成报告的时候需要在某些段落后填写测试的结论,这下又把我难住了,最终终于发现了bookmark这个东东,起始我对word并不熟悉,都不知道它有书签的功能。顺便就爱你个检索书签的方法贴出来:

/// <summary>
/// 在整个文档中根据书签名检索书签对象
/// </summary>
/// <param name="name"></param>

private static Word.Bookmark getBookmarkByName(string name)  
{      
    
foreach (Word.Bookmark bm in WordDoc.Bookmarks)      
    
{          
        
if (bm.Name.Equals(name))              
            
return bm;          
        }
          
        
return null;      
    }
  


例:

Word.Bookmark bm = getBookmarkByName(bookmarkName);  
bm.Range.Text 
= "你好"// 将检索到书签的内容替换为“你好”

这就是这次用C#做word报表的全部问题,貌似都是小问题。

最后需要看具体的word操作demo代码请访问MSDN,贴个网址:

http://msdn.microsoft.com/zh-cn/library/78whx7s6(VS.80).aspx

posted @ 2011-04-16 13:38 IceWee 阅读(1161) | 评论 (0)编辑 收藏

今天无聊,想起了《大鹏嘚吧嘚》,于是用我的蓝牙耳机连上笔记本,戴上耳机后发现没有声音,但是看本地磁盘的视频或听歌都有声音的,难道我的蓝牙耳机不支持在线视频?于是摘掉蓝牙,用外放,竟然也没有声音!!!晕了!!!百度之。。。得果:

开始->运行->键入 regedit 找到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32 新建一个字符串值,名为"wavemapper" 值为:“msacm32.drv“.

posted @ 2011-04-16 13:30 IceWee 阅读(245) | 评论 (0)编辑 收藏

我的电脑上安装的Adobe Photoshop CS4绿色版,压缩文件刚80多M,比安装版小了10倍,最近打开图片发现变成如下样子了。

缩小可能会变成这样


以前用的好好的,最近也没用它,怎么变成这个样子了,最后终于在网络上找到解决方法,害的我下了一个800多M的安装版,安装完成后发现还是一样,早看到解决方法就好了!

原文引用:

1、打开Photoshop CS4,呵呵,废话哈!


2、找到Preferences -> Performance -> 去掉Enable OpenGL Drawing选中。


看来作者是用的英文版,中文版如下:

编辑->首选项->性能,弹出窗口如下:

看到右侧的复选框了吗?启用OpenGL绘图(D),只要把勾去掉就好了。

posted @ 2011-04-16 13:29 IceWee 阅读(374) | 评论 (0)编辑 收藏

前不久在显示器公司工作的哥们送了两块讯景的显卡,用上了独立显卡就是比集成显卡爽,玩极品飞车可以把画面调节得更加细腻,而且不卡,钱花到还是有好处的啊,不过俺是借了哥们的光了。

今晚下班回家开机,发现显示器指示灯亮着,主机启动了,但是没有信号输出,我第一反应是显卡坏了,因为朋友给我的显卡都是有问题经过维修后的,并不 是新卡。当前插在电脑上的是8500GT,于是我有把7300GT翻了出来换上,开机,依旧无信号输出,晕了。。。再将显示器插到集成插槽里,可以显示。 7300并没有坏啊!?怎么回事?一顿神搜,什么在BIOS里设置,根本就不是,默认插上独显后集显就不工作的。于是关机,拔电源,拆机,内存拔掉,显卡 拔掉,找块纸分别擦擦内存条的金手指和显卡的金手指。插上内存,插上显卡,开机,“嘟嘟嘟。。。嘟嘟嘟”报警了。。。。继续拆,继续拔,最后发现是因为内 存条没有插紧导致开机报警,内存条那个热啊,烫手都,最后安装完毕后,开机,perfect!一切恢复到从前的样子了。

posted @ 2011-04-16 13:24 IceWee 阅读(383) | 评论 (0)编辑 收藏

网站或者系统开发常免不了使用ajax,但由于网络或其他原因难免造成操作等待,一个好看的等待图片绝对提高档次,偶然撞到的这个网站,我正打算在网上搜点类似的图片呢!没想到可以生产了,真是不错!

地址:http://ajaxload.info/

可以自定义前景和背景色,以及是否背景透明

posted @ 2011-04-16 13:22 IceWee 阅读(1911) | 评论 (3)编辑 收藏

Tomcat本身并不具备提供数据源的能力,它需要借助其他的开源数据源(如DBCP)类实现。通过Tomcat提供的数据源,我们的程序中可以通过JNDI来访问数据源。

下面以DBCP为例,简介数据源的配置。

数据源的配置也有两种方式,一种是通过修改Tomcat系统文件来配置全局数据源,一种是通过增加用户的web部署文件来配置局部数据源。全局数据源的意义是所有部署在Tomcat内的web应用只要遵循规定都可以访问的数据源,不建议此方式,可能会导致混乱。相对而言,增加用户自己的web部署文件就比较合适一些,因为该数据源只针对某个web应用生效,其他web应用无法访问该数据源,安全一些,也没全局数据源那么混乱。

配置数据源需要数据源的jar文件,如DBCP数据源就需要在Tomcat的common/lib下增加一个commons-dbcp.jar文件,还需要commons-poo.jar和commons-collections.jar的支持,一般在Tomcat里都会有这三个jar文件,最好还是检查一下。

在Tomcat的conf\localhost下创建自己的web部署配置文件,仿佛见《Tomcat中部署web应用的方式》,在Context元素下增加子元素,以Oracle数据库为例,如:

<Resource name="jdbc/dataSource" 
        auth
="Container"     
        description
="DB Connection"     
        type
="javax.sql.DataSource"     
        username
="username" 
        password
="password"     
        driverClassName
="oracle.jdbc.driver.OracleDriver"     
        url
="jdbc:oracle:thin:@192.168.0.10:1521:db" 
        maxActive
="5" />

程序中访问此数据源的代码:

// 初始化
ContextContext ctx = new InitialContext();

// 获取数据源,其中java:comp/env是Tomcat规定的,Tomcat提供的JNDI绑定都必须加该前缀
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/dataSource");

// 获取数据库链接
Connection conn = ds.getConnection();

// 一系列数据库操作
... ...

上面介绍了局部数据源的配置方法,全局数据源的配置和这差不多,只不过要是将Resource标签放在server.xml的<GlobalNamingResources>元素里。

posted @ 2011-04-16 13:19 IceWee 阅读(885) | 评论 (0)编辑 收藏

连接到localhost 提示:位于 XDB 的服务器 localhost 要求用户名和密码

机器上装了Tomcat6.0.18和Oracle10g,单独启动Tomcat6.0,输入http://localhost:8080可以到Tomcat欢迎页。而启动Oracle的有关必须服务后,再输入http://localhost:8080就弹出一对话框如图:



产生原因:8080端口被其他服务占用
解决方案:
1、更改Tomcat的端口,这个比较简单。其方法如下:
(1)、在Tomcat安装根目录下的字文件夹conf中找到文件server.xml
(2)、将其用记事本程序打开,找到这段文字:
    

<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" maxHttpHeaderSize="8192"
                    maxThreads
="150" minSpareThreads="25" maxSpareThreads="75" 
                    enableLookups
="false" redirectPort="8443" acceptCount="100" 
                    connectionTimeout
="20000" disableUploadTimeout="true" />

 将以上代码中的Connector port="8080"中的8080更改为8088即可,重新启动Tomcat,使用http://localhost:8088登录,发现问题已解决。


2、 禁用Oracle服务。在“计算机管理”中的“服务”中找到OracleServiceORCL,停止掉就OK了。但是这并不是一种好的解决方法,因为很多时候我们是同时需要用到Tomcat和Oracle两种服务的。


文章出处:http://www.diybl.com/course/3_program/java/javashl/2008913/142707.html

posted @ 2011-04-16 13:17 IceWee 阅读(587) | 评论 (0)编辑 收藏

Tomcat做服务器在windows下开机自动运行

免安装版本的tomcat,要建立环境变量
要有JAVA_HOME变量就是你是JDK安装目录
要有JRE_HOME变量 就是你的JRE安装目录

新建变量:CATALINA_HOME=你的TOMCAT的目录

在PATH变量最后加上: ;%CATALINA_HOME%\bin

运行 CMD
在 CMD 下运行 service.bat install
然后运行 service.msc 找到Apache Tomcat..... 修改它的运行级别就行了


linux:设置tomcat开机自动启动

linux:设置tomcat开机自动启动
    分公司的一台服务器,重新启动后,老是忘记启动tomcat, 开发的同事要求设置为开机自动启动,感觉很简单,但还是花了点时间修改才完成。
 参考了网上的几个帖子,但都不是很适合要求,还是要自己修改一下,大概如下


[root
@appsit init.d]# pwd
/etc/init.d
[root
@appsit init.d]# cat tomcatd 
#!/bin/sh
# chkconfig: 345 99 10
# description: Auto-starts tomcat
# /etc/init.d/tomcatd
# Tomcat auto-start
# Source function library.

. /etc/init.d/functions
# source networking configuration.
. /etc/sysconfig/network
RETVAL
=0
# CATALINA_HOME="/usr/apps/apache/tomcat/jakarta-tomcat-4.0.4"
export JAVA_HOME=/tomcat/java/jdk1.5.0_09
export CATALINA_HOME
=/tomcat/tomcat/apache-tomcat-5.5.20
export CATALINA_BASE
=/tomcat/tomcat/apache-tomcat-5.5.20
TOMCATUSER
=tomcat
start()
{
        
if [ -$CATALINA_HOME/bin/startup.sh ];
          then
            echo $
"Starting Tomcat"
            
/bin/su $TOMCATUSER -$CATALINA_HOME/bin/startup.sh
            RETVAL
=$?
            echo 
" OK"
            
return $RETVAL
        fi
}
stop()
{
        
if [ -$CATALINA_HOME/bin/shutdown.sh ];
          then
            echo $
"Stopping Tomcat"
            
/bin/su $TOMCATUSER -$CATALINA_HOME/bin/shutdown.sh
            RETVAL
=$?
            
sleep 1
            ps 
-fwwu tomcat | grep apache-tomcat|grep -grep | grep -v PID | awk '{print $2}'|xargs kill -9
            echo 
" OK"
            
# [ $RETVAL -eq 0 ] && rm -f /var/lock/
            return $RETVAL
        fi
}

case 
"$1" in
start) 
        start
        ;;
stop) 
        stop
        ;;
                                                
restart)
         echo $
"Restaring Tomcat"
         $
0 stop
         
sleep 1
         $
0 start
         ;;
*)
        echo $
"Usage: $0 {start|stop|restart}"
        
exit 1
        ;;
esac
exit $RETVAL

[root
@appsit init.d]# chmod u+x tomcatd 
[root@appsit init.d]# chkconfig --add tomcatd 
[root@appsit init.d]# chkconfig --list tomcatd
tomcatd         0:off   1:off   2:off   3:on    4:on    5:on    6:off

[root
@appsit init.d]# service tomcatd stop


删除:

[root@appsit init.d]# chkconfig --del tomcatd


写得也还不完善,比如tomcat 用户用个变量代替,用 RETVAL=$?来返回最后命令的退出状态,...
这些留待以后完善
也可参考这篇:http://nio.infor96.com/archives/86

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/defonds/archive/2009/04/23/4102133.aspx

posted @ 2011-04-16 13:14 IceWee 阅读(955) | 评论 (0)编辑 收藏

tomcat采用默认安装,要想tamcat直接绑定多个域名,这里我们需要修改配置文件:C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\server.xml

server.xml 的修改方式如下:

(一)多域名绑定

1.如果你要绑定网站,首先是要把tomcat的默认访问端口8080,修改成80

原始:

<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150"
    minSpareThreads
="25" maxSpareThreads="75" enableLookups="false"
    redirectPort
="8443" acceptCount="100" connectionTimeout="20000"
    disableUploadTimeout
="true" />

 

修改后:

<Connector port="80" maxHttpHeaderSize="8192" maxThreads="150"
    minSpareThreads
="25" maxSpareThreads="75" enableLookups="false"
    redirectPort
="8443" acceptCount="100" connectionTimeout="20000"
    disableUploadTimeout
="true" />
 

其实这里就是把port:8080,修改成port:80就可以了,其他的参数不变


2.接下来就是重点了哈哈...
始:

<Engine name="Catalina" defaultHost="localhost">
    
<Host name="localhost" appBase="webapps" unpackWARs="true"
        autoDeploy
="true" xmlValidation="false" xmlNamespaceAware="false" />
</Engine>


当然这里我把注释代码统统删除掉了,省的碍眼

修改后:

<Engine name="Catalina" defaultHost=www.abc.com>
    
<Host name="www.abc.com" appBase== " abcapps " unpackWARs="true"
        autoDeploy
="true" xmlValidation="false" xmlNamespaceAware="false"    
        <Host name
=www.cba.com appBase== " D: \ cba " unpackWARs="true"
            autoDeploy
="true" xmlValidation="false" xmlNamespaceAware="false" />
        
<Host name="localhost" appBase="webapps" unpackWARs="true"
            autoDeploy
="true" xmlValidation="false" xmlNamespaceAware="false" />
</Engine>
 

这里解释一下上面的配置
Engine 的 dafaultHost :表示访问该tomcat默认进入的主机,注意一定不能是localhost,不然别人通过你的ip访问,就会默认进入tomcat的管理界面.

Host 的 name:表示该主机绑定的域名,如果绑定localhost则可以通过在浏览器中输入localhost访问该Host.

Host的 appBase:表示该主机绑定的文件存放路径,可以使用相对路径或绝对路径.

按照上面的配置:
1.如果我在浏览器中输入http://localhost 则访问 C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\ROOT 下的网站
2.如果输入http://www.abc.com 则访问 C:\Program Files\Apache Software Foundation\Tomcat 5.5\abcapps\ROOT 下的网站
3.如果输入http://www.cba.com 则访问 D:\cba\ROOT 下的网站.

注意这里有一个ROOT目录需要创建,我们只要把网站放到相应的ROOT目录向下面,即可通过相应域名访问了.

这里面的参数还有很多,我也不是很清楚,不过这样做确实可以实现多域名绑定哈哈.而且网站页面修改了只要直接覆盖就可以了,tomcat可以自动更新类和页面,当然如果修改了web.xml或lib,则需要重启tomcat才可以.


(二)虚拟目录


<Host name="localhost" appBase="webapps" unpackWARs="true"
    autoDeploy
="true" xmlValidation="false" xmlNamespaceAware="false">
    
<Context path="/cqq" docBase="f:\java\cqqapp" debug="0"
        reloadable
="true" crossContext="true">
</Host>


其中,Host标记是用来配置虚拟主机的,就是可以多个域名指向一个tomcat,格式只要参考默认的就 可以了。

<context>是Host标记的子元素吧,表示一个虚拟目录,它主要有两个属性,path就相当于虚拟目录名字, 而 docbase则是具体的文件位置。在这里我的虚拟路径名称为cqq,实际上我的程序也就是html、jsp、
这样我就可以通过 http://127.0.0.1/cqq/ 访问我的这个虚拟目录了。


servlet都 放在了f:\java\cqqapp这个目录下了

另外一种方法是:
配置两个站点

<Host name="www.xyz.com" debug="0" appBase="D:\Tomcat5.5\portal"
    unpackWARs
="true" autoDeploy="true">
    
<Context path="" docBase="D:/Tomcat5.5/portal" debug="0"
        reloadable
="true" />
</Host>
<Host name="www.abc.com" appBase="D:\Tomcat5.5\hxw" unpackWARs="true"
    autoDeploy
="true" xmlValidation="false" xmlNamespaceAware="false">
    
<Context path="" docBase="D:\Tomcat5.5\abc" debug="0"
        reloadable
="true" />
</Host>

这样设置以后,输入域名可以分别到两个站点,但由于没有指定默认站点,所以直接输入IP的时候,无法访问。于是增加 D:\Tomcat5.5\conf\Catalina\localhost\ROOT.xml内容如

<Context path="/" docBase="${catalina.home}/portal" debug="5"
    reloadable
="true" crossContext="true"></Context>


这样可以实现输入域名分别到个站点,输入IP就默认到D:/Tomcat5.5/portal这个站点,可是,可是,问题出现了,这两个站点启动相当消耗内存,TOMCAT内存设置我已经设到1400M了(再高TOMCAT5无法启动),所以不能同时启动三个应用。


大家有没有实现过,启一个应用而绑定多个域名的方法。
如下(这样写TOMCAT肯定是启动不了的,只是用来表达我的意思)

<Host name="www.abc.com,192.168.0.1" appBase="D:\Tomcat5.5\hxw"
    unpackWARs
="true" autoDeploy="true" xmlValidation="false"
    xmlNamespaceAware
="false">
    
<Context path="" docBase="D:\Tomcat5.5\abc" debug="0"
        reloadable
="true" />
</Host>


因为我是整合的,所以就不用改8080端口了哦~~~~~

posted @ 2011-04-16 13:12 IceWee 阅读(456) | 评论 (0)编辑 收藏

由于项目要发布到互联网,所以必须去掉测试时候的端口和项目名称,而为其指定域名访问地址。

第一步,去掉端口

找到server.xml,将默认端口8080改为80,而且发布到互联网必须用80端口,因此端口防火墙不会拦截。

第二步,去掉项目名称

平时我们开发时可能会经常用http://localhost:8080/xxxhttp://127.0.0.1:8080/xxx来访问我们的项目,通过第一步的修改现在我们要用http://localhost/xxxhttp://127.0.0.1/xxx来访问项目,也可以用主机名替换“localhost”或“127.0.0.1”。如果现在我们实用http://localhost/http://127.0.0.1/访问,看到的会是Tomcat的欢迎界面,网上众说纷纭,不过测试后都不管用,其中有一种说法测试成功,那就是:

还是修改server.xml,在Host标签中配置项目虚拟路径。以前测试都是将xxx.xml放在Tomcat的conf/localhost中,文件内容大概为:

<Context path="/xxx" docBase="D:\xxx\xxx" debug="0" reloadable="true" />


现在我将path的值改为"",启动Tomcat,发现依旧是Tomcat欢迎页面。

于是将此配置复制到Host标签中,注意要把xxx.xml移动出去,否则就配置了两次,结果成功!

现在就可以用http://localhost来访问你发布的项目了!

备注:

经过此配置可能导致的问题是部分功能出现错误,也就是页面无法显示,功能不可用。原因可能之一为:项目的jsp中应用了项目路径如:iframe的 src等于 xxxx/xxxx.do,在此请勿实用写死的项目名做为根,要用动态项目跟路径,如:${pageContext.request.contextPath},当前我们访问的项目根路径已经变成""(空串),你在用xxx去引用自然找不到路径而报错。这就是用动态项目根路径的好处。

posted @ 2011-04-16 13:10 IceWee 阅读(2977) | 评论 (0)编辑 收藏

最新eclipse升级到了3.3,其实是安装的MyEclipse6.6,发现快捷键“alt+/”不能使用了,也就是按下后并没有输出“System.out.println()”,于是在网上搜索了一下,找到了答案。

从eclipse进入Window-Preferences-General-Keys

找到Content Assist,会发现快捷键是“ctrl+space”,这与windows系统的默认中英输入法切换快捷键冲突了,需要修改,改为“alt+/”就可以了,可是发现还是无效,再找有没有其他的快捷键也使用“alt+/”的,找到了,叫“word completion”,现在就把它的快捷键改成别的吧!比如“alt+c”,再次测试,OK!

posted @ 2011-04-16 13:08 IceWee 阅读(218) | 评论 (0)编辑 收藏

大家一定对 myeclipse 的速度经常感到痛苦把,ok,现在开始给 myeclipse 提速:

1、打开 eclipse.ini

-showsplash
com.genuitec.myeclipse.product
--launcher.XXMaxPermSize
256M
-vmargs
-Dosgi.requiredJavaVersion
=1.5
-Xms128m
-Xmx512m    
-Dosgi.splashLocation
=e:MyEclipse 6.0eclipseMyEclipseSplash.bmp
-Duser.language
=en 
-XX:PermSize
=128M 
-XX:MaxPermSize
=256M

 

把下面的那个 -XX:MaxPermSize 调大,比如 -XX:MaxPermSize=512M,再把 -XX:PermSize 调成跟 -XX:MaxPermSize一样大
原因:大家一定对这个画面很熟悉吧:

几乎每次 eclipse 卡到当都是因为这个 非堆内存 不足造成的,把最大跟最小调成一样是因为不让 myeclipse 频繁的换内存区域大小

注意:XX:MaxPermSize 和 Xmx 的大小之和不能超过你的电脑内存大小!

2、windows–>perferences–>myeclipse–>validation
把 除了manual 下面的全部点掉,build下只留 classpath dependency Validator

手工验证方法:
在要验证的文件上,单击鼠标右键–>myeclipse–>run validation


3、拼写检查会给我们带来不少的麻烦,我们的方法命名都会是单词的缩写,他也会提示有错,所以最好去掉,没有多大的用处:
windows–>perferences–>general–>validation->editors->Text Editors->spelling

4、windows–>perferences–>general–>startup and shutdown
关掉没用的启动项:
怎样才能知道哪些启动项有用呢?我现在把我知道的启动项用处说一下,还有很多不懂的,希望大家懂的回复在下面啊:
WTP :一个跟myeclipse差不多的东西,主要差别是 WTP 是免费的,如果使用myeclipse,这个可以取消
Mylyn:组队任务管理工具,类似于 CVS ,以任务为单位管理项目进度,没用到的可以取消
Derby:一种保存成 jar 形式的数据库,我没用到,取消
一大排以 MyEclipse EASIE 打头的启动项:myeclipse 支持的服务器,只选自己用的,其他取消,比如我只选了tomcat

5、myeclipse 打开 jsp 的默认编辑器不好,会同时打开预览
windows–>perferences–>general–>editors->file associations

把默认改成 MyEclipse JSP Editor

posted @ 2011-04-16 13:06 IceWee 阅读(872) | 评论 (0)编辑 收藏

MyEclipse 版本号:6.0.1

在使用MyEclipse的Hibernate插件时,配置了数据源连接数据库报错,错误信息如标题。在网上搜索到了解决方案,如下:

打开你的Myeclipse目录下有一个eclipse文件夹下有一个eclipse.ini它是Myeclipse中的启动时读取的配置文件!
里边有一个启动项,Duser.language=en,
把它改成Duser.language=zh,
好了就改这一处,重启myeclipse,OK!

posted @ 2011-04-16 13:05 IceWee 阅读(335) | 评论 (0)编辑 收藏

在网上找了些资料.整理了下...借SpringSide3.0正式发布之际.贴出来.希望能给各位方便的开发体验!

在MyEclipse6.0甚至更高的6.5GA版本中的快捷键中把我们习惯性使用的Alt+/进行代码自动补齐

   但是由于于之前版本有快捷键有冲突,所以总之不能自动提示
   以下是解决方法
   方法如下:
   1.选择MyEclipse6.X菜单栏中的Window->preferences;
   2.选择General->keys;
   3.在右侧中间的窗体中点击word completion后再点击remove binding,在下方的binding中随便输入一个快捷键;
   4.然后选择Content Assist点击Remove binding,在binding中输入Alt+/;
   5.点击Ok就可以了

  
   设置技巧2
Eclipse中默认是Ctrl+/实现单词补全功能,系统会列出相近若干个选项,怎样不通过快捷

键就启动这个功能,即打入单词,停顿片刻之后就会列出若干个相近选项供选择?

下面就是解决方法
会看到只有一个“.”存在。表示:只有输入“.”之后才会有代码提示,我们要修改的地方就是这里,可是Eclipse默认只允许输入4个自定义字符。

不过我们可以把当前的设置导出,保存为一个文件,然后在文件中修改,再导入设置,这样就可以突破Eclipse的限制。

先把上图中“.”的地方输入几个随便的字符,例如“asdf”,点最下面的“OK”来保存设置。

然后打开 Eclipse的 File -> Export,在窗口中展开 General ->Perferences-->Export all然后点击NEXT。然后点击“Browse”选择任意的一个路径,保存配置文件,然后点击“Finish”。

用记事本打开刚才保存的那个配置文件(扩展文件名:*.epf),按“ctrl + F”,输入刚才设置的“asdf”,找到刚才字符串。把“asdf”修改为“abcdefghijklmnopqrstuvwxyz.”,然后保存,退出记事本。

打开Eclipse的 File -> Import 然后在打开的窗口里展开 General ->Perferences,点击NEXT,选中刚才修改过的配置文件,Finish。现在,再打开Window ->Perferences,并依次展开 Java -> Editor -> ContentAssist,会发现已经超过了4个字符,也就是说我们输入任何字母和“.”都会有代码提示了。

修改之后,默认是你输入某个字符200毫秒之后出现代码提示,如果出现输入很卡的情况,需要把提示延迟调高一些;如果你嫌它太慢,可以修改成更小的数字,不过数字改的越小,对系统性能的要求就越高,我设置的是50毫秒


以上是个人编程习惯.大家可自行设置!

posted @ 2011-04-16 13:02 IceWee 阅读(190) | 评论 (0)编辑 收藏

转载自 zhangtianshun
最终编辑 IceWee

最近也想整整spring和hibernate,于是从网上找个例子来做,例子是MySql的,但我这里数据库用的是oracle,照着例子一步步来,但配置好连接串,却怎么也连接不上,同时用pl/sql是能连接上的.报的是ORA-00604,上网google一搜,还真有这个问题,我就在这转贴下, 如图


 

原文内容是:

myeclipse6.0 连接oracle10g的问题 ORA-00604,ORA-12705

MyEclipse Database Explorer建立oracle 10g数据库连接的时候 总提示

java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1

ORA-12705: invalid or unknown NLS parameter value specified

问题初步分析是 Myeclipse语言 和oracle 10g 冲突问题。

进一步分析,由于oracle 是可以正常登陆的,所以问题出现在myeclipse 这边。

解决方法一:
在网上搜索到的 估计myeclipse的版本是 5.0,解决方法

1.在windows XP控制面板中修改区域和语言选项,把"区域选项"中的"标准和格式"自定义为"英语(美国)";

2.在MyEclipse中help菜单>About MyEclipse...>点击"Configuration Details",设置其中的两个值:

osgi.nl=en_US

user.language=en

这样就可以在MyEclipse Database Explorer中顺利建立oracle连接了.

该方法在myeclipse6.0中不适应。

我的解决方法:

修改eclipse.ini文件,将"-Duser.language=en"修改为"-Duser.language=zh"。问题解决。

分析:
主要原因是MyEclipse在启动时候,语言编码是在[MyEclipse路径]\eclipse\eclipse.ini文件中加载的。 而国别编码是从系统的区域设置中得到的。如果MyEclipse默认启动参数为"-Duser.language=en",而操作系统设为"中文(中国)"MyEclipse加载后的信息就是"en_CN",这样就会出现上述问题,所以只要将两边的设置改成一致的,就可以解决上述问题. 你也可以就系统的区域设置定为"中文(中国)",修改eclipse.ini文件,将"-Duser.language=en"修改为"-Duser.language=zh",这样在MyEclipse加载后的Configuration Details信息就统一为zh_CN,即"osgi.nl=zh_CN".

如果是oracle 9i 问题,则可以如下解决方法

数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。

客户端字符集环境select * from nls_instance_parameter,其来源于v$parameter,

表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表

客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件

字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。

首先查看当前数据库字符集是什么,配置资料库选用相同

把eclipse.ini里的en修改成zh后,还真行了,高手就是高手啊~

 

posted @ 2011-04-16 13:00 IceWee 阅读(948) | 评论 (0)编辑 收藏

大致意思:Tim Cull碰到一个SimpleDateFormat带来的严重的性能问题,该问题主要有SimpleDateFormat引发,创建一个 SimpleDateFormat实例的开销比较昂贵,解析字符串时间时频繁创建生命周期短暂的实例导致性能低下。即使将 SimpleDateFormat定义为静态类变量,貌似能解决这个问题,但是SimpleDateFormat是非线程安全的,同样存在问题,如果用 ‘synchronized’线程同步同样面临问题,同步导致性能下降(线程之间序列化的获取SimpleDateFormat实例)。

Tim Cull使用Threadlocal解决了此问题,对于每个线程SimpleDateFormat不存在影响他们之间协作的状态,为每个线程创建一个SimpleDateFormat变量的拷贝或者叫做副本,代码如下:

 

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/** 
 * 使用ThreadLocal以空间换时间解决SimpleDateFormat线程安全问题。 
 
*/

public class DateUtil {
    
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    @SuppressWarnings(
"rawtypes")
    
private static ThreadLocal threadLocal = new ThreadLocal() {
        
protected synchronized Object initialValue() {
            
return new SimpleDateFormat(DATE_FORMAT);
        }

    }
;

    
public static DateFormat getDateFormat() {
        
return (DateFormat) threadLocal.get();
    }


    
public static Date parse(String textDate) throws ParseException {
        
return getDateFormat().parse(textDate);
    }

}


创建一个ThreadLocal类变量,这里创建时用了一个匿名类,覆盖了initialValue方法,主要作用是创建时初始化实例。也可以采用下面方式创建;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

/** 
 * 使用ThreadLocal以空间换时间解决SimpleDateFormat线程安全问题
 
*/

public class DateUtil {    
    
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    
private static ThreadLocal threadLocal = new ThreadLocal();
    
// 第一次调用get将返回null
    
// 获取线程的变量副本,如果不覆盖initialValue,第一次get返回null,
    
// 故需要初始化一个SimpleDateFormat,并set到threadLocal中
    public static DateFormat getDateFormat() {
        DateFormat df 
= (DateFormat) threadLocal.get();
        
if (df == null{
            df 
= new SimpleDateFormat(DATE_FORMAT);  
            threadLocal.set(df);
        }

        
return df;
    }

}



我们看下我们覆盖的initialValue方法:

protected T initialValue() {
    
return null;    // 直接返回null
}



当然也可以使用:
apache commons-lang包的DateFormatUtils或者FastDateFormat实现,apache保证是线程安全的,并且更高效。

posted @ 2011-04-16 02:34 IceWee 阅读(1036) | 评论 (0)编辑 收藏

HTML文档中使用了脚本控制内容的高度,所以要用到 document.body.clientHeight,但是发现结果却不是想象的那样,请教高手得来真经,是需要设置html,body样式。试试去掉红色的样式设置。脚本的功能是解决窗口进入后最大化不能自适应的问题。
 

demo.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns=" http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>Eletric Power Integrative System</title>
<style type="text/css">
   html, body {

    width
: 100%;
    height
: 100%;
    margin
: 0px;
    padding
: 0px;
   
}

</style>
<script type="text/javascript">
   
function $(id) {
    
return document.getElementById(id);
   }


   window.onload 
= window.onresize = function() {
    $('cententMain').style.height 
= (document.body.clientHeight - 100+ 'px'; 
    
//alert($('cententMain').style.height);
   }

</script>
</head>
<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
   
<tr>
    
<td>
     
<div id="header" style="height:75px; background:#006F68; left:0px; top:0px; width:100%; z-index:1000"></div> 
    
</td>
   
</tr>
   
<tr>
    
<td>       
     
<div id="cententMain" style="background-color:#fff; position:absolute; left:0px; top:75px; bottom:25px; width:100%; z-index:100">
      
<iframe id="indexFrame" name="indexFrame" src="http://www.xjgc.com" width="100%" height="100%" frameborder="1"></iframe>
     
</div> 
    
</td>
   
</tr>
   
<tr>
    
<td>
     
<div id="footer" style="background:#006F68; border-top:1px solid #1291a9; height:25px; position:absolute; left:0px; bottom:0px; width:100%; z-index:1000" align="center" valign="bottom">
      
<span style="font-size:11px;color:#fff;font-family:Verdana, Arial, Helvetica, sans-serif;">&copy;2008 - 2012 Icesoft</span>
     
</div>
    
</td>
   
</tr>
</table>
</body>
</html>


posted @ 2011-04-16 02:32 IceWee 阅读(3263) | 评论 (1)编辑 收藏

最近负责项目中的界面修改工作,遇到了一个奇怪的问题,代码如下:

.bg {
    background-attachment: fixed; /* 设定背景图不滚动 */
    font-size: 9pt; /* 设定字体 */
    background-image: url(space.gif); /* 设定背景图url */
    background-repeat: no-repeat; /* 设置背景图不平铺 */
    height: 19px; /* 等于背景图高度 */
    width: 58px; /* 等于背景图宽度 */
    background-position: center center; /* 设定背景图居中 */
    border: none; /* 取消边框 */
   }

<input type="button" class="bg" value=" 提 交">


我的系统用的是IE6,现在大多数用户用的都是IE7。我的电脑显示为:

可同事的电脑上却显示:


令我很疑惑,于是在电脑上装了IE6和IE7,发现果真是这样,由于本人并不是网页设计师,对CSS略知一二而已,这个问题是在解决不了,开始在网上搜索,但是相关主题不多,可能这不算是个问题吧!却把我难住了,终于搜索到一片相关的帖子,中说把:“   background-attachment: fixed;” 去掉,在IE7中就可以显示了,我试着去掉这行代码,果真解决问题了,但却不知其原因。。。


posted @ 2011-04-16 02:31 IceWee 阅读(621) | 评论 (0)编辑 收藏

大家都知道做分页必须要知道总记录数,这就为我们出了一到小题儿,往往我们直接用Criteria调用list方法就返回全部查询结果了,但是分页必须在返回列表之前得到总行数。我之前的做法是写两个方法,参数完全一样,一个返回 Integer,也就是记录数,一个返回List,结果集。这样写感觉挺麻烦的,还有人直接用criteria.list()返回记录数,再设置分页属性,那样还叫什么分页啊,调用list已经将数据加载到内存了,那不又成了内存分页,这种做法程序处理简单了,性能降下来了。

今天在网上闲逛发现了一个新招,代码如下(只贴出回调函数里的代码了):

灰色斜体为业务相关代码,请无视

public Object doInHibernate(Session session) throws HibernateException, SQLException {
    Criteria criteria = session.createCriteria(XtLog.class);
    Criteria userCriteria = criteria.createCriteria("xtUser");
    Criteria lcCriteria = criteria.createCriteria("xtLogClass");
    if (StringUtils.isNotBlank(userId)) {
     userCriteria.add(Restrictions.like("userId", userId, MatchMode.START));
    }
    if (StringUtils.isNotBlank(logClassId)) {
     lcCriteria.add(Restrictions.eq("logClassId", logClassId));
    }
    if (beginDate != null && endDate != null) {
     criteria.add(Restrictions.between("xtOplogtime", beginDate, endDate));
    }

    int totalRows =((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
    psm.setTotalRows(totalRows);  // 业务代码,请无视
    criteria.setProjection(null);
    criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
    Map<String, String> orderMap = psm.getOrderMap();
    if(orderMap != null){
     setOrder(criteria, userCriteria, lcCriteria, orderMap);
    }

    if(!psm.isAll()){  // 分页
     criteria.setFirstResult(psm.getRowStart());
     criteria.setMaxResults(psm.getPageSize());
    }
//    List<XtLog> logs = new ArrayList<XtLog>(); // 返回日志列表
//    List<Object[]> list = criteria.list();
//    for (Object[] o : list) {
//     logs.add((XtLog) o[2]);
//    }
//    return logs;
    return criteria.list();
}

请注意绿色加粗那两行代码,那就是hibernate获取记录总行数的写法,直接和获取列表的方法写在一起,貌似很简洁,很给力,如果你查询的就是一张表,那么没事了,但我查询的日志是要关联到用户和日志分类的,最上面那三行代码就是关联了,这时发现返回到页面后报错了,原因是返回的并不是我要的日志List,而是 Object[]的List,每个List里三个对象数组,主表的数组下标是最后一个,这时我就得使用蓝色字体的代码重新封装后返回,我感觉这样虽然解决了该问题,但还是不给力,不完美,不perfect,就是不爽,于是请将注意力转移到红色加粗字体上,写上它就OK了。

posted @ 2011-04-16 02:26 IceWee 阅读(901) | 评论 (0)编辑 收藏

想必用过Struts的朋友都遇到过这个异常吧!没遇到的也可能,只能说你很强或运气不错。

我遇到该异常的解释是我不强,用Struts不是很多,或者说根本不熟练,对一些知识了解得并不深,仅仅皮毛而已,所以这个异常困扰了我一天的时间。言归正传。

从字面上翻译就是“不能找到映射action”,当出现这个异常的时候,肯定是在请求某个action,而根据给定的路径却没找到,所以页面啪嚓抛出一个异常,满满一页。

此时你首先要检查的是请求的路径是否书写正确,与struts-config.xml中配置的路径仔细的核对,发现完全正确。真的完全吻合么?恐怕只有后面的“/XXAction”完全相同吧!所谓的完全正确是指由根目录到struts配置的path完全一致,如“http://localhost:8080/web/data/login.do”,你的struts配置文件中配置的可能是path="/data/login",那么你如此访问肯定是正确的,只怕你忘记了data这个渺小的目录的存在,遗忘请补齐。这种情况的出现往往是做项目的时候,小组都分区分模块,每个人都有自己定义的目录,在web.xml中配置struts,如:

<servlet>
    
<servlet-name>strutsAction</servlet-name>
    
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    
<init-param>
        
<param-name>config/prms/data</param-name>
        
<param-value>/WEB-INF/prms/struts-config-data.xml</param-value>
    
</init-param>
</servlet>

 

那么在你访问struts资源的时候千万不要忘记上面配置的路径

下面说说我遇到这个异常的原因吧!我直接访问服务器上的资源,即xx.jsp,如果路径写正确,这是没问题的,但是页面上却抛出了这个异常,仔细的检查发现,页面form的action写着“/login.do”,页面所在路径与“/login.do”组合后的路径并不是action配置的路径,所以根本就找不到action资源,只能抛出异常。

前辈们都建议不要直接访问服务器固定资源,如果你偏要访问那个jsp也行,使用Struts提供的ForwardAction即可,既不会出现上面的异常,又没有直接访问服务器资源,两全其美。

posted @ 2011-04-16 02:23 IceWee 阅读(1497) | 评论 (0)编辑 收藏

记得这个错误已经遇到第二次了,一打眼就知道怎么回事了,不过还是要记下,给自己长长记性。

原因是 使用了struts的标签没有闭合标签。

例:

异常(错误)写法:

<bean:write name="user" property="name">

 

正确写法:

<bean:write name="user" property="name" />


posted @ 2011-04-16 02:20 IceWee 阅读(421) | 评论 (0)编辑 收藏

今天在做应用的时候有个级联菜单的功能,因为一般做开发的时候都是使用FireFox居多(原因不用多说,相信所有的前端开发人员都曾经尝到了恶心的IE不遵守W3C标准的痛苦),因此想当然的时候对一个Select标签进行了如下操作: selectObj.innerHTML = '<option value="value">something</option>'

写完之后兴冲冲在FireFox下测试了一下功能,没问题,觉得OK!     第二天有个同事在测试的时候发现在IE下选什么都没有用,出不来子菜单,告诉我之后,着实把我郁闷了一番。在IE6下看了一把,貌似也没有报什么脚本错误,但就是innerHtML没有设置成功,因为之前没有遇到过这个问题,调了很久都没有找到原因。后来有IE Develop Toolbar看了一下生成之后的HTML结构,发现IE根本没有按照我规定的格式去渲染select标签,赶紧在Google上搜了一把,发现这是IE 的一个BUG,微软的BUG申明中注明了两种解决方案: 1. 如果您必须使用 innerHTML ,一种替代方法是使用一个 div 对象封装 SELECT 元素和然后设置 div 对象的 innerHTML 属性。 例如:

<html>
<head>
<title>My Example</title>
<script type="text/javascript">
<!--
    
var origDivHTML;
    
function init() {    
        origDivHTML 
= myDiv.innerHTML;
    }

    
    
function setValues() {    
        
var oldinnerHTML = "your original innerHTML: " + yourDiv.innerHTML;    
        alert(oldinnerHTML);    
        yourDiv.innerHTML 
= origDivHTML;    
        
var curinnerHTML = "your current innerHTML: " + yourDiv.innerHTML;    
        alert(curinnerHTML);}

//-->
</script>
</head>
<body onload="init()">
<div id="myDiv">
    
<select name="firstSelect" size="1">
        
<option>11111</option>
        
<option>22222</option>
        
<option>33333</option>
    
</select>
</div>
<div id="yourDiv">
    
<select name="secondSelect" size="1">
        
<option>aaaa</option>
        
<option>bbbb</option>
        
<option>cccc</option>
    
</select>
</div>
<button onclick="setValues();">click me to set the values</button>
</body>
</html>

 

2. 理想情况下,应使用 选项(Option) 集合添加为 SELECT 元素的选项。 下面的代码显示用编程方式将选项添加到 SELECT 元素的三种方法。例如:

<html>
<head>
<title>Example</title>
<script type="text/javascript">
<!--
    
function fill_select1() {    
        
for ( var i = 0; i < 100; i++{        
            select1.options[i] 
= new Option(i, i);    
        }

    }

    
    
function fill_select2() {    
        
var sOpts = "<select>";    
        
for ( var i = 0; i < 100; i++{        
            sOpts 
+= '<option value="' + i + '">+ i + '</option>';    
        }
    
        select2.outerHTML 
= sOpts + "</option>";
    }

    
    
function fill_select3() {    
        
for ( var i = 0; i < 100; i++{        
            
var oOption = document.createElement("OPTION");        
            oOption.text 
= "Option: " + i;        
            oOption.value 
= i;        
            document.all.select3.add(oOption)    
        }

    }

//-->
</script>
</head>
<body>
    
<h2>SELECT Box Population</h2>
    
<select id=select1 name=select1></select>
    
<input type="button" value="Populate with options list" id="button1" name="button1" onclick="fill_select1();">
    
<br /><br />
    
<select id="select2" name="select2"></select>
    
<INPUT type="button" value="Populate with outerHTML" id="button2" name="button2" onclick="fill_select2();">
    
<br /><br />
    
<select id="select3" name="select3"></select>
    
<input type="button" value="Populate with using createElement" id="button3" name="button3" onclick="fill_select3();">
</body>
</html>



虽然这个BUG在GOOGLE上已经有不少人发表了看法,我还是觉得应该自己去写下来,总结加深印象,希望能给有需要的朋友提供帮助,少走一些弯路。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/grubbyfan/archive/2009/01/09/3743344.aspx

posted @ 2011-04-16 02:01 IceWee 阅读(381) | 评论 (0)编辑 收藏