-
关于flex与java交互的问题15
各位前辈好!
本人最近在做一个关于输气管网计算界面的项目,要用到Flex与java通信。我在java里面定义了static变量,然后在flex里面向java传值(传的值有数组类型,也有double类型),然后在java里面实现计算并返回(能不能返回数组?如何做到?在flex里输入到什么组件比较好?)到flex。现在我经过测试发现传值的过程没什么问题,但是返回到flex里老出问题,百思不得其解,请求各位援助。
下面是我的调用的java类:
(注:程序运行没有什么问题的,只是没法被flex调用返回值,我是想调用Final()或者calculation()来返回getP()等)
package danxiang;
import java.sql.ResultSet;
import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List;
import domain.Model;
import domain.Result;
import flex.messaging.io.ArrayList;
public class SectionCalculationwj {
static double d[];
static int start[];
public static double deta ;
public static double Z;
static int end[];
static double l[];
static double qq[];
static double Q0[];
static double section[];
public static int point;
public static int ss;
static double P0[] ;
static double T0[];
public static double Th ;
static double K[] ;
public static double rog ;
public static double cpg ;
public static double Di;
//下面这一部分是在flex里面调用的,从flex里面往这传值
public String initiateqq(double init[])
{
qq=init;
return "qq";
}
public String initiatepoint(int i)
{
point=i;
return "point";
}
public String initiateSection(double init[])
{
section=init;
return "section";
}
public String initiateStart(int init[])
{
start=init;
return "start";
}
public String initiateEnd(int init[])
{
end=init;
return "end::"+end[1];
}
public String initiated(double init[])
{
d=init;
return "D:::"+d[1];
}
public String initiatel(double init[])
{
l=init;
return "L:::"+l[1];
}
public String initiateT0(double init[])
{
T0=init;
return "T0";
}
public String initiateQ0(double init[])
{
Q0=init;
return "Q0";
}
public String initiateP(double init[])
{
P0=init;
return "P0";
}
public String initiateK(double init[])
{
K=init;
return "K";
}
public double initiatedeta(double DETA)
{
deta=DETA;
return deta;
}
public double initiatess(int S)
{
ss=S;
return ss;
}
public double initiaterog(double ROG)
{
rog=ROG;
return rog;
}
public double initiatecpg(double C)
{
cpg=C;
return cpg;
}
public double initiateDi(double di)
{
Di=di;
return Di;
}
public double initiateTh(double th)
{
Th=th;
return Th;
}
public double initiateZ(double zz)
{
Z=zz;
return Z;
}
//
//
//下面是我希望调用的,并返回到flex里面。。
// public String Final() {
// SectionCalculationwj aa = new SectionCalculationwj();
// aa.calculation();
// return "Hello,成功了!";
//
// }
public double[] calculation() {
int step = 0;
Result result = new Result();
//第一步,取初值
Model model = getInitValue();
//节点数
int n = model.getPoint();
//管道数
int m = model.getSection().length;
//计算出A,Azz
result.setA(A(model));
result.setAzz(Azz(result.getA()));
result.setP(model.getP0());
result.setAverageP(averageP(model, result));
double condition;
result.setQx(model.getQ0());
result.setT(model.getT0());
result.setBw(bw(result));
do {
result.setSj(Sj(model, result));
double[] tempQ = {};
//算AGA之前先求出G
result.setG(G(result.getSj(), result.getQx()));
result.setAGA(AGA(result));
fenkuai kf = new fenkuai();
result.setP(kf.fk(result.getAGA(), model.getSs(), result.getP(), model.getQq()));
result.setAverageP(averageP(model, result));
result.setDetap(detap(result));
tempQ = Qnew(result);
condition = condition(tempQ, result.getQx());
for (int k = 0; k < tempQ.length; k++) {
tempQ[k] = (result.getQx()[k] + tempQ[k]) / 2;
}
result.setQx(tempQ);
// 温降 水
result.setAa(aa(model, result));
result.setT(resetT(model, result));
// 水的析出
result.setBw(bw(result));
result.setDetabw(detabw(model,result));
step += 1;
} while (condition > 0.001);
System.out.println(step);
for (int i = 0; i < 12; i++) {
System.out.println("" + result.getP()[i]);
}
for (int i = 0; i < 12; i++) {
System.out.println("" + result.getT()[i]);
}
for (int i = 0; i < 11; i++) {
System.out.println("" + result.getDetabw()[i]);
}
return result.getP();
}
public double[][] A(Model model) {
int[] start = model.getStart();
int[] end = model.getEnd();
double[] section = model.getSection();
int n = model.getPoint();
int m = section.length;
double[][] A = new double[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (i + 1 == start[j]) {
A[i][j] = -1;
}
if (i + 1 == end[j]) {
A[i][j] = 1;
} else if (i + 1 != start[j] && i + 1 != end[j]) {
A[i][j] = 0;
}
}
}
return A;
}
//将A矩阵转置
public double[][] Azz(double[][] A) {
int n = A.length;
int m = A[0].length;
double[][] Azz = new double[m][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
Azz[j][i] = A[i][j];
}
}
return Azz;
}
// 计算Sj
public double[] Sj(Model model, Result result) {
double[] section = model.getSection();
double[] D = model.getD();
double[] L = model.getL();
double[] T = result.getT();
double deta = model.getDeta();
double Z = model.getZ();
double[] averageP = result.getAverageP();
//第一步,计算lam的值
int m = section.length;
double[] lam = new double[m];
double[] Sj = new double[m];
for (int i = 0; i < m; i++) {
lam[i] = 0.009407 / Math.pow(D[i], (1.0 / 3));
}
//第二步,计算Sj
for (int i = 0; i < m; i++) {
Sj[i] = -675.3515 * lam[i] * deta * Z * T[i] * L[i] / Math.pow(D[i], 5) / (2 * averageP[i]);
}
return Sj;
}
// 计算G
public double[][] G(double[] Sj, double[] Q) {
int m = Sj.length;
double[][] G = new double[m][m];
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
if (i == j) {
G[i][j] = 1 / Sj[i] / Math.abs(Q[i]);
} else {
G[i][j] = 0;
}
}
}
return G;
}
//计算AGA
public double[][] AGA(Result result) {
double[][] G = result.getG();
double[][] A = result.getA();
double[][] Azz = result.getAzz();
int n = A.length;
int m = A[0].length;
double AG[][] = new double[n][m];
double AGA[][] = new double[n][n];
for (int i = 0; i < A.length; i++) {
for (int j = 0; j < G[0].length; j++) {
for (int k = 0; k < G.length; k++) {
AG[i][j] += A[i][k] * G[k][j];
}
}
}
for (int i = 0; i < AG.length; i++) {
for (int j = 0; j < Azz[0].length; j++) {
for (int k = 0; k < Azz.length; k++) {
AGA[i][j] += AG[i][k] * Azz[k][j];
}
}
}
return AGA;
}
public double[] detap(Result result) {
double[][] Azz = result.getAzz();
double[] p = result.getP();
int m = Azz.length;
int n = Azz[0].length;
double[] detap = new double[m];
//计算压力降
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
detap[i] += Azz[i][j] * p[j];
}
}
return detap;
}
public double[] averageP(Model model, Result result) {
double[] P = result.getP();
int[] start = model.getStart();
int[] end = model.getEnd();
int m = start.length;
double[] averageP = new double[m];
for (int j = 0; j < m; j++) {
averageP[j] = 0.5 * (P[start[j] - 1] + P[end[j] - 1]);
}
return averageP;
}
public double[] Qnew(Result result) {
//计算新流量
double[][] G = result.getG();
double[] detap = result.getDetap();
int m = G.length;
double[] Qnew = new double[m];
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
Qnew[i] += G[i][j] * detap[j];
}
}
return Qnew;
}
public double condition(double[] tempQ, double[] Q) {
int m = tempQ.length;
double condition = 0.0;
for (int i = 0; i < m; i++) {
condition += Math.pow((tempQ[i] - Q[i]), 2);
}
condition = Math.pow(condition, 0.5);
return condition;
}
//单相温降计算
public double[] aa(Model model, Result result) {
double[] Q = result.getQx();
double[] D = model.getD();
double[] K = model.getK();
double rog = model.getRog();
double cpg = model.getCpg();
double[] bw=result.getBw();
int m = Q.length;
double[] aa = new double[m];
for (int i = 0; i < m; i++) {
aa[i] = K[i] * Math.PI * D[i] / ((rog+bw[i]) * Q[i] * cpg )/1000000;
}
return aa;
}
public double[] resetT(Model model, Result result) {
double Th = model.getTh();
int[] start = model.getStart();
int[] end = model.getEnd();
double[] T = result.getT();
double[] aa = result.getAa();
double[] l = model.getL();
double Di = model.getDi();
double[] detap = result.getDetap();
int m = aa.length;
for (int i = 0; i < m; i++) {
T[end[i] - 1] = Th + ((T[start[i] - 1]) - Th) * Math.exp(-aa[i] * l[i]) + Di * detap[i] / 1000000 * (1 - Math.exp(-aa[i] * l[i])) / aa[i] / l[i];
}
return T;
}
//饱和水的计算kg/m3直接加在气体密度上
public double[] bw(Result result) {
double[] T = result.getT();
double[] P=result.getP();
int m = P.length;
double[] pb=new double[m];//饱和蒸汽压
double[] bw = new double[m];
// y = 0.06233 x3 + 0.60057 x2 + 46.27664 x + 643.34653 xOC,ypa
for (int j = 0; j < m; j++) {
pb[j] = 0.06233*Math.pow(T[j]-273.15,3)+0.60057*Math.pow(T[j]-273.15,2)+46.27664*(T[j]-273.15)+643.34653;
bw[j]=803*pb[j]/(P[j]-pb[j])*0.001;
}
return bw;
}
//起终点水量变化计算 >0进水,<0析出水 单位kg
public double[] detabw(Model model,Result result) {
double[] bw = result.getBw();
int[] start=model.getStart();
int[] end=model.getEnd();
double[]d=model.getD();
double[]L=model.getL();
int m = start.length;
double[] detabw = new double[m];
for (int j = 0; j < m; j++) {
detabw[j] = (bw[end[j]-1] - bw[start[j]-1])*(Math.PI*Math.pow(d[j], 2)/4)*L[j];
}
return detabw;
}
}
问题补充:FLEX里面的array可以直接传给java的数组,我测试过了;问题是我现在即使把public double[] calculation() 改成public String calculation()返回单个字符getP()[1]也是不成功zyn010101 写道你查下as和java的数据类型对应表,你把数组转成字符改成串到flex端再切割字符串吧。
问题补充:FLEX里面的array可以直接传给java的数组,我测试过了;问题是我现在即使把public double[] calculation() 改成public String calculation()返回单个字符getP()[1]也是不成功zyn010101 写道你查下as和java的数据类型对应表,你把数组转成字符串到flex端再切割字符串吧。
问题补充:好的 我试试zyn010101 写道flex获取的数据alert出来和java端获取的一样不?前端报什么错?监控RemoteObject的fault事件,把错误信息alert出来看看。
问题补充:问题好像在这一句:result.setAverageP(averageP(model, result));
我加上这一句就有问题,注释掉就出结果。。。但不知道哪里错了
Result类里面代码:
private double[] averageP;
public double[] getAverageP() {
return averageP;
}
public void setAverageP(double[] averageP) {
this.averageP = averageP;
}
zyn010101 写道flex获取的数据alert出来和java端获取的一样不?前端报什么错?监控RemoteObject的fault事件,把错误信息alert出来看看。
问题补充:这个事Alert出来的错误信息:[RPC Fault faultString="java.lang.ArrayIndexOutOfBoundsException : 1" faultCode="Server.Processing" faultDetail="null"]zyn010101 写道flex获取的数据alert出来和java端获取的一样不?前端报什么错?监控RemoteObject的fault事件,把错误信息alert出来看看。
问题补充:怎么加catch exception啊?加一个方法吗?zyn010101 写道在后台java代码加catch Exception块,否则控制台不报错
问题补充:我是这么写的:public String calculation() {
try{int step = 0;
Result result = new Result();
//第一步,取初值
Model model = getInitValue();
//节点数
int n = model.getPoint();
//管道数
int m = model.getSection().length;
//计算出A,Azz
result.setA(A(model));
result.setAzz(Azz(result.getA()));
result.setP(model.getP0());
result.setAverageP(averageP(model, result));
double condition;
result.setQx(model.getQ0());
result.setT(model.getT0());
result.setBw(bw(result));
do {
result.setSj(Sj(model, result));
double[] tempQ = {};
//算AGA之前先求出G
result.setG(G(result.getSj(), result.getQx()));
result.setAGA(AGA(result));
fenkuai kf = new fenkuai();
result.setP(kf.fk(result.getAGA(), model.getSs(), result.getP(), model.getQq()));
result.setAverageP(averageP(model, result));
result.setDetap(detap(result));
tempQ = Qnew(result);
condition = condition(tempQ, result.getQx());
for (int k = 0; k < tempQ.length; k++) {
tempQ[k] = (result.getQx()[k] + tempQ[k]) / 2;
}
result.setQx(tempQ);
result.setAa(aa(model, result));
result.setT(resetT(model, result));
result.setBw(bw(result));
result.setDetabw(detabw(model,result));
step += 1;
} while (condition > 0.001);
System.out.println(step);
for (int i = 0; i < 12; i++) {
System.out.println("" + result.getP()[i]);
}
for (int i = 0; i < 12; i++) {
System.out.println("" + result.getT()[i]);
}
for (int i = 0; i < 11; i++) {
System.out.println("" + result.getDetabw()[i]);
}
return "result.getP()"+m+"**"+result.getQx()[0]+"**"+result.getT()[0]+"**"+result.getBw()[0];
} catch(Exception e){e.printStackTrace();}
//
return "成功!";
}
但是没有任何输出啊,控制台也没有。。。zyn010101 写道把calculation方法中的代码全放到下面的代码处,try{代码 } catch(Exception e){e.printStackTrace();}
问题补充:return "result.getP()"+m+"**"+result.getQx()[0]+"**"+result.getT()[0]+"**"+result.getBw()[0];
我把这个放try{代码 } 外边的话他说我没定义result
zyn010101 写道把calculation方法中的代码全放到下面的代码处,try{代码 } catch(Exception e){e.printStackTrace();}
问题补充:我本人不是计算机专业所以做起来比较费劲,真诚的感谢您耐心的解答!zyn010101 写道把calculation方法中的代码全放到下面的代码处,try{代码 } catch(Exception e){e.printStackTrace();}
问题补充:嗯 数少还行 不过多了比较麻烦啊ayanami001 写道直接string交互 , 传过去了再自己折腾呗 。
2012年5月07日 10:30
7个答案 按时间排序 按投票排序
-
采纳的答案
把calculation方法中的代码全放到下面的代码处,try{代码 } catch(Exception e){e.printStackTrace();}
2012年5月08日 10:22
-
我们Flex访问后台用的<mx:HTTPService标签可以定位到后台要访问的Action,
在请求的时可以用 var params:URLVariables = new URLVariables();
params.objec = Object可以携带任何类型的参数, params.oper="adminLogin";,具体那个方法,
在后台Java中直接可以request.getParameter("object")获得传过来的参数,
在后台做一系列的操作计算以后,用 writeResponse(rusponse,object.toString());写回到前台的成功方法(注意,writeResponse为自定义方法),
写回的object为String类型,你可以使用JSON包的JSON对象开封装数组,集合等,
现在就可以在前台Flex的 protected function logOutSuccess(event:ResultEvent):void{
var returnInfo : String = event.result.toString();}里面得到这个对象了,然后你传过来的是什么类型你就转换成什么类型,就可以了2012年5月09日 11:28
-
flex获取的数据alert出来和java端获取的一样不?前端报什么错?监控RemoteObject的fault事件,把错误信息alert出来看看。
2012年5月07日 17:05
相关推荐
Flex和java交互的示例代码,给出的Flex部分:前端界面和vo,后端Java部分,以及配置部分。注意:我直接用的JDBC连接MySql,且只做了数据显示,没有增修改删除。
Flex和java交互搭建,新手可以用来练手,简单易懂
Flex 和 Java的交互实例.非常值得参考
实现Flex和Java交互.rar 实现flex与java的交互问题
拿来直接就用的flex 和java交互的入门实例,简单的不能再简单,包括所有的jar包
Flex与java和数据库交互的完美文档
最简单的Flex与Java交互(HelloWorld)
该文档提供了Flex与java交互的通信方法,通过一个实例描述了整个流程。
Flex与java交互,flex富客户端学习
Flex和java交互的登录实例Flex和java交互的登录实例Flex和java交互的登录实例Flex和java交互的登录实例Flex和java交互的登录实例Flex和java交互的登录实例Flex和java交互的登录实例
想用Flex前台页面调用mysql而苦于Flex没有该接口,利用BlazeDS技术,使得Java调用mysql,然后Flex就可以远程调用Java,从而实现前台Flex页面对mysql数据库的操作。
能很好的实现flex与java的交互 当用户的以flex作为前台 java作为后台时,在传递参数数量不确定的情况下,此demo可以很好的为你解决这个问题
flex与java之间的信息交互,使用的框架是red5
如何做好Flex与Java交互_.docx
Flex 与 Java 通信的例子,目前很流行的技术 ~~~~~~~~~~~~
Flex与Java交互通讯视频详解,是本人个人编写的,不足之处还忘各位理解.多提意见.
flex与java交互 blaze+cairngorm框架实现用户登录
flex与java通过BlazeDs进行交互
告诉大家怎么让Flex调用java方法。很简单实用,一看就懂。
flex+java交互简单实用易懂 自做的一个flex java交互的例子,数据传输。