Здравствуйте уважаемые участники форума. Я хотел бы обратится со следующим вопросом.
Существует некий класс (GetXmlFromSQL) который имеет один статический метод (getXMLDocumentFromSQL), который возвращает строковое значение. Строка представляет собой XML данные. Метод подключается к серверу БД, берет данне и по ним формирует XML дерево.
Вот код этого класса:
=================GetXmlFromSQL.java=================
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392.
package com.pb.analyse;
import java.lang.*;
import java.util.ArrayList;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.ResultSetMetaData;
import java.sql.Connection;
import java.sql.Statement;
import java.util.Hashtable;
import java.util.Date;
import java.text.*;
import java.util.Properties;
import java.sql.DriverManager;
/**
* <p>Методы формирования списка</p>
*/
public class GetXmlFromSQL extends MethodAnalyzeUtils{
/**
* dsFromSQL - датасет по которому будет строится XML-дерево
*/
private ArrayList dsFromSQL;
private ArrayList dsFromSQL1;
private ArrayList dsFromSQL2;
private String sUID;
private Hashtable TableDataSet;
/** execSQL - запрос который возвращает датасет
* Датасет должен состоять из двух полей:
* 1 - ID записи (будет поподать в поле ввода на jsp при выборе из дерева)
* 2 - Name наименование записи (то что будет отображатся в дереве)
*/
private String execSQL;
/** GetXmlVal aGetXmlVal*/
private static GetXmlFromSQL aGetXmlFromSQL = null ;
/**
* метод getGetXmlFromSQL
*
* @return GetXmlFromSQL
*/
public static GetXmlFromSQL getGetXmlFromSQL() {
if (aGetXmlFromSQL == null ) {
aGetXmlFromSQL = new GetXmlFromSQL();
}
return aGetXmlFromSQL;
}
/**
* метод getXMLDocumentFromSQL 146099 = dend is null
*
* @param execName String
* @param Params String
* @param Login int
* @return String
*/
public final String getXMLDocumentFromSQL(String execName, String Params, String Login) {
if (execName.equalsIgnoreCase("GetUserTask_add")|| execName.equalsIgnoreCase("GetUserTask")||
execName.equalsIgnoreCase("GetPodrName")|| execName.equalsIgnoreCase("GetPodrName_add"))
{ sUID= new String("");
sUID=GetParamsStrintg(Params, "uid");
sUID = sUID.substring(sUID.lastIndexOf("(")+ 1 ,sUID.length()- 1 );
//System.out.println("sUID="+sUID);
}
//Выбираем статьи капитала
if (execName.equalsIgnoreCase("GetStat"))
{
execSQL="exec get_kod_sv @dat_od='"+DataFormatSQL(GetParamsStrintg(Params, "Dat_od"))+"'";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем группы подьзователей
if (execName.equalsIgnoreCase("GetGrUser") ||
execName.equalsIgnoreCase("GetGrUser_s"))
{
execSQL="select substring(full_name,1,50)+'('+convert(varchar,uid)+')',''"+
" from ausers where is_group='Y' and uid<>0";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем подьзователей
if (execName.equalsIgnoreCase("GetUsers") )
{
execSQL="exec asGetUsers";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем доступные задачи
if (execName.equalsIgnoreCase("GetUserTask"))
{ //execSQL="exec asGet_UserMenus @uid="+GetParamsStrintg(Params, "uid")+",@fweb=1";
execSQL="exec asGet_UserMenus @uid="+sUID+",@fweb=1";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем доступные подразделения
if (execName.equalsIgnoreCase("GetPodrName")){
//String nGr=GetParamsStrintg(Params, "uid");
execSQL="select m.s_kod,m.name from apermgr p, main_gr m where p.uid="+
sUID+" and m.igr=p.igr order by name";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем недоступные подразделения
if (execName.equalsIgnoreCase("GetPodrName_add")){
//String nGr=GetParamsStrintg(Params, "uid");
execSQL="exec asGetUser_gr @uid="+sUID;
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем недоступные задачи
if (execName.equalsIgnoreCase("GetUserTask_add"))
{
execSQL="exec asGet_UserMenus @uid="+sUID+",@fweb=1,@fno=1";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем подьзователей из специальной группы
if (execName.equalsIgnoreCase("GetSpUser")||execName.equalsIgnoreCase("GetSpUser_s"))
{
execSQL="select substring(full_name,1,50)+'('+convert(varchar,uid)+')',''"+
"from ausers where puid=15325 order by name";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем доступные задачи
if (execName.equalsIgnoreCase("GetTaskName")){
String nGr=GetParamsStrintg(Params, "Uid");
execSQL="select t.tid,t.name from apermtasks p,atasks t where p.uid="+nGr+" and t.tid=p.tid order by ptid,tid";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем нормативы
if (execName.equalsIgnoreCase("GetNormat")){
String endDt=DataFormatSQL(GetParamsStrintg(Params, "DEND"));
execSQL="select n.normativ,o.name_obj from spr_norm n,spr_ob o"+
" where (n.dbeg is null or n.dbeg<='"+endDt+
"') and (n.dend is null or n.dend>='"+endDt+
"') and n.ob<>'*****' and n.ob=o.ob "+"and (o.dbeg is null or o.dbeg<='"+endDt+
"') and (o.dend is null or o.dend>='"+endDt+"')"+" and n.normativ<>'HH1'"+
" order by n.normativ ";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем статьи резерва
if (execName.equalsIgnoreCase("GetStRez")){
execSQL="exec Get_SpravRezName_WEB @bizn='99', @dat='"+
DataFormatSQL(GetParamsStrintg(Params, "DBEG"))+
"', @dat_e='"+DataFormatSQL(GetParamsStrintg(Params, "DEND"))+"'";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем статьи резерва для расчета по бизнесам
if (execName.equalsIgnoreCase("GetStRezBiz")){
execSQL="exec Get_SpravRezName_WEB @bizn='0', @dat='"+
DataFormatSQL(GetParamsStrintg(Params, "DBEG"))+
"', @dat_e='"+DataFormatSQL(GetParamsStrintg(Params, "DEND"))+"'";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем банки
if (execName.equalsIgnoreCase("GetBanks")){
execSQL="select bbn_bnmn, bbn_bnmnd from uc_in..bnpb";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем бизнесы
if (execName.equalsIgnoreCase("GetBizn") || execName.equalsIgnoreCase("GetBiznProfit")){
execSQL="asGet_UserBiznes @dat_od='"+DataFormatSQL(GetParamsStrintg(Params, "DEND"))+"', @login='"+GetParamsStrintg(Params, "login")+"'";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем продуктов
if (execName.equalsIgnoreCase("GetProd")){
execSQL = "select case when KOD_PROD=0 then -1 else KOD_PROD end as KOD_PROD,NAME_PROD from prod_bizn";
dsFromSQL = new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем уровни подразделений
if (execName.equalsIgnoreCase("GetHlevName")){
execSQL="select hlev,name from spr_hlev order by hlev";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем операции (новые коды аналитики)
if (execName.equalsIgnoreCase("GetNewOp")){
execSQL="exec Get_NewOp_WEB";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем коды показателей нормативов по MP
if (execName.equalsIgnoreCase("Get_sel_kodMP")) {
execSQL="select kod,name from spr_kod_mp where kid>0 and isnull(web_an,0)=1 order by kod";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем банки-контрагенты
if (execName.equalsIgnoreCase("GetBankKontr")){
execSQL="select case when ec7_cna='UA' and isnull(baz,'')<>'' then baz "
+" else bank end, bank from spr_bank_kg (index spr_bank_kg$cna) "+
" where ec7_cna='"+GetParamsStrintg(Params, "CNA")+"' order by bank";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
//Выбираем вид кредитования
if (execName.equalsIgnoreCase("VidKredit")){
execSQL=" select distinct s.newop, l.bl4_OCD from spr_ankr_newop s, uc_in..l4pb l "+
" where s.kod_ankr in ('nepr','kr_pr') and l.bl4_oc=convert(char(4),newop) "+
" and s.dend>='"+DataFormatSQL(GetParamsStrintg(Params, "Dat_od"))+
"' and s.dbeg<='"+DataFormatSQL(GetParamsStrintg(Params, "Dat_od"))+
"' order by s.newop";
dsFromSQL= new ArrayList( 0 );
GetArray(execSQL, dsFromSQL, Login);
}
System.out.println(execSQL);
StringBuffer xmlstr = new StringBuffer();
for ( int i = 0 ; i < dsFromSQL.size(); i++)
{
if (((ArrayList)dsFromSQL.get(i)).get( 1 ).toString().indexOf("data")!=- 1 )
{xmlstr.append("<userdata name='"+((ArrayList)dsFromSQL.get(i)).get(1).toString()+"'>"+((ArrayList)dsFromSQL.get(i)).get( 0 ).toString()+"</userdata>"); continue ;}
xmlstr.append("\n<item child='0'" +
" id='"+((ArrayList)dsFromSQL.get(i)).get(0).toString()+
"' text='" +(execName.equalsIgnoreCase("GetBankKontr")?"":
"["+((ArrayList)dsFromSQL.get(i)).get(0).toString()+"] ")+
((ArrayList)dsFromSQL.get(i)).get(1).toString()+
"' im0=\"analyse_xtree_book_titel.gif\">" +"</item>");
}
return xmlstr.toString();
}
/**
* метод GetArray
*
* @param query String
* @param data ArrayList
* @param Login String
* @return ArrayList
*/
private ArrayList GetArray (String query, ArrayList data, String Login) {
Connection connection = null ;
try {connection = GetConnect(MethodAnalyzeUtils.getNameSystemServer(), Login);}
catch (Exception ex) {ex.printStackTrace(); }
Statement statement = null ;
try {
statement = connection.createStatement();
ResultSet rs = statement.executeQuery(query);
if (statement.getResultSet() != null ) {
ResultSetMetaData metaData = rs.getMetaData();
while (rs.next()) {
ArrayList row = new ArrayList();
for ( int i = 0 ; i < metaData.getColumnCount(); i++) {
row.add(rs.getObject(i + 1 ));
}
synchronized (data) {
data.add(row);
}
}
rs.close();
statement.close();
connection.close();
}
}
catch (SQLException ex1) {ex1.printStackTrace(); }
return data;
}
/**
* метод формирует Hashtable со всеми таблицами, которые вернулись после
* окончания работы процедуры
*
* @param query String
* @param Login String
* @return Hashtable
* @throws SQLException
* @throws ClassNotFoundException
*/
private Hashtable GetTable (String query, String Login) throws SQLException, ClassNotFoundException {
Hashtable TableRezultQuery = new Hashtable();
Connection connection = null ;
try {connection = connection = GetConnect(MethodAnalyzeUtils.getNameSystemServer(),Login);}
catch (Exception ex) {ex.printStackTrace(); }
int DatasetNumber = 0 ; //кол-во таблиц возвращаемых запросом
Statement statement = null ;
statement = connection.createStatement();
statement.executeQuery(query);
if (statement.getResultSet() != null ) {
while (true) {
ResultSet rs = statement.getResultSet();
ResultSetMetaData metaData = rs.getMetaData();
ArrayList data = new ArrayList();
ArrayList columnName = new ArrayList();
ArrayList columnType = new ArrayList();
ArrayList columnDisplaySize = new ArrayList();
if (rs != null ) {
for ( int i= 0 ; i<metaData.getColumnCount(); i++) {
boolean f = !(metaData.getColumnLabel(i+ 1 ).equalsIgnoreCase("")) ?
columnName.add(metaData.getColumnLabel(i+ 1 )) : columnName.add("field" + (i+ 1 ));
Class type = Class .forName(metaData.getColumnClassName(i+ 1 ));
columnType.add(type);
columnDisplaySize.add( new Integer(metaData.getColumnDisplaySize(i+ 1 )));
}
data.add(columnType); //строка с типами полей
data.add(columnDisplaySize); //строка с шириной полей
data.add(columnName); //строка с именами колонок
while (rs.next()) {
ArrayList row = new ArrayList();
for ( int i = 0 ; i < metaData.getColumnCount(); i++) {
row.add(rs.getObject(i + 1 ));
}
synchronized (data) {
data.add(row);
}
}
TableRezultQuery.put( new Integer(DatasetNumber), data);
DatasetNumber++;
}
rs.close();
if (statement.getMoreResults()) continue ;
else break ;
}
}
statement.close();
connection.close();
return TableRezultQuery;
}
/**
* GetConnect
*
* @param srName String
* @param Login String
* @return Connection
*/
private static Connection GetConnect (String srName, String Login)
{
String url="";
url = MethodAnalyzeUtils.getSQLSrvUrl (srName);
Properties prop = new Properties();
prop.setProperty("user", "siton");
prop.setProperty("password", "siton");
prop.setProperty("applicationname","EAS_"+Login);
Connection connection = null ;
// com.sybase.jdbc2.jdbc.SybDriver driver = new com.sybase.jdbc2.jdbc.SybDriver();
try {
// DriverManager.registerDriver(driver);
com.sybase.jdbc3.jdbc.SybDriver driver = new com.sybase.jdbc3.jdbc.SybDriver();
DriverManager.registerDriver(driver);
connection = DriverManager.getConnection(url, prop);
}
catch ( SQLException ex){ return null ;}
return connection;
}
}
Метод этого класса используется на jsp странице, которая при обращении к ней возвращает XML-документ.
Вот код jsp страницы:
========GetSQLXML.jsp==================
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
<%="<?xml version=\"1.0\" encoding=\"UTF-8\"?>"%>
<%@page contentType="text/xml; charset=UTF-8"%>
<%request.setCharacterEncoding("UTF-8");%>
<%@page buffer="256kb"%>
<%@page import ="com.pb.analyse.*"%>
<%@page import ="java.util.Enumeration"%>
<%
String execName= new String();
execName= request.getParameter("execName");
Enumeration menum = request.getParameterNames();
String par_str = new String();
String cur_par_name = new String();
while (menum.hasMoreElements()) {
cur_par_name = menum.nextElement().toString();
par_str = par_str + java.net.URLDecoder.decode(cur_par_name, "CP1251") + "=" +
java.net.URLDecoder.decode(request.getParameter(cur_par_name).toString(), "CP1251") + "&";
}
%>
<%="\n<tree id=\"0\">"%>
<%="<item id=\"998\" text=\"Весь список\" open=\"1\">"%>
<%=GetXmlFromSQL.getGetXmlFromSQL().getXMLDocumentFromSQL(execName,par_str, session.getAttribute("log").toString())%>
<%="\n</item>"%>
<%="\n</tree>"%>
Проблема в том что при одновременном обращении к этой странице она не всегда возвращает XML дерево.
Я предполагаю что необходимо при обращении к jsp странице создавать каждый раз новый экземпляр класса либо синхронизировать метод getXMLDocumentFromSQL. Посоветуйте пожалуйста правильное решение.
|