仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1268|回复: 18
打印 上一主题 下一主题

[学习教程] JAVA教程之利用Java手艺在Cocoon中完成贸易逻辑

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:41:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你总不能说你写框架吧,那无疑会加大工作量,现在大多企业采取的是折中的办法,就是改别人写好的框架,可要改框架,前提是你对这个框架足够的了解,这就更难了。假如你对ApacheCocoon有懂得大概以涉足,你大概对在Cocoon中怎样利用Java更好
的完成特定的逻辑有所困惑。这篇文章将给您先容怎样利用XSP(ExtensibleServerPage)
和Action。同时另有示例和计划准绳。

你大概听到了一些来自Apache的关于Cocoon的声响。如今,在履历了三年的开展后,
Cocoon已渐渐的从一个复杂的完成XSL(ExtensibleStylesheetLanguage)转换
的servlet发展为一个丰满的Web使用框架。

Cocoon是用Java开辟的,一样平常做为servlet运转在象Tomcat如许的servlet容器中。


在这篇文章里,我们将先容到两种举措来在基于Cocoon的使用中利用Java完成贸易逻辑。

起首,让我们来总的懂得一下Cocoon。

Cocoon正式的界说是一个XML公布引擎,我们能够了解Cocoon为一个用来发生、转换、处置
和输入数据的框架。也能够了解Cocoon是一个从多种数据源吸收数据再使用分歧的处置,最
后将数据以想要的格局输入的呆板。

我们也能够界说Cocoon是一个数据流呆板。也就是说,当你利用Cocoon时,你界说数据的路
径大概流程来发生Web使用的页面。


上面是Cocoon次要的一些基础的道理:

1、Cocoon把一切的数据做为SAX(SimpleAPIforXML)事务来处置,任何非XML的数据都要
变化成XML形貌。

2、天生器(能天生SAX事务)的组件卖力处置输出数据

3、序列化器卖力处置输入数据,将数据输入到客户端(扫瞄器、文件等)。

4、开辟职员组合天生器、序列化器和别的组件组成管道。一切的管道都在一个叫做站点舆图的
文件中界说。

5、经由过程URI(UniformResourceIdentifier)来婚配管道,但URI是与物理资本离开的。


第5点必要申明一下:

关于传统的Webserver,URI一样平常映照到物理资本。
比方,这个URIhttp://localhost/index.html在Apacheserver将映照到一个叫index.html的
HTML文件。

在Cocoon中,URIs和物理资本能够是没有任何相对的互相干系的。你能够自在的计划URI来帮
助用户更好的扫瞄你的站点。最初,你能够更好的构造你的文件让其简单办理和保护。

为了更好的懂得Cocoon的处置模子,能够看一个复杂的管道。

上面这个例子界说了一个叫index.html的页面。这个管道位于叫sitemap.xmap站点舆图中:

<map:matchpattern="index.html">
<map:generatetype="file"src="content/mainfile.xml"/>
<map:transformtype="xslt"src="content/stylesheets/mainstyle.xsl"/>
<map:serializetype="html"/>
</map:match>


这个管道有三步:

起首是一个天生器组件FileGenerator从XML文件"content/mainfile.xml"读取数据。
(FileGenerator实践上已提早在舆图中界说,能够经由过程"type"属性来援用。Cocoon中一切的
管道组件都是经由过程它们的type属性来援用的。)

接着举行转换,转换器TraxTransformer将XSLstylesheet使用到引进的数据。

最初,序列化器HTMLSerializer将数据写到客户真个扫瞄器。


你大概困惑,下面所说的和Java开辟有甚么接洽呢?

我们把Cocoon的使用分红三个部分:

1、数据的搜集层DataCollection(Generation)

2、数据的处置和转换层DataProcessing&Transforming

3、数据的输入层DataOutput(Serialization)

那末,Java开辟在Cocoon的处置转换层长短常主要的。Cocoon的转换和处置层是基于Cocoon的
使用的中心,经由过程这一层对输出数据的处置,逻辑的使用,你就能够失掉所希冀的输入。


在Cocoon中,你能够有上面四种完成逻辑的办法:

1、利用转换器(Transformer)组件:他们依照你给定的划定规矩转换传进的数据。典范的例子
即是TraxTransformer。


2、经由过程分歧的request、session、URI来选择分歧的组件做出准确的处置。

3、利用已有的大概本人完成的Action。

4、利用夹杂了Java代码和内容的XSP。


这篇文章先容最初两种举措:XSP和Action。XSP和Action的开辟都是在servletcontext内。
切实的说,两种组件(实践上是一切的组件)都要存取request,response,session,和
context对象。在某些方面,你要完成的大批的逻辑城市与这些对象互相感化。


XSP

XSP是Cocoon项目标立异。你能够把它和JSP比拟较,由于它们都是夹杂逻辑和内容并且JSP的
taglib和XSP的logicsheet也很类似。

XSP位于管道的出发点,实践上它被Cocoon转换成天生器(Generator)来给管道中其他的组件提
供数据。

让我们看上面这个叫sample1.xsp复杂的示例:

<?xmlversion="1.0"?>

<xsp:pagelanguage="java"xmlns:xsp="http://apache.org/xsp">

<xsp:logic>
Datenow=newDate();
Stringmsg="Boo!";
</xsp:logic>

<content>
<title>WelcometoCocoon</title>

<paragraph>

ThisisanXSP.Youcanseehowweitcontainbothlogic
(insidethe<xsp:logic>tags)andcontent.Inthelogicblock
above,wecreatedaDateobjectwhosevalueis<xsp:expr>now</xsp:expr>.
Oh,wealsohadaspecialmessageforyou:<xsp:expr>msg</xsp:expr>

</paragraph>
</content>

</xsp:page>

起首注重这个文档的根标志是<xsp:page>。

<xsp:pagelanguage="java"xmlns:xsp="http://apache.org/xsp">

这个标志界说XSP的language(能够是Java大概JavaScript)和用到的逻辑单的namespace。

接着是我们界说了两个Java变量的<xsp:logic>块。

这些<xsp:logic>块能够有多个,能够呈现在你但愿的任何中央,并且能够包括各类Java代码。

最初,是我们本人的内容,从用户本人的跟标签入手下手,在下面的示例中是<content>。在内容部分里,
我们能够用<xsp:expr>这个标签失掉在后面界说的变量。

记着,一个XSP实践上就是一个天生器Generator。Cocoon将其转换成Java源文件然后编译、实行它。
(假如想看XSP转换成的Java源文件,到你的servlet容器的事情路径下往找。比方,
假如你利用Tomcat4.0.4,那末路径就是上面如许:
$CATALINA_HOME/work/Standalone/localhost/cocoon/cocoon-files/org/apache/cocoon/www.)

XSP实行后发生的XML数据被传送给管道其他的组件。


看上面这个管道实例:

<map:pipelinematch="*.xsp">
<map:generatetype="serverpages"src="examples/{1}.xsp"/>
<map:serializetype="xml"/>
</map:pipeline>


这里,我们利用一个指定的天生器ServerPagesGenerator,来处置我们复杂的XSP。前往给客户
端未加润色的XML。

注重例子中利用了出格的{1}变量援用:它取代值在管道入手下手处的通配符唆使的值。也就是说,
假如我们在扫瞄器中翻开我们的Web使用中的sample1.xsp,那末{1}的值即是sample1。

记着,同多半Cocoon组件一样,XSP会见request,response,session,和context对象。这些
对象实践上是HttpServletRequest,HttpServletResponse,HttpSession,和
HttpServletContext的封装,Cocoon正式版本供应了大批的存取这些对象的办法。


XSP在从数据库读取数据的时分出格有效。

数据库数据天然地以行和列构造,以是数据库数据很简单转换到XML。但是,JDBC
(JavaDatabaseConnectivity)没有合适地代码完成向XML的转换。

XSP可让我们在读取数据时很简单,这要感激ESQL逻辑单。ESQL逻辑单除埋没了具体
的JDBC代码,还同意将行和列放进到特定的标签中。同时ESQL逻辑单也能够实行嵌套查询
和实行更新命令。

上面,我们举个XSP使用的例子:

假设我们想将一些Cocoon的资本(称号和URL)存储到数据库。


起首,我们界说寄存资本的数据表,然后当用户经由过程关头字搜刮时,我们利用XSP来找到响应
的行,将数据显现给用户。

随后,我们构建一个表单来增添新的列。


表的界说和拔出的数据以下面所示。我们这里利用的数据库是MySQL,假如您利用的是别的的
数据库,要注重做响应的修改。这个例子中,必需要有设置好数据库毗连池。

表布局以下:

usetest;

createtableResources(
ResourceURLvarchar(255)notnull,
ResourceNamevarchar(64)notnull
);

拔出一些资本数据:

insertintoResourcesvalues
(http://xml.apache.org/cocoon,CocoonHomePage);

insertintoResourcesvalues
(http://www.galatea.com/Flashguides/cocoon-tips-2.xml,Cocoon2.0TipsandTricks);



表建好后而且Cocoon也准确的设置事后,我们就能够写上面这个XSP例子:

<?xmlversion="1.0"?>

<xsp:pagelanguage="java"
xmlns:xsp="http://apache.org/xsp"
xmlns:esql="http://apache.org/cocoon/SQL/v2">

<xsp:logic>
Stringkeyword=request.getParameter("value");
</xsp:logic>

<content>
<title>Searchresults</title>
<esql:connection>
<esql:pool>resources</esql:pool>
<esql:execute-query>
<esql:query>
select*fromResources
whereResourceNamelike%<xsp:expr>keyword</xsp:expr>%
</esql:query>
<esql:results>
<resources>
<esql:row-results>
<resource>
<esql:get-columns/>
</resource>
</esql:row-results>
</resources>
</esql:results>
</esql:execute-query>
</esql:connection>

</content>
</xsp:page>



注重在<xsp:page>标签中声明的称号空间(namespace)。任什么时候候,在XSP中利用逻辑单的时分,
必需要声明其称号空间(namespace)。你能够在Cocoonwebapp路径下的WEB-INF/cocoon.xconf找
到逻辑单的界说。XSP称号空间的声明就是要申明这是个XSP逻辑单。

实践上,一切的XSP最少要完成XSP逻辑单。在XSP被转换成Java源文件之前,个中的逻辑单
(实践上仅是XSL文件)会先做XSLT处置转换成Java代码。因而,在下面的例子中的一切的
ESQL标签城市转换成了我们所熟习的JDBC代码。可是并非一切的标签都能够酿成JDBC代码,
注重下面示例中的<esql:pool>块,它触及到了在WEB-INF/cocoon.xconf文件中界说的数据库
毗连池。下面程序中利用的毗连池叫做"resources",固然你可使用你所喜好的界说。

注重,我们这里利用<resources>这个标签将了局集包了起来并且每行的数据都放到<resource>标
签里。如许我们就能够很简单的编写款式表来将XML转换成别的扫瞄器能够了解的格局。我们没有
为表的列界说任何标签,经由过程利用<esql:get-columns/>,Cocoon会将每列的值放到主动以响应
的列名界说的标签内里。


如今,让我注重一下例子中的SQL查询语句,正如你所看到的,这条SQL是静态天生的。当用户
经由过程GETs大概POSTs提交数据到这个XSP后,在XSP的顶部,我们将request参数的值赋给
了keyword变量,然后依据keyword构成SQL语句。


既然这个例子很复杂,让我们把它变庞大一点,到场Email功效,能够在用户供应Email地点后,
将查询了局发送给用户。

XSP示比方下:

<?xmlversion="1.0"?>

<xsp:pagelanguage="java"
xmlns:xsp="http://apache.org/xsp"
xmlns:esql="http://apache.org/cocoon/SQL/v2"
xmlns:sendmail="http://apache.org/cocoon/sendmail/1.0"
xmlns:xsp-request="http://apache.org/xsp/request/2.0"
>

<content>

<xsp:logic>
Stringkeyword=<xsp-request:get-parametername="value"/>;
StringemailAddr=<xsp-request:get-parametername="email"/>;
StringemailBody="";
</xsp:logic>

<title>Searchresults</title>
<esql:connection>
<esql:pool>resources</esql:pool>
<esql:execute-query>
<esql:query>
select*fromResourceswhereResourceNamelike
%<xsp:expr>keyword</xsp:expr>%orderbyResourceName
</esql:query>
<esql:results>
<resources>
<esql:row-results>
<resource>
<xsp:logic>
emailBody+=<esql:get-stringcolumn="ResourceName"/>;
emailBody+=","+<esql:get-stringcolumn="ResourceURL"/>+"
";
</xsp:logic>
<esql:get-columns/>
</resource>
</esql:row-results>
</resources>
</esql:results>
</esql:execute-query>
</esql:connection>

<xsp:logic>
if(emailAddr!=null){
<sendmail:send-mail>
<sendmail:charset>ISO-8859-1</sendmail:charset>
<sendmail:smtphost>MY_SMTP_HOST</sendmail:smtphost>
<sendmail:from>MY_FROM_ADDRESS</sendmail:from>
<sendmail:to><xsp:expr>emailAddr</xsp:expr></sendmail:to>
<sendmail:subject>CocoonSearchResults</sendmail:subject>
<sendmail:body><xsp:expr>emailBody</xsp:expr></sendmail:body>
</sendmail:send-mail>
}
</xsp:logic>

</content>
</xsp:page>


来自sendmail逻辑单的几个标签让我们具有了发送EMAIL的才能。在这个例子中,我们将查询了局
的每行相加赋值给emailBody变量做为邮件的注释。当用户经由过程request参数供应一个EMAIL地点,
我们就能够发送EMAIL了。固然这必要您提早设定好SMTP服务器和FROM地点。

Cocoon晓得依据sendmail逻辑单来处置在sendmail称号空间里的标签,由于这个称号空间已
在<xsp:page>标签中已声明。检察示例中的声明,你会看到xsp-request这个称号空间。
xsp-request逻辑单供应了Request经常使用办法的封装。固然在XSP中间接会见request对象和
利用xsp-request逻辑单没有甚么功效上的区分,可是,实际上利用logicsheet的标签比直
接的JAVA代码更幽美。

在运转这个例子之前,你必需要先在cocoon.xconf文件中设置sendmail逻辑单,Cocoon的设置
文件都在Webapplication的WEB-INF目次下。用你熟习的编纂器翻开cocoon.xconf文件,
找到<target-languagename="java">标签。在这个块内,你会发明一切别的逻辑单的界说。
在最初一个逻辑单(SOAP逻辑单)后到场上面的内容:

<builtin-logicsheet>
<parametername="prefix"value="mail"/>
<parametername="uri"value="http://apache.org/cocoon/sendmail/1.0"/>
<parametername="href"
value="resource://org/apache/cocoon/components/language/markup/xsp/java/sendmail.xsl"/>
</builtin-logicsheet>


这个界说将http://apache.org.cocoon/sendmail/1.0称号空间和已包含在CocoonJAR中
的sendmail.xsl款式表团结起来。

要利用sendmail逻辑单的功效,Cocoon必需要mail.jar和activation.jar这两个JAR。
假如您利用的Server是Tomcat4.x的话,那末它们位于$CATALINA_HOME/common/lib。



Actions


Action功效很壮大,你能够将它放到管道的任何中央。Action能够以为是小的自包括的呆板,
它猎取某些输出数据,做一些处置,然后前往HashMap对象。分歧于Cocoon中的Generators,
Transformers,Serializers组件,Action不合错误实践的XML内容做任何事变,它次要在管道中
完成一些逻辑。


进修Action包含要对管道参数做些懂得,偶然管道的组件必需交换数据。固然,XML内容会通
过SAX事务传送;可是,我们所说的是管道组件自己的功效必要的值。

管道参数有两种:input和output。Input参数是由紧跟在组件声明前面的一个大概多个
<map:parameter>标签来界说的。它们为组件供应一个大概多个值来影响其操纵。

Matcher和Action这两个组件能够为它们前面的组件供应能存取的Output变量。
这些output参数放在HashMap对象里,能够经由过程key称号(如:{1})来援用。
一切的管道都最少有一个由管道入手下手处的Matcher供应的HashMap。我们在管道中利用这个
HashMap对象,利用{1}能够获得HashMap中Key为1的值。


Cocoon自己包括一些内置的Action。个中有一个是依托数据库来判别用户的Action。当我们
想回护Cocoon中的某些页面,只同意受权的用户会见时,能够将用户的ID和暗码存储到数据
库里,然后利用DatabaseAuthenticationAction来做登录确认。
这个DatabaseAuthenticationAction请求我们供应一个XML形貌文件来讲明要利用哪一个表和哪
些列。上面是这个形貌文件的示例:


<?xmlversion="1.0"encoding="UTF-8"?>

<auth-descriptor>
<connection>resources</connection>
<tablename="Users">
<selectdbcol="USER_NAME"request-param="userid"to-session="userid"/>
<selectdbcol="USER_PASSWORD"request-param="userpwd"/>
</table>
</auth-descriptor>


下面这个文件申明用户认证Action将利用resources毗连池和User表,request提交的userid参数
和userpwd参数将与User表中的USER_NAME和USER_PASSWORD列来对照,假如乐成确认,将参
数userid写到session里。

当你在管道中利用一个Action时,它必需先在站点舆图中的<map:components>块中的
<map:actions>块中界说。以下:

<map:components>
<!--allothercomponentdefinitionsgohere-->
<map:actions>
<map:actionname="authenticator"
src="org.apache.cocoon.acting.DatabaseAuthenticatorAction"/>
<!--otheractionsdefinitionsgohere-->
</map:actions>
</map:components>

一旦界说事后,就能够利用这个Action来卖力我们要回护的地区。上面为要回护的地区定
义了三个管道:


<map:matchpattern="protected/login.html">
<map:readmime-type="text/html"src="secret/login.html"/>
</map:match>

<map:matchpattern="protected/login">
<map:acttype="authenticator">
<map:parametername="descriptor"value="secret/auth-info.xml"/>
<map:redirect-touri="index.html"/>
</map:act>

<map:redirect-touri="login.html"/>
</map:match>

<map:matchpattern="protected/*">
<map:matchtype="sessionstate"pattern="*">
<map:parametername="attribute-name"value="userid"/>

<map:matchpattern="protected/*.html">
<map:readmime-type="text/html"src="secret/*.html"/>
</map:match>

<map:matchpattern="protected/*.xsp">
<map:generatetype="serverpages"src="secret/{1}.xsp"/>
<map:serializetype="xml"/>
</map:match>
</map:match>

<map:redirect-touri="login.html"/>
</map:match>


第一个管道复杂的供应了一个登录的表单,是个HTML文件,不必要转换。第二个管道处置
从login.html提交的实践的登录举措。第三个来处置我们要回护的内容。

上面我们做具体的叙述:

DatabaseAuthenticationAction依托形貌文件来考证登录。可是,我们怎样晓得考证是不是
乐成呢?关于Action,假如它们前往了无效的HashMap,那末在<map:act>块里的部分将执
行。假如前往null值,那末块上面的部分将实行。也就是说,依照下面管道的界说,我们
有两种大概的了局,即:假如认证经由过程,我们就能够抵达受回护的地区,假如失利将前往
到Login页面。

在protected/*管道有几个嵌套的Matcher,第二个的type是sessionstate,这个Matcher
实践上是WildcardSessionAttributeMatcher,在这里用来读取session里的userid的值。

在这个例子中,我们晓得DatabaseAuthenticationAction设置了一个叫userid的session属
性,我们经由过程检测userid属性来判别用户是不是登录乐成,假如它不存在,则转向到login页面。

在Cocoon已有一个DatabaseAddAction可用来拔出数据,但为了更好的了解Action,我们
将写一个本人的Action用来将新的Resource纪录拔出到Resources表中。

我们设想你已编写了一个HTML页面,可用来POST两个变量name和url到管道。我们的
Action将从Request对象中找回name和url参数,将其拔出到表中,最初前往一个HashMap对象。

上面是程序代码:

packagetest;

importorg.apache.avalon.excalibur.datasource.DataSourceComponent;
importorg.apache.avalon.framework.component.ComponentException;
importorg.apache.avalon.framework.component.ComponentManager;
importorg.apache.avalon.framework.component.ComponentSelector;
importorg.apache.avalon.framework.parameters.Parameters;
importorg.apache.avalon.framework.thread.ThreadSafe;
importorg.apache.avalon.framework.component.Composable;
importorg.apache.avalon.framework.activity.Disposable;
importorg.apache.cocoon.environment.ObjectModelHelper;
importorg.apache.cocoon.environment.Redirector;
importorg.apache.cocoon.environment.Request;
importorg.apache.cocoon.environment.Session;
importorg.apache.cocoon.environment.SourceResolver;
importorg.apache.cocoon.acting.AbstractAction;

importjava.sql.Connection;
importjava.sql.Statement;
importjava.sql.SQLException;

importjava.util.HashMap;
importjava.util.Map;

publicclassAddResourceActionextendsAbstractAction
implementsThreadSafe,Composable,Disposable
{
protectedComponentSelectordbselector;
protectedComponentManagermanager;

publicvoidcompose(ComponentManagermanager)throwsComponentException{
this.dbselector=
(ComponentSelector)manager.lookup(DataSourceComponent.ROLE+"Selector");

}

protectedfinalDataSourceComponentgetDataSource(Stringpool)
throwsComponentException{
return(DataSourceComponent)this.dbselector.select(pool);
}

publicMapact(Redirectorredirector,SourceResolverresolver,
MapobjectModel,String
source,Parametersparam)
throwsException
{
Requestreq=ObjectModelHelper.getRequest(objectModel);
Sessionses=req.getSession(true);

StringpoolName=param.getParameter("pool");

StringresourceName=req.getParameter("name");
StringresourceUrl=req.getParameter("url");

if(poolName==null){
getLogger().error("Missingapoolname");
returnnull;
}

if(resourceName==null||resourceUrl==null){
getLogger().error("Missinginputparameters");
returnnull;
}

Mapmap=newHashMap();

DataSourceComponentdataSource=getDataSource(poolName);
Connectionconn=null;
booleanstatus=false;

try{
conn=dataSource.getConnection();
Statementstmt=conn.createStatement();
Stringcmd="insertintoResourcesvalues("+
resourceName+","+
resourceUrl+")";
stmt.executeUpdate(cmd);

map.put("resource-name",resourceName);
map.put("resource-url",resourceUrl);

getLogger().debug("Resourcesinsertcompletedbyuser"+
ses.getId());

status=true;
stmt.close();
}catch(Exceptione){
getLogger().error("Stmtfailed:",e);
}finally{
try{
if(conn!=null)conn.close();
}catch(SQLExceptionsqe){
getLogger().warn("Errorclosingthedatasource",sqe);
}
}

if(!status)returnnull;
return(map);
}

publicvoiddispose(){
this.manager.release(dbselector);
}
}

这儿有大批的工具必要消化,出格是假如你不熟习Cocoon的布局。我们一步步的来讲明。

起首,Cocoonaction的主办法是act(),当在管道中利用Action时Cocoon将挪用这个办法。
在这个示例中,act()失掉Request参数、从毗连池中失掉数据库毗连,实行拔出,然后添补
HashMap对象,并将其前往。

在Act办法的入手下手是从ObjectModelHelper组件中获得Request对象,然后失掉两个参数。这个
Action必要别的一个参数,pool;它将告知我们利用哪一个毗连池。假如这个参数没有,那末
Action将前往null并且将毛病写到日记里。有了pool的称号,我们就能够从毗连池失掉数据
库的毗连。Avalon的Excalibur组件用来卖力Cocoon的毗连池。假如你不熟习Avalon,能够
会见这里http://jakarta.apache.org/avalon/。

代码中的insertstatement是间接的JDBC语法。在拔出乐成后,会将乐成的信息写到日记里。
关于日记,假如按下面Action的写法,一切的日记信息都写到你的WebApplication的
WEB-INF/logs/sitemap.log文件。

最初,我们将两个输出参数写到了Map对象,固然它们都在Request对象中,如许做是过剩的,
但我们如许做是为了示例Map对象的用法。

看一下这个Action在站点舆图中的界说。我们必需起首在站点舆图的<map:components>区定
义这个Action。

<map:components>
<!--allothercomponentdefinitionsgohere-->
<map:actions>
<map:actionname="authenticator"
src="org.apache.cocoon.acting.DatabaseAuthenticatorAction"/>
<map:actionname="add-resource"src="test.AddResourceAction"
logger="sitemap.action.AddResourceAction"/>
<!--otheractionsdefinitionsgohere-->
</map:actions>
</map:components>


在管道中利用这个Action:


<map:matchpattern="addresource">
<map:acttype="add-resource">
<map:parametername="pool"value="resources"/>
<map:readmime-type="text/html"src="examples/confirmation.html"/>
</map:act>

<map:readmime-type="text/html"src="examples/addresource.html"/>
</map:match>

能够看到,在<map:act>行的上面,紧随着的<map:parameter>标签为Action供应"pool"参数。
统统顺遂的话,Action将前往一个Map对象,confirmation页面将被显现。


在扫瞄器中翻开http://localhost:8080/cocoon/addresource,你会看到一个输出表单。
表单提交后,假如拔出乐成,将显现confirmation页面,假如呈现毛病,将再次前往到表单
页面。检察WEB-INF/logs/sitemap.log,毛病信息会告知你呈现了甚么毛病。


怎样无效的利用XSP和Action?


XSP和Action是在Cocoon中完成逻辑的两种分歧的举措。选择哪种更合适呢?

XSP在取数据大概创立布局化的数据方面是很有效的。Action被证实在把持数据流程
(其实不发生大概影响数据)的逻辑完成上很有效。我们下面看到的用户考证和数据库
操纵即是如许的两个例子。

但是,有一点必要申明的成绩:XSP会将逻辑和内容夹杂。而Cocoon的一个基础的准绳
就是逻辑、内容、暗示的分别。

在利用XSP的时分,我们提出以下几点倡议:

起首,尽量的利用逻辑单,逻辑单会很好的将Java代码埋没。

第二,只管利用Cocoon的供应的功效,如:在做数据库的Select的时分,我们也能够用
SqlTransformer来完成。

第三,在决议方面的逻辑尽量的利用Selector,Matcher或Action组件。

最初,当没法制止在你的XSP中拔出Java逻辑的话,尽量的让<xsp:logic>小,并且不要
把它们分布到各类你的标签中。
Java的B/s开发是通常是javaweb开发,又叫J2EE开发,J2SE是手机开发。C#的C/s和B/s开发是说.net和Asp开发。。u在这里说明一点;资深一点的Java和C#程序员都明白一点
愤怒的大鸟 该用户已被删除
沙发
发表于 2015-1-21 12:54:30 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
莫相离 该用户已被删除
板凳
发表于 2015-1-30 18:36:05 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
变相怪杰 该用户已被删除
地板
发表于 2015-2-6 14:54:22 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
谁可相欹 该用户已被删除
5#
发表于 2015-2-16 02:11:39 | 只看该作者
是一种突破用户端机器环境和CPU
只想知道 该用户已被删除
6#
发表于 2015-3-4 22:48:39 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
若天明 该用户已被删除
7#
发表于 2015-3-6 04:11:34 | 只看该作者
是一种为 Internet发展的计算机语言
深爱那片海 该用户已被删除
8#
发表于 2015-3-7 07:48:38 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
爱飞 该用户已被删除
9#
发表于 2015-3-8 20:53:01 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
兰色精灵 该用户已被删除
10#
发表于 2015-3-13 09:09:42 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
不帅 该用户已被删除
11#
发表于 2015-3-13 22:09:38 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
小魔女 该用户已被删除
12#
发表于 2015-3-24 22:37:09 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
若相依 该用户已被删除
13#
发表于 2015-4-3 22:00:44 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
乐观 该用户已被删除
14#
发表于 2015-4-7 10:29:33 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
15#
发表于 2015-4-20 04:57:20 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
分手快乐 该用户已被删除
16#
发表于 2015-4-21 19:10:44 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
金色的骷髅 该用户已被删除
17#
发表于 2015-4-22 06:10:09 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
柔情似水 该用户已被删除
18#
发表于 2015-4-27 14:13:54 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
灵魂腐蚀 该用户已被删除
19#
发表于 2015-6-4 01:35:17 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 02:33

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表