转载:JSF中使用Tiles框架
from : http://www.iteye.com/topic/220133
共有如下几个步骤:
1) 首先在web.xml文件中配置TilesServlet,并加入一个Tiles Filter的filter类,这个类用于跳转页面。
Xml代码
<
注意:这里的其中的一个name="content"的put元素的valuet就是实际的内容页面的相对地址。
header.jsp、footer.jsp这些页面都可以是jsf标签的页面,但是,不能每个都用上<f:view>的标签,建议是在layout.jsp使用此标签,里面的分页都使用<f:subview id="xxx">标签。因为整个模板页就是通过jsf的方式来访问的,每个jsf页面只能有一个f:view。
3)主要的JSP页面
(1) /tiles_layout/layout.jsp
这个是布局页面,即页面的整体模板。
Html代码(2) /tiles_layout/pageloader.jsp
这个是用于实际加载layout页面的页面,这个就是用来代替所有的需要为jsf页面重新定义tiles页面。
Html代码
(3) /tiles_layout/header.jsp
Html代码
(4) /tiles_layout/footer.jsp
Html代码
(5)/jsfpro/account/register.jsp
这个是实际的内容页,这里是一个实例,注册页
Html代码这里有一个设置是很有趣的:<h:form id="form" onsubmit="this.action='/jsfpro/account/userlist.tiles';return true;">
(6) /jsfpro/account/userlist.jsp
用户列表页
Html代码
4)faces-config.xml的配置
Xml代码
这里设置的是.tiles是从注册页跳转到用户列表页,而用户列表页也是使用了layout.jsp这个页面模板,所有是.tiles后缀(.tiles在web.xml里面设置了,是用于请求模板形式的jsf页面)。
上面有
<h:form id="form" onsubmit="this.action='/jsfpro/account/userlist.tiles';return true;">,这个是因为使用了动态的pageloader.jsp页面后jsf框架都会将url最终转向pageloader.jsf,这样的话就相当于<from-view-id>/jsfpro/account/register.jsp</from-view-id>要改成<from-view-id>/tiles_layout/pageloader.jsp</from-view-id>,也就是所有的入口都是这个页面,这样的局限性有些大,有的时候可能需要为某个入口页做单独的navigation设置,就如上面的一样,而为了要达到这个目的,最简单的方法就是直接修改提交的form的action,让url变成你需要的那个jsf入口页的url地址。
5)TilesFilter类
Java代码
6)Account业务类
Java代码package net.geo.mbean; import java.util.Collection; import net.geo.vo.Account; public class AccountManagedBean extends BaseManagedBean { public String register() { Account user = super.findBean(Account.class); facade.save(user); super.setRequestAttribute("myaccount", user); // 这里的returnTo方法的第一个参数是返回给jsf进行跳转的字符串 // 第2个参数是将相应要跳转的页面放置到request中, // 因为跳转的pageloader.jsp是动态的获取实际访问页面的参数的, // 所以在跳转之前必须指定。 // 如果是返回当前页则不需设定。 return returnTo("userlist", "/jsfpro/account/userlist"); } public Collection<Account> getList() { return facade.queryList(-1, -1); } /* * 以下是用到的相关的父类方法,贴出来供查看 */ protected HttpServletRequest getRequest() { return (HttpServletRequest) FacesContext.getCurrentInstance() .getExternalContext().getRequest(); } protected void setRequestAttribute(String attrName, Object obj) { getRequest().setAttribute(attrName, obj); } protected String returnTo(String outcome, String turnToUrl) { // 这里的参数名tiles-defenition-page就是在pageloader.jsp页面中 // 指定要跳转的实际页面的参数名 setRequestAttribute("tiles-defenition-page", turnToUrl); return outcome; } }