jsf标签<h:panelGrid/>的使用

本文详细介绍了JSF中panelGrid和panelGroup的使用方法及技巧,包括如何利用CSS控制样式,实现拆分合并效果,以及如何对齐内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

panelGrid 标签学习
这个标签可以用来作简单的组件排版,它会使用HTML表格标签来绘制表格,并将组件置于其中,主要指定columns属性,例如设定为 2:
<h:panelGrid columns="2">
<h:outputText value="Username"/>
<h:inputText id="name" value="#{userBean.name}"/>
<h:outputText value="Password"/>
<h:inputText id="password" value="#{userBean.password}"/>
<h:commandButton value="submit" action="login"/>
<h:commandButton value="reset" type="reset"/>
</h:panelGrid>
则自动将组件分作 2 个 column来排列,排列出来的样子如下:


<h:panelGrid>的本体间只能包括JSF组件,如果想要放入非JSF组件,例如简单的样版(template)文字,则要使用 <f:verbatim>包括住,例如:
<h:panelGrid columns="2">
<f:verbatim>Username</f:verbatim>
<h:inputText id="name" value="#{userBean.name}"/>
<f:verbatim>Password</f:verbatim>
<h:inputText id="password" value="#{userBean.password}"/>
<h:commandButton value="submit" action="login"/>
<h:commandButton value="reset" type="reset"/>
</h:panelGrid>


<h:panelGroup>
这个组件用来将数个JSF组件包装起来,使其看来像是一个组件,例如:
<h:panelGrid columns="2">
<h:outputText value="Username"/>
<h:inputText id="name" value="#{userBean.name}"/>
<h:outputText value="Password"/>
<h:inputText id="password" value="#{userBean.password}"/>
<h:panelGroup>
<h:commandButton value="submit" action="login"/>
<h:commandButton value="reset" type="reset"/>
</h:panelGroup>
</h:panelGrid>
在<h:panelGroup>中包括了两个<h:commandButton>,这使得< h:panelGrid>在处理时,将那两个<h:commandButton>看作是一个组件来看待,其完成的版面配置如下所示:


下面转载与http://blog.youkuaiyun.com/liyong1115/archive/2008/02/27/2125029.aspx
一、初识panelGrid和与之相关的设计元素

  panelGrid相当于HTML的表格,在设计中与之相关的组件有panelGrop,与之相配合的CSS

设计元素有styleClass、headerClass、footerClass、rowClasses、columnClasses。这些元

素的有机组合,可以设计出不同的输出画面。

  在HTML网页设计中,表格有<table><tr><td>等标记符号,也可以在标记符号内嵌入CSS控

制语句来控制输出的表现形式。JSF中的panelGrid虽然与HTML表格相对应,但是二者在设计时

还是有很大差异的。例如我们假设有一个HTML的表如下:

<table>
<tr>
<td>...</td>
<td>...</td>
</tr>

<tr>
<td>...</td>
<td>...</td>
</tr>
</table>

则panelGrid与之对应的标记是:

<h:panelGrid column="2">
...
...
...
...

</h:panelGrid>

它只有外壳标记,没有行控制和列控制标记。

  熟悉HTML编程的道人一眼就看出,只有外壳标记,你该怎样控制行或列的输出样式呢?别

急,JSF设计者已经想到了,他们设计出

了styleClass、headerClass、footerClass、rowClasses、columnClasses这些设计元素来控

制行与列的输出样式,其中
styleClass是格式表格总的外观的,如表格的长与宽、外边框样式、表格的背景样式等。
headerClass、footerClass分别是控制表的header和footer的。
rowClasses和columnClasses分别是控制表格的行与列样式的。

  还是举个例子说一下,我们有下例:

<h:panelGrid columns="1" cellpadding="5"
styleClass="styleClazz"
headerClass="headerClazz"
footerClass="footerClazz"
rowClasses="row1,row2"
columnClasses="column1"
>

<f:facet >
<h:outputText value="您好,朋友!"/>
</f:facet>

<h:outputText value="您好,朋友!"/>
<h:outputText value="您好,朋友!"/>
<h:outputText value="您好,朋友!"/>
<h:outputText value="您好,朋友!"/>
<h:outputText value="您好,朋友!"/>
<h:outputText value="您好,朋友!"/>

<f:facet >
<h:outputText value="您好,朋友!"/>
</f:facet>
</h:panelGrid>

  这就是一个表格,columns="1",规定这个表只有一列,cellpadding="5"说明了边框外线

与内线的距离是5个像素。这个表由一个头部、一个尾部和中间表身三部分组成。headerClass

是格式头部样式的,footerClass是格式尾部样式的,rowClasses和columnClasses是格式行与

列样式的。 rowClasses="row1,row2"规定了表格的行与行交替使用row1和row2样式类来格式

输出样式,同样,列也是,并且还可以用3个、4个或更多个row3、row4...来依序交替格式输

出样式。

对应的样式类可以像以下这样编写在css文件中:


/*styleClass处于父类的地位,headerClazz,rowClasses等的字体设置取em时,
其在屏幕上显示的大小会参照该类字体的大小设置而放大或缩小*/

.styleClazz{
font-size:1em;
color:blue;
border-style:solid;
border-color:red;
border-width: 1px;
}

.headerClazz{
background-color:#3F536B;
font-family:宋体;
font-size:1.5em;
color:white;
text-align:center;
}

.footerClazz{
background-color:#3F536B;
font-family:宋体;
font-size:1.5em;
color:white;
text-align:center;
}

/* 当行样式与列样式都用时,则行样式服从于列样式
边框的颜色需要在columnClasses中定义,
在rowClasses中定义不起作用
*/

.row1{
background-color:#FFFFFF;
}

.row2{
background-color:#C9D3E0;
}

.column1{
border-style:solid;
border-color:red;
border-width: 1px;
}

.column2{
}


你可以用CSS在JSP中的语法将其编写在JSP文件中。

  二、panelGrid如何来格式成具有拆分合并样式的表

  这要用到panelGroup,它的作用是将封装在内的元件作为一个元件来看待,如果panelGroup

中封装了一个panelGrid,则被封装的表放在其他表中就相当于一个子表。通过panelGroup来封

装各UI组件的办法,可以实现表格的拆分目的。

<h:panelGroup>
<h:panelGrid>
...
</h:panelGrid>
</h:panelGroup>

或者:

<h:panelGroup>
<h:outputText value="您好,朋友!"/>
<h:outputText value="您好,朋友!"/>
</h:panelGroup>

它们在容器中相当于一个显示元件(好像本来是一个人住一间房,现在是更多的人住一间房)。

  三、如何在panelGrid中实现设计元素对齐

  panelGrid是通过CSS语言来格式输出样式的,在CSS语言中可用vertial-align:...;来格

式输出元素纵向对齐,使用text-align:...;来实现输出元素横向对齐。其中text-align有点

迷糊人,因为从字面看它应该是针对文本的,其实它对其他元素也起作用。

  在对齐的设计中有个居中对齐的问题容易绕人。在HTML中可用<center>...</center>来实

现被封装的视图元素居中,但在CSS中好像没有类似语句。其实还是有的,只不过绕了一个弯

。你想啊,说到居中,那究竟是在多宽的范围内居中?是我这个元素在封装我的容器中居中,

还是被我封装的元素在我这个容器中居中?这个问题CSS与HTML处理语义是不样的。

在HTML中表格居中是:
<table align="center">
...
</table>

表格在这里的居中是指这个表格“我”在封装我的容器<body>中居中,具体表现为在屏幕上居

中,但是您不能通过

<h:panelGrid align="center">
...
</h:panelGrid>

来实现panelGrid在<body>中居中。因为panelGrid标记根本不支持这个语句。还是要通过CSS

来实现。下面这个使用CSS语句描述居中的语义与HTML使用align="center"语义不同。

<h:panelGrid style="text-align:center">
<h:outputText value="您好,朋友!"/>
</h:panelGrid>

这个语句说的是me这个对象在panelGrid 中居中,而不是指表格在<body>(屏幕)中居中。我

要在屏幕中居中怎么办?有两种办法,一种是通过在<body>中加入格式说明,第二种办法是在

panelGrid的外面再套一个panelGrid。即:


<h:panelGrid style="text-align:center;width=979px;">

<h:panelGroup>
<h:panelGrid style="text-align:center">
<h:outputText value="您好,朋友!您好,朋友!"/>
<h:outputText value="您好,朋友!"/>
<h:outputText value="您好,朋友!"/>
</h:panelGrid>
</h:panelGroup>

</h:panelGrid>

这样就实现了被封装的panelGrid B 在 A 中居中,注意,这里的width=979px;是必须的,它

规定了居中是在多宽的范围内居中!数字多少可以调整,但是你不能不写这个约定,否则,被

封装在里面的panelGrid还是不会在屏幕上居中。

  还有一点注意,里面panelGrid B 的text-align继承外面panelGrid A 中的text-align属

性的约定,即里面的panelGrid不写style="text-align:center",对象me们也会在里

面panelGrid中居中。但是里面的panelGrid不继承外面的width,像上面,里面panelGrid的显

示宽度与最长的me1有关,而不是外面panelGrid A的宽度979px。

  四、其他
  ■当屏幕的显式格式是1024 X 768 时,最外面的panelGrid宽度取979px是屏幕最大化时

底部滚动条由出现到不出现的临界值,如超过979则滚动条就会出现。
  ■可以按照是对<table><tr>还是对<td>起作用的CSS类,进行封装。如写在style语句中

,则形如下:

<h:panelGrid style="width:240px;vertial-align:top;text-align:center;">
...
</h:panelGrid>


[url]http://www.blogjava.net/Crying/articles/185506.html[/url]
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:cc="http://java.sun.com/jsf/composite" xmlns:lkmcc="http://java.sun.com/jsf/composite/lkmComponent" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:c="http://java.sun.com/jsp/jstl/core"> <cc:interface/> <cc:implementation> <style> .ui-panel .ui-panel-content { border: none !important; padding: 0.571em 0em !important; } .no-border { border: none !important; } .no-border td{ vertical-align: top; } .no-border .ui-panelgrid-cell { border: none !important; padding: 5px !important; } </style> <p:outputPanel> <h:panelGrid columns="2" styleClass="no-border"> <p:outputPanel style = "display: flex;flex-wrap: wrap;"> <h:panelGrid columns="1" styleClass="no-border"> <h:panelGrid columns="1" responsive="true" styleClass="no-border"> <p:outputLabel value="编号:" /> <p:inputText id="create_studentNo" style="width:250px" value="#{studentBean.createBoardDm.studentNo}"/> <p:outputLabel value="姓名:" /> <p:inputText id="create_name" style="width:250px" value="#{studentBean.createBoardDm.name}"/> <p:outputLabel value="年龄:" /> <p:inputText id="create_age" style="width:250px" value="#{studentBean.createBoardDm.age}"/> <p:outputLabel value="家庭地址:" /> <p:inputTextarea id="create_homeAddress" value="#{studentBean.createBoardDm.homeAddress}" rows="6" cols="50" /> <p:outputLabel value="有效状态:" /> <p:selectOneMenu id="create_validStatus" value="#{studentBean.createBoardDm.validStatus}" style="width:250px"> <f:selectItem itemLabel="有效" itemValue="Y" /> <!-- 默认选中有效 --> <f:selectItem itemLabel="无效" itemValue="N" /> </p:selectOneMenu> </h:panelGrid> </h:panelGrid> </p:outputPanel> </h:panelGrid> <h:panelGrid columns="1" responsive="true" styleClass="no-border"> <p:commandButton value="提交" actionListener="#{studentBean.createStudent}" update="@form:tabView:studentList:board_page" class="query" ajax="true" style="width:80px;" oncomplete="if (!args || !args.validationFailed) { PF('createStudent').hide(); }" /> <p:commandButton value="关闭" style="width:80px;" onclick="PF('createStudent').hide(); return false;" /> </h:panelGrid> </p:outputPanel> </cc:implementation> </html>帮我插入一个字段为入学日期enrollmentDate,只可以选择年月日
07-15
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:cc="http://java.sun.com/jsf/composite" xmlns:lkmcc="http://java.sun.com/jsf/composite/lkmComponent" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fm="http://java.sun.com/jsf/composite/studentlist/fragement"> <cc:interface/> <cc:implementation> <style> .ui-panel .ui-panel-content { border: none !important; padding: 0.571em 0em !important; } .ui-datatable .ui-state-highlight { background-color: #bddef7 !important; color: #000 !important; font-weight: bold; } </style> <p:outputPanel> <div class="ui-fluid"> <h:panelGrid columns="4" id="toolbar"> <!-- <p:outputPanel rendered="${mis_misBoardBean.role =='管理'}">--> <!-- <div class="ui-inputgroup">--> <!-- <span class="ui-inputgroup-addon" style="width:80px;">分配人员</span>--> <!-- <p:selectOneMenu id="emp" value="#{mis_misBoardBean.query.operator}" style="width:100px;">--> <!-- <f:selectItems value="#{mis_misBoardBean.misEmpList}" var="entry" itemLabel="#{entry}"--> <!-- itemValue="#{entry}"/>--> <!-- </p:selectOneMenu>--> <!-- </div>--> <!-- </p:outputPanel>--> <p:outputPanel> <div class="ui-fluid ui-inputgroup" style="display:inline-block;line-height:normal;"> <span class="ui-inputgroup-addon" style="width:100px;">姓名</span> <!-- <p:inputText id="name" maxlength="30" class="ui-inputval" value="#{studentBean.query.name}"--> <!-- style="width:200px"></p:inputText>--> </div> </p:outputPanel> <p:outputPanel> <div class="ui-fluid ui-inputgroup" style="display:inline-block;line-height:normal;"> <span class="ui-inputgroup-addon" style="width:100px;">家庭地址</span> <!-- <p:inputText id="homeAddress" maxlength="30" class="ui-inputval" value="#{studentBean.query.homeAddress}"--> <!-- style="width:200px"></p:inputText>--> </div> </p:outputPanel> <p:outputPanel> <div class="ui-inputgroup"> <span class="ui-inputgroup-addon" style="width:80px;">有效状态</span> <!-- <p:selectOneMenu id="valid" value="#{studentBean.query.validStatus}"--> <!-- style="width:100px">--> <!-- <f:selectItem itemLabel="有效" itemValue="Y"/>--> <!-- <f:selectItem itemLabel="无效" itemValue="N"/>--> <!-- </p:selectOneMenu>--> </div> </p:outputPanel> <!-- <div class="ui-inputgroup">--> <!-- <p:selectBooleanCheckbox value="#{mis_misBoardBean.query.createByMe}" itemLabel="我创建"/>--> <!-- </div>--> <!-- <div class="ui-inputgroup">--> <!-- <p:selectBooleanCheckbox value="#{mis_misBoardBean.query.isMe}" itemLabel="我的任务"/>--> <!-- </div>--> <!-- <p:commandButton value="查询" class="query" actionListener="#{studentBean.query}"--> <!-- update="board_page" ajax="true" style="width:80px;"></p:commandButton>--> <!-- <p:commandButton value="创建" class="query" actionListener="#{studentBean.openCreateTaskDialog}"--> <!-- update="@form:createTask @form:tabView:misBoard:studentDialog" ajax="true"--> <!-- style="width:80px;"></p:commandButton>--> </h:panelGrid> <p:spacer width="10px" height="15px"/> <!-- <p:dataTable id="board_page" widgetVar="board_page" var="item" value="#{studentBean.boardList}" paginator="true"--> <!-- paginatorPosition="bottom" rows="50" reflow="true" rowIndexVar="rowvar"--> <!-- currentPageReportTemplate="{startRecord}-{endRecord} of {totalRecords} records"--> <!-- paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"--> <!-- rowsPerPageTemplate="50,100,150"--> <!-- selectionMode="single"--> <!-- selection="#{studentBean.selectBoardDm}"--> <!-- emptyMessage="没有数据" resizableColumns="true" lazy="true">--> <!-- <p:column width="160" headerText="操作" style="text-align:right;">--> <!--<!– rendered="#{studentBean.butAuthority('修改',item,'待完成|待回复用户')}"–>--> <!-- <p:commandLink update="@form:tabView:misBoard:createDialog"--> <!-- action="#{studentBean.studentDialog(item)}">--> <!-- <h:outputText value="修改"/>--> <!-- <p:spacer width="10px"/>--> <!-- </p:commandLink>--> <!-- </p:column>--> <!-- <p:column width="150" style="text-align:left;" headerText="姓名">--> <!-- <p:commandLink update="@form:createTask"--> <!-- action="#{studentBean.preview(item)}">--> <!-- <h:outputText value="#{item.name}" id="contentName"/>--> <!-- </p:commandLink>--> <!-- </p:column>--> <!-- <p:column width="60" style="text-align:center;" headerText="年龄">--> <!-- <h:outputText value="#{item.age}"/>--> <!-- </p:column>--> <!-- <p:column style="text-align:left;" headerText="家庭地址">--> <!-- <h:outputText value="#{item.homeAddress}" id="contentHomeAddress"/>--> <!-- <p:tooltip for="contentHomeAddress" value="#{item.homeAddress}" position="top" escape="false"--> <!-- trackMouse="true"></p:tooltip>--> <!-- </p:column>--> <!-- <p:column width="60" style="text-align:center;" headerText="有效状态">--> <!-- <h:outputText value="#{item.validStatus}"/>--> <!-- </p:column>--> <!-- <p:column width="80" sortBy="#{item.enrollmentDate}" style="text-align:center;" headerText="入学日期">--> <!-- <h:outputText value="#{studentBean.format(item.enrollmentDate)}"/>--> <!-- </p:column>--> <!-- <p:column width="80" sortBy="#{item.createTime}" style="text-align:center;" headerText="创建时间">--> <!-- <h:outputText value="#{studentBean.format(item.createTime)}"/>--> <!-- </p:column>--> <!-- <p:column width="80" sortBy="#{item.updateTime}" style="text-align:center;" headerText="更新时间">--> <!-- <h:outputText value="#{studentBean.format(item.updateTime)}"/>--> <!-- </p:column>--> <!-- </p:dataTable>--> </div> <!-- <p:dialog header="学生详情" id="studentDialog" widgetVar="studentDialog" modal="true">--> <!-- <p:outputPanel>--> <!-- <h:panelGrid columns="1">--> <!-- <p:inputTextarea value="#{studentBean.singleDm.homeAddress}" id="homeAddressContent" rows="10" cols="60" />--> <!-- <p:commandButton value="取消" style="width:80px;float:right;" oncomplete="PF('studentDialog').hide()"/>--> <!-- <p:commandButton value="保存" update="board_page" actionListener="#{studentBean.save}" />--> <!-- </h:panelGrid>--> <!-- </p:outputPanel>--> <!-- </p:dialog>--> </p:outputPanel> </cc:implementation> </html> 为什么页面只有一个姓名的标签后面都没有内容
07-15
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:cc="http://java.sun.com/jsf/composite" xmlns:lkmcc="http://java.sun.com/jsf/composite/lkmComponent" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:c="http://java.sun.com/jsp/jstl/core"> <cc:interface/> <cc:implementation> <style> .ui-panel .ui-panel-content { border: none !important; padding: 0.571em 0em !important; } .no-border { border: none !important; } .no-border td{ vertical-align: top; } .no-border .ui-panelgrid-cell { border: none !important; padding: 5px !important; } </style> <p:outputPanel> <h:panelGrid columns="2" styleClass="no-border"> <p:outputPanel style = "display: flex;flex-wrap: wrap;"> <h:panelGrid columns="1" styleClass="no-border"> <h:panelGrid columns="2" responsive="true" styleClass="no-border"> <h:form id="yourFormId" novalidate="novalidate"> <p:outputLabel value="编号:" /> <p:inputText id="create_studentNo" style="width:250px" value="#{studentBean.createBoardDm.studentNo}" readonly="#{not empty studentBean.createBoardDm.studentNo}" required="true" requiredMessage="请输入编号" /> <p:message for="create_studentNo" style="color:red;" /> <p:outputLabel value="姓名:" /> <p:inputText id="create_name" style="width:250px" value="#{studentBean.createBoardDm.name}" required="true" requiredMessage="请输入姓名" /> <p:message for="create_name" style="color:red;" /> <p:outputLabel value="年龄:" /> <p:inputText id="create_age" style="width:250px" value="#{studentBean.createBoardDm.age}" required="true" requiredMessage="请输入年龄" type="number" min="0" max="150" step="1" /> <p:message for="create_age" style="color:red;" /> </h:form> <p:outputLabel value="家庭地址:" /> <p:inputTextarea id="create_homeAddress" value="#{studentBean.createBoardDm.homeAddress}" rows="6" cols="50" /> <p:outputLabel value="入学日期:" /> <p:calendar id="create_enrollmentDate" value="#{studentBean.createBoardDm.enrollmentDate}" pattern="yyyy-MM-dd" inputStyle="width:150px"></p:calendar> <p:outputLabel value="有效状态:" /> <p:selectOneMenu id="create_validStatus" value="#{studentBean.createBoardDm.validStatus}" style="width:150px"> <f:selectItem itemLabel="有效" itemValue="Y" /> <f:selectItem itemLabel="无效" itemValue="N" /> </p:selectOneMenu> </h:panelGrid> </h:panelGrid> </p:outputPanel> </h:panelGrid> <h:panelGrid columns="2" responsive="true" styleClass="no-border"> <p:commandButton value="提交" actionListener="#{studentBean.createStudent}" update="@form:tabView:studentList:board_page" class="query" ajax="true" style="width:80px;" oncomplete="if (!args || !args.validationFailed) { PF('createStudent').hide(); }" /> <p:commandButton value="关闭" style="width:80px;" onclick="PF('createStudent').hide(); return false;" /> </h:panelGrid> </p:outputPanel> </cc:implementation> </html>帮我优化下点击提交按钮才验证必填
最新发布
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值