JSF問題集

如何使用URL字符串來傳遞參數到JSF程序中?

如果你有下面的URL: http://your_server/your_app/product.jsf?id=777, 你可以使用下面的代碼來訪問所傳遞的參數nbsp;
FacesContext fc = FacesContext.getCurrentInstance();
String id = (String) fc.getExternalContext().getRequestParameterMap().get("id";

在JSF頁面上,你也可以使用預定義的變量訪問同樣的參數,例如nbsp;
<h:outputText value="#{param['id']}" />
注意: 你必須直接調用該JSF頁面,並且使用servlet 映射 (mapping).


如何添加上下文路徑到outputLink的URL中?
在當前的JSF實現中,當在outputLink 中定義的路徑以'/'開始時,沒有添加上下文路徑到URL中,要彌補該問題請在URL中使用 #{facesContext.externalContext.requestContextPath} 前綴.例如:
<h:outputLink value="#{facesContext.externalContext.requestContextPath}/myPage.faces">

如何從backing bean中得到當前頁面的URL?
你可以通過FacesContext得到一個Http Request對象的引用,如下:
FacesContext fc = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();

然後使用普通的request方法來得到路徑信息.還可以使用另外一種方法:
context.getViewRoot().getViewId();
將返回你當前JSP(JSF view IDs 基本上只是JSP path names)頁面的名字.


如何結束session?
你可以使用session的 invalidate方法 .
下面是一個從action方法中結束session的例子: :
public String logout() {

FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
session.invalidate();
return "login_page";
}


下面的代碼片段示例瞭如何在JSP頁面中結束session:

<% session.invalidate(); %><c:redirect url="loginPage.jsf" />


當用戶點擊Command Link後如何顯示確認對話框?
h:commandLink指定了 onclick 屬性爲內部使用. 因此你不可以使用她了, 該問題已經在JSF1.2中修復了,對於JSF1.2以前的版本,你可以在onclick以前使用 onmousedown 事件
<script language="javascript">
function ConfirmDelete(link) {
var delete = confirm('Do you want to Delete?';
if (delete == true) {
link.onclick();
}
}
</script>


<h:commandLink action="delete" > <h:outputText value="delete it"/></h:commandLink>

如何在另外一個managed-bean 中訪問一個managed-bean ?
有3種方法可以達到該目的: 使用值綁定 使用變量監視器:Using Variable Resolver 持有引用屬性:Having the reference property 例如,在 faces-config.xml中有下面的聲明
<managed-bean>
<managed-bean-name>person</managed-bean-name>
<managed-bean-class>demo.PersonBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-bean>
<managed-bean>
<managed-bean-name>bank</managed-bean-name>
<managed-bean-class>demo.BankBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-bean>

並且你想在Person中訪問Bank
使用值綁定,代碼如下:

FacesContext fc = FacesContext.getCurrentInstance();

BankBean bank = (BankBean) fc.getApplication().createValueBinding("#{bank}".getValue(fc);

使用變量監視器的代碼如下: Variable Resolver:

FacesContext fc = FacesContext.getCurrentInstance();

BankBean bank = (BankBean) fc.getApplication().getVariableResolver().resolveVariable(fc, "bank";

在上面的兩種方法中,第二個 managed-bean (bank)的名字被硬編碼在java代碼中.如果你不想硬編碼你可以在managed bean聲明中引用另外一個bean:
<managed-bean>
<managed-bean-name>Person</managed-bean-name>
<managed-bean-class>demo.PersonBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>bank</property-name>
<property-class>demo.BankBean</property-class>
<value>#{bank}</value>
</managed-property>
<managed-bean>
<managed-bean>
<managed-bean-name>bank</managed-bean-name>
<managed-bean-class>demo.BankBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-bean>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章