以the spec为例,我有一个模板和一个模板客户端。
default.xhtml(模板):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>...</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<h:outputStylesheet name="css/screen.css" />
</h:head>
<h:body>
<f:view>
<ui:insert name="metadata" />
<div id="container">
<div id="header">
<img src="resources/gfx/logo.png" />
</div>
<div id="content">
<ui:insert name="content" />
</div>
<div id="footer">
<p>
This is a project.<br />
</p>
</div>
</div>
</f:view>
</h:body>
</html>
edit.xhtml(模板客户端):
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="/WEB-INF/templates/default.xhtml">
<ui:define name="metadata">
<f:metadata>
<f:viewParam name="id" value="#{myBean.id}" />
<f:event type="preRenderView" listener="#{myBean.init}"/>
</f:metadata>
</ui:define>
<ui:define name="content">
...
</ui:define>
</ui:composition>
list.xhtml(编辑视图的调用者)包含:
<h:commandLink action="edit" value="#{msgs.edit}">
<f:param name="id" value="#{myentity.id}" />
</h:commandLink>
调用f:事件,但不将id(viewParam)分配给bean。然而,id存在于请求参数映射中,可以像这样检索:
FacesContext ctx = FacesContext.getCurrentInstance();
Map<String, String> parameters = ctx.getExternalContext().getRequestParameterMap();
if (parameters.containsKey("id")) {
this.id = Long.valueOf(parameters.get("id"));
}
但这就是<f:viewParam ...>
应该照顾的事情(据我所知)。
可能出现什么问题?
答案 0 :(得分:1)
这是错误的。
<h:commandLink action="edit" value="#{msgs.edit}">
<f:param name="id" value="#{myentity.id}" />
</h:commandLink>
这会发送POST请求,而不是GET请求。
您需要改为使用<h:link>
。
<h:link outcome="edit" value="#{msgs.edit}">
<f:param name="id" value="#{myentity.id}" />
</h:link>