如果你还不知道Tiles是什么这篇文章对你没有意义如果你不了解JSF那你看这篇文章是在浪费时间如果你正在为怎么在JSF里面用Tiles发愁This is what u want!!!!!!
可能有人会问为什么用tiles?为什么用JSF不用Struts?如果你对tiles在struts中的应用了如指掌那你不会问第一个问题同样如果你用过JSF我相信你会在以后的项目中优先考虑JSF而不是Struts(其实我比较赞成Struts和JSF的互补他们各有各的优势Struts强大的逻辑控制使它更适合于表示逻辑简单而控制逻辑复杂的系统而JSF在view层次的表现力同样是惊人的建议去看看David Geary的帖子Top Ten Reasons to Prefer JSF over Struts)
好了废话不说了来看看Tiles是怎样融合到JSF里面的注意JSF的配置我不多讲如果你JSF都不知道怎么运转那就不要浪费时间了
把Struts里面的strutsjar考到lib目录下面
在webxml里面加上下面配置
<servlet>
<servletname>Faces Servlet</servletname>
<servletclass>javaxfaceswebappFacesServlet</servletclass>
<loadonstartup></loadonstartup>
</servlet>
<servlet>
<servletname>TilesServet</servletname>
<servletclass>orgapachestrutstilesTilesServlet</servletclass>
<initparam>
<paramname>definitionsconfig</paramname>
<paramvalue>/WEBINF/tilesdefsxml</paramvalue>
</initparam>
<initparam>
<paramname>definitionsparservalidate</paramname>
<paramvalue>true</paramvalue>
</initparam>
<loadonstartup></loadonstartup>
</servlet>
蓝色部分是你要加的注意上面的servlet的load顺序
添加tilesdefsxml到/WEBINF/下面这个配置文件和以前在struts里面的没有差别一个典型的配置如下
<!DOCTYPE tilesdefinitions PUBLIC
//Apache Software Foundation//DTD Tiles Configuration//EN
configdtd>
<tilesdefinitions>
<definitionname=reportmain path=/JSPROOT/templates/topLayoutjsp>
<put name=header value=/JSPROOT/templates/headerjsp></put>
<put name=menu value=/JSPROOT/templates/menujsp></put>
<put name=footer value=/JSPROOT/templates/footerjsp></put>
<put name=body value=/JSPROOT/reports/report_mainjsp></put>
</definition>
<definition name=reportsummary extends=reportmain>
<put name=body value=/JSPROOT/reports/summary_reportjsp type=page></put>
</definition>
</tilesdefinitions>
上面定义了个view一个reportmain一个reportsummary
然后和原来一样编写你自己的layout文件及headerfooter等典型的一个layout如下
<%@taglib uri=tiles prefix=tiles%>
<html>
<head>
<title>
<tiles:getAsString name=header/>
</title>
</head>
<body bgcolor=#ffffff topmargin= leftmargin= marginwidth= marginheight= onKeyPress=return killEnt();>
<table width=% border= cellpadding= cellspacing=>
<tr>
<td colspan= align=justify>
<tiles:insert attribute=header flush=false ignore=false></tiles:insert>
</td>
</tr>
<tr>
<td colspan= bgcolor=# align=right>
</td>
</tr>
<tr height=>
<td bgcolor=#D align=Left valign=Top width=%>
<tiles:insert attribute=menu flush=false ignore=false></tiles:insert>
</td>
<td width=% >
<table width=%>
<tr>
<td >
<tiles:insert attribute=body flush=false ignore=false></tiles:insert>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<tiles:insert attribute=footer flush=false ignore=false></tiles:insert>
</td>
</tr>
</table>
</body>
</html>
注意一定不能在f:view里面套f:view也就是说你在layoutjsp不要用到JSF的标签来产生一些业务逻辑实际上我们主要的逻辑也是在body里面实现的在layout里面主要是定义一些文字图片什么的同样在headerjspfooterjspmenujsp里面也只写html代码不要用JSF标签
编写两个jsp文件like this
main_tjsp:
<%@ taglib uri=tiles prefix=tiles %>
<tiles:insert definition=reportmain>
</tiles:insert>
summary_tjsp:
<%@ taglib uri=tiles prefix=tiles %>
<tiles:insert definition=reportsummary>
</tiles:insert>
这一步是关键如果理解到了这里那你就可以轻松把tiles和jsf结合起来原来在Struts我们配置的forward对象可以直接是tilesdefsxml里面的一个view但是在JSF里面不行这里的navigation必须是定义到一个jsp文件所以我们只有在这个文件里面再来插入tiles里面所定义的view这样的坏处就是我们在tilesdefs里面定义的每一个view都必须有一个对应的想上面一样的jsp文件而且在JSF里面配的navigation都必须是基于这个文件到的注意不只是toviewidfromviewid也必须是对应上面的这种文件不能是body的jsp文件(不懂可以看第步的配置)
如果你都理解了你可以不往下看了下面是为了上面的例子更完整而做的剩余步骤
编写一个indexjsp
<html>
<head>
<title>
index
</title>
</head>
<body bgcolor=#ffffff>
<jsp:forward page=main_tfaces>//对应到上面第步的文件
<jsp:param name= value=/>
</jsp:forward>
</body>
</html>
编写个tilesdefsxml里面定义的body的jsp文件
report_mainjsp:
<%@taglib uri= prefix=f%>
<%@taglib uri= prefix=h%>
<html>
<head>
<title>main</title>
<link rel=stylesheet type=text/css />
</head>
<body bgcolor=#ffffff>
<h align=center class=header>Report</h>
<f:view>
<h:form>
<p>
<h:commandButton action=summary value=Summary Report styleClass=button ></h:commandButton>
<h:commandButton type=reset value=Clear styleClass=button ></h:commandButton>
</p>
</h:form>
</f:view>
</body>
</html>
summary_reportjsp
<%@taglib uri= prefix=f%>
<%@taglib uri= prefix=h%>
<html>
<head>
<title>main</title>
<link rel=stylesheet type=text/css />
</head>
<body bgcolor=#ffffff>
<h align=center class=header>Summary Report</h>
</body>
</html>
配置faceconfigxml
<navigationrule>
<fromviewid>/JSPROOT/reports/main_tjsp (注意不是report_mainjsp这样在有的IDE里面可能会报report_mainjsp有错比如JB不用管它)</fromviewid>
<navigationcase>
<fromoutcome>summary</fromoutcome>
<toviewid>/JSPROOT/reports/summary_tjsp (不是summary_reportjsp)</toviewid>
</navigationcase>
</navigationrule>
好了所有工