<document>
<localtoc/> <s1>

A Hello, World example for EJB 3.0 is much simpler than for earlier versions of EJB. To implement the EJB you need to implement:

- A local interface
- The bean implementation

To configure Resin to be a server for the EJB you need to:

- Configure the ejb-stateless-bean
- Inject the bean into the application servlet

In this tutorial, a simple "Hello" EJB is created and deployed within Resin.

</s1> <deftable>
File Description
web.xml configuration
The local interface for the stateless session bean
The implementation for the stateless session bean
The client for the stateless session bean
</deftable>

The remote interface defines the client view of the bean. It declares all the business methods. Our only business method is the `hello` method.

package example; public interface Hello { public String hello(); }

The second class for EJBs is the bean implementation class. It implements the functionality provided by the remote interface.

package example; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import static javax.ejb.TransactionAttributeType.SUPPORTS; import javax.webbeans.Named; @Stateless public class HelloBean implements Hello { @Named("greeting") private String _greeting; @TransactionAttribute(SUPPORTS) public String hello() { return _greeting; } }

The @Stateless annotation marks the bean as a stateless session bean. Resin will create a stub implementing `Hello` and store it in the WebBeans directory with type `Hello` and name `@Named("HelloBean")`.

The @Stateless annotation can have an optional `name` value which overrides the default name of "HelloBean".

The @javax.webbeans.Named annotation tells Resin to lookup the greeting `String` in the WebBeans directory with the name binding "greeting" when the session bean is created.

In this example, the greeting is configured with an <env-entry> in the web.xml.

In some cases, it may be clearer to configure the session bean directly, rather than using WebBeans injection. Instead of creating a separate <env-entry>, you can configure the greeting value using XML straight from the resin-web.xml file.

<web-app xmlns="http://caucho.com/ns/resin"> <ejb-stateless-bean class="qa.TestBean"> <init> <greeting>Hello, World from web.xml</greeting> </init> </ejb-stateless-bean> </web-app>

Managing transactions is the primary purpose of stateless session beans. Transactions are a more powerful version of a `synchronized` lock used to protect database integrity. @TransactionAttribute marks the transaction boundary for each business method.

<example> @javax.ejb.TransactionAttribute(SUPPORTS) public String hello()

The `hello()` business method uses SUPPORTS because it's a read-only method. It doesn't need to start a new transaction on its own, but will participate in any transaction that already exists.

The REQUIRED transaction value starts up a new transaction if none already exists. It's used when updating database values.

<deftable>
TransactionAttribute meaning
REQUIRED Start a new transaction if necessary
SUPPORTS Don't start a new transaction, but use one if it exists
</deftable>

`<ejb-stateless-bean>` configure the session bean from the resin-web.xml. The <ejb-stateless-bean> entry will look at the bean's annotations to enhance the class.

<web-app xmlns="http://caucho.com/ns/resin"> <env-entry env-entry-name="greeting" env-entry-type="java.lang.String" env-entry-value="Hello, World."/> <ejb-stateless-bean class="qa.TestBean"/> </web-app>

The <ejb-stateless-bean> can optionally configure the bean directly with an <init> tag as described in the alternate dependency injection section.

import javax.webbeans.In; public class HelloServlet extends GenericServlet { @In private Hello _hello; public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { PrintWriter out = res.getWriter(); out.println(_hello.hello()); } }

The @In annotation tells Resin to look for a `Hello` component in the WebBeans directory.

The servlet could also lookup the Hello bean with JNDI in the `init()` method or use an <init> configuration in the web.xml: <servlet servlet-name="hello" servlet-class="example.HelloServlet"> <init hello="${HelloBean}"/> </servlet>

</document>