True, but have you ever used the cfmodule tag, <cfx_> or <cf_> anything,
<cfinvoke>?  Why bother using them when you could just write all that code
inline with your current template source?

By encapsulating that function seperately, you not only make the template
code more readable, but leave it available for any other templates, CFCs or
whatever that needs to use it.

- Jim

-----Original Message-----
From: Rob Rohan [mailto:[EMAIL PROTECTED]]
Sent: Monday, November 25, 2002 4:37 PM
To: CF-Talk
Subject: RE: Java in CF (CFMX)


See though the whole point is

>The Java file should be compiled
>under WEB-INF/classes/
>and you can invoke it with CFObject.

wouldn't need to happen.


Rob

Certified Organic
"When you put things in quotes, people think someone actually said it."
http://treebeard.sourceforge.net
http://ruinworld.sourceforge.net
Scientia Est Potentia

-----Original Message-----
From: Joe Eugene [mailto:[EMAIL PROTECTED]]
Sent: Monday, November 25, 2002 2:33 PM
To: CF-Talk
Subject: Re: Java in CF (CFMX)


Dick,
Here is an Example that works with CFMX. The Java file should be compiled
under WEB-INF/classes/
and you can invoke it with CFObject. Note i am using Macromedia drivers to
connect to Sql-Server.
This is rough sketch..if you want.. i can improvise this later..to be
generic.
Dont forget to substitute your Database Name,server name, userid and
password.
The method call returns a list of table names.

/*Java File*/

import java.sql.*;
import java.util.*;

public class MetaData{

 String driverName="macromedia.jdbc.MacromediaDriver";
 String url="jdbc:macromedia:sqlserver://SqlServer:1433";
 String userid="YourUserid";
 String pwd="YourPassword";
 private String cat,schPattern,tblNPattern;
 private String tblTypes[];

 public void setParms(String c,String s, String t){
 if(c.equalsIgnoreCase("null")) cat=null; else cat=c;
 if(s.equalsIgnoreCase("null")) schPattern=null; else schPattern=s;
 if(t.equalsIgnoreCase("null")) tblNPattern=null; else tblNPattern=t;
 tblTypes=null;
 }
/*String driverName="com.microsoft.jdbc.sqlserver.SQLServerDriver";
 //String url="jdbc:microsoft:sqlserver://SqlServer:1433";
*/

 public String getTablesOnly(){
  StringBuffer sb = new StringBuffer();
  try{
  Class.forName(driverName);
  Connection con = DriverManager.getConnection(url,userid,pwd);
  DatabaseMetaData md = con.getMetaData();
  //System.out.println(md.getSQLKeywords()+"\n\n");
  //System.out.println(md.getNumericFunctions());

  //String tbTypes[]={"TABLE","User"};
  ResultSet rs = md.getTables(cat,schPattern,tblNPattern,tblTypes);

  while(rs.next()){
  sb.append(rs.getString("TABLE_NAME")+',');
  }
  rs.close();
  con.close();
  return sb.toString();
   }catch(Exception e){
    return e.toString();
  }

 }//end getTablesOnly

/*
 public static void main(String argv[]){
  MetaData m = new MetaData();
  System.out.println(m.getTablesOnly());
 }
*/
}

<!--- CF Code to get the tables --->
<cfobject action="create" class="MetaData" name="tables" type="JAVA">
<!---
Parm1:Catalog
Parm2:SchemaPattern
Parm3:tblNPattern
I am not currently passsing any types.. but u can add them
--->
<cfset tables.setParms("DBName","null","null")>
<cfdump var="#tables.getTablesOnly()#">

Hope this gives you an idea.
Joe



On Mon, 25 Nov 2002 10:56:57 -0800 Dick Applebaum <[EMAIL PROTECTED]>
wrote:

> Joe
>
> Below is the Java source, originally caalled
> DBViewer.
>
> This is working code that I modified to use the
> CFMX cfsnippets db (The
> PointBase
> database shipped with the Linux distro).
>
> I want to accomplish the same thing within
> CFMX, and generalize it a
> bit so it will
> work with any JDBC driver and database,
> remote or local, on any platform.
>
> For remote dbs, there will be a stub program
> that determines the
> platform, CF
> version, etc. and Uses COM objects or the Java
> interface as needed.
> Requests and data are exchanged via WDDX
> packets.
>
> For local dbs the function could be included
> inline (for performance)
> or via the
> stub (for convenience)
>
> The problem statements are shown at:  30, 38,
> and 45.
>
> It is fairly easy to program equivalent CF
> code, but you can't pass
> nulls from CF.
>
> Given more time, I would probably do this:
>
>    Use a Java program (similar to this) to do
> the actual manipulation
>    of the JDBC driver.
>
>    Use a CF routine to interface the Java
> program:  providing input
>    paramaters for the desired db request;  and
> presentation of the
>    results
>
>    Use an alias (such as 'MyNull'), to exchange
> psuedo nulls between
>    CF and Java, as necessary
>
> Any help will be greatly appreciated.
>
> TIA
>
> Dick
>
>
>
> 1 //      public abstract ResultSet
> getIndexInfo(String catalog, String
> schema,        String table, boolean unique,
> boolean approximate)
> throws SQLException;
> 2 //      public abstract ResultSet
> getColumns(String catalog, String
> schemaPattern, String tableNamePattern, String
> columnNamePattern)
> throws SQLException;
>
> 3
> 4 import java.sql.*;
> 5 import java.util.StringTokenizer;
>
> 6 public class DBViewerPB {
>
> 7   final static String jdbcURL =
> "jdbc:pointbase:cfsnippets,database.home=/opt/coldfusionmx/db";
> 8   final static String jdbcDriver =
> "com.pointbase.jdbc.jdbcUniversalDriver";
> 9   final static String username = "PBPUBLIC";
> 10   final static String password = "PBPUBLIC";
>
> 11   public static void main(java.lang.String[]
> args) {
>
> 12     System.out.println("--- Database Viewer
> ---");
> 13
> 14     try {
> 15       Class.forName(jdbcDriver);
> 16       Connection con =
> DriverManager.getConnection(jdbcURL,
> username, password);
>
> 17       DatabaseMetaData dbmd =
> con.getMetaData(  );
>
> 18       System.out.println("Driver Name: " +
> dbmd.getDriverName(  ));
> 19       System.out.println("Database Product:
> " +
> dbmd.getDatabaseProductName(  ));
> 20       System.out.println("Database Version:
> " +
> dbmd.getDatabaseProductVersion(  ));
> 21       System.out.println("SQL Keywords
> Supported:");
> 22       //StringTokenizer st = new
> StringTokenizer(dbmd.getSQLKeywords(  ), ",");
> 23       //while(st.hasMoreTokens(  ))
> 24       //  System.out.println(" " +
> st.nextToken(  ));
> 25
> 26       // Get a ResultSet that contains all
> of the tables in this
> database
> 27       // We specify a table_type of "TABLE"
> to prevent seeing system
> tables,
> 28       // views and so forth
> 29       String[] tableTypes = { "TABLE" };
> 30       ResultSet allTables =
> dbmd.getTables(null,null,null,tableTypes);
> 31       while(allTables.next(  )) {
> 32         String table_name =
> allTables.getString("TABLE_NAME");
> 33         System.out.println("Table Name: " +
> table_name);
> 34         System.out.println("Table Type:  " +
>
> allTables.getString("TABLE_TYPE"));
> 35         System.out.println("Indexes: ");
>
> 36         // Get a list of all the columns for
> this table
> 37         ResultSet columnList =
> 38
> dbmd.getColumns(null,null,table_name,null);
> 39         while(columnList.next(  )) {
> 40           System.out.println(" Column Name:
>
> "+columnList.getString("COLUMN_NAME"));
> 41         }
> 42         columnList.close(  );
>
> 43         // Get a list of all the indexes for
> this table
> 44         ResultSet indexList =
> 45
> dbmd.getIndexInfo(null,null,table_name,false,false);
> 46         while(indexList.next(  )) {
> 47           System.out.println(" Index Name:
> "+indexList.getString("INDEX_NAME"));
> 48           System.out.println(" Column Name:
>
> "+indexList.getString("COLUMN_NAME"));
> 49         }
> 50         indexList.close(  );
> 51       }
>
> 52       allTables.close(  );
> 53       con.close(  );
> 54     }
> 55     catch (ClassNotFoundException e) {
> 56       System.out.println("Unable to load
> database driver class");
> 57     }
> 58     catch (SQLException e) {
> 59       System.out.println("SQL Exception: " +
> e.getMessage(  ));
> 60     }
> 61   }
> 62 }
>
>
> On Monday, November 25, 2002, at 08:42 AM, Joe
> Eugene wrote:
>
> > Dick,
> > Can we see your code? Cant you have a method
> that converts CF String
> > "null" to
> > Java String=null?
> >
> >> tried to invoke it with cfobject.  We could
> not
> >> make the interface work
> >> because we could not pass Nulls between CF
> and
> >> Java.
> >
> > Here is an example
> >
> > public class StringType{
> >   private String str;
> >   public String getString(String s){
> >    String val="";
> >    str=s;
> >    if(str.equals("null")){
> >    val="Your String was null, setting to null
>  now";
> >    str = null;
> >    val= val+ " " +"Now Java value is : "+ str
> +"";
> >    }
> >    return val;
> >   }
> > }
> >
> > You can invoke it with
> >  type="JAVA">
> >
> > #chkNull.getString("null")#
> >
> >
> > if you can post your code, we can try figure
> it out. Let me know.
> >
> > Joe
> >
> > On Mon, 25 Nov 2002 06:54:03 -0800 Dick
> Applebaum
> > wrote:
> >
> >> On Monday, November 25, 2002, at 01:43 AM,
> >> Jochem van Dieten wrote:
> >>
> >>> Quoting Dave Carabetta :
> >>>>
> >>>> While I understand this isn't a feature
> that
> >> everybody would use, I
> >>>> would personally like to see MM focus on
> >> encapsulating some more Java
> >>>> features into easy-to-use black-box CF
> tags
> >> rather than having to code
> >>>> my own Java.
> >>>
> >>> I agree. For instance, it would be far
> better
> >> if CF had a tag to get at
> >>> the DatabaseMetaData interface instead of
> >> making it marginally easier
> >>> to
> >>> write it yourself by allowing inline Java.
> >>
> >> This is an excellent example & I expect that
> >> this will be one of the
> >> most-requested capabilities -- to be able to
> >> get DatabaseMetaData into
> >> CF.  I tried to do this, with help from Sean
> >> Corfield -- without
> >> success. I found a working Java program that
> >> extracts metadata, and
> >> tried to invoke it with cfobject.  We could
> not
> >> make the interface work
> >> because we could not pass Nulls between CF
> and
> >> Java.
> >>
> >> This is for a general-purpose developer
> utility
> >> that I use to
> >> manipulate databases.  It is especially
> useful
> >> on remote (shared) sites
> >> where  you don't have administrative
> >> privileges.
> >>
> >> I have been doing this a long time with CF
> 4.5
> >> and CF 5 on win
> >> platforms using cfobject to manipulate COM
> >> objects.
> >>
> >> But, I would like to be able to do the same
> >> thing with CFMX on
> >> non-windows platforms.
> >>
> >> Here's the difficulty:
> >>
> >> With CFMX:
> >>
> >> I can get at the equivalent of
> DatabaseMetaData
> >> on a remote windows
> >> box, using cfobject and COM objects.
> >>
> >> But, I can't get at the DatabaseMetaData on
> my
> >> local Unix (Mac OS X)
> >> developer machine -- you can't use COM
> objects
> >> and can't pass the Nulls
> >> to the Java program that gets the
> >> DatabaseMetaData.
> >>
> >> I suppose there is a way to circumvent the
> need
> >> to pass Nulls between
> >> CF and Java, but I have not had time to
> >> investigate this.
> >>
> >>> And especially from the point of view of
> >> security built-in tags are
> >>> better. All those JSP tags and Java classes
> >> are nice, but on a shared
> >>> server you need to disable them anyway
> >> because the same mechanism that
> >>> is used to access them can be used to break
> >> out of the sandbox.
> >>>
> >>
> >> Is this true for CFMXJ2ee on JRun, Websphere
> or
> >> whatever?
> >>
> >> I thought that one of the advantages of
> >> CFMXJ2ee on a J2ee-compliant
> >> app server, is the ability to interoperate
> >> between CF and Java programs.
> >>
> >> Will this be possible with Java access
> >> disabled?
> >>
> >> For the DatabaseMetaData example, I would
> >> prefer the CF tag approach.
> >>
> >> But, I still think it is valid to use Java,
> >> where warranted, on a
> >> developer machine.
> >>
> >>
> >> Dick
> >>
> >>
> >>> Jochem
> >>>
> >>
> >
>


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Archives: http://www.houseoffusion.com/cf_lists/index.cfm?forumid=4
Subscription: 
http://www.houseoffusion.com/cf_lists/index.cfm?method=subscribe&forumid=4
FAQ: http://www.thenetprofits.co.uk/coldfusion/faq
Get the mailserver that powers this list at http://www.coolfusion.com

Reply via email to