JSF入门 标签使用 实例(持续更新)
最近项目使用EJB3+JSF开发,曾经学过EJB,不过忘得差不多了,JSF完全没接触过,从零开始,学得好辛苦啊!
可以先了解jsf的入门的基础:入门之hello world
http://liusuper.iteye.com/blog/214089
之前使用struts,和后台的交互,从后台获取数据,都是通过struts的值栈(Value stack)以及ActionContext等获取后台数据,或者通过<S:ACTION>标签,自动调用action加载页面
但是刚开始接触jsf,完全没有搞明白,是怎么自动加载数据的。现在终于有点理解了。
在jsf中,每个数据都可以通过javabean(包括action)里get方法获取数据
例如<h:dataTable value="#{subscriber.subscriberList}" var="u" >
解析标签是会去找叫做subscriber的javabean,然后调用getSubscriberList()方法,获取返回的数据放到table里,就相当于struts通过<s:action>自动获取后台数据
目前用的标签有
<f:view> : 表示内部标签为jsf标签,在jsp文件中使用jsf标签时,必须在外面套上<f:view>
<h:commandLink>: 其实相当与HTML里的<a>标签,不过它可以提交表单到action,必须在<h:form>里使用
<h:dataTable>: 会自动解析成表格,结合EL可以从action或者javabean里取数据。
示例:表subscriber(用户)包含外键role_id,DAO和Service,action简化后如下(EJB参考下一篇EJB3入门)
@Named("subscriber") @RequestScoped public class SubscriberAction implements Action, Serializable { private static final long serialVersionUID = 1L; private String uuid; private String realName; private Integer roleId; @EJB private SubscriberService subscriberService; @EJB private RoleService roleService; public SubscriberAction() { } public List<Subscriber> getSubscriberList() { return subscriberService.getAll(); } public void setUuid(String uuid) { this.uuid = uuid; } public String getUuid() { return uuid; } public String getRealName() { return realName; } public void setRealName(String realName) { this.realName = realName; } public Subscriber get() { return subscriberService.get(uuid); } public Subscriber delete() { return subscriberService.delete(uuid); } }
JSP页面
<f:view> <h:form> <h:dataTable value="#{subscriber.subscriberList}" var="u" > <h:column> <f:facet name="header"> <h:outputText value="姓名" /> </f:facet> <h:outputText value="#{u.userName}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="角色" /></f:facet> <h:outputText value="#{u.role.roleName}" /> <!-- 注意 此处因为在定义表EntityBean的时候配置lazy=false,所以可以直接取出role --> </h:column> <h:column> <f:facet name="header"> <h:outputText value="操作" /> </f:facet> <h:commandLink action="#{subscriber.get}" value="编辑" > <f:param value="#{u.uuid}" name="uuid"></f:param> </h:commandLink> <f:verbatim> </f:verbatim> <h:commandLink action="#{subscriber.delete}" value="删除" > <f:param value="#{u.uuid}" name="uuid"></f:param> </h:commandLink> </h:column> </h:dataTable> </h:form> </f:view>
还有几个比较简单的,大家比较容易理解使用的标签
<h:inputHidden value="#{subscriber.uuid }" /> 相当于<input type="hidden">
<h:outputText value="#{subscriber.errorMessage }" /> 相当于直接在JSF中输出文本
<h:commandButton value="提交" action="#{subscriber.update }"/> 相当于 <input type="submit">
不过action是写在这个标签里 而不是写在<H:FORM>里
<h:selectOneMenu>: 下拉菜单嚒,就是是<select />嚒,和<h:selectItems>联合使用。
<h:selectItems>,下拉菜单中的列表,参数直接用list<Subscriber>会有点问题。。。。要用List<SelectItem>
示例:
@ManagedBean(name="role") @SessionScoped public class RoleBean implements Serializable{ private static final long serialVersionUID = 1L; @EJB RoleService roleService; public List<SelectItem> getRoleList() { List<Role> roles = roleService.getAll(); List<SelectItem> roleList = new ArrayList<SelectItem>(); for(Role role : roles) { roleList.add(new SelectItem(role.getId(),role.getRoleName())); } return roleList; } }
JSF中
<h:selectOneMenu value="#{subscriber.roleId }" > <f:selectItems value="#{role.roleList}" /> </h:selectOneMenu>
还有一种用法不知道不知道行不行,反正我没有成功,直接返回List<xxx对象>
@ManagedBean(name="role") @SessionScoped public class RoleBean implements Serializable{ private static final long serialVersionUID = 1L; @EJB RoleService roleService; public List<Role> getRoleList() { List<Role> roleList= roleService.getAll(); return roleList; } }
JSF中,参数的用法是
<h:selectOneMenu value="#{subscriber.roleId }" > <f:selectItems value="#{role.roleList}" var="r" itemLabel="#{r.roleName}" itemValue="#{r.id}"/> </h:selectOneMenu>
上例中label是正确显示的,但是value却不是id,很诡异,继续摸索。。。。
先写这么多,待续。。
后面陆续用了一些其他标签,不过后来用了richface4了,还没整理。。。
原创,转载请注明原:
http://asyty.iteye.com/blog/1239869
推荐阅读