myfriend2010的博客
===========================================================
EJB 的学习
===========================================================

EJB是什么呢?
EJB是一个J2EE体系中的组件.再简单的说它是一个能够远程调用的javaBean.
它同普通的javaBean有两点不同.
第一点,就是远程调用.
第二点,就是事务的功能,我们在EJB中声明的事务会通过容器帮助我们来处理.
支持EJB的SERVER有以下几个:
Weblogic
Webspere
Appserver
Jboss

我选用的是weblogic+JBuilder9开发.

回过来我们继续说这个EJB的原理.
它是分布式的.这个的意思其实很简单不需要想太复杂.
就是我们把事情不是交给一个人去处理.而是把事情划分一下交给多个人处理,
而多个人处理之后我们让这个分配的人来把最后得到的结合处理.

EJB我们首先要明确它是放在服务器端的组件.
一共有三种EJB
1,SessionBean 复杂处理业务逻辑的.
2,EntityBean 处理数据
3,MessageBean 消息Bean异步,耦合的处理.

那么谁能调用EJB呢?
也或者说EJB被谁调用呢?
我们说它就是放在server的一个能够远程调用的javaBean.
所以它可以被Java的语言调用servlet,jsp等都ok的说.
而且它还可以被C++语言调用.很强大吧.
EJB的最基本的出发点就是推动Java在服务器端的编程能力.
所以呢它的功能就我个人来看太强悍了..= =

这个远程调用是通过什么呢.
Java是通过RMI-JRMP(java远程方法调用)协议来调用.EJB就是通过这个来实现的.
C++是通过Corba-iiop协议来调用的.这个协议支持两端不同语言的调用.
Corba是公共对象请求代理服务
iiop是网络内部对象协议.

下面我们来简单说一下这个分布式的调用。
客户端发送一个请求给服务器
首先是传给stub代理类它发送参数给skeleton委托类然后这个类调用我们的实现类取得结果再远路返回。
这样一个分布处理就结束了。
后面会具体的结合代码分析。
先记住这个大致的结构就好。

我们写一个EJB需要做那些工作呢?
1,写一个接口继承EJBObject 这个类作为远程接口
2,写一个接口继承EJBHome 这个类里有一个方法是create()它返回接口类型。
3,写一个Bean继承SessionBean, 这个类里包含一个create()方法和一个业务方法。
4,写一个ejb-jar.xml 这个xml是把上面的三个文件组合起来
5,写一个weblogic-ejb-jar.xml 这个xml是连接查找source的作用
(不同的server会是不同的。这里选用的是weblogic)

上面的两个xml文件需要放在META-INF目录下。
而以上这些类都需要打包在一个jar文件中然后在server部署。
这样就完成了EJB的部署
例如:
我们写个简单的计算吧。
(先声明下吧本教程的说明都是我自己的理解,
也许并不是一些文档上的描述那么正规但是很方便理解的。
如果有实在无法苟同的地方大家多多包含。这是为了便于理解的讲解)
AddCount.java这个就是我们继承EJBObject的类.

import javax.ejb.*;
import java.rmi.*;

public interface AddCount extends EJBObject
{
public int addCount(int a,int b) throws RemoteException;
}
接口的作用.在这里强调一下吧.所有实现这个接口的类都会是这个接口的类型.
同时都包含接口的方法的实现.
这个接口中的方法也就是在以后会实现的方法.我们这里要做的是一个加法的运算.


AddCountHome.java这个是继承EJBHome的类.它里面包含的这个create()返回的是AddCount类型对象.


import javax.ejb.*;
import java.rmi.*;

public interface AddCountHome extends EJBHome
{
public AddCount create() throws RemoteException,CreateException;
}

下面这个是我们的Bean.这个类继承了SessionBean
import javax.ejb.*;

public class AddCountBean implements SessionBean
{
public void ejbCreate()
{
}
public void setSessionContext(SessionContext ctx)
throws EJBException,
java.rmi.RemoteException
{
}
public void ejbRemove()
throws EJBException,
java.rmi.RemoteException
{
}

public void ejbActivate()
throws EJBException,
java.rmi.RemoteException
{
}
public void ejbPassivate()
throws EJBException,
java.rmi.RemoteException
{
}
public int addCount(double a,double b)
{
return a+b;
}
}
这个里面我们实现了业务的方法addCount(){a+b;}
同时需要指出一下它的其他方法(这些仅仅简单指出后面的教程有详细说明)
首先是ejbCreate()这个方法实际上是对我们的远程接口的实现类的初始化.
setSessionContext(SessionContext ctx)设置context.容器是在这个方法之后产生的实例.
ejbRemove()毫无疑问是一个实例结束移除.
ejbActivate()激活方法.它的作用是激活钝化.
ejbPassivate()钝化方法.当实例的内容长时间不进行处理的时候就会钝化.也就是闲置的意思.
以上这几个是SessionBean的基本方法.希望大家可以自己慢慢理解.
之后也会反复说到这些的.


下面我们写xml文件
首先是ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<enterprise-beans>
<session>
<display-name>first</display-name>
<ejb-name>add</ejb-name>

<home>AddCountHome</home>
<remote>AddCount</remote>
<ejb-class>AddCountBean</ejb-class>

<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>add</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>

</assembly-descriptor>
</ejb-jar>

下面这个是weblogic-ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN' 'http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd'>
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
<ejb-name>
add
</ejb-name>

<jndi-name>rainnight</jndi-name>

</weblogic-enterprise-bean>
</weblogic-ejb-jar>


我们接下来写测试类

import java.util.*;
import java.naming.*;
import java.rim.*;
public class AddTest{
public static void main(String bb[])throws Exception{
Hashtable hash = new Hashtable();
hash.put(Context.INITIAL_COUNTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
hash.put(Context.PROVIDER_URL,
"t3://localhost:7001");
Object obj = context.lookup("rainnight");
AddCountHome home = (AddCountHome)PortableRemoteObject(obj,AddCountHome.class);
AddCount local = home.create();
System.out.println(local.add(1,1));
}
}

测试类的hash是初始化我们的weblogic的xml信息.
这里的t3://localhost:7001是weblogic的特殊协议指向的是ip位置.
然后lookup("rainnight")查找jndi,而实际上也就是通过这个jndi找到我们的ejb组件.
通过得到的对象我们对比一下是不是Home类型.
然后我们执行home.create()产生AddCount的实例
最后调用方法就ok了.


下面是如何执行这个的方法.
第一步,jdk,weblogic.需要快些下载安装啦..
第二步,配置环境变量.基本的java的环境变量如何配置我就不说了.
这里需要特别指出要把java目录下的lib中的tools.jar加载到我们的class_path中.
然后我们再把weblogic的目录下的server目录下的lib中的weblogic.jar找到也加载进来.
这样我们编译需要的东西就ok了.
第三步,编译java类.
第四步,打包.jar cvf AddCount.jar *.class META-INF/*.xml
第五步,java weblogic.appc AddCount.jar
第六步,部署到weblogic中.
第七步,运行Test类.


myfriend2010 发表于:2007.06.19 17:06 ::分类: ( java ) ::阅读:(207次) :: 评论 (0)
===========================================================
显示目录树,刚才玩着写的一个java
===========================================================
显示目录树,刚才玩着写的一个java

import java.io.*;

/**
* User: Z.X.T
* Discript:显示目录
* Date: 2007-6-8
* Time: 9:14:18
*/
public class IoTest {
static String space = "|->";

public static void main(String[] args) {
File x = new File("D:" + File.separator + "logonApp");

if (x.exists()) {
printMenu(x, space);
}

if (args.length!=0) {
System.out.println(args[0]);
try {
FileReader myFileReader = new FileReader(args[0]);
BufferedReader myBufferedReader = new BufferedReader(myFileReader);
String myString;
System.out.println("------------BEGIN SHOW FILE "+new File(args[0]).getName().toUpperCase()+"----------------");
while ((myString = myBufferedReader.readLine()) != null) {
System.out.println(myString);
}
myFileReader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}

private static void printMenu(File x, String y) {
File[] tu = x.listFiles();
for (int q = 0; q < tu.length; q++) {
System.out.println(y + tu[q].getName());
if (tu[q].isDirectory()) {
printMenu(tu[q], "| " + y);
}
}
}
}


myfriend2010 发表于:2007.06.08 13:29 ::分类: ( java ) ::阅读:(365次) :: 评论 (0)
===========================================================
转载 struts标签之logic手册
===========================================================

logic:iterate
logic:iterate
标签用来迭代集合,您可以使用如下方式来为这个标签指定其要叠代的集合:
使用一个运行时表达式,这个表达式的值是一个集合。 name属性引用一个JSP Bean,这个JSP Bean本身就是一个集合。 name属性引用一个JSP Bean,这个JSP Bean的一个属性是一个集合,这时可以联合使用property来指定这个集合。 上面所提到的集合可以是:
对象类型或原子类型的数组(Array)
java.util.Collection
的实现,包括ArrayListVector
java.util.Enumeration
的实现。
java.util.Iterator
的实现。
java.util.Map
的实现,包括HashMapHashtableTreeMap 如果您叠代的集合中含有null的值,这时需要采取一定的措施,因为这时logic:iterate不会在page作用域中创建对象。一般是使用<logic:present>标签或<logic:notPresent>标签来判断一下。
下面是logic:iterate叠代ArrayList的示例的对象引用关系和部分代码:

图示 3. logic:iterate中对象的引用关系
图中的persons列表是在ListAction中填充的,在这里只是简单的加入了三个Person对象,在实际的应用中这些数据应该取自数据库。具体的代码如下:

public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request, HttpServletResponse response) {

ListForm listForm = (ListForm) form;

List<Person> persons = new ArrayList<Person>();

Person person1 = new Person();
person1.setId("00001");
person1.setName("
赵辰");

Person person2 = new Person();
person2.setId("00002");
person2.setName("
李为芳");

Person person3 = new Person();
person3.setId("00003");
person3.setName("
王微");

persons.add(person1);
persons.add(person2);
persons.add(person3);

listForm.setPersons(persons);

return mapping.findForward("success");
}
标签输出的结果为:

00001-->
赵辰
00002-->
李为芳
00003-->
王微
回页首
logic:present
如果指定的值出现该标签就会创建其标签体内的内容。该标签用于以下情况:
检查具有指定名称的cookie是否出现。 检查具有指定名称的header是否出现。 检查具有指定名称的JSP Bean是否出现 检查具有指定名称的JSP Bean中的property属性是否出现。 检查request中指定名称的参数是否出现。 检查当前的认证用户是否与指定的安全角色相关联。 检查当前认证的主体是否具有指定的名字。 下面的代码示例了logic:present标签检查具有指定名称User-Agentheader是否出现:

<logic:present header="User-Agent">
您的浏览器是<bean:header id="userAgent" name="User-Agent"/>
<bean:write name="userAgent"/>
<br/>
</logic:present>

logic:notPresent
标签的应用正好和logic:present标签相反。
回页首
logic:messagesPresent
logic:messagesPresent
标签用于以下情况:
request作用域中存在一个ActionMessages对象,标签的property属性和ActionMessages中的property对应。 request作用域中存在一个ActionErrors对象,标签的property属性和ActionErrors中的property对应。 存在一个String对象,将其转换(构造)ActionMessage然后在添加到ActionMessages中。 存在一个String Array对象,将数组中的每一个String转换成一个ActionMessage,在将其添加到ActionMessages中。 标签的message属性值为true时将以Globals.MESSAGE_KEYkeyrequest作用域中查找Message,其它情况下,将name的值作为key查找,如果name 没有出现,默认值为Globals.ERROR_KEY
下面的代码示例了logic:messagesPresent标签的典型用法:

<logic:messagesPresent>
<ul>
<html:messages id="message">
<li><bean:write name="message"/></li>
</html:messages>
</ul>
</logic:messagesPresent>
标签logic:messagesNotPresent的应用正好和logic:messagesPresent的应用相反。
回页首
logic:empty
logic:empty
标签是用来判断是否为空的。如果为空,该标签体中嵌入的内容就会被处理。该标签用于以下情况:
Java对象为null String对象为"" java.util.Collection对象中的isEmpty()返回true java.util.Map对象中的isEmpty()返回true 下面的代码示例了logic:empty标签判断集合persons是否为空:

<logic:empty name="listForm" property = "persons">
<div>
集合persons为空!</div>
</logic:empty>

logic:notEmpty
标签的应用正好和logic:empty标签相反。
回页首
logic:match
logic:match
标签用来处理子串匹配问题。
如果指定的值匹配该标签就会创建其标签体内的内容。该标签用于以下情况:
检查具有指定名称的cookie是否与该标签的value匹配。 检查具有指定名称的header是否与该标签的value匹配。 检查具有指定名称的JSP Bean是否与该标签的value匹配 检查具有指定名称的JSP Bean中的property属性值是否与该标签的value匹配。 检查request中指定名称的参数值是否与该标签的value匹配。
下面的代码示例了logic:match标签的典型用法:

<logic:present header="User-Agent">
<logic:match header="User-Agent" value="MSIE 6.0">
MS IE 6.0
</logic:match>
</logic:present>

logic:notMatch
标签的应用正好和logic:match标签相反。
回页首
logic:equal
这里要介绍的不只是logic:equal(=)标签,而是要介绍一类标签,这类标签完成比较运算,包括:

logic:equal(=)
logic:notEqual(!=)
logic:greaterEqual(>=)
logic:lessEqual(<=)
logic:graterThan(>)
logic:lessThan(<)
该类标签的用法类似,我们只介绍logic:equal标签,其它的留给您自己去完成。

logic:equal
是用来判断是否相等的。如果相等,该标签体中嵌入的内容就会被处理。该标签用于以下情况:
比较由该标签的cookie属性指定的cookie的值是否与该标签的value属性值相等。 比较由该标签的header属性指定的header的值是否与该标签的value属性值相等。 比较由该标签的name属性指定的JSP Bean是否与该标签的value属性值相等(property属性不出现)或比较由该标签的name属性指定的JSP Bean中的property属性值是否与该标签的value属性值相等。 比较由该标签的parameter属性指定的参数值(request)是否与该标签的value属性值相等。 回页首
logic:forward
我觉得将forwardredirect这两个动作放到一起对比着介绍更加有利于理解,基于此原因也就将logic:forwardlogic:redirect这两个标签也拿到这里一起介绍了。
让我们看看这两个动作的区别:

forward
是在servlet内部执行,浏览器完全不会感知到这个动作,原始的url也不会改变,浏览器重新装载的话也只是对原始的请求进行简单的重复。
redirect
则分成两个步骤:第一步是web应用程序告诉浏览器第二个url,然后浏览器向第二个url发送请求。

redirect
forward慢,因为浏览器要做二次请求。还有就是要注意,在第一次的请求作用域(request作用域)内的bean对于第二次请求是不可见的。
理解了上面描述的区别也就知道了什么时候该选用logic:forward标签什么时候该选用logic:redirect标签了。logic:forward标签完成PageContext.forward()HttpServletResponse.sendRedirect(),如何选择由控制器决定。logic:redirect标签完成HttpServletResponse.sendRedirect()
在使用logic:redirect标签时我们可以向使用html:link一样构造baseurlquery参数。如果您感兴趣可以参考html:link标签。


myfriend2010 发表于:2007.06.01 14:21 ::分类: ( java ) ::阅读:(1296次) :: 评论 (0)
===========================================================
转载 struts标签之html手册
===========================================================

false;

<html:checkbox name="checkboxForm" property="one">
One
</html:checkbox>
<html:checkbox name="checkboxForm" property="two">
Two
</html:checkbox>
<html:checkbox name="checkboxForm" property="three">
Three
</html:checkbox>
如果选中后被提交则相应的属性的值为true
回页首
html:radio
html:radio
标签生成一个radio。主要的用法有两种,下面我们通过代码来示例。
下面的代码示例了html:radio标签的一般用法,如果被提交则选中的radiovalue值将被提交到radioForm中的id中。

<html:radio name="radioForm" property="id" value="00001">
One
</html:radio>
<html:radio name="radioForm" property="id" value="00002">
Two
</html:radio>
下面的代码示例了html:radio标签的典型用法,其中的personsbean:define标签中的一致,您可以参考bean:define标签。我只介绍这个<html:radio idName="person" property="id" value="id">idName指定html:radio要使用的bean(这里为person)value="id"表示personid属性将作为radio元素的value值而property="id"表示提交时选中的radio的值将被提交给radioForm中的id属性。

<logic:notEmpty name="radioForm" property="persons">
<logic:iterate id="person" name="radioForm" property="persons">
<html:radio idName="person" property="id" value="id">
<bean:write name="person" property="name"/>
</html:radio>
</logic:iterate>
</logic:notEmpty>
回页首
html:multibox
html:multibox
标签生成多个checkbox。当您要使用大量的checkbox时使用这个标签非常方便,可以使您避免在ActionForm中声明大量的boolean类型的变量,带之以一个数组就行了。
注意:为了正确的处理没有选中的checkbox您必须在reset()中设置数组的长度为0
下面的代码示例了html:multibox标签的一般用法,如果被提交则选中的所有checkboxvalue值将被提交到multiboxForm中的selectedItems中,这是一个String[]数组。

<html:multibox name="multiboxForm" property="selectedItems"
value="00001"/>
<html:multibox name="multiboxForm" property="selectedItems"
value="00002"/>
下面的代码示例了html:multibox标签的典型用法:

<logic:iterate id="person" name="multiboxForm" property="persons">
<html:multibox property="selectedItems">
<bean:write name="person" property="id"/>
</html:multibox>
<bean:write name="person" property="name"/>
</logic:iterate>
回页首
html:link
html:link
标签生成一个锚点(<a>)元素。我从html:link标签如何构造基本url和如何构造query参数两个方面来介绍这个标签。
构造基本url是依据该标签的如下四个属性进行的,这四个属性一次只能出现一个。让我们看看它们:

forward
,指定一个全局ActionForward的名称。另外如果forwardmodule相关的则该forward必须指向一个action而不能是一个页面。
action
,指定一个Action的名称。
href
struts会直接使用这个值而不会对其进行任何处理。
page
,指定一个页面的路径,必须以/开始。
构造query参数,下面列举了可能的形式,其中baseurl只是一个占位符:

baseurl?p=00001(
单参单值)
baseurl?p1=00001&p2=00002&p3=00003(
多参单值)
baseurl?p=00001&p=00002&p=00003(
单参多值)
baseurl?p1=00001&p2=00002&p=00001&p=00002&p=00003(
混合)
下面我们以代码示例来说明每一种html:link的用法,首先让我们花点时间看看相关action中的代码:

<!--
下面所有代码的数据都是在这里构造的 -->
public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) {

DataForm dataForm = (DataForm) form;

dataForm.setParam("00001");

HashMap paramSingleMap = new HashMap();
paramSingleMap.put("p1","00001");
paramSingleMap.put("p2","00002");
paramSingleMap.put("p3","00003");
dataForm.setParamSingleMap(paramSingleMap);

HashMap paramMultiMap = new HashMap();
paramMultiMap.put("p",new String[]{"00001","00002","00003"});
dataForm.setParamMultiMap(paramMultiMap);

HashMap paramSMMap = new HashMap();
paramSMMap.put("p1","00001");
paramSMMap.put("p2","00002");
paramSMMap.put("p",new String[]{"00001","00002","00003"});
dataForm.setParamSMMap(paramSMMap);

List<Person> persons = new ArrayList<Person>();
Person person1 = new Person();
person1.setId("00001");
person1.setName("
赵辰");
Person person2 = new Person();
person2.setId("00002");
person2.setName("
李为芳");
Person person3 = new Person();
person3.setId("00003");
person3.setName("
王微");
persons.add(person1);
persons.add(person2);
persons.add(person3);
dataForm.setPersons(persons);

return mapping.findForward("success");
}

<!--
这用来设置一个位置 -->
<html:link linkName="top"/>
<!--
这用来定位到上面的那个位置 -->
<html:link page="/link.do" anchor="top">Go Top</html:link>

<html:link page="/link.do" paramId="p" paramName="dataForm"
paramProperty="param">
单参单值
</html:link><br/>
<html:link page="/link.do" name="dataForm" property="paramSingleMap">
多参单值
</html:link><br/>
<html:link page="/link.do" name="dataForm" property="paramMultiMap">
单参多值
</html:link><br/>
<html:link page="/link.do" name="dataForm" property="paramSMMap">
混合
</html:link>
下面的代码示例了html:link标签的indexed属性和indexId属性的用法,这两个属性只有html:link标签嵌套在logic:iterate标签中时才可用。

<logic:iterate id="person" name="dataForm" property="persons">
<html:link action="/link.do" paramId="person" paramName="person"
paramProperty="id" indexed="true" indexId="number">
person
</html:link>
<br/>
</logic:iterate>
<!--
下面是上面代码的运行结果(产生的html)
<a href="/struts-demo/link.do?person=00001&number=0">
赵辰</a><br/>
<a href="/struts-demo/link.do?person=00002&number=1">
李为芳</a><br/>
<a href="/struts-demo/link.do?person=00003&number=2">
王微</a><br/>
其中的number是由indexId="number"确定的,而该参数的值为元素在集合中的位置。
-->

html:rewrite
标签和html:link标签类似只是不生成锚点(<a>),而是简单的输出字符串。
回页首
html:errors
html:errors
标签和html:messages标签的功能相似,所以我们放到一起来介绍。

html:errors
标签将由name属性指定的ActionMessagesActionErrorsStringString[]直接输出到页面中。

html:messages
标签将用由name属性(注意message属性值对它的影响)指定的ActionMessagesActionErrorsStringString[]创建一个新的属性和scripting变量,使用id属性值作为名称。

html:errors
标签和html:messages标签的property属性是用来为errorsmessages分类的。我们可以给这两个标签指定property属性,以便只显示某一类的错误或消息。
在资源文件增加了如下的内容:

# -- standard errors --
errors.header=<ul>
errors.prefix=<li>
errors.suffix=</li>
errors.footer=</ul>

error=error with none value .
error1=error1 with one value is {0} .
error2=error2 with two values are {0} , {1} .
error3=error3 with three values are {0} , {1} , {2} .
error4=error4 with four values are {0} , {1} , {2} ,{3} .
下面的代码示例了actionErrors的构造:

public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors actionErrors = new ActionErrors();
actionErrors.add("property1",
new ActionMessage("error"));
actionErrors.add("property2",
new ActionMessage("error1","value0"));
actionErrors.add("property2",
new ActionMessage("error2","value0","value1"));
actionErrors.add("property3",
new ActionMessage("error3","value0","value1","value2"));
actionErrors.add("property3",
new ActionMessage("error4","value0","value1","value2","value3"));

actionErrors.add("property4",
new ActionMessage("error1",new Object[]{"value0"}));
actionErrors.add("property4",
new ActionMessage("error2",new Object[]{"value0","value1"}));
actionErrors.add("property4",
new ActionMessage("error3",new Object[]{"value0","value1",
"value2"}));
actionErrors.add("property5",
new ActionMessage("error4",new Object[]{"value0","value1",
"value2","value3"}));

actionErrors.add("notBundle",
new ActionMessage("not a bundle key",false));
return actionErrors;
}

errors
标签代码示例:

<html:errors/>
<br/>
<html:errors property="property4"/>

messages
标签代码示例:

<logic:messagesPresent>
<ul>
<html:messages id="message">
<li><bean:write name="message"/></li>
</html:messages>
</ul>
</logic:messagesPresent>
<br/>
<logic:messagesPresent>
<ul>
<html:messages id="message" property="property4">
<li><bean:write name="message"/></li>
</html:messages>
</ul>
</logic:messagesPresent>

图示 2. 上面的两段代码示例运行结果相同,如下所示:


html:javascript
html:javascript
标签生成用于校验的javascript脚本代码。
下面的代码片段示例了html:javascript标签的基本用法,其中formName属性的值是在validation.xml文件的<formset>中定义的form的名称。有一点值得注意的是在确定<formset>时要使用合适的language属性值。

<html:javascript formName="dataForm"/>


html:xhtml
html:xhtml
标签在页面中一出现就是告诉该页的所有其它的Struts html标签以XHTML1.0兼容的形式输出。这和将html:html标签的xhtml属性值指定为true有些类似。如果上述情况都没有出现,Struts html标签将以html4.01兼容的形式输出。


myfriend2010 发表于:2007.06.01 14:18 ::分类: ( java ) ::阅读:(31283次) :: 评论 (419)
切换风格
新闻聚合
博客日历
文章归档...
最新发表...
博客统计...
网站链接...