I have been writing lately about J2EE alternatives (*) for building web applications much faster. The great thing about J2EE web applications is that in my experience, once a project freezes requirements and bugs are fixed, J2EE web apps often run forever without any intervention except for doing backups (**). Combined with cheap Linux dedicated servers (I sometimes use $50/month servers – sweet price!), the cost of running web applications does not have to be prohibitive.
Another great way to keep costs down is up front: try to develop as little new code as possible while leveraging open source or commercial libraries and frameworks.
(*) CherryPy is a pythonic, object-oriented web development framework that seems just right to me for publishing behavior of Python objects as web services and web forms. Ruby on Rails is a very cool framework for quickly building database centric web sites. RoR’s wrapping of database tables as objects is just like the way I use a generator in Python to dynamically create wrappers for database tables. I believe that CherryPy and Ruby on Rails will prove to be as stable as J2EE web applications, but I don’t have enough experience with them yet.
(**) For non-life-threatening critical web applications, here is a really simple backup technique: if you have 2 deployed web applications on different dedicated servers (even better in different hosting facilities), use backup scripts on each server to do database dumps, etc., and rsync to the other server. Most rented servers have adequate disk space, and rsync reduces bandwidth by using data compression. By relying on the extremely low probability that you would experience multiple server failures, this is one more way to cut down long term maintenance costs of web applications.