這是一個有趣的想法。我很想知道它在實踐中是如何氾濫的。
獲取導航規則
導航由NavigationHandler處理。掌握NavigationHandler並不困難,但API不公開它使用的規則。
在我看來,您可以:
- 解析faces-config.xml中的初始化和存儲的規則在應用程序上下文(容易)
- 實現自己的NavigationHandler忽略的規則faces-config.xml中或將它們用自己的規則文件的補充,並以某種方式暴露了其規則集(可行的,但需要多一點的工作的)
- 嘲笑自己FacesContext,並把它傳遞給現有的導航處理器(真的很難作出相同的線程2點FacesContext的對象並存,效率極其低下)
現在,你有另外一個問題了。你要在哪裏保持映射來查看視圖?硬編碼他們在豆?
使用的導航規則
副手,我能想到的,你可以構建從後端含參數的URL兩種方式。兩者都涉及定義某種類型的bean。
<managed-bean>
<managed-bean-name>navBean</managed-bean-name>
<managed-bean-class>foo.NavBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
來源:
package foo;
import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
public class NavBean implements Serializable {
private String getView() {
String viewId = "/showMessage.faces"; // or look this up somewhere
return viewId;
}
/**
* Regular link to page
*/
public String getUrlLink() {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
String viewId = getView();
String navUrl = context.getExternalContext().encodeActionURL(
extContext.getRequestContextPath() + viewId);
return navUrl;
}
/**
* Just some value
*/
public String getValue() {
return "" + System.currentTimeMillis();
}
/**
* Invoked by action
*/
public String invokeRedirect() {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
String viewId = getView();
try {
String charEncoding = extContext.getRequestCharacterEncoding();
String name = URLEncoder.encode("foo", charEncoding);
String value = URLEncoder.encode(getValue(), charEncoding);
viewId = extContext.getRequestContextPath() + viewId + '?' + name
+ "=" + value;
String urlLink = context.getExternalContext().encodeActionURL(
viewId);
extContext.redirect(urlLink);
} catch (IOException e) {
extContext.log(getClass().getName() + ".invokeRedirect", e);
}
return null;
}
}
GET
對於GET請求,您可以使用UIParameters設定值,讓渲染器構建參數列表。
<h:outputLink value="#{navBean.urlLink}">
<f:param name="foo" value="#{navBean.value}" />
<h:outputText value="get" />
</h:outputLink>
POST
如果你想設置一個POST操作過程中的URL到視圖,您可以使用一個動作重定向(按一個按鈕或commandLink調用)做到這一點。
<h:commandLink id="myCommandLink" action="#{navBean.invokeRedirect}">
<h:outputText value="post" />
</h:commandLink>
注意
注意ExternalContext.encodeActionURL用於字符串編碼。這是生成可跨上下文移植的代碼的良好實踐(portlet等)。如果您正在編碼指向圖像或下載文件的鏈接,您將使用encodeResourceURL。
我有;),但我要怎麼請求paramters追加到查詢字符串? – 2008-09-26 14:12:12
我不知道JSF,但這是自動使用HTML