当前位置:文档之家› Struts 2.0系列教程(十四)Struts 2与AJAX Dojo(第二部分)

Struts 2.0系列教程(十四)Struts 2与AJAX Dojo(第二部分)

Struts 2.0系列教程(十四)Struts 2与AJAX Dojo(第二部分)
Struts 2.0系列教程(十四)Struts 2与AJAX Dojo(第二部分)

Struts 2.0系列教程(十四)Struts2与AJAX(第二部分),最新最酷的S truts2.0 Ajax教程案例,详细讲述了如何在Struts下正确配置Ajax应用.欢

迎在线阅读Struts2 Ajax演示教程.

本文深入讲解的使用和通过DW R实现AJAX校验。

更多

在Struts2的s howcas e中有两个的例子,分别是静态树与

动态树。所谓的静态树即是在编写JSP代码时通过生成树节点。我的上一篇文章的例子就是一个典型的静态树。而动态树则是在程序运行期间,Struts 2 运行时(Runtime)根据程序中的数据动态创建树节点。虽然在

两个例子中的theme属性都为“ajax”,但是从严格意义上来说,

这两种树都不属于AJAX树,因为它们都是在输出页面时将全部节点加载到其中,而不是在父节点展开时通过XHR(XMLHttpRequest)获取节点数据。

动态树

下面我们先看一下动态树的例子,接着再一步步地将其改造为名副其实的A JAX 树。下例将会把W EB应用程序的目录树展现在JSP页面中。因此,我需

要先包装一下java.io.File 类,代码如下:

pac kage t ut orial;

impo rt java.io.File;

pub lic c lass FileWrap per {

privat e File file;

public FileW rap per(St rin g pat h) {

file = new File(pat h);

}

public FileW rap per(F ile file) {

t his.file = f ile;

}

public St rin g get Id() {

ret urn"file_" + file.has hCode();

}

public St rin g get Na me() {

ret urn file.get Na me();

}

public St rin g get Absolut ePat h() {

ret urn file.get Absolut ePat h();

}

public FileW rap per[] get Ch ild ren() {

File[] files = file.list Files();

if(files != nu ll&& files.len gt h > 0) {

int lengt h = files.le ngt h;

FileWra ppe r[] wrap pers = new File Wra ppe r[le ngt h];

for(int i = 0; i < lengt h; ++i) {

wrappers[i] = new FileW rap per(f iles[i]);

}

ret urn wra ppe rs;

}

ret urn new FileW rappe r[0];

}

}

清单 1 s rc/tutori al/F il eWrapper.j ava

之所以需要对File类进行如此包装,是因为用于动态树时,r ootNode、nodeIdProperty、nodeTitleProperty 和childCollect ionPrope rty等属性都必填的。

然后是Action类的代码如下:

pac kage t ut orial;

impo rt javax.se rvlet.ht t p.Ht t pServlet Req uest;

impo rt org.apac he.st rut s2.int erc ept or.Servlet Req uest Aware;

impo rt c om.opensy mp hony.xwo rk2.Ac t ionSup po rt;

pub lic c lass Dyna mic T reeAc t ion ext ends Act ionSup port imp le ment s Servlet Re quest Aware {

privat e st at ic final lo ng seria lVers ion UID = 11285930472690367 37L;

privat e Ht t pServlet Req uest request;

privat e FileWra ppe r root;

public void set Servlet Request(Ht t pServlet Req uest request) {

t his.request= re quest;

}

public FileW rap per get Root() {

ret urn root;

}

@Override

public St rin g exec ut e() {

root= new FileW rap per(req uest.get Session().get Servlet Cont e xt().get Rea lPat h("/"));

ret urn SUCC ESS;

}

}

清单 2 s rc/tutori al/D ynam i cTreeActi on.j ava

上述代码取得W EB应用程序的根目录的绝对路径后,初始化FileW rapper 对象root。该对象将为JSP页面的的根节点。如下代码所示:

<%@ page la ngua ge="java" c ont ent T ype="t ext/ht ml; c harset=ut f -8"

pageEnc oding="ut f-8"%>

<%@ t ag lib prefix="s" uri="/st rut s-t ags"%>

St rut s 2 AJAX - More T ree

/*

funct ion t reeNodeSe lec t ed(arg) {

alert(arg.sou rc e.t it le + ' selec t ed');

}

funct ion t reeNodeE xpande d(arg) {

alert(arg.sou rc e.t it le + ' expan ded');

}

funct ion t reeNodeCo llapsed(a rg) {

alert(arg.sou rc e.t it le + ' c ollapse d');

}

dojo.addO nLoa d(func t ion() {

var t= do jo.widget.byId('appF iles');

dojo.event.t opic.subsc ribe(t.event Na mes.e xpa nd, t reeN odeE xpan ded);

dojo.event.t opic.subsc ribe(t.event Na mes.c olla pse, t reeN odeCollapse d);

var s = t.select or;

dojo.event.c onnect(s, 'select', 't reeNodeSe lec t ed');

});

/*]]> */

Dyna mic T ree Exa mp le

nodeT it lePropert y="na me"node IdP rope rt y="id"

c hildCo llec t ionPrope rt y="c hil

d ren"/>

清单 3 WebContent/Tree.j s p

因为的treeCollaps edTopic和treeEx pandedTopic属性都没有起作用,所以如果我们想要监听这两个事件,就必须使用上述代码的方法。

最后是s truts.x ml配置文件:

"-//Apac he Soft ware Foundat ion//DT D St rut s Configu rat ion 2.0//E N"

"ht t p://st rut s.apac https://www.doczj.com/doc/1517314304.html,/dt ds/st rut s-2.0.dt d">

T ree.jsp

清单 4 s rc/s truts.xm l

发布运行应用程序,在浏览器地址栏中键入http://localhos t:8080/Stru ts2_Ajax2/DynamicTree.act ion,有如下图所示页面:

图1 动态树示例

AJAX 树

正如我在文章开头所说,Struts2所提供的静态树和动态树都不是严格意义上的AJAX树。下面就让我们来实现一个如假包换的AJAX树。首先要说明的是,Struts2的默认是不支持这种按需加载数据的AJAX树。不过因为它是基于Dojo的树控件(W idget)所以要扩展也很方便。

Dojo 通过名为“TreeRPCController”的控件实现AJAX 树,它会监听被控制树的事件。当发生展开节点的事件时,TreeRPCController就会向URL发送XHR请求,该URL由TreeRPCController的RPCUr l 属性定义。XHR请求格式类似如下格式:

ht t p://loc alhost:8080/St rut s2_A ja x2/Aja xT ree.ac t ion?ac t ion=get Ch ildre n&dat a={"node":{"w idget Id":"file_226092423","ob jec t Id":"C:\\Pro gra m Files\\T o mc at 5.5\\webapps\\St rut s2_Aja x2","inde x":0,"isFolde r": t rue},"t ree":{"w id get Id":"ap pFiles","ob jec t Id":""}}&do jo.p revent Cac he =1182913465392

清单 5 XH R样本

显而易见,请求中包含三个参数,分别是action为“getChildren”(固定值),data一个包含当前节点与树信息的JSON串和dojo.preventCache随机串,用于缓存不同节点的请求响应(父节点只会在第一次被展开时到服务器端加载数据,之后都是从浏览器的缓存中读取数据,可以提高应用程序性能)。

首先我要先写一个加载树节点数据的Action类,代码如下:

pac kage t ut orial;

impo rt java.ut il.Map;

impo rt c om.goog lec ode.json plug in.JS O NE xept io n;

impo rt c om.goog lec ode.json plug in.JS O NUt il;

pub lic c lass AjaxT reeAc t ion ext ends Dyna mic T reeAc t ion {

privat e st at ic final lo ng seria lVers ion UID = 39700197517409423 11L;

privat e St ring ac t ion;

privat e St ring dat a;

privat e FileWra ppe r[] wrap pers;

public void set Act ion(St ring ac t ion) {

t his.act ion = ac t ion;

}

public void set Dat a(St ring dat a) {

t his.dat a = dat a;

}

public FileW rap per[] get Wra ppe rs() {

ret urn wrappe rs;

}

@Override

public St rin g exec ut e() {

if("get Child ren".e qua ls(ac t ion)) {

t ry{

Objec t o = JSO NUt il.dese ria lize(dat a);

St ring pat h = ((Map) ((Ma p) o).get("node")).get("ob je ct Id").t oSt ring();

wrappers = new FileW rap per(pat h).get Child ren();

} c atc h(JSONE xept io n e) {

e.print St ac kT rac e();

}

ret urn"aja x";

}

ret urn super.e xec ut e();

}

}

清单 6 s rc/tutori al/Aj axTreeActi on.j ava

上述代码可能需要解释一下:

1.action属性对应于XHR中的action,如果它为“getChildren”时,则

需要进行加载子节点操作。否则,会读取树的根节点,并返回JSP页

面;

2.通过上面XHR的分析,大家可以知道data是代表树和当前节点的J

SON串,故应将其反串行化为Map对象,并将其objectId属性取出。

通常情况下,Dojo树的objectId属性代表服务器端的对象的标识,

在本例中为文件夹的绝对路径;

3.wrappers属性表示当前文件夹下的文件数组,它被传送到Freemar

ker页面,翻译为Dojo树节点数组的JSON串。

下面是Freemarker页面的代码:

[

<#list wrappe rs as r>

{ "t it le": "${r.na me}", "isFolde r": <#if r.c hild ren?s ize gt0>t rue <#else>fa lse, "id": "${r.id}", "ob jec t Id": "${r.abso lut ePat h?js _st rin g}" }<#if r_has_ne xt>,

]

清单7 WebContent/Aj axTree.f tl

以上代码中<#lis t>的写法是Fr eemark er中遍历集合的写法;而<#if r.ch ildren?s ize gt 0>判断“r”对象的ch ildren属性是否为空;r.ab s olutePath?js_string 就是将“r”的abs olutePath属性的值输出为Jav as cri pt 的字串符形式;<#if r_has_nex t>判断集合是否有下一项数据。如果希望更详细地了解Freemarker的使用,请参考该手册。

接下来,让我们看看Action的配置代码片段:

A ja xT ree.jsp

A ja xT ree.ft l

清单8 s rc/s truts.xm l配置片段

最后是JSP页面代码:

<%@ page la ngua ge="java" c ont ent T ype="t ext/ht ml; c harset=ut f -8"

pageEnc oding="ut f-8"%>

<%@ t ag lib prefix="s" uri="/st rut s-t ags"%>

St rut s 2 AJAX - More T ree

/*

funct ion t reeNodeSe lec t ed(arg) {

alert(arg.sou rc e.t it le + ' selec t ed');

}

dojo.addO nLoa d(func t ion() {

var t= do jo.widget.byId('appF iles');

var s = t.select or;

dojo.event.c onnect(s, 'select', 't reeNodeSe lec t ed');

});

/*]]> */

AJAX T ree Exa mp le

/*

dojo.requ ire("do https://www.doczj.com/doc/1517314304.html, ng.*");

dojo.requ ire("do jo.widget.*");

dojo.requ ire("do jo.widget.T ree");

dojo.requ ire("do jo.widget.T reeRPC Cont ro ller");

/*]]> */

DNDc ont ro lle r="c reat e"RPC Url="">

c ont roller="t ree Cont ro ller">

widget Id=''

isFolder=''

objec t Id=' '>

清单9 WebContent/Aj axTree.js p

由于上面所提及的原因,我在上述的代码中并没有使用标志,而是使用了Dojo的写法——创建widgetId 为“treeController”的TreeRPC Controller 并将设为树的控制器。

发布运行应用程序,在浏览器地址栏中键入http://localhos t:8080/Stru ts2_Ajax2/Ajax Tree.action,点开某个节点,在节点加载的过程中,加号图

标变成时钟状图标,如下图所示页面:

图2 AJ AX树示例

自定义的AJAX的主题(theme)

Struts2的标志过人之外在于它允许开发人员自定义标志的页面输出。要做到这一点,你所需要做的只是创建一个自定义的theme并将其应用到相应标志。下面就让我自定义一个真正的AJAX的的theme。

首先,你的源文件的根目录下新建包“temp late.realajax”。

然后,在上一步所建的包中新建“tree.ftl”文件,内容如下:

/*

dojo.requ ire("do https://www.doczj.com/doc/1517314304.html, ng.*");

dojo.requ ire("do jo.wid get.*");

dojo.requ ire("do jo.wid get.T ree");

dojo.requ ire("do jo.wid get.T reeRPC Cont ro lle r"); <#--Added by Max -->

/*]]> */

<#--Added by Max -->

widget Id="${pa ra met ers.id?ht ml}_c ont roller"

DNDc ont roller="c reat e"

RPC Url="<@s.url />">

<#--End -->

<#if pa ra met ers.bla n kIc onSrc?e xist s>

gridIc onS rc T="<@s.u rl value='${pa ra met ers.bla n kIc onS rc}' enc od e="false"inc lu dePara ms='no ne'/>"

<#if pa ra met ers.grid Ic onSrc L?e xist s>

gridIc onS rc L="<@s.url value='${pa ra met ers.g ridIc onS rc L}' enc od e="false"inc lu dePara ms='no ne'/>"

<#if pa ra met ers.grid Ic onSrc V?exist s>

gridIc onS rc V="<@s.u rl value='${pa ra met ers.grid Ic onSrc V}' enc od e="false"inc lu dePara ms='no ne'/>"

<#if pa ra met ers.grid Ic onSrc P?exist s>

gridIc onS rc P="<@s.u rl value='${pa ra met ers.grid Ic onSrc P}' enc od e="false"inc lu dePara ms='no ne'/>"

<#if pa ra met ers.grid Ic onSrc C?e xist s>

gridIc onS rc C="<@s.u rl value='${pa ra met ers.g rid Ic onSrc C}' enc od e="false"inc lu dePara ms='no ne'/>"

<#if pa ra met ers.grid Ic onSrc X?exist s>

gridIc onS rc X="<@s.u rl value='${pa ra met ers.grid Ic onSrc X}' enc od e="false"inc lu dePara ms='no ne'/>"

<#if pa ra met ers.grid Ic onSrc Y?exist s>

gridIc onS rc Y="<@s.u rl value='${pa ra met ers.grid Ic onSrc Y}' enc od e="false"inc lu dePara ms='no ne'/>"

<#if pa ra met ers.grid Ic onSrc Z?exist s>

gridIc onS rc Z="<@s.u rl value='${pa ra met ers.grid Ic onSrc Z}' enc od e="false"inc lu dePara ms='no ne'/>"

<#if pa ra met ers.expa nd Ic onSrc Plus?e xist s>

expandIc onS rc Plus="<@s.u rl value='${pa ra met ers.expa nd Ic onSrc P lus}' inc ludePa ra ms='none'/>"

<#if pa ra met ers.expa nd Ic onSrc Min us?e xist s>

expandIc onS rc Minus="<@s.url value='${para met ers.e xpan dIc onS r c Minus?ht ml}' inc ludePa ra ms='no ne'/>"

<#if pa ra met ers.ic onWidt h?exist s>

ic onWidt h="<@s.u rl value='${pa ra met ers.ic onWidt h?ht ml}' enc od e="false"inc lu dePara ms='no ne'/>"

<#if pa ra met ers.ic onHe ig ht?exist s>

ic onHe ight="<@s.u rl va lue='${pa ra met ers.ic onHe ig ht?ht ml}' enc o de="fa lse"inc ludePa ra ms='no ne'/>"

<#if pa ra met ers.t oggle Durat io n?e xist s>

t oggle Du rat ion=${pa ra met ers.t oggle Du rat ion?c}

<#if pa ra met ers.t emplat eCssPat h?e xist s>

t emp lat eCssPat h="<@s.url value='${pa ra met ers.t e mp lat eCssPat h} ' enc ode="false"inc lu dePara ms='no ne'/>"

<#if pa ra met ers.show Grid?e xist s>

showGrid="${pa ra met ers.show Grid?defau lt(t rue)?st ring}"

<#if pa ra met ers.show Root Grid?exist s>

showRoot Grid="${pa ra met ers.show Root Grid?defau lt(t rue)?st ring}"

<#if pa ra met ers.id?e xist s>

id="${pa ra met ers.id?ht ml}"

<#if pa ra met ers.t reeSelec t edT opic?exist s>

publis hSelec t ionT opic="${pa ra met ers.t reeSelec t edT opic?ht ml}"

<#if pa ra met ers.t reeExpande dT opic?exist s>

publis hE xpa ndedT opic="${para met ers.t reeE xpande dT opic?ht ml}"

<#if pa ra met ers.t reeCollapsedT op ic?exist s>

publis hCo lla psedT opic="${pa ra met ers.t reeCo lla psedT opic?ht ml}"

<#if pa ra met ers.t oggle?e xist s>

t oggle="${para met ers.t ogg le?ht ml}"

c ont roller="${para met ers.id?ht ml}_c ont ro lle r" <#--Adde

d by Ma x -->

>

<#if pa ra met https://www.doczj.com/doc/1517314304.html,be l?e xist s>

<#if pa ra met ers.node IdP rope rt y?exist s>

id="${st ac k.findVa lue(pa ra met ers.node IdP rope rt y)}"

<#else>

id="${pa ra met ers.id}_root"

>

<#else if para met ers.root Node?e xist s>

${st ac k.push(pa ra met ers.root Node)}

<#-- Edit ed by Max -->

t it le="${st ac k.findValue(pa ra met ers.nodeT it leP rope rt y)}"

widget Id="${st ac k.findVa lue(para met ers.node IdP rope rt y)} "

isFolder="<#if st ac k.findVa lue(pa ra met ers.c hildCo llec t ionP rope rt y)?size gt0>t rue<#e lse>fa lse"

object Id="${st ac k.findVa lue(para met ers.na meVa lue)}">

<#-- End -->

<#assig n old Node = st ac k.pop()/><#--pop t he node off of t h e st ac k, but don't show it-->

清单10 s rc/tem pl ate/real aj ax/tree.f tl

对上述稍作解释,上述代码主要在原版的s rc/template/ajax/tree.ft l的基础上添加了TreeRPCController的控件,并只输出根节点。由于没有类似nodeObjectIdProperty的属性,所以我用了value属性表示objec tId对应的属性名称。

接着新建tree-clos e.ftl文件,内容和原版的一样,如下所示:

<#if pa ra met https://www.doczj.com/doc/1517314304.html,be l?e xist s>

清单11 s rc/tem pl ate/real aj ax/tree-cl os e.f tl

再下来就应该是将theme应用到,如下代码所示:

<%@ page la ngua ge="java" c ont ent T ype="t ext/ht ml; c harset=ut f -8"

pageEnc oding="ut f-8"%>

<%@ t ag lib prefix="s" uri="/st rut s-t ags"%>

"ht t p://https://www.doczj.com/doc/1517314304.html,/T R/xht ml1/DT D/xht ml1-t ransit io nal.dt d">

St rut s 2 AJAX - More T ree

/*

funct ion t reeNodeSe lec t ed(arg) {

alert(arg.sou rc e.t it le + ' selec t ed');

}

dojo.addO nLoa d(func t ion() {

var t= do jo.widget.byId('appF iles');

var s = t.select or;

dojo.event.c onnect(s, 'select', 't reeNodeSe lec t ed');

});

/*]]> */

AJAX T ree Exa mp le

nodeT it lePropert y="na me"node IdP rope rt y="id"

c hildCo llec t ionPrope rt y="c hil

d ren"value="abso lut ePat h" />

清单12 WebContent/Aj axTreeThem e.j s p

上述代码中的用法,除了theme改为“r ealaj ax”和多了valu e="abs olutePath"外,几乎和静态树中的一样。

为了不影响前一个例子,我们为该JSP文件配置类型相同的Action,如下代码所示:

A ja xT reeT he me.js p

A ja xT ree.ft l

清单13 s rc/s truts.xm l配置片段

发布运行应用程序,在浏览器地址栏中键入http://localhos t:8080/Stru ts2_Ajax2/Ajax TreeTheme.action,结果如图2所示。

总结

通过上述例子,大家知道Struts 2 的AJAX 标志是基于Dojo控件开发的,所以如果大家希望熟练地使用这些标志,最好去了解一下Dojo。

Struts2教程2:处理一个form多个submit

在很多Web应用中,为了完成不同的工作,一个HTML form标签中可能有两个或多个submit 按钮,如下面的代码所示: 由于在

中的多个提交按钮都向一个action提交,使用Struts2 Action的execute 方法就无法判断用户点击了哪一个提交按钮。如果大家使用过Struts1.x就会知道在 Struts1.2.9之前的版本需要使用一个LookupDispatchAction动作来处理含有多个submit 的form。但使用LookupDispatchAction动作需要访问属性文件,还需要映射,比较麻烦。从Struts1.2.9开始,加入了一个Event DispatchAction动作。这个类可以通过java反射来调用通过request参数指定的动作(实际上只是判断某个请求参数是不存在,如果存在,就调用在action类中和这个参数同名的方法)。使用EventDispatchAction必须将submit的name 属性指定不同的值以区分每个submit。而在Struts2中将更容易实现这个功能。 当然,我们也可以模拟Event DispatchAction的方法通过request获得和处理参数信息。但这样比较麻烦。在Struts2中提供了另外一种方法,使得无需要配置可以在同一个action类中执行不同的方法(默认执行的是execute方法)。使用这种方式也需要通过请求参来来指定要执行的动作。请求参数名的格式为 action!method.action 注:由于Struts2只需要参数名,因此,参数值是什么都可以。 下面我就给出一个实例程序来演示如何处理有多个submit的form: 【第1步】实现主页面(more_submit.jsp)

尚学堂_马士兵 Java学习路线图_教学大纲_视频资源列表

尚学堂教学安排 第一部分学习总周期26天: 1. --j2se(chat + tank + snake)-----------------------13 days 2. --oracle--------------------------------- 4 days 3. --jsp+jdbc+mysql------------------------------- 1 days 4. --html+css+js--------------------------- 3 days 5. --html+css+js--------------------------- 3 days 6. --bbs----------------------------------- 2 days 第二部分学习总周期27天 7. --drp-----------------------------------12 days 8. --struts--------------------------------- 6 days 9. --hibernate-------------------------------- 6 days 10.--spring--------------------------------- 3 days 第三部分学习总周期26天 11.--uml----------------------------------- 2 days 12.--oa-----------------------------------15 days 13.--crm----------------------------------- 5 days 14.--ejb 3.0---------------------------------3 days 15.--bankproject(简介)---------------------------1 days 16.--面试技巧+3g+j2me(简介)-------------------------1 days 第四部分linux学习总周期4天 教学视频资源列表 q、jshtmlcss 这是基础 l、尚学堂科技_马士兵_轻松愉快linux视频教程 n、oracle.马士兵 r、mysql_avi.马士兵 这些单独的数据库和系统模块可以在任何时候都可以,建议在学j2ee之前学 j、尚学堂马士兵视频教程_scm_cvs_svn cvs是存档工具,建议在学j2ee当中学习 p、junit4 这个是测试工具,建议在学j2ee中学习 s、设计模式.马士兵

struts2+spring3+hibernate整合教程

Struts2+Spring3+hibernate3整合 (2011年7月末,最新) 上次下载了一个教程,上面写着:“献给我亲爱的老婆!”(羡慕不已)。想了想,我没老婆,难道没什么好写了!不难… 献给我暗恋过的每一个女人!(嘿嘿…) 如果在你遇到的女生中有一个幽默豁达的女生,不要犹豫,追上去,就娶她了!

一,需要的框架包 二,建立project,添加相应的.jar文件(重点) 1,eclipse中建立dynamic web project,这里是ssh_integrate_0100。 2,src中创建需要的类,这里以一个域模型为user的例子说明。(现在建立这些类,可以方便我们在搭建时候随时测试!) User.java IUserDao.java

UserDaoImpl.java IUserService.java UserServiceImpl.java

3,拷贝spring-framework-3.1.0\dist目录下的所有jar包,注意有一个不是jar的文件,当然拷过去也没事。 4,拷贝spring运行中需要的其他jar文件,主要是 https://www.doczj.com/doc/1517314304.html,mons-logging,可以从spring-framework-3.0.2.RELEASE-dependencies 中找到。 ii.Aspectjrt.jar和aspect-waver.jar,可以从spring-framework-2.5.6-with-dependencies/lib/aspectj下面找到(不知道为什 么,spring-framework-3.0.2.RELEASE-dependencies中没有aspectjrt的jar 包) iii.aopalliance.Jar,apache-dbcp.jar,apache-pool.jar,可以从spring-framework-3.0.2.RELEASE-dependencies中找到。 5,建立beans.xml,这里使用的是annotation和component-scan,这样配置可以大大简化配置,所以是best-practice,其他配置请参考spring文档。

struts1教程

本系列教程将详细介绍Struts 1.x的基本原理和使用方法,读者可以参阅《Struts 2系列教程》来比较Struts 1.x和Struts 2.x的相同点和不同点。 在这篇文章中将以一个简单的例子(mystruts)来演示如何使用MyEclipse来开发、运行Struts程序,并给出了解决ActionForm出现乱码问题的方法。读者可以从本文中了解开发Struts 1.x程序的基本过程。 一、本文给出的程序要实现什么功能 mystruts是一个录入和查询产品信息的程序。为了方便起见,本例中的产品信息表只包括了产品ID、产品名称和产品价格三个字段。mystruts的主要功能如下: 1. 接受用户输入的产品ID、产品名称和产品价格。 2. 验证这些字段的合法性。如果某些字段的输入不合法(如未输入产品ID),程序会forward到一个信息显示页,并显示出错原因。 3. 如果用户输入了正确的字段值,程序会将这些字段值保存到数据库中,并显示“保存成功”信息。 4. 用户输入产品名称,并根据产品名称进行模糊查询。如果存在符合要求的产品信息。程序会以表格形式显示这些产品的信息,同时显示记录数。如果未查到任何记录,会显示“没有符合要求的记录!”信息。 二、编写程序前的准备工作 1. 建立数据库 在编写程序之前,需要建立一个数据库(struts)和一个表(t_products),建立数据库和表的SQL脚本如下所示:

# 建立数据库struts CREATE DATABASE IF NOT EXISTS struts DEFAULT CHARACTER SET GBK; # 建立表t_products CREATE TABLE IF NOT EXISTS struts.t_products ( product_id varchar(4) NOT NULL, product_name varchar(50) NOT NULL, price float NOT NULL, PRIMARY KEY (product_id) ) ENGINE=InnoDB DEFAULT CHARSET=gbk; 2 建立一个支持struts1.x的samples工程 用MyEclipse建立一个samples工程(Web工程),现在这个samples工程还不支持Struts1.x (没有引入相应的Struts jar包、struts-config.xml文件以及其他和Struts相关的配置)。然而,在MyEclipse中这一切并不需要我们手工去加入。而只需要使用MyEclipse的「New Struts Capabilities」对话框就可以自动完成这些工作。 首先选中samples工程,然后在右键菜单中选择「MyEclipse」> 「New Struts Capabilities」,启动「New Struts Capabilities」对话框。对默认的设置需要进行如下的改动:(1)将Struts specification改为Struts 1.2. (2)将Base package for new classes改为struts. (3)将Default application resources改为struts.ApplicationResources. 改完后的「New Struts Capabilities」对话框如图1所示。

struts2教程(完全版)

Yaio 4 一、准备工作及实例 4 1.解压struts- 2.1.6-all.zip 4 2.六个基本包 4 3.初识struts2配置文件 4 (1).web.xml文件 4 (2).struts.xml文件 4 (3).struts.properties(参default.properties) 4 (4)struts-default.xml 5 (5)其它配置文件 5 4.让MyEclipse提示xml信息 5 5.如何使用alt+/提示 5 6.实例 5 7.开启struts2自带的开发模式常量 7 8.vo传参模式 8 9.ModerDriven传参模式(不建议采用) 8 10.为什么要使用struts2代替struts1.x 9

二、struts.xml配置及例程 9 1.配置文件的优先级 9 2.配置形式 9 3.package配置相关 10 4.分工合作include:指定多个配置文件 12 5.tomcat认证访问 12 6.初识拦截器 13 7.Action中的method属性 15 8.使用ForwardAction实现页面屏蔽。 17 8.使用default-Action配置统一访问 17 小结Action 18 9.使用通配符 18 10.使用0配置:ZERO Annotation 19 11.Result配置详解 19 12.异常处理 24 三、在Action获取Scope对象 25 方式一、与Servlet解耦合的非IOC方式 25

方式二、与Servlet解耦合的IOC方式 27 方式三、与Servlet耦合的非IOC方式 27 方式四、与Servlet耦合的IOC方式 28 四、OGNL与ValueStack(VS) 29 1.值栈入门 29 2.OGNL入门 31 3.普通方法访问 31 4.静态方法访问 31 5.默认类Math的访问 32 6.调用普通类的构造方法 32 7.集合对象初步 32 8.集合对象进阶 33 9.N语法top语法 34 10.获取Stack Context中的信息 35 11.总结$ # %的区别 35 12.总结OGNL[重点] 35 五、拦截器 36

Struts2+Hibernate架构教程课后参考答案

第1章 Struts2框架技术入门 1.5 习题 1.5.1 选择题 1.D 2.A 3.C 4.B 5.B 1.5.2 填空题 1.MVC 2.Struts1和WebWork 3.IBM 4.FilterDispatcher 5.JSP、Struts2标签 1.5.3 简答题 1.简述MVC设计模式的工作流程。 答:MVC设计模式工作流程是: (1)用户的请求

基于struts2框架研究

基于 Struts2 框架研究 (信息学院计算机科学与技术,) 摘要: 分析基于J2EE MVC架构的Struts2框架. Struts2是基于java、MVC模式、web的开发框架。 Struts 框架的开发应用,体现了软件框架结构和组件技术重用的优越性,促使网页设计者和软件开发者职责分离,提高了软件开发的效率,使得程序易于扩展和维护。 关键词:构架;Struts2;struts; 0引言 随着J2EE在WEB开发中的应用越来越广泛,J2EE工程开发框架不断涌现。从应用最早的struts到刚刚兴起的struts2,每个框架都在为实现代码复用、提高开发效率等方面做出了努力。Struts2框架的产生给程序开发带来了极大的方便,它更容易实现单元测试,更容易和其他框架整合,进一步提高了程序员的开发效率。 1 Struts2构架及其扩展 1.1 Struts2构架简介 虽然Struts2被业界称为是一个全新的框架,但这仅仅是相对Struts1而言。 Struts2与Struts 1 相比,确实有很多革命性的改进,但它并不是全新的框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。由于 Struts1是应用最早的一种MVC架构,经过多年的考验,被广大Java 开发者所接受,其稳定性和可用性毋庸置疑。相Struts1对来说,WebWork兴起时间比较短,要被广大开发者接受还需要一定的时间,但凭借其先进的技术优势,WebWork也逐渐受到业界的青睐。Apache接手 WebWork项目后,吸取 Struts1和 WebWork两者的优势,成功推出了 Struts2。 1.2 Struts构架简介 Struts是一个开放资源框架,具有组件的模块化、灵活性和重用性的优点,采用的是一个 M odel 2 JS PWeb 应用程序框架,也就是所谓的模型-视图-控制器(M V C )设计模式,它清晰地区分控制、事务逻辑和外观,从而简化了开发应用程序过程,其体系结构如图 1所示。 S tru ts 是由 S ervlet、标记库、实用类库等构成,这些类包括控制程序流程的类、实现和执行程序事务逻辑的类。其中,A ctionServlet类是控制器组件,它根据用户请求,调用相应的 Action 类实例进行处理,然后选择相应的JSP 文件返回客户端;A ctionForm 类是模型中的数据Bean 类,用来表示从 View 组件中输入的数据;Action 类是模型中的逻辑Bean 类,对它扩展后可以执行某一特定请求的业务逻辑;ta g lib 组件代 图1 Struts体系结构 表标签库;A ctionM apping 类代表 URL 模式和业务逻辑组件 Action 之间的映射。此外,Struts还包含了一个非常重要的配置文件Struts-config.xm l,它包括关于W eb 应用程序的ActionM apping 信息、 JD B C 数据源信息、 A ctionForm Bean 信息和全局转发等。使用 Struts 框架可以将业务逻辑、控制和数据显示功能模块区分开来,应用程序功能划分很清晰,开发人员可以分别集中开发业务逻辑模块、程序控制模块和数据显示模块,不用担心3 者之间的耦合问题。 Struts 架的开发应用,体现了软件框架结构和组件技术重用的优越性,促使网页设计者和软件开发者职责分离,提高了软件开发的效率,使得程序易于扩展和维护。 1.3 Struts 2与 Struts

SSH框架教程

SSH框架的学习 一,Struts 2 1 为什么要学习Struts框架? 1>Struts框架的好处:简化开发工作量,提高开发效率;采用了优秀的MVC 思想 2>如何学习:先掌握框架的使用,在了解内涵 2 MVC模式在javaWeb中的应用 1>MVC思想是根据组件职责不同,将系统分为三部分组成 --M(Model) 负责业务处理 --V(View) 负责与用户交互 --C(Controller) 负责协调试图部分和模型部分协同工作 2> 为什么使用MVC:易于扩展和升级 3 Struts框架的处理流程 浏览器发出struts请求—>请求进入struts控制器—>struts控制器解析XML配置文件—>控制器根据不同请求,调用不同的Action—>Action 调用DAO处理请求返回结果—>控制器根据结果调用试图组件,响应给用户 4 Struts 历史 Struts框架分为Struts1和Struts2 两者没有必然联系,Struts2 是以WebWork 框架核心(Xwork)为基础构建起来的 5 Struts 基本使用 1>引入核心开发包五个: commons-logging-1.0.4.jar ( 主要用于日志处理) struts2-spring-plugin-2.0.14.jar ( struts2整合spring需要的包) 2>在web.xml 中配置struts控制器 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExcuteFilter

3>根据要求编写Action 和JSP Action要继承ActionSupport 4>在struts.xml定义Action和请求对应关系 6 struts.xml 基本配置可以放在src下面 1> 根元素里面包含多个元素 2> 主要是为了将Action分组定义name用于指定包名;extends一 般指定struts-default(在struts-default.xml中定义),里面包括struts2运行所需的必要组件 3> 4> 一个可以包括多个 主要用于试图响应 5>下面一个例子: 7 为列表添加分页功能例如每页2个 page =1; pageSize=2; int begin=(page-1)*pageSize+1; int end=page*pageSize; eg: select * from ( select rownum rn , c.* form COST c ) where rn between 1 and 6;

Struts2+Hibernate架构技术教程课后参考答案

第1章Struts2框架技术入门 1.5 习题 1.5.1 选择题 1.D 2.A 3.C 4.B 5.B 1.5.2 填空题 1.MVC 2.Struts1和WebWork 3.IBM 4. FilterDispatcher 5.JSP、Struts2标签 1.5.3 简答题 1.简述MVC设计模式的工作流程。 答:MVC设计模式工作流程是: (1)用户的请求(V)提交给控制器(C); (2)控制器接受到用户请求后根据用户的具体需求,调用相应的JavaBean或者EJB(M部分)来进行处理用户的请求; (3)控制器调用M处理完数据后,根据处理结果进行下一步的调转,如跳转到另外一个页面或者其他Servlet。 2.简述Struts2的工作原理。 答:Struts2中使用拦截器来处理用户请求,从而允许用户的业务控制器Action与Servlet分离。用户请求提交后经过多个拦截器拦截后交给核心控制器FilterDispatcher处理,核心控制器读取配置文件struts.xml,根据配置文件的信息指定某一个业务控制器Action(POJO类)来处理用户数据,业务控制器调用某个业务组件进行处理,在处理的过程中可以调用其他模型组件共同完成数据的处理。Action处理完后会返回给核心控制器FilterDispatcher一个处理结果,核心控制器根据返回的处理结果读取配置文件struts.xml,根据配置文件中的配置,决定下一步跳转到哪一个页面。 一个客户请求在Struts2框架中处理的过程大概有以下几个步骤: (1)客户提交请求到服务器; (2)请求被提交到一系列的过滤器过滤后最后到FilterDispatcher; FilterDispatcher是核心控制器,是基于Struts2中MVC模式的控制器部分; (3)FilterDispatcher读取配置文件struts.xml,根据配置信息调用某个Action来处理客户请求; (4)Action执行完毕,返回执行结果,根据struts.xml的配置找到对应的返回结果。

三大框架整合

Spring3.2 Jar分析: Spring3.2 开发最基本jar包 spring-beans-3.2.0.RELEASE.jar spring-context-3.2.0.RELEASE.jar spring-core-3.2.0.RELEASE.jar spring-expression-3.2.0.RELEASE.jar https://www.doczj.com/doc/1517314304.html,mons.logging-1.1.1.jar https://www.doczj.com/doc/1517314304.html,.apache.log4j-1.2.15.jar AOP开发 spring-aop-3.2.0.RELEASE.jar spring-aspects-3.2.0.RELEASE.jar https://www.doczj.com/doc/1517314304.html,.aopalliance-1.0.0.jar https://www.doczj.com/doc/1517314304.html,.aspectj.weaver-1.6.8.RELEASE.jar Spring Jdbc开发 spring-jdbc-3.2.0.RELEASE.jar spring-tx-3.2.0.RELEASE.jar Spring事务管理 spring-tx-3.2.0.RELEASE.jar Spring整合其他ORM(对象关系模型)框架 spring-orm-3.2.0.RELEASE.jar Spring在web中使用 spring-web-3.2.0.RELEASE.jar Spring整合Junit测试 spring-test-3.2.0.RELEASE.jar Spring框架的使用: 在src或WEB-INF下创建applicationContext.xml 配置web.xml contextConfigLocation classpath:applicationContext.xml org.springframework.web.context.ContextLoaderListener 在Servlet/Filter中获得Spring上下文对象 WebApplicationContext context= WebApplicationContextUtils.getWebApplicationContext(servletContext);

Struts2详细实例教程

Struts2(上) 一、经典的MVC模式 二、Struts1.x对MVC的实现 三、Struts1.x的主要组件和作用 组件作用 ActionServlet 中央控制器 Action 分控制器,调用JavaBean实现业务逻辑, Action可以分为Action、DispatchAction等不 同类型

ActionForm 封装参数,实现服务器验证,文件上传等Forward 转发到目的地,可以是JSP,也可以是另一个 Action Struts-config.xml 配置文件,配置有ActionForm,Action,Forward 等,通过XML解析,然后使用反射技术使用 该文件 Struts标签库和JSTL类似,和Struts-config.xml、 ActionForm、Action等对象可以紧密集成 四、Struts1.x 开发实例-登录程序 见案例。 五、Struts2(WebWork)的MVC Struts2的MVC架构 六、Struts2的主要组件 组件作用 FilterDispatcher 起中央控制器作用的过滤器 Action 处于Model层的Action,调用JavaBean实现 业务逻辑 struts.xml 核心配置文件,配置有Action、Result等result 和forward类似,转发的目的地,支持多种视 图技术。

七、Struts2的实例-登录 在MyEclipse环境中建立一个新的web工程,名称“Struts2Login”,存放路径“f:\Struts2Login”。 在Struts2.0.11版本中找到war包struts2-blank-2.0.11.war,解开该war包,在WEB-INF/lib 目录下复制出所有的jar包,这些jar包就是一个Struts2程序所需要的基础jar包,把它们复制到新建的web工程的WEB-INF/lib目录中。 在src目录下建立一个类,包名mypack,类名UserAction,其代码如下: package mypack; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private String username; private String userpass; public String getUsername() { return username; } public void setUsername(String username) { https://www.doczj.com/doc/1517314304.html,ername = username; } public String getUserpass() { return userpass; } public void setUserpass(String userpass) { https://www.doczj.com/doc/1517314304.html,erpass = userpass; } @Override public String execute() throws Exception { if ("Mike".equals(username) && "123".equals(userpass) || "张三".equals(username) && "abc".equals(userpass)) return "success"; else return "error"; } } 在src目录下建立Struts2的配置文件struts.xml,内容如下:

关于struts漏洞的利用工具

关于struts漏洞的利用工具 自从这个工具流传以后,在江湖上掀起了一片腥风血雨,危害甚为严重,现在小菜来说说我的一些利用心得,加上各种看见的资料,说说见解吧了。各位看观觉得有意思的驻足,没有意思的无视就OK 关于工具的不多说了,随处可以看见下载的,关键字嘛..自己随意吧,反正经常遇见各种root和system。 关于各种利用 1.先来看看windows的,经过一番的构造遇见了一个 是system权限的,我们先看看是处于内网还是外网的 是外网,就方便多了,然后我们net start就是看看是开启了些什么服务

远程开启了,但是由于IP策略的存在,我们无法远程连接 然后我们关闭IP策略的服务net stop policyagent 再连接,表示可以连接了 然后就是一般的加用户啊什么的,常规的,不再描述

net user guset ifuckyou!@# /add net localgroup administrators guset /add 这个擦PP啊,自己去网上找教程,不是这里的重点 2.再谈谈linux的利用 Linux我是完全的不熟悉,然后问起还被liuker大牛一顿那啥,这里表示感谢了。

我不懂java,所以只能谈谈利用,目测又遇见一个。 目测有两个方向可以走,一个是加用户,因为是root,先看看开ssh没有chkconfig --list 然后查看下是不是内网 是外网,我们来增加一个用户 useradd -u 0 -o -g root -G root -d /home/cat11 cat11 -p $1$F1B0hFxb$NkzreGE7srRJswTgLYq9c 执行后发现已经加上去了..我们来ssh连接下,发现连接不上去,我们关闭防火墙

struts2.3.8配置教程

最近想学struts2,上网看了许多struts2的例子,怎么捣腾都捣腾不出来。原来是struts2.3.8和之前的2.1.x不一样,于是继续捣腾,终于有成果,以下是一个HelloWorld的demo 1.创建web project,结构目录如下 注:所需要的包缺一不可(本人无聊还故意一个个删除然后测试,哈哈),与网上的教程相比,多了个javassist这个jar包 2.修改WEB-INF/lib下的web.xml 加入 struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPre pareAndExecuteFilter struts2 /* 注:filter-class中与之前不同

3.编写action类 package com.action; import com.opensymphony.xwork2.ActionSupport; public class IndexAction extends ActionSupport{ private static final long serialVersionUID = 1L; private static final String MESSAGE = "struct is running"; private String message = ""; @Override public String execute() throws Exception { setMessage(MESSAGE); return SUCCESS; } public String getMessage(){ return message; } public void setMessage(String message) { this.message = message; } } 4.编写view的jsp <%@page language="java"import="java.util.*"pageEncoding="utf8"%> <%@taglib prefix="s"uri="/struts-tags"%> My JSP 'success.jsp' starting page


5.编写struts.xml

Struts2框架搭建教程

Struts2教程1:第一个Struts2程序 在本系列教程中我们将学习到Struts2的各种技术。在本教程中使用的工具和程序库的版本如下: 开发工具:MyEclipse6 Web服务器:Tomcat6 Struts版本:Struts2.0.11.1 JDK版本:JDK1.5.0_12 J2EE版本:Java EE5.0 在本系列教程中Web工程的上下文路径都是struts2,如果在Web根目录有一个index.jsp文件,则访问路径如下: http://localhost:8080/struts2/index.jsp 由于MyEclipse6目前并不支持Struts2,所以我们需要到https://www.doczj.com/doc/1517314304.html,去下载Struts2安装包。要想正常使用Struts2,至少需要如下五个包(可能会因为Struts2的版本不同,包名略有差异,但包名的前半部是一样的)。 struts2-core-2.0.11.1.jar xwork-2.0.4.jar commons-logging-1.0.4.jar freemarker-2.3.8.jar ognl-2.6.11.jar Struts2虽然在大版本号上是第二个版本,但基本上在配置和使用上已经完全颠覆了Struts1.x的方式(当然,Struts2仍然是基于MVC模式的,也是动作驱动的,可能这是唯一没变的东西)。Struts2实际上是在Webwork基础上构建起来的MVC框架。我们从Struts2的源代码中可以看到,有很多都是直接使用的xwork(Webwork的核心技术)的包。既然从技术上来说Struts2是全新的框架,那么就让我们来学习一下这个新的框架的使用方法。

MyEclipse_SSH_教程

【标题】:MyEclipse Struts 教程 【关键字】:MyEclipse,Struts 【来源】:https://www.doczj.com/doc/1517314304.html,/u/3138/showart.php?id=124768 MyEclipse Struts 教程 1. 序 此文档适应 Sun JDK 1.4.2, Eclipse 3.0.1 and MyEclipse 3.8.2. 环境。所有的屏幕截图都是基于 Eclipse, MyEclipse Enterprise Workbench, and Windows XP 的默认用户接口设置。如果你在使用这个文档的过程中遇到困难,请看用户反馈部分,以反馈给 MyEclipse documentation team 。 2. 说明 在这个用户指南中我们将通过 MyEclipse Enterprise Workbench 来开发和测试一个简单的 Struts 示例应用。这并不需要我们具有 Struts 或者MyEclipse 的预备知识。 3. 必备工具 JDK 1.4+ (Sun or IBM) https://www.doczj.com/doc/1517314304.html,/j2se/downloads/index.html Eclipse 3.0.x SDK https://www.doczj.com/doc/1517314304.html,/downloads/index.php MyEclipse 3.8.2 https://www.doczj.com/doc/1517314304.html,/ContentExpress-display-ceid-10.html Tomcat 5.0.x ( 首选 5.0.28 P referred, 或其他 Servlet/EJB 容器 ) https://www.doczj.com/doc/1517314304.html,/jakarta/tomcat-5/v5.0.28/bin/jakarta-tomcat -5.0.28.exe 4. 构造一个新项目 为了有效的组织我们的开发,我们需要在添加了 Struts Capabilities 的MyEclipse 中创建一个新的Web Module Project 。你可以创建一个 web project 通过菜单 File > New > Other > Project > J2EE > Web Project ,如下图所示

Struts2+JQuery+JSON集成

Struts2+JQuery+JSON集成 各位搞java的兄弟们,小弟搞了一个上午加中午,终于搞出用ajax传输json数据了,下面完完全全的将我遇到困难和配置给贴出来!! 结合https://www.doczj.com/doc/1517314304.html,/fengda2870/article/details/4052527这篇文章,慢慢的搞出来 点击“点我看看”按钮后,用jquery取得venus和password,用ajax传输到后台,处理,将处理后的数据,返回并显示在页面上 1、新建web工程 2、导入strust2的jar包(易错) 3、导入struts2里相关的json的包(2个) 4、要下载个处理json的库,(网上很多) https://www.doczj.com/doc/1517314304.html,/json的官网(里面有这些链接) 推荐google的gson和json发明者自己写的类(我这里用的是json发明者自己的写的类) 5、工程目录结构(红色框内重点!)

6、web.xml里写 7、struts2.xml里写(!!!!很容易出错,注意) 8、Action类 packagecom.zyn.action; importjava.util.ArrayList; importjava.util.List; import org.apache.struts2.ServletActionContext; importorg.json.JSONObject; import com.opensymphony.xwork2.ActionSupport; https://www.doczj.com/doc/1517314304.html,er; public class Test extends ActionSupport { private User user; private String result; public String getResult(){ return result; } public void setResult(String result){ this.result = result; } public User getUser() { return user; } public void setUser(User user) { https://www.doczj.com/doc/1517314304.html,er = user; } public static void main(String[] args) {

Struts+Spring+Hibernate整合教程

Struts+Spring+Hibernate整合 教程v1.0 作者: 陈文光 作者Blog: https://www.doczj.com/doc/1517314304.html, 声明 本文内容根据个人所知的以及网络文章整理而成, 如有侵权, 请与本人联系. 菜鸟写的文章,难免有错误,望体谅以及给我修正 本文内容仅供参考, 不得用于商业目的. 转载请著名作者和出处. 日期: 2008-01-06

1 SSH整合理念 (3) 1.1 框架 (3) 1.2 应用层 (4) 1.2.1 表现层 (4) 1.2.2 持久层 (4) 1.2.3 业务层 (5) 1.2.4 领域模型层 (6) 1.3 整合一个简单的例子 (6) 2 Spring整合Struts (6) 3.1 三个小窍门 (6) 3.2 窍门1. 使用Spring 的ActionSupport (7) 3.3 窍门2. 覆盖RequestProcessor (8) 3.4 窍门3. 将动作管理委托给Spring (9) 3.5 拦截Struts (10) 2.5.1. 前提: (10) 2.5.2. 使用拦截器的步骤: (10) 2.5.3. 一个例子: (10) 3 Spring整合Hibernate (11) 3.1 为什么要整合? (11) 3.2 配置数据源 (11) 3.3 配置sessionfactory (13) 3.4 配置事务 (15)

1SSH整合理念 1.1框架 用java来建立一个很有价值的web 应用不是一个简单的任务。在架构这个应用时要考虑很多的因素和问题。从更高的层次来看,开发人员面临着关于如何构建用户接口,何处驻留业务逻辑,以及如何实现数据持久性这些问题。这3层都有各自的问题需要回答。而每一层又需要实现那些技术?应用如何设计来进行松散耦合并能进行灵活变更?应用架构是否允许某一层变更而不影响到其它的层次? 应用应该如何处理容器一级的服务比如事务? 在为你的应用创建一个架构之前有许多问题需要澄清。幸运的是,有很多开发者都意识到这个问题,并建立了很多框架来解决这些问题。一个良好的框架可以让开发人员减轻重新建立解决复杂问题方案的负担和精力;它可以被扩展以进行内部的定制化;并且有强大的用户社区来支持它。框架通常能很好的解决一个问题。然而,你的应用是分层的,可能每一个层都需要各自的框架。仅仅解决UI问题并不意味着你能够很好的将业务逻辑和持久性逻辑和UI 组件很好的耦合。例如,你不应该使具有JDBC代码的业务逻辑放入控制器之中,这不是控制器应该提供的功能。一个UI 控制器应该是轻量化的组件,由它代表对UI范围之外的其它应用层的服务调用。良好的框架自然地形成代码分离的原则。更为重要的是,框架减轻了开发人员从头构建持久层代码的精力,从而集中精力来应用逻辑上,这对客户端来说更为重要。 本文讨论了如何结合几个著名的框架来达到松散耦合,如何设计你的架构,以及如何达到各个层次的一致性设计。面临的挑战是,将框架整合起来,以使每一层都向另外的层次以一种松散的方式来暴露接口,而不管底层功能使用的是什么技术。本文还讨论整合3种著名开源框架的一种策略。对表现层,我们使用Struts;业务层使用Spring;对于持久层我们使用的是Hibernate。你尽可以取代这里的某个框架而使用你喜欢的框架已达到同样的效果。图1显示了框架被整合起来时,从最高层次看到的视图。

相关主题
文本预览
相关文档 最新文档