JSF+Spring+JPA(Hibernate)常見bug解決辦法

因爲primefaces在國內使用的並非太多,所以,國內對jsf作系統、詳細的介紹的資料不多,即便有一些資料,也僅僅是對國外資料的簡單翻譯或者是僅僅講表面現象(皮毛而已),它們的語句甚至仍是錯誤的,極可能會誤導使用者。css

相對來講,看國內的那些僅僅是翻譯過來的文章或書籍不如直接看國外的官方文檔或資料來的實在,在我講述jsf頁面中如何使用js調用後臺bean方法以前,先給你們說幾個國外的資料。在primefaces官方網站上,你能夠搜索到幾乎全部你須要的東西,primefaces官網爲:http://www.primefaces.org/showcase/index.xhtml 如過以爲本身英語很差的童鞋,能夠前往primefaces國內鏡像網站查閱資料: http://www.primefaces.cn/ ,只是國內的這個網站正在翻譯中,有些東西還不完善;若是有想細緻的瞭解primefaces的朋友,還能夠下載primefaces的官方文檔,最新的官方文檔爲5.2,全英文,我在這裏給你們提供我下載好的primefaces官方文檔:http://pan.baidu.com/s/1mg3i9Ry ,在這個文檔裏你能夠經過他們的示例來組合出來不少有趣的東西。另外我在淘寶上發現了Primefaces官方的JSF框架,官方售價300RMB,淘寶售價才五元,你們能夠前去學習:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-12555052969.2.nPXnNz&id=523880497056html

1、單選/多選(p:selectOneMenu/p:selectCheckboxMenu)

         一、選項只有第一次能夠傳至後臺,屢次點擊就不能傳遞至後臺:

頁面代碼以下:java

<!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"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui"
	xmlns:pe="http://primefaces.org/ui/extensions">
<f:view contentType="text/html" locale="zh_CN">

	<h:head title="ZCPLT - HOME">
	<title>測試頁面</title>
		<f:facet name="first">
			<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
			<meta http-equiv="pragma" content="no-cache" />
			<meta http-equiv="cache-control" content="no-cache" />
			<meta http-equiv="expires" content="0" />
		</f:facet>
		<h:outputStylesheet name="css/theme.css" />
		<h:outputStylesheet name="css/image.css" />
		<h:outputStylesheet name="css/perfect-scrollbar.css" />
		<h:outputScript name="jquery/jquery.js" library="primefaces" />
		<h:outputScript name="jquery/jquery-plugins.js" library="primefaces" />
		<h:outputScript name="script/perfect-scrollbar.js" />
		<ui:insert name="head" />
	</h:head>

<h:body>
	<h:form id="form">
		<h:panelGrid columns="6" id="addPanel">
			<p:outputLabel for="tableName" value="選擇類名" />
			<p:selectOneMenu id="tableName" value="#{pvgEditManager.selectedClassString}"  
				disabled="#{pvgEditManager.selectedClassString !=null}" panelStyle="width:180px"
				effect="fade" style="width:160px" filter="true"
				filterMatchMode="startsWith">
				<p:ajax listener="#{pvgEditManager.onTableChange}" />
				<f:selectItem itemLabel="選擇類" itemValue="" noSelectionOption="true" />
				<f:selectItems value="#{pvgEditManager.classStrings}" />
			</p:selectOneMenu>
		</h:panelGrid>
	</h:form>
</h:body>
</f:view>
</html>

後臺bean類代pvgEditManager.java碼以下:jquery

package test;

import java.io.Serializable;
import java.util.List;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import zuccess.zcplt.basic.privilege.dao.TableDao;


@Named("pvgEditManager")
@ViewScoped
public class PvgEditManager implements Serializable {

	private static final long serialVersionUID = 5586577032813381888L;

	private TableDao classDao = new TableDao();
	private List<String> classStrings = classDao.findAllClass();// 重數據庫中查詢到的全部的表
	private String selectedClassString; // 選中的表
	/***
	 * 獲取全部的類的名稱
	 */
	public void searchClasses() {
		classStrings = classDao.findAllClass();
	}
	/**
	 * 表改變
	 */
	public void onTableChange() {
		System.out.println("獲取的class名稱爲:++++++"+selectedClassString);
	}
	public List<String> getClassStrings() {
		return classStrings;
	}
	public void setClassStrings(List<String> classStrings) {
		this.classStrings = classStrings;
	}
	public String getSelectedClassString() {
		System.out.println("get方法中的置爲:==============="+selectedClassString);
		return selectedClassString;
	}
	public void setSelectedClassString(String selectedClassString) {
		this.selectedClassString = selectedClassString;
		System.out.println("set方法中的置爲:==============="+selectedClassString);
	}
	
}

當測試以上代碼時,會發現只有第一次選擇下拉列表時能調用後臺set/get方法,而再次點擊就不能調用set/get方法,仔細分析上面的邏輯發現,其根本緣由是因爲,在這個下拉列表的有個屬性disabled="#{pvgEditManager.selectedClassString !=null}",把這個屬性去掉就沒有問題了;那麼,爲何這個屬性就會形成這個問題呢,其根本緣由在於,我想達到當選擇了一次下拉列表之後就再也不讓它能夠選擇,而正是因爲第一次選擇了之後,這個selectedClassString已經在後臺不爲null了,可是因爲這個動做並無自動刷新頁面,形成在頁面上的下拉列表仍舊能夠操做的假象,但實際上即便再次選擇了下拉列表,因爲其是不可操做的,它的選擇的動做確定不會傳遞到後臺。web

找到問題了,那麼解決就好辦了,要麼把isabled="#{pvgEditManager.selectedClassString !=null}"去掉,要麼把內容ajax

pvgEditManager.selectedClassString換爲另外一個:例如disabled="#{pvgEditManager.status !=null}" ,固然你須要在後臺定義這個status屬性,經過這個status狀態來控制下拉列表是否可操做。數據庫

相關文章
相關標籤/搜索