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, 可以根据输入动态查询。

 

 

posted on 2012-06-29 16:40  ~有木有~  阅读(1012)  评论(0编辑  收藏  举报

导航