flex datagrid 分页例子
最近做个分页的,分页从数据库取数据,还蛮通用的,分享一下。
先上分页组件,Pagin.mxml
<?xml version="1.0" encoding="utf-8"?> <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:compoment="compoment.*" xmlns:services="services.*" xmlns:valueObjects="valueObjects.*" width="619" height="26" minWidth="955" minHeight="600"> <fx:Declarations> </fx:Declarations> <fx:Script> <![CDATA[ import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.rpc.CallResponder; import mx.rpc.events.ResultEvent; import valueObjects.Clas; // 分页数据 [Bindable] public var pageNo:uint=1;//默认第一页 [Bindable] public var pageSize:uint=10;//默认每页10条数据 [Bindable] public var totalRecord:uint;//总记录 [Bindable] public var totalPage:uint;//总页数 [Bindable] public var pages:ArrayList=new ArrayList();//页数下拉框数据源 [Bindable] public var flag:String;//操作标志 [Bindable] public var one:Boolean;//是否仅有一条数据 [Bindable] public var loadDataCallBackFunction:Function;//声明回调函数 private function toPage(pNo:uint):void { pageNo=pNo; cb.selectedItem=pageNo; loadDataCallBackFunction.call(); } private function topPage():void //到第一页 { if(pageNo==1){ return; } toPage(1); } private function prevPage():void//到上一页 { if(pageNo <= 1){ return; } toPage(pageNo - 1); } private function nextPage():void//到下一页 { if(pageNo>=totalPage){ return; } toPage(pageNo + 1); } private function endPage():void//到最后 一页 { if(pageNo==totalPage && flag !='add'){ return; } toPage(totalPage); } protected function cb1Change():void { pageSize=cb1.selectedItem; if(totalPage !=1 || pageSize<totalRecord){ pageNo=1; } toPage(pageNo); } //初始化数据和记录 public function init():void{ if(totalRecord<=pageSize){ totalPage=1; } else if(totalRecord%pageSize==0){ totalPage=totalRecord/pageSize; } else{ totalPage=totalRecord/pageSize+1; } pages.removeAll(); for (var i:int=1;i<=totalPage;i++){ pages.addItem(i.toString()); } cb.selectedItem=pageNo; } protected function cbChange():void { if(pageNo != cb.selectedItem){ pageNo=cb.selectedItem; loadDataCallBackFunction.call();//调用回调函数,开始从数据库取一页的数据 } } public function getAllCountResult (event:ResultEvent):void { init(); if(flag =="delete"){//删除的时候,如果删除本页最后一条,跳到上一页 if(one){ pageNo=pageNo-1; } toPage(pageNo); } else if(flag=="add" ){//如果是添加则跳到最后一页 endPage(); } else if(flag=="update"){//如果是更新则还是显示当前页 toPage(pageNo); } else{ toPage(1); } } ]]> </fx:Script> <s:Label x="469" y="8" color="#FDF9F9" text="第 {pageNo}/{totalPage} 页 共 {totalRecord} 条数据"/> <s:Button id="btn_top" x="5" y="0" label="首页" buttonDown="topPage()"/> <s:Button id="btn_prev" x="54" y="0" label="上一页" buttonDown="prevPage()"/> <s:Button id="btn_next" x="116" y="0" label="下一页" buttonDown="nextPage()"/> <s:Button id="btn_end" x="178" y="0" label="尾页" buttonDown="endPage()"/> <s:Label x="425" y="8" color="#FDF9F9" text="页"/> <s:Label x="363" y="9" width="16" height="19" color="#FDF9F9" text="第"/> <s:ComboBox id="cb" x="378" y="1" width="46" change=" cbChange()" color="#090909" dataProvider="{pages}"/> <s:Label x="233" y="8" height="18" color="#F8F1F1" text="每页显示"/> <s:Label x="337" y="7" color="#FDF9F9" text="条"/> <s:ComboBox id="cb1" x="290" y="1" width="45" change="cb1Change()" color="#0B0A0A" prompt="{pageSize}"> <s:dataProvider> <s:ArrayList> <fx:int>5</fx:int> <fx:int>10</fx:int> <fx:int>15</fx:int> <fx:int>25</fx:int> <fx:int>35</fx:int> <fx:int>50</fx:int> <fx:int>80</fx:int> <fx:int>100</fx:int> </s:ArrayList> </s:dataProvider> </s:ComboBox> </s:Group>
主程序Teacher.mxml
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:valueObjects="valueObjects.*" xmlns:services="services.*" xmlns:ExamCleint="ExamCleint.*" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:compoment="compoment.*" width="842" height="456" fontSize="14" creationComplete="init()"> <fx:Declarations> <valueObjects:Teacher id="teacher"/> <valueObjects:School id="school"/> <services:TeacherService id="teacherService" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"> <services:channelSet> <s:ChannelSet> <s:AMFChannel url="http://localhost:8080/Exam/messagebroker/amf"/> </s:ChannelSet> </services:channelSet> </services:TeacherService> <s:CallResponder id="addTeacherResult" /> <s:CallResponder id="deleteTeacherResult" result="getCounts()"/> <s:CallResponder id="updateTeacherResult" result="getCounts()"/> <s:CallResponder id="getCountsResult" result="getCountsResult_resultHandler(event)"/> <s:CallResponder id="loadPage" result="loadPageResult(event)"/> <s:CallResponder id="getSchoolsResult" result="getSchoolsResult_resultHandler(event)"/> <services:SchoolService id="schoolService" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"> <services:channelSet> <s:ChannelSet> <s:AMFChannel url="http://localhost:8080/Exam/messagebroker/amf"/> </s:ChannelSet> </services:channelSet> </services:SchoolService> </fx:Declarations> <fx:Binding destination="teacher" source="teacherDg.selectedItem as Teacher"/> <fx:Binding destination="school" source="schoolcb.selectedItem as School"/> <fx:Script> <![CDATA[ import compoment.AddTeacher; import flash.sampler.Sample; import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.events.FlexEvent; import mx.managers.PopUpManager; import mx.messaging.AbstractConsumer; import mx.rpc.events.ResultEvent; import spark.effects.Scale; import spark.events.GridSelectionEvent; import spark.events.IndexChangeEvent; import valueObjects.Chapter; import valueObjects.Subject; private var rgStatus:String; [Bindable] private var schools:ArrayCollection = new ArrayCollection(); [Bindable] protected var teachers:ArrayCollection=new ArrayCollection(); [Bindable] public var keyword:String ; [Bindable] public var level:String; [Bindable] public var chapter:Chapter; private function init ():void{ paging.cb1.selectedItem=paging.pageSize; getCounts(); } protected function deletebtn_clickHandler():void { deleteTeacherResult.token = teacherService.deleteTeacher(teacher); } protected function addbtn_clickHandler(event:MouseEvent):void { var addTeacherWin:AddTeacher=new AddTeacher(); addTeacherWin.callbackFunction = this.getCounts; addTeacherWin.setFlag=this.setFlag; PopUpManager.addPopUp(addTeacherWin,this,true); PopUpManager.centerPopUp(addTeacherWin); } public function setFlag(f:String):void { paging.flag=f; } protected function edite_clickHandler(event:MouseEvent):void { var editTeacherWin:EditTeacher=new EditTeacher(); editTeacherWin.callback = this.getCounts; editTeacherWin.setFlag=this.setFlag; editTeacherWin.teacher=this.teacher; PopUpManager.addPopUp(editTeacherWin,this,true); PopUpManager.centerPopUp(editTeacherWin); } protected function getCounts():void { if(school!=null && school.name=="--全部院系--"){ school=null; } getCountsResult.token = teacherService.getCounts(nameInput.text,school); } protected function getCountBySchool_resultHandler(event:ResultEvent):void { paging.totalRecord=getCountsResult.lastResult; paging.getAllCountResult(event); } protected function loadPages():void { if(school!=null && school.name=="--全部院系--"){ school=null; } loadPage.token = teacherService.load(paging.pageNo, paging.pageSize,nameInput.text,school); } protected function loadPageResult(event:ResultEvent):void { teachers=loadPage.lastResult; if(teachers.length==1){ paging.one=true; } paging.init(); } protected function schoolcb_changeHandler(event:IndexChangeEvent):void { getCounts(); } protected function schoolcb_creationCompleteHandler(event:FlexEvent):void { getSchoolsResult.token = schoolService.getSchools(); } protected function getCountsResult_resultHandler(event:ResultEvent):void { paging.totalRecord=getCountsResult.lastResult; paging.getAllCountResult(event); } protected function getSchoolsResult_resultHandler(event:ResultEvent):void { schools=getSchoolsResult.lastResult; var s:School= new School(); s.name="--全部院系--"; schools.addItem( s); schoolcb.selectedIndex=schools.length-1; } ]]> </fx:Script> <s:DataGrid id="teacherDg" x="44" y="3" width="824" height="406" chromeColor="#3F97C9" color="#000305" contentBackgroundColor="#CECEE3" dataProvider="{teachers}" editable="false" requestedRowCount="4" rollOverColor="#DCD0D0" selectionColor="#7A93D2"> <s:columns> <s:ArrayList> <s:GridColumn width="120" dataField="name" editable="false" headerText="姓名" resizable="false"></s:GridColumn> <s:GridColumn width="80" dataField="pwd" headerText="密码" resizable="false"></s:GridColumn> <s:GridColumn width="200" dataField="question" headerText="问题" resizable="true"></s:GridColumn> <s:GridColumn width="150" dataField="answer" editable="true" headerText="答案" resizable="false"></s:GridColumn> <s:GridColumn width="150" dataField="school.name" headerText="院系" resizable="false"></s:GridColumn> <s:GridColumn width="50" dataField="room.name" editable="false" headerText="房号"></s:GridColumn> <s:GridColumn width="70" dataField="title" headerText="职称" resizable="false"></s:GridColumn> </s:ArrayList> </s:columns> </s:DataGrid> <compoment:Paging id="paging" x="39" y="412" width="660" height="27" loadDataCallBackFunction="loadPages"> </compoment:Paging> <s:ComboBox id="schoolcb" x="631" y="4" width="114" change="schoolcb_changeHandler(event)" color="#047912" creationComplete="schoolcb_creationCompleteHandler(event)" labelField="name"> <s:AsyncListView list="{getSchoolsResult.lastResult}"/> </s:ComboBox> <s:TextInput id="nameInput" x="88" y="4" width="78" height="25" change="getCounts()"/> <s:Button id="button2" x="792" y="-23" label="删除" click="deletebtn_clickHandler()"/> <s:Button x="681" y="-23" label="新增" click="addbtn_clickHandler(event)"/> <s:Button x="737" y="-23" label="编辑" click="edite_clickHandler(event)"/> <s:Label x="402" y="-23" width="90" height="19" color="#FCF9F9" fontSize="19" text="教师列表"/> </s:Application>
后台是java: TeacherService.java
package com.ying.Exam.service; import java.util.List; import javax.annotation.Resource; import org.springframework.flex.remoting.RemotingDestination; import org.springframework.flex.remoting.RemotingInclude; import org.springframework.stereotype.Service; import com.ying.Exam.dao.TeacherDAO; import com.ying.Exam.model.School; import com.ying.Exam.model.Teacher; @Service @RemotingDestination(channels = { "my-amf" }) public class TeacherService { private TeacherDAO teacherDAO; @RemotingInclude public void addTeacher(Teacher teacher) { teacherDAO.save(teacher); } @RemotingInclude public List<Teacher> getTeachers() { return teacherDAO.findAll(); } @RemotingInclude public List<Teacher> getBySchool(School school) { return teacherDAO.getBySchool(school); } //返回总记录数 @RemotingInclude public int getCounts(String name,School school) { return teacherDAO.getCounts(name,school); } @RemotingInclude public void deleteTeacher(Teacher teacher) { teacherDAO.delete(teacher); } @RemotingInclude public Teacher getById(Integer id) { return teacherDAO.findById(id); } public TeacherDAO getteacherDAO() { return teacherDAO; } @RemotingInclude public void updateTeacher(Teacher teacher) { teacherDAO.updte(teacher); } @RemotingInclude public Teacher getByName(String name) { return teacherDAO.findByName(name); } //加载一页数据的方法 @RemotingInclude public List<Teacher> load(int page, int size,String name, School school) { return teacherDAO.load((page - 1) * size, size, name,school); } @Resource public void setteacherDAO(TeacherDAO teacherDAO) { this.teacherDAO = teacherDAO; } }
DAO层:TeacherDAO.java
package com.ying.Exam.dao; import java.util.List; import javax.annotation.Resource; import org.hibernate.LockMode; import org.hibernate.Query; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.stereotype.Service; import com.ying.Exam.model.Teacher; import com.ying.Exam.model.School; @Service public class TeacherDAO { private static final Logger log = LoggerFactory.getLogger(SchoolDAO.class); // property constants protected HibernateTemplate hibernateTemplate; public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } @Resource public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } @SuppressWarnings("unchecked") public List<Teacher> load(int first, int psize, String name, School school) { StringBuilder hql = new StringBuilder("from Teacher t where 1=1"); if (name.trim() != "") { hql.append(" and t.name like " + "'%" + name + "%'"); } if (school != null) { hql.append(" and t.school.id=" + school.getId()); } Query q = hibernateTemplate.getSessionFactory().getCurrentSession() .createQuery(hql.toString()); return q.setFirstResult(first).setMaxResults(psize).list();//此处就是hibernate分页功能,first就是从第几条开始取,psize是取几条 } public void save(Teacher transientInstance) { log.debug("saving Teacher instance"); try { hibernateTemplate.save(transientInstance); log.debug("save successful"); } catch (RuntimeException re) { log.error("save failed", re); throw re; } } public void delete(Teacher major) { log.debug("deleting School instance"); try { hibernateTemplate.delete(major); log.debug("delete successful"); } catch (RuntimeException re) { log.error("delete failed", re); throw re; } } public Teacher findById(java.lang.Integer id) { log.debug("getting Teacher instance with id: " + id); try { Teacher instance = (Teacher) hibernateTemplate.get( "com.ying.Exam.model.Teacher", id); return instance; } catch (RuntimeException re) { log.error("get failed", re); throw re; } } public void updte(Teacher teacher) { log.debug("update Teacher instance"); try { hibernateTemplate.update(teacher); log.debug("update successful"); } catch (RuntimeException re) { log.error("update failed", re); throw re; } } @SuppressWarnings("unchecked") public List<Teacher> getBySchool(School school) { log.debug("finding by School instances"); try { String hql = "from Teacher t where t.school.id=" + school.getId(); return hibernateTemplate.find(hql); } catch (RuntimeException re) { log.error("find all failed", re); throw re; } } public int getCounts(String name, School school) { StringBuilder hql = new StringBuilder( "select count(*) from Teacher t where 1=1"); if (name.trim() != "") { hql.append(" and t.name like " + "'%" + name + "%'"); } if (school != null) { hql.append(" and t.school.id=" + school.getId()); } return ((Long) hibernateTemplate.find(hql.toString()).iterator().next()) .intValue(); } public Teacher findByName(String name) { log.debug("getting Teacher instance with name: " + name); try { String hql = "from Teacher where name=" + "'" + name + "'"; Teacher instance = (Teacher) hibernateTemplate.find(hql).get(0); return instance; } catch (RuntimeException re) { log.error("find failed", re); throw re; } } public List<Teacher> findAll() { log.debug("finding all Teacher instances"); try { String queryString = "from Teacher"; return hibernateTemplate.find(queryString); } catch (RuntimeException re) { log.error("find all failed", re); throw re; } } public Teacher merge(Teacher detachedInstance) { log.debug("merging Teacher instance"); try { Teacher result = (Teacher) hibernateTemplate .merge(detachedInstance); log.debug("merge successful"); return result; } catch (RuntimeException re) { log.error("merge failed", re); throw re; } } public void attachDirty(Teacher instance) { log.debug("attaching dirty Teacher instance"); try { hibernateTemplate.saveOrUpdate(instance); log.debug("attach successful"); } catch (RuntimeException re) { log.error("attach failed", re); throw re; } } public void attachClean(Teacher instance) { log.debug("attaching clean Teacher instance"); try { hibernateTemplate.lock(instance, LockMode.NONE); log.debug("attach successful"); } catch (RuntimeException re) { log.error("attach failed", re); throw re; } } }
实体层:Teacher.java
package com.ying.Exam.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import org.springframework.stereotype.Component; /** * Teacher entity. @author MyEclipse Persistence Tools */ @Component("teacher") @Entity @Table(name = "Teacher", schema = "dbo", catalog = "ExamSystem", uniqueConstraints = @UniqueConstraint(columnNames = "TeacherID")) public class Teacher implements java.io.Serializable { // Fields private Integer id; private School school; //private StaffRoom staffRoom; private String teacherId; private String pwd; private String name; private String question; private String answer; private String title; // Constructors /** default constructor */ public Teacher() { } @Id @GeneratedValue @Column(name = "ID", unique = true, nullable = false) public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "SchoolID") public School getSchool() { return this.school; } public void setSchool(School school) { this.school = school; } // @ManyToOne(fetch = FetchType.EAGER) // @JoinColumn(name = "RoomID") // public StaffRoom getStaffRoom() { // return this.staffRoom; // } // // public void setStaffRoom(StaffRoom staffRoom) { // this.staffRoom = staffRoom; // } @Column(name = "TeacherID", unique = true, nullable = false, length = 20) public String getTeacherId() { return this.teacherId; } public void setTeacherId(String teacherId) { this.teacherId = teacherId; } @Column(name = "Pwd", nullable = false, length = 20) public String getPwd() { return this.pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Column(name = "Name", length = 20) public String getName() { return this.name; } public void setName(String name) { this.name = name; } @Column(name = "Question", length = 50) public String getQuestion() { return this.question; } public void setQuestion(String question) { this.question = question; } @Column(name = "Answer", length = 50) public String getAnswer() { return this.answer; } public void setAnswer(String answer) { this.answer = answer; } public void setTitle(String title) { this.title = title; } @Column(name = "Title", length = 20) public String getTitle() { return title; } }
School类 有ID和name属性就行了。
SchoolService、SchoolDAO就不贴了。和TeacherService,TeacherDAO差不多,改个名就行了。
主要是web.xml和spring配置
web.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Spring and Flex</display-name> <description>Spring and Flex</description> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>RDSDispatchServlet</servlet-name> <display-name>RDSDispatchServlet</display-name> <servlet-class>flex.rds.server.servlet.FrontEndServlet</servlet-class> <init-param> <param-name>messageBrokerId</param-name> <param-value>_messageBroker</param-value> </init-param> <init-param> <param-name>useAppserverSecurity</param-name> <param-value>false</param-value> </init-param> <load-on-startup>10</load-on-startup> </servlet> <servlet-mapping id="RDS_DISPATCH_MAPPING"> <servlet-name>RDSDispatchServlet</servlet-name> <url-pattern>/CFIDE/main/ide.cfm</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/messagebroker/*</url-pattern> </servlet-mapping> </web-app>
dispatcherServlet-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:flex="http://www.springframework.org/schema/flex" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/flex http://www.springframework.org/schema/flex/spring-flex-1.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" > <flex:message-broker> <flex:remoting-service default-channels="my-amf" /> </flex:message-broker> <context:annotation-config /> <context:component-scan base-package="com" /> <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value> </property> <property name="url"> <value>jdbc:sqlserver://localhost:1433;DatabaseName=ExamSystem </value> </property> <property name="username" value="sa" /> <property name="password" value="sa" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan" value="com" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> </props> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="dataSource" /> </property> </bean> <!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <aop:config> <!-- 切入点指明了在执行com.ying包中的所有方法时产生事务拦截操作 --> <aop:pointcut id="daoMethods" expression="execution(* com.ying.Exam.service.*.*(..))" /> <!-- 定义了将采用何种拦截操作,这里引用到 txAdvice --> <aop:advisor advice-ref="txAdvice" pointcut-ref="daoMethods" /> </aop:config> <!-- 事务通知操作,使用的事务管理器引用自transactionManager --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 指定哪些方法需要加入事务 --> <tx:method name="add" propagation="REQUIRED" /> <tx:method name="find" propagation="REQUIRED" /> <tx:method name="get*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="load*" propagation="REQUIRED" /> <tx:method name="log*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> </beans>
还有添加教师组件 AddTeacher.mxml
<?xml version="1.0" encoding="utf-8"?> <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:valueObjects="valueObjects.*" xmlns:ExamCleint="ExamCleint.*" xmlns:services="services.*" width="298" height="456"> <fx:Script> <![CDATA[ import flash.sampler.Sample; import mx.collections.ArrayList; import mx.controls.Alert; import mx.events.FlexEvent; import mx.events.IndexChangedEvent; import mx.managers.PopUpManager; import mx.messaging.AbstractConsumer; import spark.effects.CallAction; import spark.events.IndexChangeEvent; import valueObjects.Subject; import valueObjects.TopicSelect; [Bindable] public var callbackFunction:Function; //回调函数 public var setFlag:Function; [Bindable] public var teachers:ArrayList; protected function button_clickHandler(event:MouseEvent):void { teacher.name = nameinput.text; teacher.pwd=pass.text; teacher.question=question.text; teacher.answer=answer.text; teacher.title=title.text; teacher.teacherId=teacherId.text; teacher.school=schoolcb.selectedItem; addTeacherResult.token = teacherService.addTeacher(teacher); setFlag.call(this.parent,"add"); //PopUpManager.removePopUp(this); } protected function schoolcb_creationCompleteHandler(event:FlexEvent):void { getSchoolsResult.token = schoolService.getSchools(); } protected function cancle_clickHandler():void { PopUpManager.removePopUp(this); } ]]> </fx:Script> <fx:Declarations> <valueObjects:Teacher id="teacher"/> <services:TeacherService id="teacherService" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"> <services:channelSet> <s:ChannelSet> <s:AMFChannel url="http://localhost:8080/Exam/messagebroker/amf"/> </s:ChannelSet> </services:channelSet> </services:TeacherService> <services:SchoolService id="schoolService" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"> <services:channelSet> <s:ChannelSet> <s:AMFChannel url="http://localhost:8080/Exam/messagebroker/amf"/> </s:ChannelSet> </services:channelSet> </services:SchoolService> <s:CallResponder id="getSchoolsResult"/> <s:CallResponder id="addTeacherResult" result="callbackFunction.call()"/> <!-- 将非可视元素(例如服务、值对象)放在此处 --> </fx:Declarations> <s:Panel x="-5" y="3" width="293" height="431" fontSize="13" title="新增教师"> <s:FormItem x="64" y="359" width="163" height="33"> <s:HGroup width="131" height="26"> <s:Button width="60" label="添加" click="button_clickHandler(event)"/> <s:Button width="54" label="取消" click="cancle_clickHandler()"/> </s:HGroup> </s:FormItem> <s:FormItem id="key" x="55" y="193" height="40" label="答案"> <s:TextInput id="answer" x="-1" y="0" height="17" text="{teacher.answer}"/> </s:FormItem> <s:FormItem x="57" y="144" label="问题"> <s:TextInput id="question" x="0" y="1" text="{teacher.question}"/> </s:FormItem> <s:FormItem x="57" y="88" width="203" height="38" label="密码"> <mx:TextInput id="pass" text="{teacher.pwd}"/> </s:FormItem> <s:FormItem x="57" y="37" width="220" label="姓名"> <mx:TextInput id="nameinput" x="0" y="1" text="{teacher.name}"/> </s:FormItem> <s:FormItem id="shoolcb" x="56" y="-7" width="146" height="36" label="院系"> <s:ComboBox id="schoolcb" x="-1" y="0" width="97" creationComplete="schoolcb_creationCompleteHandler(event)" labelField="name"> <s:AsyncListView list="{getSchoolsResult.lastResult}"/> </s:ComboBox> </s:FormItem> <s:FormItem x="55" y="243" height="40" label="职称"> <s:TextInput id="title" x="-1" y="0" height="17" text="{teacher.title}"/> </s:FormItem> <s:FormItem x="56" y="306" height="40" label="编号"> <s:TextInput id="teacherId" x="-1" y="0" height="17" text="{teacher.teacherId}"/> </s:FormItem> </s:Panel> </s:Group>
编辑教师组件:EditTeacher.mxml
<?xml version="1.0" encoding="utf-8"?> <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:valueObjects="valueObjects.*" xmlns:ExamCleint="ExamCleint.*" xmlns:services="services.*" width="298" height="456"> <fx:Script> <![CDATA[ import flash.sampler.Sample; import mx.collections.ArrayList; import mx.controls.Alert; import mx.events.FlexEvent; import mx.events.IndexChangedEvent; import mx.managers.PopUpManager; import mx.messaging.AbstractConsumer; import spark.effects.CallAction; import spark.events.IndexChangeEvent; import valueObjects.Subject; import valueObjects.TopicSelect; [Bindable] public var callbackFunction:Function; //回调函数 public var setFlag:Function; [Bindable] public var teachers:ArrayList; protected function button_clickHandler(event:MouseEvent):void { teacher.name = nameinput.text; teacher.pwd=pass.text; teacher.question=question.text; teacher.answer=answer.text; teacher.title=title.text; teacher.teacherId=teacherId.text; teacher.school=schoolcb.selectedItem; addTeacherResult.token = teacherService.addTeacher(teacher); setFlag.call(this.parent,"add"); //PopUpManager.removePopUp(this); } protected function schoolcb_creationCompleteHandler(event:FlexEvent):void { getSchoolsResult.token = schoolService.getSchools(); } protected function cancle_clickHandler():void { PopUpManager.removePopUp(this); } ]]> </fx:Script> <fx:Declarations> <valueObjects:Teacher id="teacher"/> <services:TeacherService id="teacherService" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"> <services:channelSet> <s:ChannelSet> <s:AMFChannel url="http://localhost:8080/Exam/messagebroker/amf"/> </s:ChannelSet> </services:channelSet> </services:TeacherService> <services:SchoolService id="schoolService" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"> <services:channelSet> <s:ChannelSet> <s:AMFChannel url="http://localhost:8080/Exam/messagebroker/amf"/> </s:ChannelSet> </services:channelSet> </services:SchoolService> <s:CallResponder id="getSchoolsResult"/> <s:CallResponder id="addTeacherResult" result="callbackFunction.call()"/> <!-- 将非可视元素(例如服务、值对象)放在此处 --> </fx:Declarations> <s:Panel x="-5" y="3" width="293" height="431" fontSize="13" title="新增教师"> <s:FormItem x="64" y="359" width="163" height="33"> <s:HGroup width="131" height="26"> <s:Button width="60" label="添加" click="button_clickHandler(event)"/> <s:Button width="54" label="取消" click="cancle_clickHandler()"/> </s:HGroup> </s:FormItem> <s:FormItem id="key" x="55" y="193" height="40" label="答案"> <s:TextInput id="answer" x="-1" y="0" height="17" text="{teacher.answer}"/> </s:FormItem> <s:FormItem x="57" y="144" label="问题"> <s:TextInput id="question" x="0" y="1" text="{teacher.question}"/> </s:FormItem> <s:FormItem x="57" y="88" width="203" height="38" label="密码"> <mx:TextInput id="pass" text="{teacher.pwd}"/> </s:FormItem> <s:FormItem x="57" y="37" width="220" label="姓名"> <mx:TextInput id="nameinput" x="0" y="1" text="{teacher.name}"/> </s:FormItem> <s:FormItem id="shoolcb" x="56" y="-7" width="146" height="36" label="院系"> <s:ComboBox id="schoolcb" x="-1" y="0" width="97" creationComplete="schoolcb_creationCompleteHandler(event)" labelField="name"> <s:AsyncListView list="{getSchoolsResult.lastResult}"/> </s:ComboBox> </s:FormItem> <s:FormItem x="55" y="243" height="40" label="职称"> <s:TextInput id="title" x="-1" y="0" height="17" text="{teacher.title}"/> </s:FormItem> <s:FormItem x="56" y="306" height="40" label="编号"> <s:TextInput id="teacherId" x="-1" y="0" height="17" text="{teacher.teacherId}"/> </s:FormItem> </s:Panel> </s:Group>
修改dispatcherServlet-servlet.xml 中的 <prop key="hibernate.hbm2ddl.auto">update</prop>
改为<prop key="hibernate.hbm2ddl.auto">create</prop>
再修改连接属性,部署项目启动服务器会自动创建表。
再改回:<prop key="hibernate.hbm2ddl.auto">update</prop>
否则再次启动服务器时候又重建表,数据会丢失。测试数据时注意 教师编号不要重复,不然不能插入数据。
效果:姓名旁边有个Input, 可以根据输入动态查询。