JSF+Spring+JPA(Hibernate)常见bug解决办法

原创
2015/03/03 09:42
阅读数 551

由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统、详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的,很可能会误导使用者。

相对来说,看国内的那些仅仅是翻译过来的文章或书籍不如直接看国外的官方文档或资料来的实在,在我讲述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=523880497056

一、单选/多选(p:selectOneMenu/p:selectCheckboxMenu)

         1、选项只有第一次可以传至后台,多次点击就不能传递至后台:

页面代码如下:

<!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码如下:

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了,但是由于这个动作并没有自动刷新页面,造成在页面上的下拉列表仍旧可以操作的假象,但实际上即使再次选择了下拉列表,由于其是不可操作的,它的选择的动作肯定不会传递到后台。

找到问题了,那么解决就好办了,要么把isabled="#{pvgEditManager.selectedClassString !=null}"去掉,要么把内容

pvgEditManager.selectedClassString换为另一个:例如disabled="#{pvgEditManager.status !=null}" ,当然你需要在后台定义这个status属性,通过这个status状态来控制下拉列表是否可操作。



展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部