Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92037
  • 博文数量: 41
  • 博客积分: 2650
  • 博客等级: 少校
  • 技术积分: 680
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-23 16:26
文章分类

全部博文(41)

文章存档

2011年(1)

2008年(40)

我的朋友

分类:

2008-06-24 16:12:06


 一直都只有看到从Mysql读取数据到Flex app中然后显示在DataGrid控件中。还很少见到从Flex app中的Datagrid取得数据写回数据库的例子。在网上搜索了找到一篇用Flex,PHP,JSON的方法:具体请参考:Using Flex, PHP, and JSON to Modify a MySQL Database。写的非常的简单明白,可惜的是自己没学过PHP。无法按照例子上完整的去实现,所以我把它更改用Java-Json的方法来实现同样的功能。
  首先来看下这个例子的界面功能设计:包含一个dataGrid控件,两个按钮(读取和更新数据)以及一个Label控件用来提示用户操作的结果。dataGrid包含四个列:员工的编号,姓名,性别以及部门。其中姓名这个列是可以编辑修改的:编辑后通过检查后,按更新按钮更新数据库。

 接着来看下工作流程:Flex app是通过remoteObject方式与后台的java bean沟通的,然后在由java bean连接mysql database,读取或更新数据。然后返回给flex app. 由于使用blazeDS,flex app可以直接调用java 的方法,所以发送请求和接受数据都变的简单了。
 那么,我门开始工作了。
 首先,创建一个数据库:在mysql提示框中输入以下的SQL就可以创建一个简单的员工信息资料表。
 

CREATE DATABASE IF NOT EXISTS test;
USE test;

DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
  `id` varchar(10) NOT NULL,
  `name` varchar(45) NOT NULL,
  `gender` varchar(10) NOT NULL,
  `department` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我们来先看看那后台java bean的处理:他要接受flex app的读取数据和更新数据的请求,而且他们之间的数据传递格式采用的是json.所以我们的java bean的一个框架结构应该是:

public class JsonGrid {
    private Connection con = null;
    private String myDriver = "com.mysql.jdbc.Driver";
    private String conURL = "jdbc:mysql://localhost:3306/test";
    private String userName = "root";
    private String userPass = "12345";
    
    public Connection conToDB(){
         try{
             Class.forName(myDriver);
             con = DriverManager.getConnection(conURL,userName,userPass);
         }catch(Exception e){
             e.printStackTrace();
         }
         return con;
     }
    public String getJsonArray(){
        String result= new String();        
        return result;
    }
    public String sendJsonArray(String jsonData){
        String result= new String();
     return result;
    }
}

里面包含了两个重要的方法(getJsonArray()和sendJsonArray())分别对应flex app的读取数据和更新数据的请求。在getJsonArray()方法中,要连接数据库,取得员工的信息资料,然后按照json格式封装数据,结果返回给flex app,由flex app中的datagrid显示出来。我们具体看看getJsonArray()这个方法:

    public String getJsonArray(){
        JSONArray jsonEmployeeArray = new JSONArray();
        ResultSet rs = null;
        String result= new String();
        try{
             Connection conToDb = conToDB();
             Statement stmt = conToDb.createStatement();
             rs=stmt.executeQuery("select * from employee");
             while(rs.next()){
                 JSONObject jsonEmployee = new JSONObject();
                 jsonEmployee.put("id", rs.getString("id"));
                 jsonEmployee.put("name", rs.getString("name"));
                 jsonEmployee.put("gender", rs.getString("gender"));
                 jsonEmployee.put("department", rs.getString("department"));
                 jsonEmployeeArray.add(jsonEmployee);
             }
             result = jsonEmployeeArray.toString();
             conToDb.close();
            
//result = new JSONObject().put("jsonEmployeeArray",jsonEmployeeArray).toString();

             }catch(SQLException ex){
                 ex.printStackTrace();
             }
        
        return result;
    }

内容其实都很简单,只是读取数据和封装成json格式的数据,最后把json array格式的jsonEmployeeArray转换成string格式传输给flex app.即return语句。而当flex app要使用这个json array格式的数据,自然需要按照json格式解码等,后面在介绍。接着看看那个更新数据的方法sendJsonArray():

public String sendJsonArray(String jsonData){
        String result= new String();
        
//jsonData = jsonData.replace("\\", "");

     JSONArray jsonArray = JSONArray.fromObject(jsonData);
    
     try{
         Connection conToDb = conToDB();
         Statement stmt = conToDb.createStatement();
     for(int i=0;i<jsonArray.size();i++){
         JSONObject jsonObject = JSONObject.fromObject(jsonArray.getString(i));
         String id = jsonObject.getString("id");
         String name = jsonObject.getString("name");
         stmt.executeUpdate("update employee set name='"+name+"' where id='"+id+"'");
     }
     result="恭喜,成功更新数据!";
     conToDb.close();
     }catch(Exception e){
         e.printStackTrace();
     }
     return result;
    }

即把flex app传递过来的String类型的json格式的的数据解码开来,然后根据对应的Id把更新后的名字保存在数据库中。这里我们传递过来的是整个datagrid的信息,不管是有没有更新的,都要循环的更新所有员工的信息。所以呢,在你的程序中你的JsonGrid.java文件应该类似:

package jsongrid;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class JsonGrid {
    private Connection con = null;
    private String myDriver = "com.mysql.jdbc.Driver";
    private String conURL = "jdbc:mysql://localhost:3306/test";
    private String userName = "root";
    private String userPass = "liceven";
    
    public Connection conToDB(){
         try{
             Class.forName(myDriver);
             con = DriverManager.getConnection(conURL,userName,userPass);
         }catch(Exception e){
             e.printStackTrace();
         }
         return con;
     }
    public String getJsonArray(){
        JSONArray jsonEmployeeArray = new JSONArray();
        ResultSet rs = null;
        String result= new String();
        try{
             Connection conToDb = conToDB();
             Statement stmt = conToDb.createStatement();
             rs=stmt.executeQuery("select * from employee");
             while(rs.next()){
                 JSONObject jsonEmployee = new JSONObject();
                 jsonEmployee.put("id", rs.getString("id"));
                 jsonEmployee.put("name", rs.getString("name"));
                 jsonEmployee.put("gender", rs.getString("gender"));
                 jsonEmployee.put("department", rs.getString("department"));
                 jsonEmployeeArray.add(jsonEmployee);
             }
             result = jsonEmployeeArray.toString();
             conToDb.close();
            
//result = new JSONObject().put("jsonEmployeeArray",jsonEmployeeArray).toString();

             }catch(SQLException ex){
                 ex.printStackTrace();
             }
        
        return result;
    }
    public String sendJsonArray(String jsonData){
        String result= new String();
        
//jsonData = jsonData.replace("\\", "");

     JSONArray jsonArray = JSONArray.fromObject(jsonData);
    
     try{
         Connection conToDb = conToDB();
         Statement stmt = conToDb.createStatement();
     for(int i=0;i<jsonArray.size();i++){
         JSONObject jsonObject = JSONObject.fromObject(jsonArray.getString(i));
         String id = jsonObject.getString("id");
         String name = jsonObject.getString("name");
         stmt.executeUpdate("update employee set name='"+name+"' where id='"+id+"'");
     }
     result="恭喜,成功更新数据!";
     conToDb.close();
     }catch(Exception e){
         e.printStackTrace();
     }
     return result;
    }
}

接下来我们看看flex app前台的处理。
阅读(332) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~