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

标签: java jsf jsf-2


【解决方案1】:

您尝试自己使用和渲染您的表格。

这是我的示例。根据您的要求进行修改。我用的是 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 (managed bean) 的 loadProductDetail() 里面,你放了另一个 redirect(..)。

像这样..

response.sendRedirect(request.getContextPath() + "/product-info");

再次进入漂亮的配置..

你必须为上面的 url 配置配置..

<url-mapping id="product-info">
    <pattern value="/product-info" />
    <view-id value="/pages/product-info.jsf" />
</url-mapping>

在我的应用中,我做了类似的事情来隐藏一些 URL。

希望对您有所帮助。

这是我的示例源代码和我的理解。我以 zip 文件的形式上传到 4shared.com http://www.4shared.com/zip/ctPZ4Dbj/URL_Hidding.html

【讨论】:

  • OP 提到他不想要 URL 中的行标识符。
  • 请尝试使用 PrettyFace.. 您也许可以隐藏该网址。在下面做这样的事情。我编辑了我的旧帖子
  • 这不适用于未传递产品 ID 的 GET。
  • 嗯.. 刚才我已经用小模块进行了测试,它工作正常.. 当我点击表格行时.. 它加载了该产品的详细信息并显示在另一个页面中,URL smth 像这个 localhost :8080/flower/product/product-info(这里的花是我的上下文)
  • 谢谢你的例子! @代码后面你能把代码上传到这里吗,拜托:2shared.com我下载了种子,但没有种子。
猜你喜欢
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 2014-12-23
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
相关资源
最近更新 更多