struts ejb tutorial

72
Building a CMP Based Payment Voucher Web Application By Using Struts and EJB In this tutorial, you will create a CMP based payment voucher web application by using Struts and EJB. You will learn how to create a Container Managed Entity Bean to store the voucher. A Session bean will be used to interact with the CMP. A Model-View-Controller architecture known as Struts will serve as the front end. The Web portion of this tutorial was adapted from the Building a CMP Based School Schedule Web Application tutorial by Jason Sholl. Prerequisites For The Tutorial 1. Web Tools Platform (WTP) project The WTP project can be downloaded from http://download.eclipse.org/webtools/downloads/ 2. JDK 1.4.2 Sun's JDK is available from http://java.sun.com/j2se/1.4.2/download.html 3. JBoss 3.2.3 JBoss is available from http://www.jboss.org/products/jbossas/downloads 4. XDoclet 1.2.3 XDoclet is available from http://xdoclet.sourceforge.net/xdoclet/install.html Installing The JBoss and XDoclet Runtimes In Eclipse In order to run the EJB and Web modules from Eclipse (which will allow you to test and debug the modules), Eclipse has to be told where to find JBoss, XDoclet and where to find the JDK. JBoss requires a JDK so it can compile java class and JSPs. 1. Select Window -> Preferences.

description

Building a CMP Based Payment Voucher Web Application By Using Struts and EJB in JBoss server

Transcript of struts ejb tutorial

Page 1: struts ejb tutorial

Building a CMP Based Payment Voucher Web Application By Using Struts and EJB

In this tutorial, you will create a CMP based payment voucher web application by using Struts and EJB. You will learn how to create a Container Managed Entity Bean to store the voucher. A Session bean will be used to interact with the CMP. A Model-View-Controller architecture known as Struts will serve as the front end. The Web portion of this tutorial was adapted from the Building a CMP Based School Schedule Web Application tutorial by Jason Sholl.

Prerequisites For The Tutorial1. Web Tools Platform (WTP) project

The WTP project can be downloaded from http://download.eclipse.org/webtools/downloads/

2. JDK 1.4.2Sun's JDK is available from http://java.sun.com/j2se/1.4.2/download.html

3. JBoss 3.2.3JBoss is available from http://www.jboss.org/products/jbossas/downloads

4. XDoclet 1.2.3XDoclet is available from http://xdoclet.sourceforge.net/xdoclet/install.html

Installing The JBoss and XDoclet Runtimes In EclipseIn order to run the EJB and Web modules from Eclipse (which will allow you to test and debug the modules), Eclipse has to be told where to find JBoss, XDoclet and where to find the JDK. JBoss requires a JDK so it can compile java class and JSPs.

1. Select Window -> Preferences.

Page 2: struts ejb tutorial

2. Select Java -> Installed JREs from the menu on the left.

3. Select Add.... The Add JRE dialog will open. Name the runtime Sun JDK 1.4.2. Select Browser for the JRE home directory and choose the location where you installed the JDK 1.4.2. And then click OK.

Page 3: struts ejb tutorial

4. The Sun JDK 1.4.2 now shows on the list of installed runtimes.

Page 4: struts ejb tutorial

5. Select Server -> Installed Runtimes from the menu on the left.

Page 5: struts ejb tutorial

6. Click on Add.... Select JBoss -> JBoss v3.2.3 and click Next. Click Browse and select the location where you installed JBoss and click Finish.

Page 6: struts ejb tutorial

7. Check JBoss v3.2.3.8. Select XDoclet. Make sure the builder item is enabled. Click on the Browse... button and choose

the directory where you have installed XDoclet. Make sure that you choose the correct version. Click Apply.

Page 7: struts ejb tutorial

9. Select XDoclet -> ejbdoclet. Check JBoss. Click Edit... button to make sure JBoss version is 3.2. Click Apply.

Page 8: struts ejb tutorial

10. Select XDoclet -> webdoclet. Check JBoss. Click Edit... button to make sure JBoss version is 3.2. Click Apply.

Page 9: struts ejb tutorial

11. Click OK to close the preferences dialog. JDK, XDoclet and JBoss are now configured in Eclipse.

Creating An EJB ProjectThe first step is to create an EJB project for the EJB module.

1. Select File -> New -> Project -> EJB -> EJB Project.

Page 10: struts ejb tutorial

2. Click Next and fill in 'PaymentVoucherEJB' for the EJB project name, check 'Add project to an EAR' and fill in 'PaymentVoucherEAR' for the EAR Application name, click Next.

Page 11: struts ejb tutorial

3. Click Next again and uncheck EJB client JAR support, and click Finish.

Page 12: struts ejb tutorial

4. Once the wizard finishes, switch to the J2EE Perspective and see your newly created EJB Project.

Page 13: struts ejb tutorial

Creating An EJB Session BeanNow you will create a Session bean in the PaymentVoucherEJB EJB project.

1. Select File -> New -> Other -> EJB -> XDoclet Enterprise JavaBean.

Page 14: struts ejb tutorial

2. Click Next and check 'SessionBean'.

Page 15: struts ejb tutorial

3. Click Next, fill in 'ejbs' for the package and 'PaymentVoucherSessionBean' for the class name.

Page 16: struts ejb tutorial

4. Click finish to create your Session bean and see it in the Project Explorer. The annotations builder should have run and generated local and remote, and local and remote home interfaces.

Page 17: struts ejb tutorial

It is important to remember when developing EJBs using Xdoclet to only edit the actual bean classes (e.g. ejbs.PaymentVoucherSessionBean). All deployment descriptor metadata, as well as the various EJB interfaces are generated using the XDoclet javadoc tags. If you open PaymentVoucherSessionBean, you can see some of these tags. Full documentation on how to use these tags can be found in the XDoclet docs.

Creating A CMP BeanAt the time of this writing, there is no tooling support Entity beans. Entity beans may be created, however, using JDT tools and XDoclet tags.

1. Right click on ejbs and select New -> Other -> Java -> Class, click Next.

Page 18: struts ejb tutorial
Page 19: struts ejb tutorial

2. Fill in the following information: Package: ejbs, Name: PaymentVoucherItemBean, Modifiers: public and abstract, Superclass: java.lang.Object, Interfaces: javax.ejb.EntityBean. Then click finish.

Page 20: struts ejb tutorial

3. Now, open ejbs.PaymentVoucherItemBean.java in the Java editor. XDoclet tags need to be added in order for XDoclet to properly generate all the necessary code and ejb meta data. Start by adding the following javadoc to the bean class itself (right above the line: public abstract class PaymentVoucherItemBean). This code specifies that this bean is a CMP, should only have local interface, defines the interfaces names, and specifies that the primary key is type java.lang.Integer and is handled by field 'id'.

/** * Bean implementation class for Entity Bean: PaymentVoucherItem * * @ejb.bean name="PaymentVoucherItem" type="CMP" cmp-version="2.x" * schema="PaymentVoucherItem" * local-jndi-name="ejb/ejbs/PaymentVoucherItemLocalHome" * view-type="local" reentrant="true" primkey-field="id" * * @ejb.home local-class="ejbs.PaymentVoucherItemLocalHome" * * @ejb.interface local-class="ejbs.PaymentVoucherItemLocal" * * @ejb.pk class="java.lang.Integer" */

4. Now add the necessary getters/setters and XDoclet tags for the primary key.

Page 21: struts ejb tutorial

/** * @ejb.persistence read-only="false" * @ejb.interface-method view-type="local" */public abstract Integer getId();

/** * @ejb.persistence */public abstract void setId(Integer id);

5. At this point, if you save PaymentVoucherItemBean, the XDoclet builder should run cleanly.

6. Now, to add a few more CMP attributes to PaymentVoucherItem bean, add getters/setters and XDoclet tags.

/** * @ejb.persistence read-only="false" * @ejb.interface-method view-type="local" */public abstract String getType();

/** * @ejb.persistence

Page 22: struts ejb tutorial

* @ejb.interface-method view-type="local" */public abstract void setType(String type);

/** * @ejb.persistence read-only="false" * @ejb.interface-method view-type="local" */public abstract String getCode();

/** * @ejb.persistence * @ejb.interface-method view-type="local" */public abstract void setCode(String code);

/** * @ejb.persistence read-only="false" * @ejb.interface-method view-type="local" */public abstract String getDescription();

/** * @ejb.persistence * @ejb.interface-method view-type="local" */public abstract void setDescription(String description);

/** * @ejb.persistence read-only="false" * @ejb.interface-method view-type="local" */public abstract float getAmount();

/** * @ejb.persistence * @ejb.interface-method view-type="local" */public abstract void setAmount(float amount);

/** * @ejb.persistence read-only="false" * @ejb.interface-method view-type="local" */public abstract String getName();

/** * @ejb.persistence * @ejb.interface-method view-type="local" */public abstract void setName(String name);

/** * @ejb.persistence read-only="false" * @ejb.interface-method view-type="local" */public abstract String getIc();

Page 23: struts ejb tutorial

/** * @ejb.persistence * @ejb.interface-method view-type="local" */public abstract void setIc(String ic);

/** * @ejb.persistence read-only="false" * @ejb.interface-method view-type="local" */public abstract String getPaymentType();

/** * @ejb.persistence * @ejb.interface-method view-type="local" */public abstract void setPaymentType(String paymentType);

7. Next is to add a means by which to create PaymentVoucherItemBean. The create method will take the Name for the new PaymentVoucherItem and autogenerate a new key. The rudimentary key generation code is for example purposes only. After you paste the code below, do an organized imports (Control-Shift-o) to add an import for CreateException.

private static int PRIMKEY = (int) System.currentTimeMillis();

/** * ejbCreate * * @ejb.create-method view-type="local" */public Integer ejbCreate(String name) throws CreateException {

setId(new Integer(PRIMKEY++));setName(name);return null;

}

/** * ejbPostCreate */public void ejbPostCreate(String name) throws CreateException {}

8. The last step is to add a few finder definitions. These should be added to the class level javadoc (right below @ejb.pk class definition added before).

* @ejb.finder signature="java.util.Collection findAll()"* query="select object(o) from PaymentVoucher o"* * @ejb.finder signature="java.util.Collection findByIc(String ic)"* query="select object(o) from PaymentVoucher o where o.ic = (?1)"** @ejb.finder signature="java.util.Collection findByName(String name)"* query="select object(o) from PaymentVoucher o where o.name = (?1)"

Page 24: struts ejb tutorial

** @ejb.finder signature="java.util.Collection findByPrimaryKey(Integer id)"* query="select object(o) from PaymentVoucher o where o.id = ?1"

9. At this point if you save and build, you should be able to open PaymentVoucherItemLocal and PaymentVoucherItemLocalHome and see all method stubs were appropriately generated. Do not edit these files. Once you are done inspecting them, close them both.

Adding purpose to PaymentVoucherSessionBean1. If PaymentVoucherSessionBean is not open, open it in the JavaEditor. The first thing we need to

do is add a local reference from the PaymentVoucherSessionBean to the PaymentVoucherItemLocal. This requires the following XDoclet tag at the class level (put this right below the *@ejb.bean name=”PaymentVoucherSession” block). The second tag which starts with @jboss.ejb-local-ref is a JBoss specific XDoclet tag used to setup the JNDI name; other vendors also have their own specific tags where needed.

* @ejb.ejb-ref ejb-name="PaymentVoucherItem" view-type="local"* * @jboss.ejb-local-ref ref-name="PaymentVoucherItemLocal"* jndi-name="ejb/ejbs/PaymentVoucherItemLocalHome"

2. Since PaymentVoucherSessionBean will be used by the forthcoming web client instead of PaymentVoucherItemBean, it is necessary to add a few methods to access PaymentVoucherItems. The below code supplies a way for clients to create new PaymentVoucherItems, and find existing ones using the finders we specified previously. Note that PaymentVoucherItems beans are not returned directly, but, rather their data is wrapped up in a PaymentVoucherItemWrapper. The PaymentVoucherItemWrapper will be created in the next step. Delete the existing 'foo' method and add the following methods to PaymentVoucherSessionBean. You will have several compile errors which can be fixed using organized imports (Control-Shift-o); just be sure you select the correct types if there are multiple choices (javax.naming.Context, javax.rmi.PortableRemoteObject, java.util.List, java.util.Iterator).

/** * @ejb.interface-method view-type="both" */public PaymentVoucherItemWrapper addPaymentVoucherItem(String type,

String code, String description, float amount, String name,String ic, String paymentType) {

PaymentVoucherItemLocalHome home = getPaymentVoucherItemLocalHome();try {

PaymentVoucherItemLocal paymentVoucherItem = home.create(name);paymentVoucherItem.setType(type);paymentVoucherItem.setCode(code);paymentVoucherItem.setDescription(description);paymentVoucherItem.setAmount(amount);paymentVoucherItem.setIc(ic);paymentVoucherItem.setPaymentType(paymentType);return new PaymentVoucherItemWrapper(type, code, description,

amount, name, ic, paymentType);} catch (CreateException e) {

Page 25: struts ejb tutorial

// TODO Auto-generated catch blocke.printStackTrace();

}return null;

}

/** * @ejb.interface-method view-type="both" */public PaymentVoucherItemWrapper editPaymentVoucherItemForId(Integer id,

String type,String code, String description, float amount, String name,String ic, String paymentType) {

PaymentVoucherItemLocalHome home = getPaymentVoucherItemLocalHome();try {

PaymentVoucherItemLocal paymentVoucherItem = home.findByPrimaryKey(id);

paymentVoucherItem.setType(type);paymentVoucherItem.setCode(code);paymentVoucherItem.setDescription(description);paymentVoucherItem.setAmount(amount);paymentVoucherItem.setIc(ic);paymentVoucherItem.setPaymentType(paymentType);return new PaymentVoucherItemWrapper(id, type, code, description,

amount, name, ic, paymentType);} catch (Exception e) {

// TODO Auto-generated catch blocke.printStackTrace();

}return null;

}

/** * @ejb.interface-method view-type="both" */public List getPaymentVoucherItem(String name) {

PaymentVoucherItemLocalHome home = getPaymentVoucherItemLocalHome();try {

Collection items = home.findByName(name);return wrapPaymentVoucherItemsInList(items);

} catch (FinderException e) {// TODO Auto-generated catch blocke.printStackTrace();

}return null;

}

/** * @ejb.interface-method view-type="both" */public List getAllPaymentVoucherItems() {

PaymentVoucherItemLocalHome home = getPaymentVoucherItemLocalHome();try {

Collection items = home.findAll();return wrapPaymentVoucherItemsInList(items);

} catch (FinderException e) {// TODO Auto-generated catch block

Page 26: struts ejb tutorial

e.printStackTrace();}return null;

}

/** * @ejb.interface-method view-type="both" */public List getPaymentVoucherItemsForIc(String ic) {

PaymentVoucherItemLocalHome home = getPaymentVoucherItemLocalHome();try {

Collection items = home.findByIc(ic);return wrapPaymentVoucherItemsInList(items);

} catch (FinderException e) {// TODO Auto-generated catch blocke.printStackTrace();

}return null;

}

/** * @ejb.interface-method view-type="both" */public List getPaymentVoucherItemsForId(Integer id) {

PaymentVoucherItemLocalHome home = getPaymentVoucherItemLocalHome();try {

Collection items = (Collection) home.findByPrimaryKey(id);return wrapPaymentVoucherItemsInList(items);

} catch (FinderException e) {// TODO Auto-generated catch blocke.printStackTrace();

}return null;

}

/** * @ejb.interface-method view-type="both" */public void removePaymentVoucherItemsForId(Integer id) {

PaymentVoucherItemLocalHome home = getPaymentVoucherItemLocalHome();try {

home.findByPrimaryKey(id).remove();} catch (Exception e) {

// TODO Auto-generated catch blocke.printStackTrace();

}}

/** * @ejb.interface-method view-type="both" */public void editPaymentVoucherItemsForId(Integer id, String type,

String code, String description, float amount, String name,String ic, String paymentType) {

PaymentVoucherItemLocalHome home = getPaymentVoucherItemLocalHome();try {

home.findByPrimaryKey(id).setType(type);

Page 27: struts ejb tutorial

home.findByPrimaryKey(id).setCode(code);home.findByPrimaryKey(id).setDescription(description);home.findByPrimaryKey(id).setAmount(amount);home.findByPrimaryKey(id).setName(name);home.findByPrimaryKey(id).setIc(ic);home.findByPrimaryKey(id).setPaymentType(paymentType);

} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();

}}

private List wrapPaymentVoucherItemsInList(Collection items) {Iterator iterator = items.iterator();List list = new ArrayList(items.size());while (iterator.hasNext()) {

PaymentVoucherItemLocal paymentVoucherItem = (PaymentVoucherItemLocal) iterator

.next();PaymentVoucherItemWrapper wrapper = new PaymentVoucherItemWrapper(

paymentVoucherItem.getId(), paymentVoucherItem.getType(),

paymentVoucherItem.getCode(), paymentVoucherItem.getDescription(),

paymentVoucherItem.getAmount(),paymentVoucherItem.getName(),

paymentVoucherItem.getIc(),paymentVoucherItem.getPaymentType());

list.add(wrapper);}return list;

}

private PaymentVoucherItemLocalHome getPaymentVoucherItemLocalHome() {try {

Context context = new InitialContext();Object obj = context

.lookup("java:comp/env/ejb/PaymentVoucherItemLocal");PaymentVoucherItemLocalHome home = (PaymentVoucherItemLocalHome)

PortableRemoteObject.narrow(obj, PaymentVoucherItemLocalHome.class);

return home;} catch (NamingException e) {

// TODO Auto-generated catch blocke.printStackTrace();

}return null;

}

3. Next, PaymentVoucherItemWrapper needs to be created. Create a new Class called PaymentVoucherItemWrapper in the ejbs package. Be sure to add the java.io.Serializable interface. Then click Finish.

Page 28: struts ejb tutorial

4. Next, open PaymentVoucherItemWrapper in the Java editor and add the following fields.

public Integer id;

public String type;

public String code;

public String description;

public float amount;

public String name;

public String ic;

Page 29: struts ejb tutorial

public String paymentType;

5. Right click on PaymentVoucherItemWrapper in the source editor and select Source -> Generate Getters and Setters. Generate a getter and setter for each field.

Page 30: struts ejb tutorial

6. Finally, add the following constructor.

public PaymentVoucherItemWrapper(Integer id, String type, String code,String description, float amount, String name, String ic,String paymentType) {

this.id = id;this.type = type;this.code = code;this.description = description;this.amount = amount;this.name = name;this.ic = ic;this.paymentType = paymentType;

}

public PaymentVoucherItemWrapper(String type, String code,String description, float amount, String name, String ic,String paymentType) {

this.type = type;this.code = code;this.description = description;this.amount = amount;

Page 31: struts ejb tutorial

this.name = name;this.ic = ic;this.paymentType = paymentType;

}

Building a Struts ProjectThe first step is to create a Struts project. The easiest way is to import the struts-blank.war file.

1. Select File -> Import... -> WAR file and click Next.

2. Click Browse... and select the location where you downloaded the WAR file, fill in 'StrutsPaymentVoucher' for the Web project name and select 'JBoss v3.2.3' for target runtime, check 'Add module to an EAR application' and fill in 'PaymentVoucherEAR' for the EAR Application name. Click finish.

Page 32: struts ejb tutorial

3. Expand the 'Dynamic Web Projects' node in the project explorer, and right click on StrutsPaymentVoucher and select 'Properties'.

Page 33: struts ejb tutorial

4. Select the 'J2EE Module Dependencies' properties page, and then click the checkbox next to 'PaymentVoucherEJB.jar' to add a module dependency to the EJB module.

Page 34: struts ejb tutorial

Creating struts-config.xml fileA Struts application has to have a Struts application configuration file. In this example and in most other simple Struts applications, the default name of the configuration file is struts-config.xml and it typically resides under application's ./WEB-INF directory. The configuration information is then read by Struts framework when the application gets started.

1. Open struts-config.xml in Text Editor if it is not open.

Page 35: struts ejb tutorial

2. Add the following XML tags to define form bean definition and action mapping definition.

<!-- ========== Form Bean Definitions ================= --><form-beans>

<form-bean name="SubmitForm" type="submit.SubmitForm"/></form-beans>

Page 36: struts ejb tutorial

<!-- ========== Action Mapping Definitions ============ --><action-mappings><action path="/list"

type="submit.ListAction"name="SubmitForm"input="/index.jsp"scope="request"validate="true">

<forward name="afterAdd" path="/print.jsp"/><forward name="printResults" path="/print.jsp"/><forward name="edit" path="/edit.jsp"/><forward name="afterUpdate" path="/print.jsp"/><forward name="afterDelete" path="/index.jsp"/><forward name="index" path="/index.jsp"/>

</action>

<action path="/edit"type="submit.EditAction"name="SubmitForm"input="/edit.jsp"scope="request"validate="true">

<forward name="edit" path="/edit.jsp"/><forward name="afterUpdate" path="/print.jsp"/><forward name="index" path="/index.jsp"/>

</action></action-mappings>

Creating ActionForm ClassesNext, you will create a class which captures input form data that is entered by an end user. An ActionForm class is a JavaBean and each input form data field is mapped to a property of the ActionForm class. Consequently you write getter and setter methods for each of the properties.

1. Select File -> New -> Other -> Java -> Class and then click Next.

Page 37: struts ejb tutorial

2. Fill in 'submit' for the package, and 'SubmitForm' for the class name and then click Finish.

Page 38: struts ejb tutorial

3. Next, open SubmitForm in the Java editor and add the following code.

package submit;

import org.apache.struts.validator.ValidatorForm;

public final class SubmitForm extends ValidatorForm {

private String operation;public String getOperation() {

return operation;}

public void setOperation(String operation) {

Page 39: struts ejb tutorial

this.operation = operation;}

private String type;public String getType() {

return type;}

public void setType(String type) {this.type = type;

}

private String code;public String getCode() {

return code;}

public void setCode(String code) {this.code = code;

}

private String description;public String getDescription() {

return description;}

public void setDescription(String description) {this.description = description;

}

private String amount;public String getAmount() {

return amount;}

public void setAmount(String amount) {this.amount = amount;

}

private String name;public String getName() {

return name;}

public void setName(String name) {this.name = name;

}

private String ic;public String getIc() {

return ic;}

public void setIc(String ic) {this.ic = ic;

}

Page 40: struts ejb tutorial

private String paymentType;public String getPaymentType() {

return paymentType;}

public void setPaymentType(String paymentType) {this.paymentType = paymentType;

}

private String searchName;public String getSearchName() {

return searchName;}

public void setSearchName(String searchName) {this.searchName = searchName;

}

private String searchIC;public String getSearchIC() {

return searchIC;}

public void setSearchIC(String searchIC) {this.searchIC = searchIC;

}}

Creating Action ClassesNow you need to create two Action classes which the execute() method of the Action class get invoked by the Struts framework for each request.

1. Select File -> New -> Other -> Java -> Class and then click Next.

Page 41: struts ejb tutorial

2. Fill in 'submit' for the package, and 'ListAction' for the class name and then click Finish.

Page 42: struts ejb tutorial

3. Open ListAction in the Java editor and add the following code to provide business logic of your application.

package submit;

import javax.ejb.CreateException;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;import javax.rmi.PortableRemoteObject;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;

Page 43: struts ejb tutorial

import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;

import ejbs.PaymentVoucherSessionLocal;import ejbs.PaymentVoucherSessionLocalHome;

/** * @web.ejb-local-ref home="ejbs.PaymentVoucherSessionLocalHome" * local="ejbs.PaymentVoucherSessionLocal" * name="ejb/PaymentVoucherSession" type="Session" * link="PaymentVoucherSession" * * @jboss.ejb-local-ref ref-name="PaymentVoucherSession" * jndi-name="ejb/ejbs/PaymentVoucherSessionHome" * */

public final class ListAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {

try {PaymentVoucherSessionLocal paymentVoucherSession =

getPaymentVoucherSession();String operation = request.getParameter("operation");if (operation.equals("add")) {

// Cast ActionForm object to SubmitForm typeSubmitForm f = (SubmitForm) form;

String type = f.getType();String code = f.getCode();String description = f.getDescription();float amount = Float.parseFloat(f.getAmount());String name = f.getName();String ic = f.getIc();String paymentType = f.getPaymentType();

paymentVoucherSession.addPaymentVoucherItem(type, code,description, amount, name, ic, paymentType);

request.getSession().setAttribute("items",

paymentVoucherSession.getAllPaymentVoucherItems());request.getSession().setAttribute("title",

"<p><b>:: PAYMENT VOUCHER ADDED SUCCESSFULLY ::</b></p>");

return (mapping.findForward("afterAdd"));}

else if (operation.equals("name")) {String name = request.getParameter("searchName");request.getSession().setAttribute("title",

"<p><b>:: NAME MATCHING " + name + "::</b></p>");

request.getSession().setAttribute("items",

Page 44: struts ejb tutorial

paymentVoucherSession.getPaymentVoucherItem(name));

return (mapping.findForward("printResults"));}

else if (operation.equals("ic")) {String ic = request.getParameter("searchIC");request.getSession().setAttribute("title",

"<p><b>:: IC MATCHING " + ic + "::</b></p>");request.getSession().setAttribute("items",

paymentVoucherSession.getPaymentVoucherItemsForIc(ic));

return (mapping.findForward("printResults"));}

else if (operation.equals("list")) {request.getSession().setAttribute("items",

paymentVoucherSession.getAllPaymentVoucherItems());request.getSession().setAttribute("title",

"<p><b>:: ALL PAYMENT VOUCHERS ::</b></p>");

return (mapping.findForward("printResults"));}

else if (operation.equals("edit")) {return (mapping.findForward("edit"));

}

else if (operation.equals("update")) {paymentVoucherSession.editPaymentVoucherItemsForId(

new Integer(request.getParameter("id")),request.getParameter("type"),request.getParameter("code"),request.getParameter("description"),

Float.parseFloat(request.getParameter("amount")),request.getParameter("name"),request.getParameter("ic"),request.getParameter("paymentType"));

request.getSession().setAttribute("items",

paymentVoucherSession.getAllPaymentVoucherItems());request.getSession().setAttribute("title",

"<p><b>:: PAYMENT VOUCHER UPDATED SUCCESSFULLY ::</b></p>");

return (mapping.findForward("afterUpdate"));}

else if (operation.equals("delete")) {paymentVoucherSession.removePaymentVoucherItemsForId(

new Integer(request.getParameter("id")));

Page 45: struts ejb tutorial

return (mapping.findForward("afterDelete"));}

else if (operation.equals("index")) {return (mapping.findForward("index"));

}}

catch (Exception e) {e.printStackTrace();

}

return null;}

private PaymentVoucherSessionLocalHome paymentVoucherSessionLocalHome;private PaymentVoucherSessionLocal getPaymentVoucherSession() {

if (null == paymentVoucherSessionLocalHome) {try {

Context context = new InitialContext();Object obj = context

.lookup("java:comp/env/ejb/PaymentVoucherSession");paymentVoucherSessionLocalHome =

(PaymentVoucherSessionLocalHome) PortableRemoteObject.narrow(obj,

PaymentVoucherSessionLocalHome.class);}catch (NamingException e) {

e.printStackTrace();}

}

try {return paymentVoucherSessionLocalHome.create();

}catch (CreateException e) {

e.printStackTrace();}return null;

}}

4. Next, create another new class file. Select File -> New -> Other -> Java -> Class and then click Next.

Page 46: struts ejb tutorial

5. Fill in 'submit' for the package, and 'EditAction' for the class name and then click Finish.

Page 47: struts ejb tutorial

6. Open EditAction in the Java editor and add the following code to provide business logic of your application.

package submit;

import javax.ejb.CreateException;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;import javax.rmi.PortableRemoteObject;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;

Page 48: struts ejb tutorial

import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;

import ejbs.PaymentVoucherSessionLocal;import ejbs.PaymentVoucherSessionLocalHome;

/** * @web.ejb-local-ref home="ejbs.PaymentVoucherSessionLocalHome" * local="ejbs.PaymentVoucherSessionLocal" * name="ejb/PaymentVoucherSession" type="Session" * link="PaymentVoucherSession" * * @jboss.ejb-local-ref ref-name="PaymentVoucherSession" * jndi-name="ejb/ejbs/PaymentVoucherSessionHome" * */

public final class EditAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {

try {PaymentVoucherSessionLocal paymentVoucherSession =

getPaymentVoucherSession();String operation = request.getParameter("operation");if (operation.equals("edit")) {

return (mapping.findForward("edit"));}

else if (operation.equals("update")) {paymentVoucherSession.editPaymentVoucherItemsForId(

new Integer(request.getParameter("id")),request.getParameter("type"),request.getParameter("code"),request.getParameter("description"),

Float.parseFloat(request.getParameter("amount")),request.getParameter("name"),request.getParameter("ic"),request.getParameter("paymentType"));

request.getSession().setAttribute("items",

paymentVoucherSession.getAllPaymentVoucherItems());request.getSession().setAttribute("title",

"<p><b>:: PAYMENT VOUCHER UPDATED SUCCESSFULLY ::</b></p>");

return (mapping.findForward("afterUpdate"));}

else if (operation.equals("index")) {return (mapping.findForward("index"));

}}

Page 49: struts ejb tutorial

catch (Exception e) {e.printStackTrace();

}

return null;}

private PaymentVoucherSessionLocalHome paymentVoucherSessionLocalHome;private PaymentVoucherSessionLocal getPaymentVoucherSession() {

if (null == paymentVoucherSessionLocalHome) {try {

Context context = new InitialContext();Object obj = context

.lookup("java:comp/env/ejb/PaymentVoucherSession");paymentVoucherSessionLocalHome =

(PaymentVoucherSessionLocalHome) PortableRemoteObject.narrow(obj,

PaymentVoucherSessionLocalHome.class);}catch (NamingException e) {

e.printStackTrace();}

}try {

return paymentVoucherSessionLocalHome.create();}catch (CreateException e) {

e.printStackTrace();}return null;

}}

Creating A JSPThis is the final piece of this example payment voucher application, and you are going to use Struts tags to provide a user interface. In this sample application, you need to create three JSP pages.

1. Select File -> New -> Other -> Web -> JSP and click next to create a new JSP page.

Page 50: struts ejb tutorial

2. Select the WebContent directory under StrutsPaymentVoucher, and fill in index.jsp for the file name. Click finish.

Page 51: struts ejb tutorial

3. Open index.jsp in the JSP editor and add the following code.

<%@ page language="java" %><%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<html><head><title>Payment Voucher</title></head>

<body><html:errors/>

Page 52: struts ejb tutorial

<html:form action="list.do"><table><html:hidden property="operation" value="add"/><tr><td><b><u>Payment Vouchers</u></b></td><td></td></tr><tr><td>Type: </td><td><html:text property="type"/></td></tr><tr><td>Code: </td><td><html:text property="code"/></td></tr><tr><td>Description: </td><td><html:text property="description"/></td></tr><tr><td>Amount: </td><td><html:text property="amount"/></td></tr><tr><td>Name: </td><td><html:text property="name"/></td></tr><tr><td>IC: </td><td><html:text property="ic"/></td></tr><tr><td>Payment Type: </td><td><html:radio property="paymentType" value="Cash"/>Cash <html:radio property="paymentType" value="Cheque"/>Cheque</td></tr></table>

<html:submit value="Add New Payment Voucher"/></html:form>

<hr><html:form action="list.do"><html:hidden property="operation" value="name"/><table><tr><td>Name: </td><td><html:text property="searchName"/></td></tr></table><html:submit value="Find Payment Vouchers By Name"/></html:form>

<hr><html:form action="list.do"><html:hidden property="operation" value="ic"/><table><tr><td>IC: </td><td><html:text property="searchIC"/></td></tr></table><html:submit value="Find Payment Vouchers By IC"/></html:form>

<hr><html:form action="list.do"><html:hidden property="operation" value="list"/><html:submit value="List All Payment Vouchers"/></html:form>

</body></html>

4. After that, you need to create another JSP page and fill in 'edit.jsp' for the JSP name. And then click finish.

Page 53: struts ejb tutorial

5. Open the edit.jsp in the JSP editor and add the following code.

<%@ page language="java" %><%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<html><head><title>Payment Voucher</title></head>

<body><html:errors/>

Page 54: struts ejb tutorial

<html:form action="edit.do"><table><html:hidden property="operation" value="update"/><html:hidden property="id" value="<%=request.getParameter("id")%>"/><tr><td><b><u>Payment Vouchers</u></b></td><td></td></tr><tr><td>Type: </td><td><html:text property="type"/></td></tr><tr><td>Code: </td><td><html:text property="code"/></td></tr><tr><td>Description: </td><td><html:text property="description"/></td></tr><tr><td>Amount: </td><td><html:text property="amount"/></td></tr><tr><td>Name: </td><td><html:text property="name"/></td></tr><tr><td>IC: </td><td><html:text property="ic"/></td></tr><tr><td>Payment Type: </td><td><html:radio property="paymentType" value="Cash"/>Cash <html:radio property="paymentType" value="Cheque"/>Cheque</td></tr></table>

<html:submit value="Update Payment Voucher"/></html:form>

<html:form action="edit.do"><html:hidden property="operation" value="index"/><html:submit value="Abort"/></html:form>

</body></html>

6. Create a JSP page again and fill in 'print.jsp' for the JSP name. And then add the following code.

<%@ page language="java" %><%@ page import="java.util.List, ejbs.PaymentVoucherItemWrapper" %><%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<html><head><title>Payment Voucher</title></head>

<body><%= request.getSession().getAttribute("title")%><% List items= (List) request.getSession().getAttribute("items");%>

<table width="100%" border="1" cellspacing="1"><tr><td></td><td></td><td><b>Type</b></td><td><b>Code</b></td><td><b>Description</b></td><td><b>Amount</b></td><td><b>Name</b></td><td><b>IC</b></td>

Page 55: struts ejb tutorial

<td><b>Payment Type</b></td></tr>

<%for (int i = 0; i < items.size(); i++) {PaymentVoucherItemWrapper item = (PaymentVoucherItemWrapper) items.get(i);%>

<tr><td><a href="edit.do?operation=edit&id=<%=item.getId()%>

&type=<%=item.getType()%>&code=<%=item.getCode()%>&description=<%=item.getDescription()%>&amount=<%=item.getAmount()%>&name=<%=item.getName()%>&ic=<%=item.getIc()%>&paymentType=<%=item.getPaymentType()%>">Edit</a></td>

<td><a href="list.do?operation=delete&id=<%=item.getId()%>">Delete</a></td><td><%= item.getType() %></td><td><%= item.getCode() %></td><td><%= item.getDescription() %></td><td><%= item.getAmount() %></td><td><%= item.getName() %></td><td><%= item.getIc() %></td><td><%= item.getPaymentType() %></td></tr>

<% }%></table><br>

<html:form action="list.do"><html:hidden property="operation" value="index"/><html:submit value="Return"/></html:form>

</body></html>

Creating web.xml fileIn this application, you need to define the ActionServlet into web.xml configuration file, which functions as a controller from the standpoint of the Model-View-Controller framework. Every web application must have a web.xml configuration file since Struts application is a web application. Before you adding the configuration, you need to run XDoclet to generate jboss-web.xml. It is because XDoclet will clear the content for ActionServlet definition and generate its own web.xml.

1. Right click on StrutsPaymentVoucher and then select Run XDoclet. After that, XDoclet will generate a file call jboss-web.xml as you can see at WEB-INF directory.

Page 56: struts ejb tutorial
Page 57: struts ejb tutorial

2. Next, open web.xml in the Text editor and add the following XML tags into web-app tag.

<!-- Standard Action Servlet Configuration (with debugging) --><servlet>

<servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><init-param>

<param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value>

</init-param><init-param>

<param-name>debug</param-name><param-value>2</param-value>

</init-param><init-param>

<param-name>detail</param-name>

Page 58: struts ejb tutorial

<param-value>2</param-value></init-param><load-on-startup>2</load-on-startup>

</servlet>

<!-- Standard Action Servlet Mapping --><servlet-mapping>

<servlet-name>action</servlet-name><url-pattern>*.do</url-pattern>

</servlet-mapping>

<!-- The Usual Welcome File List --><welcome-file-list>

<welcome-file>index.jsp</welcome-file></welcome-file-list>

<!-- Struts Tag Library Descriptors --><taglib>

<taglib-uri>/tags/struts-bean</taglib-uri><taglib-location>/WEB-INF/struts-bean.tld</taglib-location>

</taglib><taglib>

<taglib-uri>/tags/struts-html</taglib-uri><taglib-location>/WEB-INF/struts-html.tld</taglib-location>

</taglib><taglib>

<taglib-uri>/tags/struts-logic</taglib-uri><taglib-location>/WEB-INF/struts-logic.tld</taglib-location>

</taglib><taglib>

<taglib-uri>/tags/struts-nested</taglib-uri><taglib-location>/WEB-INF/struts-nested.tld</taglib-location>

</taglib><taglib>

<taglib-uri>/tags/struts-tiles</taglib-uri><taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>

</taglib>

<!-- EJB References --><ejb-local-ref>

<ejb-ref-name>ejb/PaymentVoucherSession</ejb-ref-name><ejb-ref-type>Session</ejb-ref-type><local-home>ejbs.PaymentVoucherSessionLocalHome</local-home><local>ejbs.PaymentVoucherSessionLocal</local><ejb-link>PaymentVoucherSession</ejb-link>

</ejb-local-ref>

Running And Testing The Payment Voucher Web ApplicationYour payment voucher application is now complete. Now it is time to take it for a spin.

1. Select Window -> Show View -> Other... -> Server -> Servers and click OK.

Page 59: struts ejb tutorial

2. Right click on the servers view and select New -> Server.

Page 60: struts ejb tutorial

3. Select 'JBoss v3.2.3' under JBoss and click Finish.

4. Right click on the new server and select 'Add and Remove Projects...' which will bring up the dialog below.

Page 61: struts ejb tutorial

5. Select PaymentVoucherEAR from the left panel and click 'Add >' to add it to the right panel as shown below. Click Finish.

Page 62: struts ejb tutorial

6. Right click on the newly created server in the Servers view and select Start. Wait a few seconds to ensure the server started up correctly. The Console view should look something like this:

7. Now, back in the Project Explorer right click on 'index.jsp' and select 'Run As' -> 'Run on Server'.

Page 63: struts ejb tutorial

8. This will bring up the below dialog. Select JBOSS 3.2.3 and check 'Set server as project default(do not ask again)' and click Finish.

Page 64: struts ejb tutorial

9. An embedded web browser should open showing the following page.

Page 65: struts ejb tutorial

10. You can experiment by adding more records into your payment voucher.

SummaryIn this tutorial you learned how to configure Eclipse to work with JBoss and create J2EE EJB and Struts projects that uses a CMP Bean, a Session Bean, an ActionForm class, an Action class, and a JSP to create a payment voucher J2EE Web application. This application, while simple, provides a good introduction to Java Web development and some of the Web development tools available in the Eclipse Web Tools Platform project.