【问题标题】:jsf : passing a selected hyperlink as a query argumentjsf:将选定的超链接作为查询参数传递
【发布时间】:2013-12-29 20:09:36
【问题描述】:

我有一个项目的 mySql 表,我在 index.xhtml 中显示为一个列表。 projectid 列包含超链接。单击它们时,我希望将选择的特定 projectid 行作为查询参数传递到另一个 jsf 文件 (ListProjects.xhtml) 中,该文件显示引用 index.xhtml 中选择的 projectid 的所有项目值。 index.xhtml 页面似乎正确传递了值(将鼠标悬停在选择上时,url 显示正确的 id 值)。当实际单击选择时,我在生成的 ListPprojects.xhtml 中得到一个空白页面:

我不确定它是否是我在 index.xhtml 上选择的标签,应该将其替换为另一个标签,例如映射到 bean 操作的 CommandLink。

或者,结果页面 (ListProject.xhtml) 中的标记是否是用于检索 projectid 值作为查询参数的正确标记?

另外,如果projectid是一个int,应该先用parseInt还是其他方法把它转成String?

问题是否存在于其中 projectid 导致结果页面呈现空白记录的空值的会话 bean 中?任何意见是极大的赞赏。提前致谢!

实体bean(projects.java)中的命名查询是:

@NamedQuery(name = "Projects.findByProjectid", query = "SELECT p FROM Projects p WHERE    p.projectid = :projectid")  

在 index.xhtml 中,我使用以下标签来显示超链接:

<h:link value="#{item.projectid}" outcome="ListProject">  
<f:param name="projectid" value="#{item.projectid}"/>  
</h:link>

ListProjects.xhtml 是我希望根据在 index.xhtml 中选择的 projectid 显示项目详细信息的页面(这就是我开始感到困惑的地方):

<h:column>  
<f:facet name="header">  
<h:outputText value="Countryid"/>  
</f:facet>  
<h:commandLink action="#{selProjectMgtBean.selProjectList}" value="#{item.projectid}"/>  
</h:column>  

我的会话 bean:

@Stateless
public class ProjectSelectedBean implements ProjectSelectedBeanLocal {

@PersistenceContext(unitName = "QueryTrialNoMavenPU")
private EntityManager em;


@Override
public List<Projects> getSelectedProjects(String projectid) {
    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    projectid=request.getParameter(projectid);
    return em.createNamedQuery("Projects.findByProjectid", Projects.class).setParameter    ("projectid", projectid).getResultList();
}
}

最后调用渲染选择的方法:

package com.manaar.beans;

imports....

@Named(value = "selProjectMgtBean")
@RequestScoped
public class SelProjectMgtBean {

@ManagedProperty(value="#{item.projectid}")
private String projectid;

private List<Projects> selProjectList;
@EJB
private ProjectSelectedBeanLocal projectSelectedBeanLocal;

@PostConstruct
public void init() {
    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance    ().getExternalContext().getRequest();   
    projectid=request.getParameter("projectid");
    selProjectList = projectSelectedBeanLocal.getSelectedProjects();
}

public List<Projects> getSelProjectList() {
    return selProjectList;
}

public void setSelProjectList(List<Projects> selProjectList) {
    this.selProjectList = selProjectList;
}
}

【问题讨论】:

    标签: java jsf-2 primefaces jpa-2.0 glassfish-3


    【解决方案1】:

    您没有在查询中设置:projectId
    您可以按如下方式更改代码:

    public List<Projects> getSelectedProjects(String projectId) {
        return em.createNamedQuery("Projects.findByProjectid", Projects.class).setParameter("projectId" , projectId).getResultList();
    }
    

    【讨论】:

    • 哈米德,非常感谢。这是我在代码中修复的一个非常有用的建议。查询异常已解决,但结果为空白(在 ListProjet.xhtml 中)。我有 3 个关于可能出问题的问题。 1) projectid 是一个 int,所以我应该使用 parsetInt 或其他方法从 int 转换为 String 吗? 2) 在 index.xhtml 中使用是正确的还是我应该考虑使用另一个标签(即: 来代替 bean 操作?3)在中使用 commandLink 标签是否正确LilstProjects.html 来检索项目 ID?
    • 不客气。如果 asnwer 有帮助,请接受 asnwer,对于其他问题,我建议在 stackoverflow 中搜索,您可以找到答案,如果没有找到,只需提交一个新问题。
    • 我接受了这个答案。很抱歉之前错过了它。我的问题仍未解决,我仍然无法正确传递查询参数。如果我提交一个新问题,它将与上面修改后的问题几乎相同。那么我应该还是提交一个新问题还是继续这个话题?
    • 简要检查&lt;h:commandLink&gt; vs &lt;h:link&gt;的链接,对于转换器,只需在cdi bean中将projectId声明为int,最后检查您接受的asnwer。
    • 我认为很明显 commandLink 可能是最合适的标签,但这只能回答我的部分问题。我将接受您的回答,因为它有很大帮助,但问题仍未解决。我认为问题在于我对会话 bean 的使用,并且可能我必须为请求页面公开 DataModel 或 ListDataModel 类以传递给结果页面并传递一个字符串来显示详细信息。我构建 bean 类的方式看起来不对!
    【解决方案2】:

    关于您的一个问题: 将 h:link 用于纯导航目的(使用结果参数),使用 h:commandLink 直接调用操作(使用 action 参数)。在这种情况下,被调用的方法应该返回一个字符串,告诉 JSF 下一步要导航到哪里。

    【讨论】:

    • 非常感谢。您帮助我澄清了 commmandLink 是在我的标签中使用的适当方法。我现在需要弄清楚我的 bean 出了什么问题,答案可能与使用 DataModel 或 LIstDataModel 方法有关
    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2014-07-17
    • 1970-01-01
    相关资源
    最近更新 更多