无聊人士

搬家==》www.soapui.cn

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  32 随笔 :: 0 文章 :: 60 评论 :: 0 Trackbacks

#

以前一直为KeepWatcher装的那台oracle服务器奇怪,中软Linux 3.1的系统,用了一年,发现/etc/hosts.deny里面写了近二十万条ALL:xxx.xxx.xxx.xxx记录。

这两天弄了台淘汰下来的服务器,准备装来做部门的cvs、bug、oracle服务器,想装oracle的时候省事省心,就装成中软的Linux 3.1,连上断掉再连,如此反复,最后发现自己上不去了,換台机器上去才发现自己被加进ipchains和/etc/hosts.deny里面去了。

开始怀疑是ipchains、iptables服务的问题,chkconfig --level 345 ipchains off以后,仍然如此。

打电话问情报所的吴兵,刚把现象一讲,他就直接说了,是hostsentry和portsentry两个进程做的怪,看了一下,在/etc/rc.d/rc3.d下,这两个东西都是S前缀的,停掉服务,终于OK。


posted @ 2005-12-27 12:30 mmwy 阅读(518) | 评论 (0)编辑 收藏

在刘冬的文章“ Java虚拟机的最大内存是多少 ”一文中
今天分析了当前比较流行的几个不同公司不同版本JVM的最大内存,得出来的结果如下:

公司     JVM版本     最大内存(兆)client     最大内存(兆)server
SUN     1.5.x     1492     1520
SUN     1.5.5(Linux)     2634     2660
SUN     1.4.2     1564     1564
SUN     1.4.2(Linux)     1900     1260
IBM     1.4.2(Linux)     2047     N/A
BEA     JRockit 1.5 (U3)     1909     1902

除非特别说明,否则JVM版本都运行在Windows操作系统下

附:如何获得JVM的最大可用内存

在命令行下用 java -XmxXXXXM -version 命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息。

实际发现版本上有细微差别的JDK最大容许内存值都不尽相同,因此在实际的应用中还是要自己试验一下看到底内存能达到什么样的值。

通过这个表想说明的是,如果你的机器的内存太多的话,只能通过多运行几个实例来提供机器的利用率了,例如跑Tomcat,你可以多装几个Tomcat并做集群,依此类推。

我在新到的一台dell 2850服务器上做测试

1、使用sun jdk1.4.2_07,测试结果为
[root@localhost bin]# ./java -Xmx3710M -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
[root@localhost bin]# ./java -Xmx3700M -version
java version "1.4.2_07"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_07-b05)
Java HotSpot(TM) Client VM (build 1.4.2_07-b05, mixed mode)
2、使用sun jdk 1.5.6,测试结果为
[root@localhost bin]# ./java -Xmx3700M -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
[root@localhost bin]# ./java -Xmx3600M -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Server VM (build 1.5.0_06-b05, mixed mode)

服务器的配置情况
[root@localhost bin]# top

top - 14:32:23 up 5 days, 21:06,  3 users,  load average: 0.00, 0.03, 0.00
Tasks: 114 total,   1 running, 113 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.0% us,  0.0% sy,  0.0% ni, 100.0% id,  0.0% wa,  0.0% hi,  0.0% si
Cpu1  :  0.0% us,  0.0% sy,  0.0% ni, 100.0% id,  0.0% wa,  0.0% hi,  0.0% si
Cpu2  :  2.3% us,  0.0% sy,  0.0% ni, 97.7% id,  0.0% wa,  0.0% hi,  0.0% si
Cpu3  :  0.3% us,  0.0% sy,  0.0% ni, 99.7% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   4044816k total,  1810908k used,  2233908k free,    92088k buffers
Swap:  2555888k total,        0k used,  2555888k free,  1333328k cached

[root@localhost bin]# cat /proc/meminfo 
MemTotal:      4044816 kB
MemFree:       2234092 kB
Buffers:         92088 kB
Cached:        1333328 kB
SwapCached:          0 kB
Active:         671408 kB
Inactive:       939560 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:      4044816 kB
LowFree:       2234092 kB
SwapTotal:     2555888 kB
SwapFree:      2555888 kB
Dirty:               0 kB
Writeback:           0 kB
Mapped:         230684 kB
Slab:           148664 kB
Committed_AS:   642520 kB
PageTables:       6332 kB
VmallocTotal: 536870911 kB
VmallocUsed:    264596 kB
VmallocChunk: 536606195 kB
HugePages_Total:     0
HugePages_Free:      0
Hugepagesize:     2048 kB

[root@localhost bin]# cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      :                   Intel(R) Xeon(TM) CPU 3.00GHz
stepping        : 3
cpu MHz         : 2992.789
cache size      : 2048 KB
physical id     : 0
siblings        : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl cid cx16 xtpr
bogomips        : 5931.00
clflush size    : 64
cache_alignment : 128
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      :                   Intel(R) Xeon(TM) CPU 3.00GHz
stepping        : 3
cpu MHz         : 2992.789
cache size      : 2048 KB
physical id     : 3
siblings        : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl cid cx16 xtpr
bogomips        : 5980.16
clflush size    : 64
cache_alignment : 128
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor       : 2
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      :                   Intel(R) Xeon(TM) CPU 3.00GHz
stepping        : 3
cpu MHz         : 2992.789
cache size      : 2048 KB
physical id     : 0
siblings        : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl cid cx16 xtpr
bogomips        : 5980.16
clflush size    : 64
cache_alignment : 128
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor       : 3
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      :                   Intel(R) Xeon(TM) CPU 3.00GHz
stepping        : 3
cpu MHz         : 2992.789
cache size      : 2048 KB
physical id     : 3
siblings        : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl cid cx16 xtpr
bogomips        : 5980.16
clflush size    : 64
cache_alignment : 128
address sizes   : 36 bits physical, 48 bits virtual
power management:

posted @ 2005-12-05 14:36 mmwy 阅读(6389) | 评论 (5)编辑 收藏

白衣同志是个好同志,“刨虫”啊,俺现在用的O/R Broker就是白衣“刨”出来的!

今天准备睡觉,发现白衣同志blog上在推荐“Web Service Framework:XFire”( http://www.blogjava.net/calvin/archive/2005/12/04/22390.html).嘿嘿,受够了axis,终于解放了。

xfire的user's guide做得很漂亮,俺这种E盲都能看个半懂。quick start看完,直接跳到spring一章,顺带拿手上的一个测试工程做测试,HelloXfire。

xfire 要加的包一大堆,guide上“Dependency Guide”这一章纯粹是在糊弄人,我的工程是webwork2.1.7(freemarker2.3.4)+spring1.2.5+ hibernate3.0.5+oracle8.1.7的东西,原来的jar不算,新加了一堆进去,最后所有的包加进来有19MB,晕啊!
antlr-2.7.5H3.jar
aopalliance.jar
asm.jar
asm-attrs.jar
cglib-nodep-2.1_2.jar
classes12.jar
commons-codec-1.3.jar
commons-collections-3.1.jar
commons-dbcp-1.2.1.jar
commons-fileupload.jar
commons-io-1.1.jar
commons-lang-2.1.jar
commons-logging.jar
commons-pool-1.2.jar
concurrent-1.3.4.jar
cos-multipart.jar
dom4j-1.6.jar
freemarker.jar
groovy-all-1.0-jsr-04.jar
hibernate3.jar
javamail-1.3.2.jar
jaxen-1.1-beta-8.jar
jdom-1.0.jar

jencrypt.jar
jta.jar
log4j-1.2.9.jar
lucene-1.4.3.jar
nls_charset12.jar
ognl.jar
oscache-2.2.jar
oscore.jar
quartz-1.5.0.jar
quartz-oracle-1.5.0.jar
quartz-weblogic-1.5.0.jar
spring.jar
spring-xwork-integration.jar
stax-1.1.2-dev.jar
stax-api-1.0.jar
stax-utils-snapshot-20040917.jar

velocity-dep.jar
webflow-2.1.7.jar
webwork-2.1.7.jar
webwork2-spring.jar
xfire-all-1.0-M6a.jar
xwork.jar
activation-1.0.2.jar
commons-beanutils-1.7.0.jar
wsdl4j-1.5.1.jar


user's guide上说得比较清楚,下载下来的zip里面也有一个spring的example。
首先是在web.xml中做配置,除了原来spring、webwork的,加上
 1    <context-param>
 2        <param-name>contextConfigLocation</param-name>
 3        <param-value>classpath:beans.xml,classpath:org/codehaus/xfire/spring/xfire.xml</param-value>
 4    </context-param>
 5    <servlet>
 6        <servlet-name>xfire</servlet-name>
 7        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 8    </servlet>
 9    <servlet-mapping>
10        <servlet-name>xfire</servlet-name>
11        <url-pattern>/xfire/*</url-pattern>
12    </servlet-mapping>


然后在WEB-INF下面放一个xfire-servlet.xml文件,实际上就是一个spring的配置文件
 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 3<beans>
 4    <!-- START SNIPPET: xfire -->
 5    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 6        <property name="urlMap">
 7            <map>
 8                <entry key="/echo" value-ref="echo" />
 9                <entry key="/HelloWorld" value-ref="HelloWorld" />
10                <entry key="/AccountManager" value-ref="AccountManager-xfire" />
11            </map>
12        </property>
13    </bean>
14    <bean id="echoBean" class="com.yninfo.rules.services.impl.EchoImpl" />
15    <!-- Declare a parent bean with all properties common to both services -->
16    <bean id="echo" class="org.codehaus.xfire.spring.remoting.XFireExporter">
17        <property name="serviceFactory" ref="xfire.serviceFactory" />
18        <property name="xfire" ref="xfire" />
19        <property name="serviceBean" ref="echoBean" />
20        <property name="serviceInterface" value="com.yninfo.rules.services.Echo" />
21    </bean>
22    <bean id="HelloWorld" class="org.codehaus.xfire.spring.remoting.XFireExporter">
23        <property name="serviceFactory" ref="xfire.serviceFactory" />
24        <property name="xfire" ref="xfire" />
25        <property name="serviceBean" ref="HelloService" />
26        <property name="serviceInterface" value="com.yninfo.rules.services.HelloWorld" />
27    </bean>
28    <bean id="AccountManager-xfire" class="org.codehaus.xfire.spring.remoting.XFireExporter">
29        <property name="serviceFactory" ref="xfire.serviceFactory" />
30        <property name="xfire" ref="xfire" />
31        <property name="serviceBean" ref="AccountManager" />
32        <property name="serviceInterface" value="com.yninfo.rules.services.AccountManager" />
33    </bean>
34    <!-- END SNIPPET: xfire -->
35</beans>
36
值得注意的是“serviceBean”,按user's guides上给的例子是“service”,结果是报错,大意说service这个属性没有setter。
 1public class ServiceBean
 2    implements InitializingBean, ApplicationContextAware
 3{
 4
 5    private Object service;
 6    /**
 7     * Gets the object which backs this service.
 8     * @return
 9     */

10    public Object getServiceBean()
11    {
12        return service;
13    }

14}

我做测试的三个例子,echo是抄xfire examples上的,HelloWorld是一个groovy的例子
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
    
<bean id="GroovyScriptFactory" class="org.springframework.beans.factory.script.groovy.GroovyScriptFactory">
        
<property name="expirySeconds" value="20" />
    
</bean>

    
<bean id="HelloService" factory-bean="GroovyScriptFactory" factory-method="create">
        
<constructor-arg index="0" value="classpath:com/yninfo/rules/services/impl/HelloWorldImpl.groovy" />
    
</bean>
</beans>
而AccountManager,则是标准的spring+hibernate的东西。
 1    <bean id="AccountManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
 2        <property name="transactionManager" ref="TransactionManager" />
 3        <property name="transactionAttributes">
 4            <props>
 5                <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
 6                <prop key="load">PROPAGATION_REQUIRED,readOnly</prop>
 7                <prop key="*">PROPAGATION_REQUIRED</prop>
 8            </props>
 9        </property>
10        <property name="target">
11            <bean class="com.yninfo.rules.services.impl.AccountManagerImpl">
12                <property name="accountDAO" ref="AccountDAO" />
13            </bean>
14        </property>
15    </bean>

配置完成后,启动tomcat,用http://192.168.0.100:8080/rules/xfire/echo?wsdl可以看到wsdl的描述。

在vs2005里面,建了个j#的工程(略)。。。

注:手误,把图覆盖了,只好全部删掉

posted @ 2005-12-05 03:20 mmwy 阅读(7714) | 评论 (12)编辑 收藏

需求很简单,就是用js向后端请求,然后把请求的结果弄进一个select里面。一开始是用xmlrequest去请求后端一个groovy的url,得到一个xml,然后把xml的内容填进select里面去。做完老瞅着不顺眼,正好在看ajax的资料,拿dwr改造一下。

js是我一直很头疼的事了,尤其是对dom的操作上面,dwr感觉就是在直接调java接口,操作java对象,省事省心啊。

用dwr,先得在web.xml中配一下。

 1    <servlet>
 2        <servlet-name>dwr-invoker</servlet-name>
 3        <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
 4        <init-param>
 5            <param-name>debug</param-name>
 6            <param-value>true</param-value>
 7        </init-param>
 8    </servlet>
 9    <servlet-mapping>
10        <servlet-name>dwr-invoker</servlet-name>
11        <url-pattern>/dwr/*</url-pattern>
12    </servlet-mapping>
13

然后就是配dwr.xml文件了。
dwr和spring贴得比较紧,不用折腾,直接让dwr去调spring中定义的bean了。
 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd" >
 3<dwr>
 4    <allow>
 5        <create javascript="ServerManager" creator="spring">
 6            <param name="beanName">ServerManager</param>
 7        </create>
 8    </allow>
 9</dwr>
10
我的project中,已经在web.xml中配了spring的listener,直接写beanName就行。

在ServerManager接口中定义了如下方法
  List<Server> loadAll(User manager, ServerStatus status, String order);
因此,在dwr中定义了三个convert(一开始没配,结果怎么调都不成功)。

1        <convert converter="bean" match="com.yninfo.sa.domain.Server" />
2        <convert converter="bean" match="com.yninfo.sa.domain.ServerStatus" />
3        <convert converter="bean" match="com.yninfo.sa.domain.User" />


loadAll方法中的manager参数,是用户登录成功后,session.setAttribute("user",user)存放的。在html里面,用js是无法读到的,因此,自己定义了一个java bean。
1public class Remote {
2  public User getUser(HttpSession session) {
3    return (User) session.getAttribute("user");
4  }

5}

6

同样的,在dwr中配了一下
1        <create javascript="Remote" creator="new">
2            <param name="class" value="com.yninfo.sa.web.ajax.Remote" />
3        </create>


所有配置完成后,js代码如下:
 1<script type='text/javascript' src='dwr/interface/Remote.js'></script>
 2<script type='text/javascript' src='dwr/interface/ServerManager.js'></script>
 3<script type='text/javascript' src='dwr/engine.js'></script>
 4<script type='text/javascript' src='dwr/util.js'></script>
 5<script>
 6    function init(){
 7        Remote.getUser(
 8            function(user){
 9                ServerManager.loadAll(user,null,null,load);
10            }
);
11    }

12    function load(data){
13        for (var i=0; i<data.length; i++{
14          document.DailyRecordAdd.elements["model.serverId"].options[i]=
15            new Option(data[i].name,data[i].id);
16        }

17    }

18    window.onload = function (){
19        init();
20    }

21</script>


最终的配置文件:
 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd" >
 3<dwr>
 4    <allow>
 5        <create javascript="ServerManager" creator="spring">
 6            <param name="beanName">ServerManager</param>
 7            <include method="add" />
 8            <include method="findByPrimaryKey" />
 9            <include method="loadAll" />
10        </create>
11        <create javascript="Remote" creator="new">
12            <param name="class" value="com.yninfo.sa.web.ajax.Remote" />
13        </create>
14        <convert converter="bean" match="com.yninfo.sa.domain.User" />
15        <convert converter="bean" match="com.yninfo.sa.domain.Server" />
16        <convert converter="bean" match="com.yninfo.sa.domain.ServerStatus" />
17    </allow>
18</dwr>
19

posted @ 2005-12-05 00:04 mmwy 阅读(6385) | 评论 (8)编辑 收藏

最近在RH 6.1、COSIX 3.1服务器上配置iptables,被ipchains弄得半死。

iptables需要加入ip_tables模块,但是由于ipchains从中作梗,每次都报错。
[root@cosix-31-oracle-01 /root]# iptables --list
/lib/modules/2.4.18-5smp/kernel/net/ipv4/netfilter/ip_tables.o: init_module: Device or resource busy
Hint: insmod errors can be caused by incorrect module parameters, including invalid IO or IRQ parameters
/lib/modules/2.4.18-5smp/kernel/net/ipv4/netfilter/ip_tables.o: insmod /lib/modules/2.4.18-5smp/kernel/net/ipv4/netfilter/ip_tables.o failed
/lib/modules/2.4.18-5smp/kernel/net/ipv4/netfilter/ip_tables.o: insmod ip_tables failed
iptables v1.2.5: can't initialize iptables table `filter': iptables who? (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.


开始以为是服务器上安装oracle8i时,降了gcc版本造成的,折腾好几天,无意中在google上用“init_module: Device or resource busy”做关键词google到某个maillist中的提示信息,恍然大悟

首先停掉ipchains服务
#chkconfig --level 345 ipchains off
# service ipchains stop
Flushing all chains: [  OK  ]
Removing user defined chains: [  OK  ]
Resetting built-in chains to the default ACCEPT policy:[  OK  ]
去掉ipchains的模块
# rmmod ipchains

使用vi编辑/etc/sysconfig/iptables文件(具体用哪个文件,要看/etc/rc.d/init.d/iptables脚本)。

# Firewall configuration written by redhat-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -j ACCEPT
-A RH-Firewall-1-INPUT -p 50   -j ACCEPT
-A RH-Firewall-1-INPUT -p 51   -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.0/24  -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 61.138.209.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 61.166.155.0/24 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1521         -j ACCEPT

-A RH-Firewall-1-INPUT -p udp -s 61.138.209.0/24 -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

启动iptables服务
#service iptables start
Flushing all current rules and user defined chains: [  OK  ]
Clearing all current rules and user defined chains: [  OK  ]
Applying iptables firewall rules:
[  OK  ]
#chkconfig --level 345 iptables on



posted @ 2005-11-21 18:58 mmwy 阅读(1551) | 评论 (0)编辑 收藏

折腾了很久,还是 char 发现的问题。

在AS4 U2下,/etc/pam.d/ftp.vsftpd中如下定义

auth  required   /lib/security/pam_userdb.so   db=/etc/vsftpd/vsftpd.login

在使用db_load生成userdb文件时,应该使用

db_load -T -t hash -f ftpuser /etc/vsftpd/vsftpd.login.db

必须给定一个扩展名.db

posted @ 2005-11-18 18:50 mmwy 阅读(2117) | 评论 (0)编辑 收藏

使用ww2的validator,taglib就只能使用xhtml了。taglib我一向讨厌,再加上ww2 xhtml这套做得非常难看,自做主张的加一堆table、td之类的html标签进去。

看了一下xhtml的velocity模板,如果检验未通过,ww2将validators.xml中相应field检验失败的message是放进fieldErrors里面的。

checkbox.vm
#if( $fieldErrors.get($parameters.name) )
  #set ($hasFieldErrors = $fieldErrors.get($parameters.name))
  #foreach ($error in $fieldErrors.get($parameters.name))
    <tr>
        <td align="left" valign="top" colspan="2"><span class="errorMessage">$!error</span></td>
    </tr>
  #end
#end

<tr>
    <td valign="top" colspan="2">
#* Use an extra table so that the checkbox doesn't align with the other columns. *#
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td valign="middle">#parse("/template/simple/checkbox.vm")</td>
        <td width="100%" valign="middle"><label #if ($parameters.id) for="$!webwork.htmlEncode($parameters.id)"#end#if ($hasFieldErrors) class="checkboxErrorLabel"#else class="checkboxLabel"#end>$!webwork.htmlEncode($parameters.label)</label></td>
    </tr>
</table>
#parse("/template/xhtml/controlfooter.vm")

我使用的模板引擎是freemarker,参照xhtml的vm代码,自己写了个marco。

<#macro validError local>
    <#if req.method=='POST'>
        <#if
            fieldErrors?has_content &&
            fieldErrors[local]?exists
        >
            <br>
            <font color="red">
                <#list fieldErrors[local] as error>
                    ${error}
                </#list>
            </font>
        </#if>
    </#if>
</#macro>

模板示例:
            <tr>
                <td width="80" align="right">登录密码:</td>
                <td>
                <input type="password" name="model.password"
                    value="${model.password?if_exists}" size="24">
                <@validError local="model.password"/>
                </td>
            </tr>
posted @ 2005-11-18 12:07 mmwy 阅读(1397) | 评论 (0)编辑 收藏

在FreeMarker中,session是一个Hash。
在处理hash类型时,我以前一直是用Session["xxxx"]来读取的,今天翻freemarker manual,发现有这么一个示例。

<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>
- Joe is ${ages.Joe}
- Fred is ${ages.Fred}
- Julia is ${ages.Julia} 

照此,修改了一下手上的nav.ftl模板

    <#if Session.user?exists>
        <p align="right">
        <a href="logout.ftl">注销[${Session.user.loginName}]</a>
        </p>
    </#if>
posted @ 2005-11-18 12:06 mmwy 阅读(3532) | 评论 (0)编辑 收藏

最初我是用spring的aop来实现spring与orbroker“结合”的,在befor的时候把orbroker和trans注进 service去,after的时候commit,如果出现exception由rollback。怎么看怎么别扭,还是 江南白衣 这个“刨虫”提醒了一下,说是spring module的cvs上有orbrokerTemplate。

有现成的东西,俺就不用现学木匠造轮子了,省事省心,还顺眼。

从spring module的cvs上下源码,把org.springmodules.orm.orbroker、org.springmodules.orm.orbroker.support两个package的东西拷进project(或者是打成jar扔进去)。

与ibatis、hibernate一样,java代码部分很简单,我做的测试代码就这么几行
public interface ResultDAO {
  List find(String parentId, String catalogId);
}
public class ResultDAOORBroker extends BrokerDaoSupport implements ResultDAO {
  public List find(String parentId, String catalogId) {
    return this.getBrokerTemplate().selectMany("find",
        new String[]{"parentId", "catalogId"},
        new String[]{parentId, catalogId});
  }
}
public interface ResultManager {
  List<Result> find(String parentId, String catalogId);
}

public class ResultManagerImpl implements ResultManager {

  @SuppressWarnings("unchecked")
  public List<Result> find(String parentId, String catalogId) {
    return resultDAO.find(parentId, catalogId);
  }

  private ResultDAO resultDAO;
  public void setResultDAO(ResultDAO resultDAO) {
    this.resultDAO = resultDAO;
  }
}
最主要的还是xml的配置文件,与用ibatis大体上差不了多少。

DataSource、TransactionManager是必须的
    <bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="DataSource" />
    </bean>
    <bean id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${marekt.jdbc.driver}" />
        <property name="user" value="${marekt.jdbc.user}" />
        <property name="password" value="${marekt.jdbc.password}" />
        <property name="jdbcUrl" value="${marekt.jdbc.url}" />
        <property name="initialPoolSize" value="2" />
    </bean>
    <bean id="PlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations" value="classpath:jdbc.properties" />
    </bean>
然后是一个Broker的Factory
    <bean id="BrokerFactory" class="org.springmodules.orm.orbroker.BrokerFactoryBean">
        <property name="dataSource" ref="DataSource" />
        <property name="configLocation" value="classpath:orbroker/orbroker.xml" />
    </bean>

剩下的事情就是DAO和Manager了。
    <bean id="ResultDAO" class="dao.impl.ResultDAOORBroker">
        <property name="broker" ref="BrokerFactory" />
    </bean>
    <bean id="ResultManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager" ref="TransactionManager" />
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
        <property name="target">
            <bean class="services.impl.ResultManagerImpl">
                <property name="resultDAO" ref="ResultDAO" />
            </bean>
        </property>
    </bean>
posted @ 2005-11-15 23:48 mmwy 阅读(459) | 评论 (0)编辑 收藏

在O/R Broker User Guide的“Sub queries”部分讲得非常清楚了,主要就是检索的时候定义一个sub query。
public class Organization {
 private Integer id;
 private Employee manager;
 private Set employees;//子查询就做在这儿了
}

定义result-object的时候处理一下
<result-object id="Organization" class="my.package.Organization">
。。。。
 <property name="employees">
  <sub-query sql-statement="selectEmployeesByOrganization">
   <set-parameter name="organizationId" from-column="OrganizationID"/>
  </sub-query>
 </property>
。。。。
</result-object>
posted @ 2005-11-15 23:48 mmwy 阅读(401) | 评论 (0)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4 下一页