I guess many people are often “unsatisfied” with how JSF works and how much time it sometimes takes to do a simple thing. That’s why we are trying out a new combination: RoR for the frontend and CDI for the backend. How?
Deploying RoR applications to JBoss AS is really easy thanks to the TorqueBox project. You just deploy a .yml
file using the provided rake
tasks and you can develop the application “live” – no redeploys, instant changes, and so on.
Using RoR as a frontend to a CDI/Weld based application requries two more steps, so that RoR can see the business logic classes and share the same http session with CDI (so it’s possible to access @SessionScoped
beans from RoR and CDI code).
First you need to deploy your application in the DefaultDomain
(at least until TORQUE-85 is fixed). To do this, add a jboss-classloading.xml
file to the META-INF
directory with this content:
<classloading xmlns="urn:jboss:classloading:1.0"
domain="DefaultDomain"
top-level-classloader="true"
export-all="NON_EMPTY"
import-all="true">
</classloading>
Secondly, you need to add a filter to RoR’s web application, so that Weld and RoR share the same session. Just edit config/web.xml
in your RoR application (the magic in the RoR deployer will add it to the virtual .war deployment it creates) and add the following:
<web-app>
<listener>
<listener-class>org.jboss.weld.servlet.WeldListener</listener-class>
</listener>
</web-app>
Now RoR and CDI share the same session (so you can use @SessionScoped
beans etc, probably also @ConversationScoped
, but I haven’t tried that). You can lookup CDI beans from RoR code using e.g. the BeanInject class from cdi-ext, or just by writing a very simple utility method which lookups the BeanManager
.
Adam
comments powered by Disqus