Get rid of the temp files generated by ColdFusion Builder.

When opening an html file with CFBuilder, it was generating a temp file in my workspace - that wasn't going away when you closed the file. Digging into the issue, it turns out that Aptana - which is CFBuilder's HTML editor, does this. To get rid of this behavior, uncheck the following option:

view plain print about
1Window->Preferences->HTML->Editors->HTML->Preview->Generate temporary files for browser previews.

Railo on Tomcat on Windows x64 - Part III

Now that we've got Tomcat, Railo and Apache httpd up and running, lets connect Tomcat and Apache.

For this we will need a mod_jk connector. The binary can be found here.

There is no x64 connector as there is no x64 official release of Apache httpd, so we will be using the x32 connector. In my case I downloaded mod_jk-1.2.28-httpd-2.2.3.so from the win32 folder. Download this file and put it in C:\Apache2\modules. Now rename it to mod_jk.so

Create a file in c:\Apache2\conf\extra called workers.properties and put this into the file

view plain print about
1# Define 1 real worker using ajp13
2 worker.list=worker1
3 # Set properties for worker1 (ajp13)
4 worker.worker1.type=ajp13
5 worker.worker1.host=localhost
6 worker.worker1.port=8009

Now lets download Railo and lets set it up. We want to get the custom one, the jars, in my case "railo-3.1.2.001-jars.zip (34 MB)". Create a Railo folder in the Tomcat folder, in my case "C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0".

Now open up the railo zip file and put the jar files from the railo-3.1.2.001-jars into the railo folder we just created.

Now edit the catalina.properties file that was in Tomcat conf folder, in my case "C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0\conf". Find the line that says "common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar" and edit it to say "common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.home}/railo/*.jar"

Now open tomcat-users.xml and change the encoding to utf-8. At the top where it says "<?xml version='1.0' encoding='cp1252'?>" and change it to "<?xml version='1.0' encoding='utf-8'?>" This is needed due to some weird Tomcat bug on windows.

Now lets open web.xml in the Tomcat's conf directory. Just before the "Built In Servlet Mappings" add the following:

view plain print about
1<servlet>
2 <servlet-name>RailoCFMLServlet</servlet-name>
3 <description>CFML runtime Engine</description>
4 <servlet-class>railo.loader.servlet.CFMLServlet</servlet-class>
5 <init-param>
6<param-name>configuration</param-name>
7<param-value>/WEB-INF/railo</param-value>
8<description>Configuration directory</description>
9</init-param>
10 <!-- init-param>
11<param-name>railo-server-root</param-name>
12<param-value>.</param-value>
13<description>directory where railo root directory is stored</description>
14</init-param -->

15 <load-on-startup>1</load-on-startup>
16</servlet>
17<servlet>
18 <servlet-name>RailoAMFServlet</servlet-name>
19 <description>AMF Servlet for flash remoting</description>
20 <servlet-class>railo.loader.servlet.AMFServlet</servlet-class>
21 <load-on-startup>1</load-on-startup>
22</servlet>
23<servlet>
24 <servlet-name>RailoFileServlet</servlet-name>
25 <description>File Servlet for simple files</description>
26 <servlet-class>railo.loader.servlet.FileServlet</servlet-class>
27 <load-on-startup>2</load-on-startup>
28</servlet>

Now at the end of the servlet mapping section, add the following

view plain print about
1<servlet-mapping>
2 <servlet-name>RailoCFMLServlet</servlet-name>
3 <url-pattern>*.cfm</url-pattern>
4</servlet-mapping>
5<servlet-mapping>
6 <servlet-name>RailoCFMLServlet</servlet-name>
7 <url-pattern>*.cfml</url-pattern>
8</servlet-mapping>
9<servlet-mapping>
10 <servlet-name>RailoCFMLServlet</servlet-name>
11 <url-pattern>*.cfc</url-pattern>
12</servlet-mapping>
13<servlet-mapping>
14 <servlet-name>RailoAMFServlet</servlet-name>
15 <url-pattern>/flashservices/gateway/*</url-pattern>
16</servlet-mapping>
17<servlet-mapping>
18 <!-- could be RailoFileServlet -->
19 <servlet-name>default</servlet-name>
20 <url-pattern>/</url-pattern>
21</servlet-mapping>

Now open up server.xml and at the end of the file inside the Engine tag, we'll add a new host definition.

view plain print about
1<Host name="railotest" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
2 <Context path="" docBase="c:/websites/railotest" />
3</Host>

Now lets go back to our httpd-vhosts.conf Apache file. We need to add the following (I do this outside of any virtualhost definitions.

view plain print about
1# Load mod_jk module
2LoadModule jk_module modules/mod_jk.so
3# Where to find workers.properties
4JkWorkersFile conf/extra/workers.properties
5# Where to put jk shared memory
6JkShmFile logs/mod_jk.shm
7# Where to put jk logs
8JkLogFile logs/mod_jk.log
9# Set the jk log level [debug/error/info]
10JkLogLevel info
11# Select the timestamp log format
12JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

We also need to add the following to the VirtualHost definition

view plain print about
1# Send requests for cfm files to worker named worker1
2    JkMount /*.cfm     worker1

The full virtualhost definition should look like

view plain print about
1<VirtualHost *:80>
2    DocumentRoot "C:/websites/railotest"
3    ServerName railotest
4    ErrorLog "logs/railotest.com-error.log"
5    CustomLog "logs/railotest-access.log" common
6    # Send requests for cfm files to worker named worker1
7    JkMount /*.cfm     worker1
8</VirtualHost>

Now if we restart Tomcat and Apache we should be able to hit http://railotest in our browser and see the debugging info. We will also see a WEB-INF folder created inside c:\websites\railotest.

Now lets put in an alias for the railo-context so that we can get to the admin. Inside the virtual host add

view plain print about
1Alias /railo-context C:\websites\railotest\WEB-INF\railo\context

Now restart Apache and we should be able to get to the Web Administrator for this host by going to http://railotest/railo-context/admin.cfm

Railo on Tomcat on Windows x64 - Part II

In the previous two parts we installed Tomcat. Now lets set up Apache httpd server.

I suggest downloading Apache from Apache Lounge. The nice thing about Apache Lounge's builds is that they include mod_rewrite and mod_ssl.

The latest version at the time of this writing is 2.2.14. Download httpd-2.2.14-win32-x86-ssl.zip and open it in your favorite archiver (mine is WinRar).

I recommend taking the Apache2 folder inside the zip file and placing it on c:\. After you've done this you should have a c:\Apache2 folder with many files and subfolders in it.

Open c:\Apache2\conf\httpd.conf file in your favorite text editor. I recommend Textpad.

I usually change a few things from the defaults. Your configuration may differ.

Change

view plain print about
1ServerAdmin admin@example.com
to your email address.

Uncomment the following modules:

view plain print about
1#LoadModule proxy_module modules/mod_proxy.so
2#LoadModule proxy_http_module modules/mod_proxy_http.so
3#LoadModule rewrite_module modules/mod_rewrite.so
by removing the # sign in front of the line.

Find the line that says

view plain print about
1<Directory "c:/Apache2/htdocs">

After closing directory tag lets add one allowing access to our web root. I usually set up a folder or a new drive for it. Lets say we set up a webroot of "c:\websites". Create a folder websites on c: and then inside it create another folder called railotest. We will use this to set up our test site.

After the closing tag, add a new one allowing access to our web root.

view plain print about
1<Directory "c:/websites">
2 Options Indexes FollowSymLinks
3 AllowOverride None
4 Order allow,deny
5 Allow from all
6</Directory>

This will allow Apache to serve from anywhere inside c:\websites. Alternatively, you can set up a new directory entry for every site that you create, but I find that this makes things easier without significantly impacting security.

Find the line that says

view plain print about
1DirectoryIndex index.html

and add index.cfm to that list

view plain print about
1DirectoryIndex index.html index.cfm

Uncomment the line that says

view plain print about
1#Include conf/extra/httpd-vhosts.conf
by removing the # sign.

Now open up httpd-vhosts.conf file that is located in "C:\Apache2\conf\extra".

There are two sample virtual hosts defined. Lets comment them both out. Alternatively you can just delete them.

view plain print about
1<VirtualHost *:80>
2 ServerAdmin webmaster@dummy-host.example.com
3 DocumentRoot "c:/Apache2/docs/dummy-host.example.com"
4 ServerName dummy-host.example.com
5 ServerAlias www.dummy-host.example.com
6 ErrorLog "logs/dummy-host.example.com-error.log"
7 CustomLog "logs/dummy-host.example.com-access.log" common
8</VirtualHost>
9
10<VirtualHost *:80>
11 ServerAdmin webmaster@dummy-host2.example.com
12 DocumentRoot "c:/Apache2/docs/dummy-host2.example.com"
13 ServerName dummy-host2.example.com
14 ErrorLog "logs/dummy-host2.example.com-error.log"
15 CustomLog "logs/dummy-host2.example.com-access.log" common
16</VirtualHost>
should look like this:

view plain print about
1#<VirtualHost *:80>
2# ServerAdmin webmaster@dummy-host.example.com
3# DocumentRoot "c:/Apache2/docs/dummy-host.example.com"
4# ServerName dummy-host.example.com
5# ServerAlias www.dummy-host.example.com
6# ErrorLog "logs/dummy-host.example.com-error.log"
7# CustomLog "logs/dummy-host.example.com-access.log" common
8#</VirtualHost>
9#
10#<VirtualHost *:80>
11# ServerAdmin webmaster@dummy-host2.example.com
12# DocumentRoot "c:/Apache2/docs/dummy-host2.example.com"
13# ServerName dummy-host2.example.com
14# ErrorLog "logs/dummy-host2.example.com-error.log"
15# CustomLog "logs/dummy-host2.example.com-access.log" common
16#</VirtualHost>

Now lets add a new entry for our test server

view plain print about
1<VirtualHost *:80>
2 DocumentRoot "C:/websites/railotest"
3 ServerName railotest
4 ErrorLog "logs/railotest.com-error.log"
5 CustomLog "logs/railotest-access.log" common
6</VirtualHost>

Now save the files and lets try running apache and see if it worked. Open up command prompt (Start -> Run -> cmd.exe)

view plain print about
1Microsoft Windows [Version 5.2.3790]
2(C) Copyright 1985-2003 Microsoft Corp.
3
4C:\Documents and Settings\Administrator>
cd \apache2\bin
5
6C:\Apache2\bin>httpd
7httpd: Could not reliably determine the server's fully qualified domain name, using xxx.xxx.xxx.xxx for ServerName
We can ignore that warning since we don't care about the default configuration.

Now we will need to define a host called railotest using windows hosts file. Open up "C:\windows\system32\drivers\etc\hosts" file in your favorite text editor.

After a bunch of comments, you should see

view plain print about
1127.0.0.1 localhost

Lets add an entry for railotest

view plain print about
1127.0.0.1 railotest

Now this computer knows that railotest points to 127.0.0.1.

Lets put a test cfm file in the webroot for railotest. Create a new file called index.cfm and put it in c:\websites\railotest.

Inside the file lets put some basic cf code

view plain print about
1<cfdump var="#server#">

If you still have apache running and put in http://railotest in your browser you should see the code being output. It is not being interpreted yet because we have not hooked up Apache httpd to Railo. We will do this in Part IV.

For now lets set up apache to run as a service.

First stop the httpd that you ran earlier by entering ctrl-c and do the following.

view plain print about
1C:\Apache2\bin>httpd -k install
2Installing the Apache2.2 service
3The Apache2.2 service is successfully installed.
4Testing httpd.conf....
5Errors reported here must be corrected before the service can be started.
6httpd: Could not reliably determine the server's fully qualified domain name, using xxx.xxx.xxx.xxx for ServerName

The Apache service is now installed. I recommend also adding the "Apache Monitor" app to your startup folder.

Click Start->All Programs and right click on Startup. Now click "Explore All Users". In another explorer window open up C:\Apache2\Bin and right drag ApacheMonitor.exe to the Startup folder. Let go of the right mouse button and select "Create shortcut here".

Double click on the shortcut and the monitor App should appear in your taskbar next to the clock and next to Tomcat's icon.

Double click it to open it and click start. Now you have a working Apache installation that will start as a service.

If you enter http://railotest in your browser, you should see the code we wrote earlier. This will persist across reboots.

In the next part, we'll hook it up to Railo and be able to actually execute this code.

Railo on Tomcat on Windows x64 - Part I

I tried following Sean Corfield's excellent post on how to get Railo running on Tomcat, but ran into a few snags on my x64 windows system.

First download Tomcat 6 from the Apache Foundation. I picked the "Windows Service Installer" of the Core.

Start up the installer and hit next a few times until you get to the "Choose Components" section. Select Full install and then uncheck the Examples item as we won't be needing it.

Pick the installation folder, and the default port, and set a password for the administrator. At the next step it will ask for a path to a J2SE 5.0 JRE installation. Finding this on Sun's site is a bit of a pain, so here is a link to the J2SE 5.0 Update 22, which is the latest as of this writing.

Download it, install it and make a note of what folder it installs in. In my case it was "C:\Program Files\Java\jre1.5.0_22". This is the path I provided to Tomcat installer.

Finish the tomcat installation and you will see that the service is installed, but will not start. This is because we need the 64bit service wrapper

The only file that should be in there is tomcat6.exe. Download it and replace the one in your tomcat's installation bin folder. In my case that folder is "C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0\bin".

Now if you go to "http://localhost:8080/", you should see The Tomcat default start page.

In part II, we will cover getting setting up Apache.

CFEclipse 1.3.1.5 on Eclipse 3.3 (Europa) Line Number workaround

CFEclipse 1.3.1.5 was recently released and it works with Eclipse 3.3 (Europa). It seems that some of the people using it can't seem to get the line number feature to work.

It looks like in order to get line numbers working properly, you will need to go to Window->Preferences->CFEclipse->Editor and check off "Show line numbers". The little menu that comes up when clicking on the gutter in the editor doesn't seem to work, and I'm guessing that Mark Drew just forgot to override/implement that menu in CFEclipse for 3.3. Hopefully he will fix it soon.

Getting IIS and Apache to run side by side on Windows 2003

Getting IIS and Apache running side by side is not as easy as telling IIS to listen on one IP and Apache on the other. You will need to tell IIS to not be greedy and stop listening on all IPs. In order to do that, you will need the Windows 2003 SP1 Support Tools' httpcfg.exe utility to set the IP's that IIS listens on.

view plain print about
1httpcfg set iplisten -i xxx.xxx.x.x

You would need to run this command once for each IP that you're using. If using a lot of IP's, I suggest writing a simple batch script.

Once you have done this, and restarted IIS, you can use the IP that you have not included in the IP list above for your Apache server.

ColdFusion Var Bug

Now we all know why we should var our variables in CFC methods. If you don't, the variables you create will bleed into other functions, and can wreak havoc on your application, especially if you cache your CFCs.

Suppose you have a component called MyComponent.cfc.

view plain print about
1<component name="MyComponent">
2 <cffunction name="method1">
3 <cfset var myQry="">
4 <cfquery name="myQry" datasource="myDSN">
5 insert into table (somefield) values (1)
6 </cfquery>
7 <cfquery name="myQry" datasource="myDSN">
8 select * from table where somefield=1
9 </cfquery>
10 </cffunction>
11 <cffunction name="method2">
12 <cfdump var="#myQry#">
13 </cffunction>
14</component>

Now lets say you have a test file that looks something like this:

view plain print about
1<cfobject name="application.myComponent" component="myComponent">
2<cfinvoke component="#application.myComponent#" method="method1">
3<cfinvoke component="#application myComponent#" method="method2">

What do you expect the output to be? It should just throw an error when you call method2, saying that myQry is not defined. What will happen is you will see the dump of myQry, which has bled out from the other method.

Apparently, what happens is when the first query runs, it doesn't return anything, and the myQry variable gets erased. (If you try dumping it right afterwards, you will see that it's not defined).

When the second query runs, it will create the myQry variable in the standard scope, which is local to the CFC. There are workarounds, but hopefully Adobe will fix it in their next updater.

One such workaround is to use a struct for the local variables, like this:

view plain print about
1<component name="MyComponent">
2 <cffunction name="method1">
3 <cfset var local=StructNew()>
4 <cfquery name="local.myQry" datasource="myDSN">
5 insert into table (somefield) values (1)
6 </cfquery>
7 <cfquery name="local.myQry" datasource="myDSN">
8 select * from table where somefield=1
9 </cfquery>
10 </cffunction>
11 <cffunction name="method2">
12 <cfdump var="#local.myQry#">
13 </cffunction>
14</component>

Now if you try running the same code, you will get an error saying that "local.myQry" is not defined.