2014年7月16日

Struts2学习

几年前学习了一阵子Struts2,也开发了些小项目,后来工作变动,几年没动技术,这两天又想捡起来,发现一些配置有了变化,重新学习,记录些内容,供自己查询。

环境没敢用最新的,MyEclipse用的是8.5的版本,Tomcat最终选择了6,JDK也是用的7,Struts2的版本2.3.16.3。通常的配置没什么要记录的,主要记录下出问题的地方:
1、Tomcat
从MyEclipse启动Tomcat一直报错,后来下载了一个tcnative-1.dll文件才解决,版本要求比较严格,对于Tomcat6.0.41而言,这个动态链接库版本要求是1.1.30,1.1.3都不行,不知道有什么区别,将文件拷贝到jre/bin下即可。
2、web.xml文件内容
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 3 
 4     <display-name>Struts Test</display-name>
 5 
 6     <filter>
 7         <filter-name>struts2</filter-name>
 8         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
 9     </filter>
10 
11     <filter-mapping>
12         <filter-name>struts2</filter-name>
13         <url-pattern>/*</url-pattern>
14     </filter-mapping>
15 
16     <welcome-file-list>
17         <welcome-file>index.html</welcome-file>
18     </welcome-file-list>
19 
20 </web-app>
21 
3、struts.xml文件内容
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 
 6 <struts>
 7 
 8    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
 9     <constant name="struts.devMode" value="true" />
10 
11     <package name="default" namespace="/" extends="struts-default">
12 
13         <default-action-ref name="index" />
14 
15         <global-results>
16             <result name="error">/error.jsp</result>
17         </global-results>
18 
19         <global-exception-mappings>
20             <exception-mapping exception="java.lang.Exception" result="error"/>
21         </global-exception-mappings>
22         
23         <action name="action名" class="java包名及类名">
24         <result name="success">/调用的jsp页面文件p</result>
25         </action>
26     </package>
27 
28     <include file="example.xml"/>
29 
30     <!-- Add packages here -->
31 
32 </struts>
33 
4、调用时发现action名定义了大小写后,地址栏也要输入相应的大小写,否则报错。这个问题困扰了好久。。。。。


By SeeSea

posted @ 2014-07-16 10:47 SeesSea 阅读(191) | 评论 (0)编辑 收藏

2009年3月18日

在ubuntu 8.04下安装Oracle 11g方法

项目要求使用Oracle,据说安装方式比较繁复,网上搜到两篇文章,先备着,准备日后按图索骥。
第一篇
地址:http://forum.ubuntu.org.cn/viewtopic.php?f=44&t=136860

在ubuntu 8.04下安装Oracle 11g
本文是参考了:http://hi.baidu.com/wuxicn/blog/item/0cfdc24ac5ae372609f7ef94.html"文章,是翻译下面的这篇文章的。我主要参考的是中文的,我只是在实际操作中做了一点小小的修改,在此表示感谢!紫色为我的注释。
原文是英文,地址是:
http://www.pythian.com/blogs/968/instal ... ardy-heron,(转载注明出处,谢谢!! )
共9步:

Step 1
下载和安装 Ubuntu 8.04 Hardy Heron (x86-32位) 版。略。

Step 2
下载Oracle 11g: Download Oracle 11g for Linux (x86, 32-bit).
现不要急着解压,一会我会告诉你解压在哪的。

Step 3
修改X server 的默认设置,点菜单的System -> Administration -> Login Window(系统->管理->登录窗口),选择“Security(安全)”选项卡,取消“Deny TCP connections to the Xserver(拒绝TCP连接到X服务器)”的勾,重启Xserver(或者重启系统)。然后在终端输入:
user@hardy:~$ xhost +127.0.0.1
127.0.0.1 being added to access control list
Step 4
打开终端,转换为超级用户:(注意,这里用sudo su -而不是sudo -s是有原因的:sudo su - 将用户转换为超级用户,并新起一个会话(空的会话),而不是像sudo -s那样将当前会话传递个新的超级用户,减少环境变量可能造成的影响和危害。
user@hardy:~$ sudo su -
[sudo] password for user:
root@hardy:~# apt-get update
...
root@hardy:~# apt-get dist-upgrade
...
root@hardy:~# reboot
Step 5
用apt安装一些必要的工具:

user@hardy:~$ sudo su -
[sudo] password for user:
root@hardy:~# apt-get install build-essential libaio1 gawk ksh libmotif3 alien libtool lsb-rpm
...
root@hardy:~#
Step 6
在装完那些工具以后,我们需要做的就是修改一些Ubuntu的/bin/sh的默认连接,千万不要略过这一步,否则安装的时候会出现很多错误。
root@hardy:~# cd /bin
root@hardy:/bin# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2008-04-28 19:59 /bin/sh -> dash
root@hardy:/bin# ln -sf bash /bin/sh
root@hardy:/bin# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2008-05-01 22:51 /bin/sh -> bash
如果你想知道为什么Ubuntu用dash作为默认的shell,看这个:a detailed explanation of why dash is the default system shell 。
Step 7
增加用户和组,并修改一些配置。这一步很重要!如果不是很有把握,不要随便改。(为了便于解释,增加了行号):
01 root@hardy:/bin# cd
02 root@hardy:~# pwd
/root
04 root@hardy:~# addgroup oinstall
Adding group `oinstall' (GID 1001) ...
Done.
07 root@hardy:~# addgroup dba
Adding group `dba' (GID 1002) ...
Done.
10 root@hardy:~# addgroup nobody
Adding group `nobody' (GID 1003) ...
Done.
13 root@hardy:~# usermod -g nobody nobody
14 root@hardy:~# useradd -g oinstall -G dba -p password -d /home/oracle -s /bin/bash oracle
15 root@hardy:~# mkdir /home/oracle
16 root@hardy:~# chown -R oracle:dba /home/oracle
17 root@hardy:~# ln -s /usr/bin/awk /bin/awk
18 root@hardy:~# ln -s /usr/bin/rpm /bin/rpm
19 root@hardy:~# ln -s /usr/bin/basename /bin/basename
20 root@hardy:~# mkdir /etc/rc.d
21 root@hardy:~# for i in 0 1 2 3 4 5 6 S ; do ln -s /etc/rc$i.d /etc/rc.d/rc$i.d ; done
22 root@hardy:~# mkdir -p /u01/app/oracle
23 root@hardy:~# chown -R oracle:dba /u01
24 root@hardy:~#
Lines 04-12: 增加我们需要的用户和组
Line 13: 让nobody用户的组变为nobody,这样Oracle的安装程序不会出问题。Ubuntu默认nobody的组是nogroup。
Lines 14-18: 创建一个oracle用户。注意,oracle用户的HOME目录不要与ORACLE_HOME相同。
Lines 19-23: 创建一些Oracle安装程序需要的工具的连接。因为Oracle安装程序是为Red Hat准备的,所以有些工具的位置和Ubuntu不一样。
Finally, on lines 24-25 创建ORACLE_BASE目录。
Step 8
修改一些系统默认值。这些修改将会增加系统文件描述符的数量、增加共享内存大小和修改一些网络子系统参数。这些修改是否会对你的系统带来影响我就不得而知了。将下面这些增加到/etc/sysctl.conf文件的末尾:
fs.file-max = 65535
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 1024 65535
net.core.rmem_default = 1048576
net.core.rmem_max = 1048576
net.core.wmem_default = 262144
net.core.wmem_max = 262144
再增加下面这些到/etc/security/limits.conf文件末尾:

oracle soft nproc 2047
oracle hard nproc 16383
oracle soft nofile 1023
oracle hard nofile 65535
为了强制使用刚才我们增加的东西,我们再增加下面这些到/etc/pam.d/login文件末尾:

session required /lib/security/pam_limits.so
session required pam_limits.so
然后通过命令:sysctl -p 让刚才增加的东西生效:

root@hardy:~# sysctl -p
kernel.printk = 4 4 1 7
kernel.maps_protect = 1
fs.inotify.max_user_watches = 524288
vm.mmap_min_addr = 65536
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
fs.file-max = 65535
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 1024 65535
net.core.rmem_default = 1048576
net.core.rmem_max = 1048576
net.core.wmem_default = 262144
net.core.wmem_max = 262144
root@hardy:~#
Step 9
现在我们将刚才下载的oracle11g的安装包解压到/home/oracle/install/目录下。然后进入目录,设置DISPLAY参数,开始安装:

root@hardy:~# cd /home/oracle
root@hardy:/home/oracle# chown -R oracle:dba install

用oracle用户登陆,(不然会出安装界面出不来)
oracle@hardy:~$ export DISPLAY=127.0.0.1:0.0
oracle@hardy:~$ pwd
/home/oracle
oracle@hardy:~$ ls -l
total 4
drwxr-xr-x 6 oracle dba 4096 2007-09-18 18:50 install
oracle@hardy:~$ cd install
oracle@hardy:~/install$ ls -l
total 28
drwxr-xr-x 11 oracle dba 4096 2007-08-06 16:02 doc
drwxr-xr-x 5 oracle dba 4096 2007-08-03 13:28 install
drwxr-xr-x 2 oracle dba 4096 2007-09-18 18:52 response
-rwxr-xr-x 1 oracle dba 2911 2007-08-03 13:28 runInstaller
drwxr-xr-x 14 oracle dba 4096 2007-08-03 13:27 stage
-rw-r--r-- 1 oracle dba 4835 2007-08-06 18:19 welcome.html
oracle@hardy:~/install$ ./runInstaller -ignoreSysPrereqs
输入完上面命令后,就进入了Oracle 的同一安装程序了(OUI),不要急,继续按照本文一步一步的通过安装:
注意:OUI安装完后,并不是真正完全安装完成,还需要就行最后的收尾工作(在最后有),而且这是必须做的工作!


点(Next)下一步。


修改“Specify Operating System group name:”为:"dba",然后点"Next".


按照上图设置,点下一步。


选择"Enterprise Edition",然后下一步。


安图设置,下一步。


继续下一步。


等待系统检查,不要担心有错误和警告。


将检查到的所有非“Succeeded”的都打上勾,下一步。


,下一步。在这一步选"Create a Database"来安装数据库。([color=red]原文是通过netca建立监听,dbca建库,我第一次也是这样做的,dbca建库时会报错,因为ubutunbu 不支持RPM包)。[/color]

将所有组都设为:dba,下一步。

现在可以点“Install”了:)时间比较长。


到了这一步不要记着点“OK”,需要做下面操作:(另起一个终端,用sudo su - 转为超级用户)

root@hardy:~# /u01/app/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/oraInventory to 770.
Changing groupname of /u01/app/oraInventory to dba.
The execution of the script is complete
root@hardy:~# /u01/app/oracle/product/11.1.0/db_1/root.sh
Running Oracle 11g root.sh script...

The following environment variables are set as:
ORACLE_OWNER= oracle
ORACLE_HOME= /u01/app/oracle/product/11.1.0/db_1

Enter the full pathname of the local bin directory: [/usr/local/bin]:
Copying dbhome to /usr/local/bin ...
Copying oraenv to /usr/local/bin ...
Copying coraenv to /usr/local/bin ...

Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
Finished product-specific root actions.
root@hardy:~#
好了,这个完成后可以点“OK”了。
安后点“Exit”退出OUI,现在可以祝贺你,OUI安装完成了:)但是还是不要急,记住咱们还有收尾工作需要做。
在/etc/profile文件中加入下面几句:

export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1
export PATH=$PATH:/u01/app/oracle/product/11.1.0/db_1/bin
创建一个Oracle 11g数据库的启动脚本,名字可以叫做:oracledb,在/u01/app/oracle/product/11.1.0/db_1/bin下建立文件:oracledb,内容:

#!/bin/bash
#
# /etc/init.d/oracledb
#
# Run-level Startup script for the Oracle Listener and Instances
# It relies on the information on /etc/oratab

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1
export ORACLE_OWNR=oracle
export PATH=$PATH:$ORACLE_HOME/bin

if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]
then
echo "Oracle startup: cannot start"
exit 1
fi

case "$1" in
start)
# Oracle listener and instance startup
echo -n "Starting Oracle: "
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/lsnrctl start"
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
touch /var/lock/oracle
echo "OK"
;;
stop)
# Oracle listener and instance shutdown
echo -n "Shutdown Oracle: "
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/lsnrctl stop"
su $ORACLE_OWNR -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME"
rm -f /var/lock/oracle
echo "OK"
;;
reload|restart)
$0 stop
$0 start
;;
*)
echo "Usage: `basename $0` start|stop|restart|reload"
exit 1
esac

exit 0
修改脚本为可执行的:

root@hardy:~# chmod a+x /u01/app/oracle/product/11.1.0/db_1/bin/oracledb
如果你希望开机自动启动Oracle 11g数据库,那么就作下面的工作:

root@hardy:~# ln -s /u01/app/oracle/product/11.1.0/db_1/bin/oracledb /etc/init.d/oracledb
root@hardy:~# sudo sysv-rc-conf --level 2345 oracledb on

如果没有sysv-rc-conf命令,就apt-get一个。
最后,增加你自己的用户名到dba组:

root@hardy:~# usermod -G dba -a user
好了,至此,Oracle 11g就安装完了。重新登录后,你就可以使用oracle的命令了。
(ORACLE_SID=orcl 是你安装时候设置的值)

oracle@hardy:~$ export ORACLE_SID=orcl
oracle@hardy:~$ sqlplus '/as sysdba'

SQL*Plus: Release 11.1.0.6.0 - Production on Mon May 5 02:39:27 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>connect /as sysdba
Connected to an idle instance.

SQL>startup 启动数据库命令。
.
ORACLE instance started.



Total System Global Area 418484224 bytes

Fixed Size 1300324 bytes

Variable Size 281020572 bytes

Database Buffers 130023424 bytes

Redo Buffers 6139904 bytes

Database mounted.

Database opened.

oracle@hardy:~$ export ORACLE_SID=orcl
oracle@hardy:~$ emctl start dbconsole 启动EM,地址为https://yourip:1158/em/console.这样你就可以通过IE登陆了。不过界面为乱码。呵呵!!解决方法自己在网上找吧!!

如果你看到了上面的结果,证明你的oracle安装成功了。

第二篇
地址:http://www.linuxidc.com/Linux/2008-06/13855.htm

花了半天时间,在Ubuntu 8.04 LTS上顺利安装Oracle 11G.下面说说大概的步骤.

1.确保安装了以下程序:

sudo apt-get install build-essential libaio1 gawk ksh libmotif3 alien libtool lsb-rpm

2.

cd /bin
ln -sf bash /bin/sh

 

3.增加用户和组

addgroup oinstall
addgroup dba
addgroup nobody
useradd -g oinstall -G dba -p passwd -d /home/oracle -s /bin/bash oracle
usermod -g nobody nobody

4.
mkdir /home/oracle
chown -R oracle:dba /home/oracle

ln -s /usr/bin/awk /bin/awk
ln -s /usr/bin/rpm /bin/rpm
ln -s /usr/bin/basename /bin/basename

5.
mkdir /etc/rc.d
for i in 0 1 2 3 4 5 6 S ; do ln -s /etc/rc$i.d /etc/rc.d/rc$i.d ; done

mkdir -p /opt/ora11
chown -R oracle:dba /opt

6.编辑/etc/sysctl.conf,增加以下内容:

fs.file-max = 65535
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 1024 65535
net.core.rmem_default = 1048576
net.core.rmem_max = 1048576
net.core.wmem_default = 262144
net.core.wmem_max = 262144

7.编辑/etc/security/limits.conf,增加以下内容:

oracle soft nproc 2047
oracle hard nproc 16383
oracle soft nofile 1023
oracle hard nofile 65535

8.编辑/etc/pam.d/login,增加以下内容:

session required /lib/security/pam_limits.so
session required pam_limits.so

9.执行:

sysctl -p

10.

su - oracle

以上命令需以root用户执行,接下来切换至oracle用户.

11.切换至安装目录,开始安装.我选择了英语作为安装时显示的语言.

export LANG=en_CN
./runInstaller

12.安装过程中提示运行以下两个脚本:

orainstRoot.sh
root.sh

12.安装过程中检测到系统未装有GLIBC环境,忽略后,未发现对安装和运行有多大影响.

13.切记,安装时选择自定义,并且选择数据库的字符集为 ZHS16GBK!

因为忘记了这个选项,我只好删掉数据库,重新建了一个,浪费了半个小时的时间.

PS.ORACLE 11g好像不支持更改数据库的字符集了...或是我没有找到正确的方法

14.安装完成后,数据库的连接和查询异常之慢,GOOGLE之,然后尝试着把网络的DNS服务器全给删了,解决.

15.两个常用的工具:dbca和netca.



 

posted @ 2009-03-18 10:52 SeesSea 阅读(537) | 评论 (0)编辑 收藏

2008年8月12日

Struts2 action 的 ;jsessionid=xxx 使找不到页面 Bug 的解决 [转帖]

     摘要: 原文地址 自己留个地址,遇到这个问题可以考虑使用。不过要重新编译struts2的jar包确实比较。。。 刚刚又找到一个解决办法: 在用Struts的时候发现这样一个问题,不管我们的程序中是否创建了一个新的session,从页面提交表单到action类,再跳转到页面的时候url中总是出现了;jsessionid这样的一长串内容,这是由于新建的session导致容器产生的。 经过深入研究s...  阅读全文

posted @ 2008-08-12 10:40 SeesSea 阅读(3768) | 评论 (0)编辑 收藏

2008年8月6日

Struts2设置

这几天总有其他事情在忙,现在有一点点时间了,尝试学习Struts2,洒家属于超级新人,一步一步记录吧。
1、下载Struts2的jar包。下载地址:
http://struts.apache.org/2.0.9/index.html
2、解压缩必要文件到项目中WebRoot\WEB-INF\lib下。洒家最开始引用的为:
commons-logging-1.0.4.jar
ognl-2.6.11.jar
xwork-2.0.4.jar
freemarker-2.3.8.jar
struts2-core-2.0.11.1.jar
3、修改项目中WebRoot\WEB-INF\web.xml文档,增加如下内容
<filter>
   
<filter-name>struts2</filter-name>
   
<filter-class>
   org.apache.struts2.dispatcher.FilterDispatcher
   
</filter-class>
</filter>
<filter-mapping>
   
<filter-name>struts2</filter-name>
   
<url-pattern>/*</url-pattern>
</filter-mapping> 
4、在项目中WebRoot/WEB-INF/classes下建立struts.xml文件。如果在MyEclipse中,可以直接建立在项目的src目录中,MyEclipse将自动将其拷贝到发布目录的相关位置。文件内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>
    
<struts>
    
<package name="struts2" extends="struts-default">
    
<!--
    此处加入不同的action
    
-->
    
</package>
    
</struts>
   
5、建立jsp文件
如果使用struts的标签,则需要在jsp文件的第一行后插入:
<%@ taglib prefix="s" uri="/struts-tags" %>
暂时有事,回头补充。

posted @ 2008-08-06 16:27 SeesSea 阅读(251) | 评论 (0)编辑 收藏

2008年8月1日

Ubuntu下的tomcat启动

    上一个项目由于奥运的关系不能调试,只能先放下了。新的任务是一个b/s项目,彻底陌生的领域。以前做过的的项目全部都是C#.net下的东东。这次用jsp。又一次痛苦的学习历程。
    还是喜欢ubuntu下的调试环境,所以还想选择在这个下面开发。
    先在原有eclipse上安装了MyEclipse,这次比较顺利,记得上次安装比较费劲,总是启动不了,或许是因为这台机器是inter的CPU缘故?不得而知。
    安装TomCat遇到一些问题,主要是TomCat总是随系统启动,每次开机都需要手动关闭服务,比较麻烦。由于对ubuntu不熟悉,找了下方法,感觉比较好的方法如下:
安装sysv-rc-conf
方法:
sudo apt-get install sysv-rc-conf
sudo sysv-rc-conf

这个工具可以调整启动项目,比较方便。


posted @ 2008-08-01 11:27 SeesSea 阅读(2310) | 评论 (0)编辑 收藏

2008年7月24日

Eclipse发布程序

辛辛苦苦在Eclipse里面写好东西,不会发布,网络上搜到的大多都是关于MyEclipse发布web方式。不过也难怪人家不写,因为是在比较简单。只要直接导出Jar文件就可以了,是在没什么可以写的,都怪洒家太笨了。
不过导出后遇到一些问题,就是第三方jar文件错误,这个找了一下,同样在BlogJava上有人发表了方法,他推荐的是第一种方法,洒家用的是第二种。原文见http://www.blogjava.net/mimi-van/archive/2007/11/28/163597.html
为了自己阅读方便,也粘贴一份吧。失敬,失敬!

我存档的一篇java资料,里面对 -jar 情况下的classpath 有了比较详细的阐述。

当用java -jar yourJarExe.jar来运行一个经过打包的应用程序的时候,你会发现如何设置-classpath参数应用程序都找不到相应的第三方类,报 ClassNotFound错误。实际上这是由于当使用-jar参数运行的时候,java VM会屏蔽所有的外部classpath,而只以本身yourJarExe.jar的内部class作为类的寻找范围。

**解决方案**

一 BootStrap class扩展方案

Java 命令行提供了如何扩展bootStrap 级别class的简单方法.
-Xbootclasspath:     完全取代基本核心的Java class 搜索路径.
                                   不常用,否则要重新写所有Java 核心class
-Xbootclasspath/a: 后缀在核心class搜索路径后面.常用!!
-Xbootclasspath/p: 前缀在核心class搜索路径前面.不常用,避免
                                   引起不必要的冲突.

语法如下:
 (分隔符与classpath参数类似,unix使用:号,windows使用;号,这里以unix为例)
 java -Xbootclasspath/a:/usrhome/thirdlib.jar: -jar yourJarExe.jar

二 extend class 扩展方案

Java exten class 存放在{Java_home}"jre"lib"ext目录下.当调用Java时,对扩展class路径的搜索是自动的.总会搜索的.这样,解决的方案就很简单了,将所有要使用的第三方的jar包都复制到ext 目录下.

三 User class扩展方案

当使用-jar执行可执行Jar包时,JVM将Jar包所在目录设置为codebase目录,所有的class搜索都在这个目录下开始.所以如果使用了其他第三方的jar包,一个比较可以接受的可配置方案,就是利用jar包的Manifest扩展机制.
步骤如下:

 1.将需要的第三方的jar包,复制在同可执行jar所在的目录或某个子目录下. 比如:jar 包在 /usrhome/yourJarExe.jar 那么你可以把所有jar包复制到/usrhome目录下或/usrhome/lib 等类似的子目录下.

 2.修改Manifest 文件

 在Manifest.mf文件里加入如下行

 Class-Path:classes12.jar lib/thirdlib.jar

 Class-Path 是可执行jar包运行依赖的关键词.详细内容可以参考 http://java.sun.com/docs/books/tutorial/deployment/jar/downman.html 。 要注意的是 Class-Path 只是作为你本地机器的CLASSPATH环境变量的一个缩写,也就是说用这个前缀表示在你的jar包执行机器上所有的CLASSPATH目录下寻找相应的 第三方类/类库。你并不能通过 Class-Path 来加载位于你本身的jar包里面(或者网络上)的jar文件。因为从理论上来讲,你的jar发布包不应该再去包含其他的第三方类库(而应该通过使用说明来 提醒用户去获取相应的支持类库)。如果由于特殊需要必须把其他的第三方类库(jar, zip, class等)直接打包在你自己的jar包里面一起发布,你就必须通过实现自定义的ClassLoader来按照自己的意图加载这些第三方类库。


以上三种方法推荐第一种,扩展性好,操作起来也最方便.
另外编写自己的ClassLoader,来动态载入class,是更加复杂和高级技术.限于篇幅,不赘述.有兴趣了解可以去google一下custom classloader,或者参考我的另一篇日志:让classpath参数走开

Java的安全机制随不同的JDK版本有不同的变化,会影响很多核心CLASS,比如Thread,所以很多大型商业软件,要求JDK的版本很严格.部分原因也在此.这也要求在发布自己编写的应用时候,不管大小,都要说明开发和测试的JDK版本.


本文所述方法测试基于j2sdk 1.4.2_04-b05

----------------------------------------------------------------------------------------------

附:背景知识

自JDK 1.2以后,JVM采用了委托(delegate)模式来载入class.采用这种设计的原因可以参考http://java.sun.com/docs/books/tutorial/ext/basics/load.html

归纳来讲:是基于JVM sandbox(沙盒)安装模型上提供应用层的可定制的安全机制.


Java虚拟机(JVM)寻找Class的顺序

1. Bootstrap classes

属于Java 平台核心的class,比如java.lang.String等.及rt.jar等重要的核心级别的class.这是由JVM Bootstrap class loader来载入的.一般是放置在{java_home}"jre"lib目录下

2. Extension classes

基于Java扩展机制,用来扩展Java核心功能模块.比如Java串口通讯模块comm.jar.一般放置在{Java_home}"jre"lib"ext目录下

3. User classes

开发人员或其他第三方开发的Java程序包.通过命令行的-classpath或-cp,或者通过设置 CLASSPATH环境变量来引用.JVM通过放置在{java_home}"lib"tools.jar来寻找和调用用户级的class.常用的 javac也是通过调用tools.jar来寻找用户指定的路径来编译Java源程序.这样就引出了User class路径搜索的顺序或优先级别的问题.

 3.1 缺省值:调用Java或javawa的当前路径(.),是开发的class所存在的当前目录
 3.2 CLASSPATH环境变量设置的路径.如果设置了CLASSPATH,则CLASSPATH的值会覆盖缺省值
 3.3 执行Java的命令行-classpath或-cp的值,如果制定了这两个命令行参数之一,它的值会覆盖环境变量CLASSPATH的值
 3.4 -jar 选项:如果通过java -jar 来运行一个可执行的jar包,这当前jar包会覆盖上面所有的值.换句话说,-jar 后面所跟的jar包的优先级别最高,如果指定了-jar选项,所有环境变量和命令行制定的搜索路径都将被忽略.JVM APPClassloader将只会以jar包为搜索范围.
有关可执行jar有许多相关的安全方面的描述,可以参考http://java.sun.com/docs/books/tutorial/jar/ 来全面了解.

这也是为什么应用程序打包成可执行的jar包后,不管你怎么设置classpath都不能引用到第三方jar包的东西了

关于 什么是 jar文件可以参看以下链接:

http://www-128.ibm.com/developerworks/cn/java/j-jar/index.html


洒家测试的环境是:Ubuntu8.04+jdk 1.6+Eclipse 3.2。

posted @ 2008-07-24 16:19 SeesSea 阅读(2839) | 评论 (0)编辑 收藏

JAVA实现CRC16校验

要求:

CRC循环冗余错误校验计算方法

CRC-16C(循环冗余错误校验)生成CRC-16校验字节的步聚如下:

(1)装入一个16位寄存器,所有数位均为1

(2)16位寄存器的高位字节与开始8位字节进行“异或”运算。运算结果放入这个16位寄存器。

(3)把这个16位寄存器向右移1位。

(4a)若向右(标记位)移出的数位是1,则生成多项式1010000000000001和这个寄存器进行“异或”运算。

(4b)若向右移出的数位是0,则返回(3)

(5)重处处(3)(4),直至移出8位。

(6)另外8位与该16位寄存器进行“异或”运算。

(7)重处处(3)-(6),直至该报文所有字节均与16位寄存器进行“异或”运算,并移位8次。

(8)这个16位寄存器的内容即2字节CRC错误校验。

public class CRC {
    
private byte[] CRC=new byte[2];
    
    
byte data;
    
byte[] reg=new byte[2];
    
byte[] ploy=new byte[2];
    
byte Op;
    
    
public CRC(byte[] source){
        
//初始化多项式
        int temp=0xA001;
        ploy
=InttoByteArray(temp,2);
        
//初始化寄存器
        temp=0xFFFF;
        reg
=InttoByteArray(temp,2);
        
        
for(int i=0;i<source.length;i++){
            
//获取数据
            data=source[i];
            
//与寄存器中数据进行异或操作
            reg[1]=(byte) (reg[1]^data);
            
//移动数据
            for(int j=0;j<8;j++){
                
//获取数据的最后一位,即被移动出的数据判断是否与多项式异或
                Op=reg[0];
                
//右移一位
                reg=InttoByteArray(ByteArraytoInt(reg)>>1,2);
                
//如果移出数据为1
                if((Op&0x01)==1){
                    
//与多项式进行异或操作
                    reg[0]=(byte) (reg[0]^ploy[0]);
                    reg[
1]=(byte) (reg[1]^ploy[1]);
                }                
            }
        }
        CRC
=reg;        
    }

    
public byte[] getCRC() {
        
return CRC;
    }
//格式化辅助函数
    private static byte[] InttoByteArray(int iSource, int iArrayLen) {
        
byte[] bLocalArr = new byte[iArrayLen];
        
for ( int i = 0; (i < 4&& (i < iArrayLen); i++) {
            bLocalArr[i] 
= (byte)( iSource>>8*& 0xFF );          
        }
        
return bLocalArr;
    }
    
    
private static int ByteArraytoInt(byte[] bRefArr) {
        
int iOutcome = 0;
        
byte bLoop;
        
        
for ( int i =0; i<bRefArr.length ; i++) {
            bLoop 
= bRefArr[i];
            iOutcome
+= (bLoop & 0xFF<< (8 * i);
          
        }         
        
return iOutcome;
    }    
}

开始把高低位搞混了,以为reg[0]是高位,调整了半天。郁闷!
另外,好像CRC算法也有好多种,我就没在网上找到用户要求的这种算法。貌似这个算法是Modbus协议中的CRC校验方式。有待确认。

posted @ 2008-07-24 12:11 SeesSea 阅读(8721) | 评论 (2)编辑 收藏

2008年7月22日

Ubuntu load/unload cycle count问题

开始使用T61后就安装了Ubuntu。当时就看到说Ubuntu电源管理有缺陷,会损伤硬盘,没有太在意,只是查询了一下当时的load/unload cycle count的值,大约3000+的样子。使用了半个月的今天,再次查询此值着实让人吃惊,已经到了惊人的近20000,按照这个速度,硬盘设计的600000次估计也就能维持10个月。找来解决方案如下,不知是否有效,试一段时间再说吧。毕竟硬盘热或者费电比起数据丢失都是太微不足道了。


安装 laptop-mode,手动编辑 /etc/laptop-mode/laptop-mode.conf,大概 216 行左右,按如下修改:

#
# Should laptop mode tools control the hard drive power management settings?
#
CONTROL_HD_POWERMGMT=1


#
# Power management for HD (hdparm -B values)
#
BATT_HD_POWERMGMT=192
LM_AC_HD_POWERMGMT=254
NOLM_AC_HD_POWERMGMT=254


第 一项是为了让对硬盘参数的设置纳入 laptop-mode 管理(默认不开)。后面三个就是指定各种模式下的硬盘参数了。默认情况下是 1/255/255。1 这个值太激进(估计 3 分钟 1 次就是它干的),我改成了 192(电池模式下毕竟还是要省电的,虽然这个值在不同品牌的硬盘可能表现差异很大,但是根据我搜索的结果,设置成 192 的时候硬盘已经很难有机会自行 unload 了)。后两个默认值 255 是可以不改的,但是 255 是直接关闭 APM(高级电源管理),据说某些硬盘可能会忽略 255 这个极端值,所以改成 254(我的出发点其实还是不想舍弃 APM)。

然后是修改 /etc/default/acpi-support 这个文件。文件末尾两个参数,按如下设置:

# Switch to laptop-mode on battery power - off by default as it causes odd
# hangs on some machines
ENABLE_LAPTOP_MODE=true

# Spindown time on battery
SPINDOWN_TIME=60


第一项是开启 laptop-mode,第二项似乎是控制用来控制硬盘空闲多长时间自动断电的,可根据自己喜好修改(默认值是 12)。

经几天观察,基本上这个 Load Cycle Count 只在关机的时候才会增加了。

附:监测 Load Cycle Count 的方法

sudo smartctl -a /dev/sda


设备可能是 /dev/hda(IDE 硬盘)或 /dev/sdb(第二块硬盘)等等。如果觉得输出太多,可以加上 grep 193。


sudo smartctl -a /dev/sda | grep 193

补充:
2008年07月24日
试运行了几天,至少从开机到关机,Ubuntu中的这个值不再变化。不过好像是硬盘比以前热一些了,或许是心里作用。但是在Vista中这个数据还在增加,具体值没有算过,最近项目是Linux里的,不怎么用Win系统,等常用时候在关注吧。

posted @ 2008-07-22 01:57 SeesSea 阅读(671) | 评论 (0)编辑 收藏

2008年7月20日

JAVA基本数据类型与其他语言数据类型之间的转换方法 (ZT)

     摘要: 在写网络通信程序的时候非常非常有用
通信格式转换
Java和一些windows编程语言如c、c++、delphi所写的网络程序进行通讯时,需要进行相应的转换
高、低字节之间的转换
windows的字节序为低字节开头
linux,unix的字节序为高字节开头
java则无论平台变化,都是高字节开头  阅读全文

posted @ 2008-07-20 12:02 SeesSea 阅读(320) | 评论 (0)编辑 收藏

2008年7月19日

XML读取

今天需要在C#下读取XML,查了N多文章,都写的太复杂。洒家只要读取一些基本信息做系统初始化用。没法子,只好翻出以前代码。留在这里一份,以备后查。
另,前几天找JAVA的读取XML,网上很多也是比较繁复。费了点力气才搞定,回头另开一篇粘进去。

 XmlTextReader xmlReader = new XmlTextReader("path/filename.xml");
 while (xmlReader.Read())
 {
     if (xmlReader.Name == "XXX")
     {
         if (xmlReader.Read() && xmlReader.NodeType == XmlNodeType.Text)
         {
             xxx = xmlReader.Value;
          }

      }

 }

By SeeSea

posted @ 2008-07-19 23:09 SeesSea 阅读(277) | 评论 (0)编辑 收藏

仅列出标题  
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜