【发布时间】:2012-05-07 13:41:45
【问题描述】:
我有一个 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.xhml 的托管bean 并获取我想要传递的值?但也许我需要更改 JavaScript?
【问题讨论】:
-
当您在older post 中提出此问题时,我已经回答了您:您应该将
<h:outputLink id="lnkHidden" />更改为<h:commandLink id="lnkHidden" />或<h:commandButton id="lnkHidden" />在您的操作方法中执行逻辑和导航。在寻求帮助之前,您应该尝试一些代码。 -
彼得,你应该学习标签组件在 JSF 2 中是如何工作的。我建议你阅读 JSF 2 commandbutton 和 action for commandButton,最后一篇由 BalusC(JSF 专家)制作
-
好的,我用这种方式更改了 JSF 页面:pastebin.com/BCZSNsEh 但是现在当我单击表格行时,我得到了这个标题:localhost:8080/test-1.0-SNAPSHOT/# 也许 JavaScript 必须更改?
-
我用
<h:commandButton />using this code做了一个导航示例。注意:当您使用 javascript 执行按钮时,您调用click方法:elements[i].click()。另外,查看this link了解如何访问HttpSession(访问HttpRequest类似,但使用facesContext#getExternalContext()#getRequest()) -
你基本上想要一个幂等的 POST 请求。这是不可能的。您应该接受在 URL 中可见的参数(我一生不明白为什么这是一个问题),或者接受由于服务器端转发的性质而不会更改 URL。我曾经在您之前的一个变色龙问题上回答过正确的方法,但我删除了它,因为您要求不可能并且不想改变主意。哦,请不要将 URL 称为“标题”。 HTTP 标头完全不同。