我有一个h:datatable示例,用于在用户单击表行时打开新页面。不幸的是,这个例子使用http标头将参数传递给打开的页面。我的问题是这可以实现,但是将参数传递给背景而不是标题?
这是完整的来源code:
这是JSF页面:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<head>
<title>test</title>
<script type="text/javascript">
function addOnclickToDatatableRows() {
//gets all the generated rows in the html table
var trs = document.getElementById('myForm:dataTable').getElementsByTagName('tbody')[0]
.getElementsByTagName('tr');
//on every row, add onclick function (this is what you're looking for)
for (var i = 0; trs.length > i; i++) {
trs[i].onclick = new Function("rowOnclick(this)");
}
}
function rowOnclick(tr) {
// var childNodes = tr.childNodes;
// for(var i = 0; childNodes.length > i; i++) {
//
// }
var elements = tr.cells[0].childNodes;
for(var i = 0; elements.length > i; i++) {
if ((typeof elements[i].id !== "undefined") &&
(elements[i].id.indexOf("lnkHidden") > -1)) {
//opne in a new window// window.open(elements[i].href);
location.href=elements[i].href
break;
}
}
return false;
}
</script>
</head>
<body onload="addOnclickToDatatableRows();">
<h:form id="myForm">
<h1>Click on table row example</h1>
<h:dataTable id="dataTable" var="data" value="#{datatableBean.lstData}" border="1">
<h:column>
<f:facet name="header">
<h:outputText value="ID" />
</f:facet>
<h:outputText value="#{data.id}" />
<h:outputLink id="lnkHidden" value="AnotherPage.xhtml"
style="display:none">
<f:param name="id" value="#{data.id}" />
</h:outputLink>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Value1" />
</f:facet>
<h:outputText value="#{data.value}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Value2" />
</f:facet>
<h:outputText value="#{data.value}" />
</h:column>
</h:dataTable>
</h:form>
</body>
</html>
这是托管bean:
package edu.home;
import edu.home.model.Data;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class DatatableBean {
private List<Data> lstData;
/**
* Creates a new instance of datatableBean
*/
public DatatableBean() {
lstData = new ArrayList<Data>();
lstData.add(new Data(1, "Hello World"));
lstData.add(new Data(2, "Hello 123"));
lstData.add(new Data(3, "Hello abv"));
lstData.add(new Data(4, "Hello qaz"));
}
/**
* @return the lstData
*/
public List<Data> getLstData() {
return lstData;
}
/**
* @param lstData the lstData to set
*/
public void setLstData(List<Data> lstData) {
this.lstData = lstData;
}
}
This is the class Data:
package edu.home.model;
public class Data {
private int id;
private String value;
public Data(int id, String value) {
this.id = id;
this.value = value;
}
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the value
*/
public String getValue() {
return value;
}
/**
* @param value the value to set
*/
public void setValue(String value) {
this.value = value;
}
}
我确信这是可能的,但我可以通过适当的方式传递参数。
祝福
修改
我了解必须以这种方式更改h:outputLink
:
<h:column>
<f:facet name="header">
<h:outputText value="ID" />
</f:facet>
<h:outputText value="#{data.id}" />
<h:commandLink id="lnkHidden" value="AnotherPage.xhtml"
style="display:none">
<f:param name="id" value="#{data.id}" />
</h:commandLink>
</h:column>
但我不明白如何更改托管bean。也许我想如果AnotherPage.xhtml
可以访问DataTable.x
hml的托管bean并获取我想传递的值?但也许我需要更改javaScript?
答案 0 :(得分:2)
您尝试自己使用并渲染表格。
这是我的样本。根据您的要求进行修改。我用过JSF 2.0
<h:form id="nextPage">
<table>
<ui:repeat var="row" value="#{shoppingCartMB.shoppingItems}">
<tr onclick="clickedMe('#{row.productId}');">
<td>#{row.productId}</td>
</tr>
</ui:repeat>
</table>
<script>
function clickedMe(id)
{
// Please modify following URL base on ur requirment..
// Following is just for sample..
location.href="#{request.contextPath}/product/" + id;
}
</script>
</h:form>
以下是pretty-config.xml的一些内容
<url-mapping id="productMB-loadProductDetail">
<pattern value="/product/#{ productMB.productId }" />
<view-id value="/pages/product-detail.jsf" />
<action>#{productMB.loadProductDetail}</action>
</url-mapping>
在productMB(托管bean)的loadProductDetail()里面,你放了另一个重定向(..)。
像这样......
response.sendRedirect(request.getContextPath() + "/product-info");
再次在漂亮的配置中..
您必须为上面的网址添加配置..
<url-mapping id="product-info">
<pattern value="/product-info" />
<view-id value="/pages/product-info.jsf" />
</url-mapping>
在我的应用中,我做了类似的事情来隐藏一些网址。
希望得到这个帮助。
这是我的示例源代码和我的理解..我在zip文件中上传到4shared.com http://www.4shared.com/zip/ctPZ4Dbj/URL_Hidding.html