您的位置:首页 > 编程语言

精通Flex 3.0――14.4.4 DataManagement的Flex应用的服务端代码

2008-04-28 15:35 393 查看

  在服务端生成的Java代码中包括一个抽象类FlexDBAFlexDAO,一个接口IRestVO还有三个类StudentAssembler,StudentDAO和StudentVO。
FlexDBAFlexDAO为数据访问的抽象类代码如下所示。
package com.lcdsstu.dao.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import Javax.naming.InitialContext;
import Javax.naming.NamingException;
import Javax.sql.DataSource;

import com.lcdsstu.dao.dao.IRestVO;

public abstract class FlexDBAFlexDAO
{

public static final String PAGE_NUM = "pageNum";
public static final String PAGE_SIZE = "pageSize";
public static final String ORDER_FIELD = "orderField";
public static final String ORDER_DIR = "orderDirection";
public static final String FILTER = "filter";
protected static DataSource getDataSource()
{
InitialContext ic;
DataSource nativeDS = null;
try
{
ic = new InitialContext();
nativeDS = (DataSource) ic.lookup("jdbc/myDB");
}
catch (NamingException e)
{
// ignore this exception
// if the data source is not found in JNDI then we will get
// the connection the old way
}
return nativeDS;
}
protected static Connection getConnection() throws SQLException
{
DataSource ds = FlexDBAFlexDAO.getDataSource();
if (ds != null)
{
return ds.getConnection();
}

try
{
Class.forName("com.mysql.jdbc.Driver");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}

Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost/FlexDB", "root", "123");

return conn;

}

public FlexDBAFlexDAO()
{
super();
}

protected abstract String getCountStatement(Map args);
protected String getOrder(String order, String dir)
{
if(!dir.toLowerCase().equals("desc"))
{
dir = "asc";
}

if(order != null && order.trim().length() != 0)
{
return " order by " + order + " " + dir;
}
else
{
return "";
}
}

protected void setUpPKAfterCreate(IRestVO vo, Connection c)
{
//设置主键这里不作操作
}

public int count()
{
return count(new HashMap());
}
public int count(Map args)
{
Connection c = null;
PreparedStatement ps = null;
int res = 0;

try
{
c = getConnection();
ps = c.prepareStatement(getCountStatement(args));

String filter = getParameter(args.get(FILTER));
if(filter.trim().length() != 0)
{
ps.setString(1, "%"+filter+"%");
}

ResultSet rs = ps.executeQuery();

rs.next();
res = rs.getInt(1);
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
try
{
ps.close();
c.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
return res;
}
protected int[] getPagination(Map map)
{
int[] dim = new int[2];
if(map.size() == 0)
{
return null;
}
String page = null;
String pageSize = null;

if(!map.containsKey(PAGE_NUM))
{
return null;
}
else
{
page = getParameter(map.get(PAGE_NUM));
}

if(!map.containsKey(PAGE_SIZE))
{
return null;
}
else
{
pageSize = getParameter(map.get(PAGE_SIZE));
}

try
{
dim[0] = Integer.parseInt(page);
dim[1] = Integer.parseInt(pageSize);
}
catch (NumberFormatException e)
{
return null;
}

return dim;
}

protected String getParameter(Object value)
{
if(value instanceof String[] )
{
return ((String[])value)[0];
}
else
{
return value.toString();
}

}

}
IRestVO定义了一个值对象的接口代码如下所示。
package com.lcdsstu.dao.dao;
import java.util.HashMap;
public interface IRestVO {
HashMap getAsMap();
}
StudentAssembler是访问数据库的一个助手类。代码如下所示。
package com.lcdsstu.dao.dao;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import flex.data.assemblers.AbstractAssembler;
import flex.messaging.io.amf.ASObject;
public class StudentAssembler extends AbstractAssembler
{
private StudentDAO studentDAO = new StudentDAO();
public Object getItem(Map uid)
{
Object pk = uid.get("id");
if(pk == null)
{
// it should not get here as the refreshFill should prevent this.
// However, we respond with an empty object so the DataService to work.
return new StudentVO();
}
return studentDAO.find(new BigDecimal(pk.toString()));
}

public Collection fill()
{
return studentDAO.list();
}

public Collection fill(List arg)
{
if(arg.size() != 0) {
ASObject asObj = (ASObject)arg.get(0);
return studentDAO.list(asObj);
} else {
return fill();
}
}

public int count(List arg)
{
if(arg.size() != 0) {
ASObject asObj = (ASObject)arg.get(0);
return studentDAO.count(asObj);
} else {
return studentDAO.count();
}
}

public void createItem(Object newVersion)
{
StudentVO vo = (StudentVO) newVersion;
studentDAO.create(vo);
}

/*
* (non-Javadoc)
*
* @see flex.data.assemblers.AbstractAssembler#deleteItem(java.lang.Object)
*/
public void deleteItem(Object prevVersion)
{
StudentVO vo = (StudentVO) prevVersion;
studentDAO.delete(vo);
}

public void updateItem(Object newVersion, Object prevVersion, List changes)
{
StudentVO vo = (StudentVO) newVersion;
studentDAO.update(vo);
}
public int refreshFill(List arg0, Object arg1, boolean arg2)
{
StudentVO vo = (StudentVO)arg1;
if(vo.getId() == null)
{
return DO_NOT_EXECUTE_FILL;
}
return super.refreshFill(arg0, arg1, arg2);
}

}
StudentDAO是一个继承与FlexDBAFlexDAO的数据访问类,代码如下所示。
package com.lcdsstu.dao.dao;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import flex.messaging.MessageException;

public class StudentDAO extends FlexDBAFlexDAO
{
public static String COLUMNS = "|id|name|sex|age|address|remark|";
public static String FIND_STATEMENT = "select id,Name,Sex,age,Address,Remark "
+ " from student" + " where id = ?";
public static String LIST_STATEMENT = "select id,Name,Sex,age,Address,Remark "
+ " from student";
public static String DELETE_STATEMENT = "DELETE FROM student WHERE id = ?";
private static String CREATE_STATEMENT = "INSERT INTO student (Name,Sex,age,Address,Remark) "
+ "VALUES (?,?,?,?,?)";
private static String UPDATE_STATEMENT = "UPDATE student SET Name = ?,Sex = ?,age = ?,Address = ?,Remark = ? "
+ "WHERE id = ?";

protected String getCountStatement(Map args)
{
return "SELECT COUNT(*) FROM student" + getFilter(getParameter(args.get(FILTER)));
}

private String getFilter(String filter)
{
if(filter != null && filter.trim().length() != 0)
{
return " where Name like ?";
}
else
{
return "";
}
}

public StudentVO find(BigDecimal pk)
{
Connection c = null;
PreparedStatement ps = null;
ResultSet rs = null;
StudentVO ret = null;

try
{
c = getConnection();
ps = c.prepareStatement(FIND_STATEMENT);
ps.setBigDecimal(1, pk);
rs = ps.executeQuery();
if (rs.next())
{
ret = new StudentVO( pk,rs.getString(2),rs.getString(3),rs.getBigDecimal(4),rs.getString(5),rs.getString(6));
}

}
catch (SQLException e)
{
e.printStackTrace();
throw new MessageException("Error quering database! See server log for details!");
}
finally
{
try
{
rs.close();
ps.close();
c.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
return ret;
}

public List list()
{
return list(new HashMap());
}
public List list(Map args)
{
Connection c = null;
PreparedStatement ps = null;
ResultSet rs = null;
StudentVO vo = null;
ArrayList ret = new ArrayList();
int page = 0;
int pageSize = Integer.MAX_VALUE;
int[] dim = getPagination(args);
if(dim != null)
{
page = dim[0];
pageSize = dim[1];
}
String order = getParameter(args.get(ORDER_FIELD));
String dir = getParameter(args.get(ORDER_DIR));
if(COLUMNS.indexOf("|"+order.toLowerCase()+"|") == -1) {
order = "";
dir = "";
}
String filter = getParameter(args.get(FILTER));
try
{
c = getConnection();
ps = c.prepareStatement(LIST_STATEMENT + getFilter(filter) + getOrder(order, dir),
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);

if(filter.trim().length() != 0)
{
ps.setString(1, "%"+filter+"%");
}

rs = ps.executeQuery();
if (page != 0)
{
rs.absolute(page * pageSize);
}
int i = 0;
while (rs.next() && i < pageSize)
{
vo = new StudentVO(rs.getBigDecimal(1),rs.getString(2),rs.getString(3),rs.getBigDecimal(4),rs.getString(5),rs.getString(6));
ret.add(vo);
i++;
}
}
catch (SQLException e)
{
e.printStackTrace();
throw new MessageException("Error quering database! See server log for details!");
}
finally
{
try
{
rs.close();
ps.close();
c.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}

return ret;
}

public int delete(StudentVO item)
{
Connection c = null;
PreparedStatement ps = null;
int res = 0;

try
{
c = getConnection();
ps = c.prepareStatement(DELETE_STATEMENT);
ps.setBigDecimal(1, item.getId());
res = ps.executeUpdate();

}
catch (SQLException e)
{
e.printStackTrace();
throw new MessageException("Error deleting item! See server log for details!");
}
finally
{
try
{
ps.close();
c.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
return res;
}

public int create(StudentVO vo)
{
Connection c = null;
PreparedStatement ps = null;
int res = 0;

try
{
c = getConnection();
ps = c.prepareStatement(CREATE_STATEMENT);
ps.setString(1, vo.getName());
ps.setString(2, vo.getSex());
ps.setBigDecimal(3, vo.getAge());
ps.setString(4, vo.getAddress());
ps.setString(5, vo.getRemark());
res = ps.executeUpdate();

setUpPKAfterCreate(vo, c);
}
catch (SQLException e)
{
e.printStackTrace();
throw new MessageException("Error creating item! See server log for details!");
}
finally
{
try
{
ps.close();
c.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
return res;
}

public int update(StudentVO vo)
{
Connection c = null;
PreparedStatement ps = null;
int res = 0;

try
{
c = getConnection();
ps = c.prepareStatement(UPDATE_STATEMENT);

ps.setString(1, vo.getName());
ps.setString(2, vo.getSex());
ps.setBigDecimal(3, vo.getAge());
ps.setString(4, vo.getAddress());
ps.setString(5, vo.getRemark());
ps.setBigDecimal(6, vo.getId());

res = ps.executeUpdate();

}
catch (SQLException e)
{
e.printStackTrace();
throw new MessageException("Error updating item! See server log for details!");
}
finally
{
try
{
ps.close();
c.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
return res;
}

}
StudentVO是一个实现了IRestVO接口的值对象类,代码如下所示。
package com.lcdsstu.dao.dao;
import java.math.BigDecimal;
import java.util.HashMap;
import com.lcdsstu.dao.dao.IRestVO;
public class StudentVO implements IRestVO
{
private BigDecimal id;
private String Name;
private String Sex;
private BigDecimal age;
private String Address;
private String Remark;
public StudentVO()
{
}
public StudentVO( BigDecimal id, String Name, String Sex, BigDecimal age, String Address, String Remark)
{
this.id = id;
this.Name = Name;
this.Sex = Sex;
this.age = age;
this.Address = Address;
this.Remark = Remark;
}
public BigDecimal getId()
{
return id;
}
public void setId(BigDecimal id)
{
this.id = id;
}
public void setId(String id)
{
if (id != null)
{
this.id = new BigDecimal(id);
}
}

public String getName()
{
return Name;
}
public void setName(String Name)
{
this.Name = Name;
}
public String getSex()
{
return Sex;
}
public void setSex(String Sex)
{
this.Sex = Sex;
}
public BigDecimal getAge()
{
return age;
}
public void setAge(BigDecimal age)
{
this.age = age;
}
public void setAge(String age)
{
if (age != null)
{
this.age = new BigDecimal(age);
}
}

public String getAddress()
{
return Address;
}
public void setAddress(String Address)
{
this.Address = Address;
}
public String getRemark()
{
return Remark;
}
public void setRemark(String Remark)
{
this.Remark = Remark;
}
public HashMap getAsMap()
{
HashMap hm = new HashMap();
hm.put("id", getId());
hm.put("Name", getName());
hm.put("Sex", getSex());
hm.put("age", getAge());
hm.put("Address", getAddress());
hm.put("Remark", getRemark());
return hm;
}

}
data-management-config.xml文件更新的内容是用于描述服务端代码的配置,以便被客户端的ActionScript代码进行调用。data-management-config.xml文件内容代码如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<service class="flex.data.DataService" id="data-service">
<adapters>
<adapter-definition class="flex.data.adapters.ASObjectAdapter" default="true" id="actionscript"/>
<adapter-definition class="flex.data.adapters.JavaAdapter" id="java-dao"/>
</adapters>
<destination id="studentJava">
<channels>
<channel ref="my-rtmp"/>
</channels>
<adapter ref="java-dao"/>
<properties>
<use-transactions>true</use-transactions>
<source>com.lcdsstu.dao.dao.StudentAssembler</source>
<scope>application</scope>
<cache-items>false</cache-items>
<metadata>
<identity property="id"/>
</metadata>
<network>
<session-timeout>0</session-timeout>
<paging enabled="false" pageSize="5"/>
<throttle-inbound max-frequency="500" policy="ERROR"/>
<throttle-outbound max-frequency="500" policy="REPLACE"/>
</network>
</properties>
</destination>
</service>
在data-management-config.xml文件中通过声明<destination id="studentJava">指明前端调用的数据服务名称。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: