- From: Anselm Baird_Smith <abaird@www43.inria.fr>
- Date: Thu, 13 Mar 1997 13:35:30 +0100 (MET)
- To: www-jigsaw@w3.org
This is a ten minute piece of code, it's over powerfull, you ought to check it :-) It's an extension to SSI, that will allow you to create templates that access a database. A sample example will explain it better: <html> <head> <title>Database SSI</title> </head> <body> <h1>Database SSI</h1> <p>This Server Side Include extension allows you to query a database (which I am doing right now) <!-- First step, make a query to the database --> <!--#jdbc select="SELECT * FROM users" name="result" driver="imaginary.sql.iMsqlDriver" url="jdbc:msql://www43.inria.fr:4333/demo" --> <!-- Second Step, skip to first row --> <!--#jdbc name="result" next="true" --> <!-- Third step: have fun with the results --> <p>The query has run, here is the first result: <p>First row: <!--#jdbc name="result" column="1" --> <p>Second row: <!--#jdbc name="result" column="2" --> </body> </html> I am all over excited, you have to understand that as SSIResources can be nested, you can get the template from a database, and have it filled through the database, not to mention things like per-client page customization... Anselm. ----- For those of you who want to share fun, here is *all* the code needed ! BTW It needs improvement, of course; don't forget to register the new command in some command registry, ie add in DefaultCommandRegistry.java : private static Command[] cmds = { new ConfigCommand(), new IncludeCommand(), new EchoCommand(), new FSizeCommand(), new FLastModCommand(), new ExecCommand(), new SampleCommand(), new CountCommand(), new CookieCommand(), new w3c.jigsaw.ssi.jdbc.jdbcCommand() }; ---- w3c.jigsaw.ssi.jdbc.jdbcCommand package w3c.jigsaw.ssi.jdbc; import java.util.*; import java.sql.*; import w3c.www.http.*; import w3c.jigsaw.http.*; import w3c.jigsaw.resources.*; import w3c.util.*; import w3c.jigsaw.ssi.*; public class jdbcCommand implements Command { private final static String NAME = "jdbc"; private final static boolean debug = true; private static final String keys[] = { "select", "url", "driver", "name", "column", "next" }; protected Connection getConnection(String driver, String url) { try { Class.forName(driver); return DriverManager.getConnection(url, "abaird", ""); } catch (Exception ex) { ex.printStackTrace(); } return null; } protected ResultSet performSelect(Connection conn, String cmd) { try { Statement smt = conn.createStatement(); ResultSet set = smt.executeQuery(cmd); return set; } catch (Exception ex) { ex.printStackTrace(); } return null; } protected void addSet(Dictionary d, String name, ResultSet set) { d.put(getClass().getName()+"."+name, set); } protected ResultSet getSet(Dictionary d, String name) { return (ResultSet) d.get(getClass().getName()+"."+name); } public String getName() { return NAME; } public Reply execute(SSIResource resource , Request request , ArrayDictionary parameters , Dictionary variables) { Object values[] = parameters.getMany(keys); String select = (String) values[0]; String url = (String) values[1]; String driver = (String) values[2]; String name = (String) values[3]; String column = (String) values[4]; String next = (String) values[5]; String text = null; if ( select != null ) { Connection conn = getConnection(driver, url); if ( conn != null ) addSet(variables, name, performSelect(conn, select)); } else if (column != null) { ResultSet set = getSet(variables, name); try { if ( set != null ) text = set.getObject(Integer.parseInt(column)).toString(); } catch (Exception ex) { ex.printStackTrace(); } } else if ( next != null ) { ResultSet set = getSet(variables, name); if ( set != null ) { try { set.next(); } catch (Exception ex) { ex.printStackTrace(); } } } // We are NOT doing notMod hack here (tricky and useless ?) Reply reply = resource.createCommandReply(request, HTTP.OK); if ( text != null ) reply.setContent(text); return reply; } }
Received on Thursday, 13 March 1997 07:35:29 UTC