| Size: 15118 Comment:  | Size: 87429 Comment:  | 
| Deletions are marked like this. | Additions are marked like this. | 
| Line 466: | Line 466: | 
| == EJB Jar with persistence == * http://127.0.0.1:8080/jbossws/services * http://127.0.0.1:8080/ejbjee5-0.0.1/AddWS?wsdl === src/main/java/org/allowed/bitarus/AddEntity.java === {{{#!highlight java package org.allowed.bitarus; import java.util.Date; import javax.persistence.Id; import javax.persistence.Entity; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.TemporalType; import javax.persistence.Temporal; @Entity public class AddEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column @Temporal(TemporalType.TIMESTAMP) private Date creationDate; @Column private int op1; @Column private int op2; @Column private int res; public long getId(){return this.id;} public void setId(long id){ this.id=id;} public Date getCreationDate(){return this.creationDate;} public void setCreationDate(Date creationDate){ this.creationDate=creationDate;} public int getOp1(){return this.op1;} public void setOp1(int op1){ this.op1=op1;} public int getOp2(){return this.op2;} public void setOp2(int op2){ this.op2=op2;} public int getRes(){return this.res;} public void setRes(int res){ this.res=res;} } }}} === src/main/java/org/allowed/bitarus/AddLocal.java === {{{#!highlight java package org.allowed.bitarus; import javax.ejb.Local; import java.util.List; @Local public interface AddLocal { int add(int val1, int val2) ; List<AddEntity> getAll(); } }}} === src/main/java/org/allowed/bitarus/AddWS.java === {{{#!highlight java package org.allowed.bitarus; import javax.ejb.Stateless; import javax.jws.WebMethod; import javax.jws.WebService; import org.allowed.bitarus.AddRemote; import javax.persistence.PersistenceContext; import javax.persistence.EntityManager; import java.util.List; @Stateless @WebService public class AddWS implements AddRemote { @PersistenceContext(unitName="puDefaultDS") EntityManager em; @WebMethod public int add(int val1, int val2) { int res = val1 + val2; AddEntity me = new AddEntity(); me.setRes(res); me.setOp1(val1); me.setOp2(val2); me.setCreationDate( new java.util.Date() ); em.persist(me); return res; } @WebMethod public List<AddEntity> getAll(){ return em.createQuery("select a from AddEntity a ").getResultList(); } } }}} === src/main/java/org/allowed/bitarus/AddRemote.java === {{{#!highlight java package org.allowed.bitarus; import javax.ejb.Remote; import java.util.List; @Remote public interface AddRemote { int add(int val1, int val2); List<AddEntity> getAll(); } }}} === src/main/resources/META-INF/ejb-jar.xml === {{{#!highlight xml <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0"> <enterprise-beans> <session> <ejb-name>AddWS</ejb-name> <business-local>org.allowed.bitarus.AddLocal</business-local> <business-remote>org.allowed.bitarus.AddRemote</business-remote> <ejb-class>org.allowed.bitarus.AddWS</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> }}} === src/main/resources/META-INF/persistence.xml === {{{#!highlight xml <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="puDefaultDS" transaction-type="JTA"> <jta-data-source>java:/DefaultDS</jta-data-source> <properties> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence> }}} === pom.xml === {{{#!highlight xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.allowed.bitarus</groupId> <artifactId>ejbjee5</artifactId> <version>0.0.1</version> <packaging>ejb</packaging> <dependencies> <dependency> <groupId>javaee</groupId> <artifactId>javaee-api</artifactId> <version>5</version> <scope>provided</scope> </dependency> </dependencies> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> </project> }}} == JNDIView == * http://127.0.0.1:8080/jmx-console/ Show JNDI info. In kmx comsole chosse jboss, service=JNDIView, invoke list, Global JNDI Namespace * http://127.0.0.1:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss%3Aservice%3DJNDIView == WAR web app that invokes ejb using JNDI name == * mvn clean install * cp target/warjee5-0.0.1.war /app/jboss-5.1.0.GA/server/default/deploy/warjee5-0.0.1.war === pom.xml === {{{#!highlight xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.allowed.bitarus</groupId> <artifactId>warjee5</artifactId> <version>0.0.1</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>javaee</groupId> <artifactId>javaee-api</artifactId> <version>5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.allowed.bitarus</groupId> <artifactId>ejbjee5</artifactId> <version>0.0.1</version> <scope>provided</scope> </dependency> </dependencies> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> </project> }}} === src/main/java/org/allowed/bitarus/Handler.java === {{{#!highlight java package org.allowed.bitarus; import java.util.logging.Logger; import java.util.logging.Level; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; import javax.naming.InitialContext; import java.util.List; import javax.naming.NamingEnumeration; import javax.naming.NameClassPair; public class Handler{ private ServletRequest request; private ServletResponse response; private JspWriter out; public Handler(ServletRequest request, ServletResponse response,JspWriter out){ this.request = request; this.response = response; this.out = out; } public Handler(PageContext pageContext){ this.request = pageContext.getRequest(); this.response = pageContext.getResponse(); this.out = (JspWriter) pageContext.getAttribute(pageContext.OUT) ; } public void writeHandler(){ try{ this.out.println(String.format("<p>Handler up %s</p>" , this.request.getParameter("user") )); } catch(Exception ex){ } } public void writeIP(){ try{ this.out.print("!!! Your IP address is " + this.request.getRemoteAddr()); } catch(Exception ex){ } } public void writeAddResults(){ try{ InitialContext context = new InitialContext(); NamingEnumeration<NameClassPair> namingList = context.list(""); while (namingList.hasMore()) { out.println(namingList.next().getName() + "<br/>" ); } AddLocal addLocal = (AddLocal) context.lookup("AddWS/local"); List<AddEntity> list = addLocal.getAll(); for(int idx=0; idx<list.size(); idx++){ this.out.println( list.get(idx).getCreationDate().toString() + "<br/>" ); } } catch(Exception ex){ } } } }}} === src/main/java/org/allowed/bitarus/TestBean.java === {{{#!highlight java package org.allowed.bitarus; import java.util.logging.Logger; import java.util.logging.Level; public class TestBean{ private String name; private Logger logger; public TestBean(){ this.logger = Logger.getLogger(this.getClass().getName() ); this.logger.log(Level.INFO,"Created test bean"); this.name="Ioooo"; } public String getName(){ this.logger.info("getName called"); return this.name; } public void setName(String name){ this.name=name; } } }}} === src/main/webapp/WEB-INF/web.xml === {{{#!highlight xml <?xml version="1.0"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>index</servlet-name> <jsp-file>/index.jsp</jsp-file> </servlet> <servlet-mapping> <servlet-name>index</servlet-name> <url-pattern>/index**</url-pattern> </servlet-mapping> <servlet> <servlet-name>otherindex</servlet-name> <jsp-file>/otherindex.jsp</jsp-file> </servlet> <servlet-mapping> <servlet-name>otherindex</servlet-name> <url-pattern>/otherindex**</url-pattern> </servlet-mapping> </web-app> }}} === src/main/webapp/index.jsp === {{{#!highlight html <%@page import="org.allowed.bitarus.Handler" %> <jsp:useBean id="test" class="org.allowed.bitarus.TestBean" /> <% //Handler h = new Handler(request,response,out); %> <% Handler h = new Handler(pageContext); %> <html> <body> <p>Hello</p> <p>World <jsp:getProperty name="test" property="name" /> </p> <% h.writeHandler(); %> <h2><% out.print("Your IP address is " + request.getRemoteAddr()); %></h2> <h3><% h.writeIP(); %></h3> <h3><% h.writeAddResults(); %></h3> </body> </html> }}} === src/main/webapp/otherindex.jsp === {{{#!highlight html <%@page import="org.allowed.bitarus.Handler" %> <jsp:useBean id="test" class="org.allowed.bitarus.TestBean" /> <% //Handler h = new Handler(request,response,out); %> <% Handler h = new Handler(pageContext); %> <html> <body> <p>Other Hello</p> <p>World <jsp:getProperty name="test" property="name" /> </p> <% h.writeHandler(); %> <h2><% out.print("Your IP address is " + request.getRemoteAddr()); %></h2> <h3><% h.writeIP(); %></h3> </body> </html> }}} == Spring 3.0.1 in JBoss 5 == * https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/new-in-3.html#new-in-3-intro === pom.xml === {{{#!highlight xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.allowed.bitarus</groupId> <artifactId>testSpringMVCJSP</artifactId> <version>0.1.0</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.0.1.RELEASE</version> </dependency> </dependencies> <build> <sourceDirectory>src/main/java</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> </project> }}} === src/main/java/org/allowed/bitarus/hello/HelloController.java === {{{#!highlight java package org.allowed.bitarus.hello; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class HelloController { @RequestMapping("/hello") public String hellox(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) { model.addAttribute("name", name); return "greeting"; } } }}} === src/main/webapp/WEB-INF/mvc-dispatcher-servlet.xml === {{{#!highlight xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="org.allowed.bitarus.hello" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/pages/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> </beans> }}} === src/main/webapp/WEB-INF/pages/greeting.jsp === {{{#!highlight html <!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Getting Started: Serving Web Content</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <p>Hello ${name}</p> </body> </html> }}} === src/main/webapp/WEB-INF/web.xml === {{{#!highlight xml <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Spring MVC Application + JSP</display-name> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app> }}} == EJB 3.0 Contacts, JPA == === src/main/java/org/allowed/bitarus/ContactsLocal.java === {{{#!highlight java package org.allowed.bitarus; import javax.ejb.Local; import java.util.List; @Local public interface ContactsLocal { void add(String firstName, String lastName, String address, String phoneNumber); List<ContactEntity> getAll(); ContactEntity get(long id); void remove(long id); void edit(long id, String firstName, String lastName, String address, String phoneNumber ); } }}} === src/main/java/org/allowed/bitarus/ContactsWS.java === {{{#!highlight java package org.allowed.bitarus; import javax.ejb.Stateless; import javax.jws.WebMethod; import javax.jws.WebService; import org.allowed.bitarus.ContactsRemote; import javax.persistence.PersistenceContext; import javax.persistence.EntityManager; import java.util.List; import javax.persistence.NamedQuery; @Stateless @WebService public class ContactsWS implements ContactsRemote, ContactsLocal { @PersistenceContext(unitName="puContactsDefaultDS") EntityManager em; @WebMethod public void add(String firstName, String lastName, String address, String phoneNumber ) { ContactEntity c = new ContactEntity(); c.setFirstName(firstName); c.setLastName(lastName); c.setAddress(address); c.setPhoneNumber(phoneNumber); c.setCreationDate( new java.util.Date() ); em.persist(c); } @WebMethod public List<ContactEntity> getAll(){ return em.createQuery("select a from ContactEntity a ").getResultList(); } @WebMethod public ContactEntity get(long id){ //return (ContactEntity) em.createQuery("select a from ContactEntity a where a.id = :id").setParameter("id", id).getSingleResult(); return (ContactEntity) em.createNamedQuery("Contacts.byId").setParameter("id", id).getSingleResult(); } @WebMethod public void remove(long id){ ContactEntity ent = (ContactEntity) em.createNamedQuery("Contacts.byId").setParameter("id", id).getSingleResult(); em.remove(ent); } @WebMethod public void edit(long id, String firstName, String lastName, String address, String phoneNumber ){ ContactEntity ent = (ContactEntity) em.createNamedQuery("Contacts.byId").setParameter("id", id).getSingleResult(); ent.setFirstName(firstName); ent.setLastName(lastName); ent.setAddress(address); ent.setPhoneNumber(phoneNumber); em.persist(ent); } } }}} === src/main/java/org/allowed/bitarus/ContactsRemote.java === {{{#!highlight java package org.allowed.bitarus; import javax.ejb.Remote; import java.util.List; @Remote public interface ContactsRemote { void add(String firstName, String lastName, String address, String phoneNumber); List<ContactEntity> getAll(); ContactEntity get(long id); void remove(long id); void edit(long id, String firstName, String lastName, String address, String phoneNumber ); } }}} === src/main/java/org/allowed/bitarus/ContactEntity.java === {{{#!highlight java package org.allowed.bitarus; import java.util.Date; import javax.persistence.Id; import javax.persistence.Entity; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.TemporalType; import javax.persistence.Temporal; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; @Entity @NamedQueries( { @NamedQuery(name="Contacts.byId",query="select a from ContactEntity a where a.id = :id") } ) public class ContactEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column @Temporal(TemporalType.TIMESTAMP) private Date creationDate; @Column private String firstName; @Column private String lastName; @Column private String address; @Column private String phoneNumber; public void setId(long id){this.id=id;} public long getId(){return this.id;} public void setCreationDate(Date creationDate){this.creationDate=creationDate;} public Date getCreationDate(){return this.creationDate;} public void setFirstName(String firstName){this.firstName=firstName;} public String getFirstName(){return this.firstName;} public void setLastName(String lastName){this.lastName=lastName;} public String getLastName(){return this.lastName;} public void setAddress(String address){this.address=address;} public String getAddress(){return this.address;} public void setPhoneNumber(String phoneNumber){this.phoneNumber=phoneNumber;} public String getPhoneNumber(){return this.phoneNumber;} } }}} === src/main/resources/META-INF/ejb-jar.xml === {{{#!highlight xml <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0"> <enterprise-beans> <session> <ejb-name>ContactsWS</ejb-name> <business-local>org.allowed.bitarus.ContactsLocal</business-local> <business-remote>org.allowed.bitarus.ContactsRemote</business-remote> <ejb-class>org.allowed.bitarus.ContactsWS</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> }}} === src/main/resources/META-INF/persistence.xml === {{{#!highlight xml <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="puContactsDefaultDS" transaction-type="JTA"> <jta-data-source>java:/DefaultDS</jta-data-source> <properties> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence> }}} === pom.xml === {{{#!highlight xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.allowed.bitarus</groupId> <artifactId>ejbcontacts</artifactId> <version>0.0.1</version> <packaging>ejb</packaging> <dependencies> <dependency> <groupId>javaee</groupId> <artifactId>javaee-api</artifactId> <version>5</version> <scope>provided</scope> </dependency> </dependencies> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> </project> }}} == WAR Contacts == * wget https://github.com/twbs/bootstrap/releases/download/v4.5.0/bootstrap-4.5.0-dist.zip * wget https://code.jquery.com/jquery-3.5.1.min.js External files: * src/main/webapp/js/bootstrap.min.js * src/main/webapp/js/jquery-3.5.1.min.js * src/main/webapp/css/bootstrap.min.css === deploy_to_target.sh === {{{ #!/bin/sh rm ../warcontacts.tgz tar cvzf ../warcontacts.tgz ../warcontacts cp ../warcontacts.tgz ../target/ docker exec -it jboss5_container /bin/sh -c 'cd /app;rm -rf warcontacts; tar xvzf warcontacts.tgz' docker exec -it jboss5_container /bin/sh -c 'cd /app/warcontacts; rm /app/jboss-5.1.0.GA/server/default/deploy/warcontacts-0.0.1.war; mvn clean install;' docker exec -it jboss5_container /bin/sh -c 'cp /app/warcontacts/target/warcontacts-0.0.1.war /app/jboss-5.1.0.GA/server/default/deploy' }}} === pom.xml === {{{ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.allowed.bitarus</groupId> <artifactId>warcontacts</artifactId> <version>0.0.1</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>javaee</groupId> <artifactId>javaee-api</artifactId> <version>5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.allowed.bitarus</groupId> <artifactId>ejbcontacts</artifactId> <version>0.0.1</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> </project> }}} === src/main/java/org/allowed/bitarus/Handler.java === {{{ package org.allowed.bitarus; import java.util.logging.Logger; import java.util.logging.Level; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; import javax.naming.InitialContext; import java.io.IOException; import java.util.List; import javax.naming.NamingEnumeration; import javax.naming.NameClassPair; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Map; public class Handler { private static final String CONTACTS_WS_LOCAL = "ContactsWS/local"; private ServletRequest request; private ServletResponse response; private JspWriter out; public Handler(ServletRequest request, ServletResponse response, JspWriter out) { this.request = request; this.response = response; this.out = out; } public Handler(PageContext pageContext) { this.request = pageContext.getRequest(); this.response = pageContext.getResponse(); this.out = (JspWriter) pageContext.getAttribute(PageContext.OUT); HttpServletRequest hsr = (HttpServletRequest) this.request; System.out.println(String.format("Current method %s", hsr.getMethod())); System.out.println(String.format("Path %s", hsr.getServletPath())); if ("POST".equals(hsr.getMethod())) { Map<String, String> params = hsr.getParameterMap(); for (String key : params.keySet()) { System.out.println(String.format("%s:%s", key, hsr.getParameter(key))); } handleAddPost(hsr); handleDeletePost(hsr); handleUpdatePost(hsr); } } private void handleUpdatePost(HttpServletRequest hsr) { if ("/update.jsp".equals(hsr.getServletPath())) { try { InitialContext context = new InitialContext(); ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL); long id = Integer.parseInt(hsr.getParameter("cid")); String firstName = hsr.getParameter("firstname"); String lastName = hsr.getParameter("lastname"); String address = hsr.getParameter("address"); String phoneNumber = hsr.getParameter("phonenumber"); contacts.edit(id, firstName, lastName, address, phoneNumber); redirectToIndex(hsr); } catch (Exception ex) { } } } private void handleDeletePost(HttpServletRequest hsr) { if ("/delete.jsp".equals(hsr.getServletPath())) { try { InitialContext context = new InitialContext(); ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL); contacts.remove(Integer.parseInt(hsr.getParameter("id"))); redirectToIndex(hsr); } catch (Exception ex) { } } } private void handleAddPost(HttpServletRequest hsr) { if ("/add.jsp".equals(hsr.getServletPath())) { try { InitialContext context = new InitialContext(); ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL); contacts.add(hsr.getParameter("firstname"), hsr.getParameter("lastname"), hsr.getParameter("address"), hsr.getParameter("phonenumber")); redirectToIndex(hsr); } catch (Exception ex) { } } } private void redirectToIndex(HttpServletRequest hsr) throws IOException { ((HttpServletResponse) this.response).sendRedirect(hsr.getContextPath() + "/index.jsp"); } public void writeHandler() { try { this.out.println(String.format("<p>Handler up %s</p>", this.request.getParameter("user"))); } catch (Exception ex) { } } public void writeIP() { try { this.out.print("!!! Your IP address is " + this.request.getRemoteAddr()); } catch (Exception ex) { } } public List<ContactEntity> getAllContacts() { List<ContactEntity> ret = null; try { InitialContext context = new InitialContext(); ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL); ret = contacts.getAll(); } catch (Exception ex) { } return ret; } public ContactEntity getContact(long id) { ContactEntity ret = null; try { InitialContext context = new InitialContext(); ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL); ret = contacts.get(id); } catch (Exception ex) { } return ret; } } }}} === src/main/webapp/add.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %> <html> <head> <jsp:include page="head.jsp" /> </head> <body> <jsp:include page="nav.jsp" /> <div class="container topspace"> <div class="row"> <div class="col-sm-2"></div> <div class="col-sm-8"> <form action="add.jsp" method="post" > <label for="firstname">First name:</label><br/> <input type="text" id="firstname" name="firstname" class="form-control"><br/> <label for="lastname">Last name:</label><br/> <input type="text" id="lastname" name="lastname" class="form-control"><br/> <label for="address">Address::</label><br/> <input type="text" id="Address:" name="address" class="form-control"><br/> <label for="phonenumber">Phone number:</label><br/> <input type="text" id="phonenumber" name="phonenumber" class="form-control"><br/> <input type="submit" value="Add" class="form-control btn btn-primary button"/> </form> </div> <div class="col-sm-2"></div> </div> </div> </body> </html> }}} === src/main/webapp/css/warcontacts.css === {{{ .button{margin-top:2px; margin-bottom:2px;} .topspace { padding-top: 10px; } }}} === src/main/webapp/delete.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %> <html> <head> <jsp:include page="head.jsp" /> </head> <body> <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) ); %> <jsp:include page="nav.jsp" /> <div class="container topspace"> <div class="row"> <div class="col-sm-2"></div> <div class="col-sm-8"> <% if(ci!=null) { %> <p><strong>Id:</strong> <%= ci.getId() %></p> <p><strong>First name:</strong> <%= ci.getFirstName() %></p> <p><strong>Last name:</strong> <%= ci.getLastName() %></p> <p><strong>Creation date:</strong> <%= ci.getCreationDate() %></p> <p><strong>Address:</strong> <%= ci.getAddress() %></p> <p><strong>Phone:</strong> <%= ci.getPhoneNumber() %></p> <form action="delete.jsp" method="post"> <input type="hidden" id="id" name="id" value="<%=ci.getId()%>" /> <input type="submit" class="form-control btn btn-primary button" value="Delete"> </form> <% } %> </div> <div class="col-sm-2"></div> </div> </div> </body> </html> }}} === src/main/webapp/head.jsp === {{{ <link rel="stylesheet" href="css/bootstrap.min.css"/> <link rel="stylesheet" href="css/warcontacts.css"/> <script src="js/jquery-3.5.1.min.js"></script> <script src="js/bootstrap.min.js" ></script> }}} === src/main/webapp/index.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %> <html> <head> <jsp:include page="head.jsp" /> </head> <body> <jsp:include page="nav.jsp" /> <div class="container topspace"> <div class="row"> <div class="col-sm-2"></div> <div class="col-sm-8"> <% List<ContactEntity> contacts = h.getAllContacts(); %> <a href="add.jsp" class="btn btn-primary button">Add</a> <table class="table table-stripped" > <tr> <th>FirstName</th> <th>LastName</th> <th>Actions</th> </tr> <% for(int i=0; i<contacts.size() ;i++){ %> <tr> <% ContactEntity contact = ((ContactEntity)contacts.get(i)); %> <td><%= contact.getFirstName() %></td> <td><%= contact.getLastName() %></td> <td> <a href="view.jsp?id=<%=contact.getId()%>" class="btn btn-primary button">View</a> <a href="update.jsp?id=<%=contact.getId()%>" class="btn btn-primary button">Update</a> <a href="delete.jsp?id=<%=contact.getId()%>" class="btn btn-primary button">Delete</a> </td> </tr> <%}%> </table> </div> <div class="col-sm-2"></div> </div> </div> </body> </html> }}} === src/main/webapp/nav.jsp === {{{ <nav class="navbar navbar-dark bg-dark navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="index.jsp">Contacts</a> </div> <div id="navbar" class="collapse navbar-collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="index.jsp">List</a></li> </ul> </div> </div> </nav> }}} === src/main/webapp/update.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %> <html> <head> <jsp:include page="head.jsp" /> </head> <body> <jsp:include page="nav.jsp" /> <div class="container topspace"> <div class="row"> <div class="col-sm-2"></div> <div class="col-sm-8"> <% if( request.getParameter("id") != null ) { %> <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) ); %> <form action="update.jsp" method="post" > <label for="firstname">First name:</label><br/> <input class="form-control" type="text" id="firstname" name="firstname" value="<%= ci.getFirstName() %>"/><br/> <label for="lastname">Last name:</label><br/> <input class="form-control" type="text" id="lastname" name="lastname" value="<%= ci.getLastName() %>" /><br/> <label for="address">Address::</label><br/> <input class="form-control" type="text" id="Address:" name="address" value="<%= ci.getAddress() %>"/><br/> <label for="phonenumber">Phone number:</label><br/> <input class="form-control" type="text" id="phonenumber" name="phonenumber" value="<%= ci.getPhoneNumber() %>"/><br/> <input class="form-control" type="hidden" id="cid" name="cid" value="<%=ci.getId()%>"/> <input type="submit" value="Update" class="form-control btn btn-primary button" > </form> <% } %> </div> <div class="col-sm-2"></div> </div> </div> </body> </html> }}} === src/main/webapp/view.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %> <html> <head> <jsp:include page="head.jsp" /> </head> <body> <jsp:include page="nav.jsp" /> <div class="container topspace"> <div class="row"> <div class="col-sm-2"></div> <div class="col-sm-8"> <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) ); %> <p><strong>Id:</strong> <%= ci.getId() %></p> <p><strong>First name:</strong> <%= ci.getFirstName() %></p> <p><strong>Last name:</strong> <%= ci.getLastName() %></p> <p><strong>Creation date:</strong> <%= ci.getCreationDate() %></p> <p><strong>Address:</strong> <%= ci.getAddress() %></p> <p><strong>Phone:</strong> <%= ci.getPhoneNumber() %></p> </div> <div class="col-sm-2"></div> </div> </div> </body> </html> }}} === src/main/webapp/WEB-INF/web.xml === {{{ <?xml version="1.0"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> </web-app> }}} == EAR with JMS and PgSQL == {{attachment:earFile.png}} === Setup postgresql in docker === {{{ cd /app/jboss-5.1.0.GA/server/default/lib wget https://jdbc.postgresql.org/download/postgresql-9.3-1103.jdbc3.jar apt install postgresql-9.5 su postgres mkdir -p /var/run/postgresql/9.5-main.pg_stat_tmp/ /usr/lib/postgresql/9.5/bin/postgres -D /var/lib/postgresql/9.5/main -c config_file=/etc/postgresql/9.5/main/postgresql.conf su postgres psql create user appuser with login password '12345678'; create database app; grant all privileges on database app to appuser; \q Datasource in Jboss , Local Tx Datasources PostgresDS org.postgresql.Driver jdbc:postgresql://localhost/app?user=appuser&password=12345678 /app/jboss-5.1.0.GA/server/default/deploy# cat PostgresDS-ds.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <datasources> <local-tx-datasource> <jndi-name>PostgresDS</jndi-name> <rar-name>jboss-local-jdbc.rar</rar-name> <use-java-context>true</use-java-context> <connection-definition>javax.sql.DataSource</connection-definition> <jmx-invoker-name>jboss:service=invoker,type=jrmp</jmx-invoker-name> <min-pool-size>0</min-pool-size> <max-pool-size>10</max-pool-size> <blocking-timeout-millis>30000</blocking-timeout-millis> <idle-timeout-minutes>30</idle-timeout-minutes> <prefill>false</prefill> <background-validation>false</background-validation> <background-validation-millis>0</background-validation-millis> <validate-on-match>true</validate-on-match> <statistics-formatter>org.jboss.resource.statistic.pool.JBossDefaultSubPoolStatisticFormatter</statistics-formatter> <isSameRM-override-value>false</isSameRM-override-value> <allocation-retry>0</allocation-retry> <allocation-retry-wait-millis>5000</allocation-retry-wait-millis> <security-domain xsi:type="securityMetaData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> <metadata/> <local-transaction/> <prepared-statement-cache-size>0</prepared-statement-cache-size> <share-prepared-statements>false</share-prepared-statements> <set-tx-query-timeout>false</set-tx-query-timeout> <query-timeout>0</query-timeout> <use-try-lock>0</use-try-lock> <driver-class>org.postgresql.Driver</driver-class> <connection-url>jdbc:postgresql://localhost/app?user=appuser&password=12345678</connection-url> </local-tx-datasource> </datasources> }}} === Create JMS queue === {{{ mkdir -p /app/jboss-5.1.0.GA/server/default/deploy/queue nano /app/jboss-5.1.0.GA/server/default/deploy/queue/ContactsQueue-service.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <server> <mbean xmbean-dd="xmdesc/Queue-xmbean.xml" name="jboss.messaging.destination:service=Queue,name=ContactsQueue" code="org.jboss.jms.server.destination.QueueService"> <attribute name="JNDIName">/queue/ContactsQueue</attribute> <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends> <depends>jboss.messaging:service=PostOffice</depends> </mbean> </server> }}} === Structure === {{{ . ├── deploy_to_target.sh ├── earcontacts │ └── pom.xml │ ├── ejbcontacts │ ├── pom.xml │ └── src │ └── main │ ├── java │ │ └── org │ │ └── allowed │ │ └── bitarus │ │ ├── ContactEntity.java │ │ ├── ContactsLocal.java │ │ ├── ContactsMDB.java │ │ ├── ContactsRemote.java │ │ └── ContactsWS.java │ └── resources │ └── META-INF │ ├── ejb-jar.xml │ └── persistence.xml ├── pom.xml └── warcontacts ├── pom.xml └── src └── main ├── java │ └── org │ └── allowed │ └── bitarus │ └── Handler.java └── webapp ├── add.jsp ├── css │ ├── bootstrap.min.css │ └── warcontacts.css ├── delete.jsp ├── head.jsp ├── index.jsp ├── js │ ├── bootstrap.min.js │ └── jquery-3.5.1.min.js ├── nav.jsp ├── update.jsp ├── view.jsp └── WEB-INF └── web.xml }}} === deploy_to_target.sh === {{{ #!/bin/sh rm ../contacts.tgz tar cvzf ../contacts.tgz ../contacts cp ../contacts.tgz ../target/ docker exec -it jboss5_container /bin/sh -c 'cd /app;rm -rf contacts; tar xvzf contacts.tgz' docker exec -it jboss5_container /bin/sh -c 'cd /app/contacts; rm /app/jboss-5.1.0.GA/server/default/deploy/earcontacts-0.0.1.ear; mvn clean install;' docker exec -it jboss5_container /bin/sh -c 'cp /app/contacts/earcontacts/target/earcontacts-0.0.1.ear /app/jboss-5.1.0.GA/server/default/deploy' }}} === pom.xml === {{{ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.allowed.bitarus</groupId> <artifactId>contacts</artifactId> <version>1.0</version> <packaging>pom</packaging> <modules> <module>ejbcontacts</module> <module>warcontacts</module> <module>earcontacts</module> </modules> </project> }}} === earcontacts/pom.xml === {{{ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.allowed.bitarus</groupId> <artifactId>earcontacts</artifactId> <version>0.0.1</version> <packaging>ear</packaging> <dependencies> <dependency> <groupId>org.allowed.bitarus</groupId> <artifactId>warcontacts</artifactId> <version>0.0.1</version> <type>war</type> </dependency> <dependency> <groupId>org.allowed.bitarus</groupId> <artifactId>ejbcontacts</artifactId> <version>0.0.1</version> <type>ejb</type> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ear-plugin</artifactId> <version>2.10.1</version> <configuration> <version>5</version> <defaultLibBundleDir>lib</defaultLibBundleDir> <filtering>true</filtering> <modules> <ejbModule> <groupId>org.allowed.bitarus</groupId> <artifactId>ejbcontacts</artifactId> <bundleDir>/</bundleDir> </ejbModule> <webModule> <groupId>org.allowed.bitarus</groupId> <artifactId>warcontacts</artifactId> <bundleDir>/</bundleDir> </webModule> </modules> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> </project> }}} === ejbcontacts/pom.xml === {{{ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.allowed.bitarus</groupId> <artifactId>ejbcontacts</artifactId> <version>0.0.1</version> <packaging>ejb</packaging> <dependencies> <dependency> <groupId>javaee</groupId> <artifactId>javaee-api</artifactId> <version>5</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> </project> }}} === ejbcontacts/src/main/java/org/allowed/bitarus/ContactEntity.java === {{{ package org.allowed.bitarus; import java.util.Date; import javax.persistence.Id; import javax.persistence.Entity; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.TemporalType; import javax.persistence.Temporal; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; @Entity @NamedQueries( { @NamedQuery(name="Contacts.byId",query="select a from ContactEntity a where a.id = :id") } ) public class ContactEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column @Temporal(TemporalType.TIMESTAMP) private Date creationDate; @Column private String firstName; @Column private String lastName; @Column private String address; @Column private String phoneNumber; public void setId(long id){this.id=id;} public long getId(){return this.id;} public void setCreationDate(Date creationDate){this.creationDate=creationDate;} public Date getCreationDate(){return this.creationDate;} public void setFirstName(String firstName){this.firstName=firstName;} public String getFirstName(){return this.firstName;} public void setLastName(String lastName){this.lastName=lastName;} public String getLastName(){return this.lastName;} public void setAddress(String address){this.address=address;} public String getAddress(){return this.address;} public void setPhoneNumber(String phoneNumber){this.phoneNumber=phoneNumber;} public String getPhoneNumber(){return this.phoneNumber;} } }}} === ejbcontacts/src/main/java/org/allowed/bitarus/ContactsLocal.java === {{{ package org.allowed.bitarus; import javax.ejb.Local; import java.util.List; @Local public interface ContactsLocal { void add(String firstName, String lastName, String address, String phoneNumber); List<ContactEntity> getAll(); ContactEntity get(long id); void remove(long id); void edit(long id, String firstName, String lastName, String address, String phoneNumber); void sendMessage(String message); } }}} === ejbcontacts/src/main/java/org/allowed/bitarus/ContactsMDB.java === {{{ package org.allowed.bitarus; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; /* mkdir -p /app/jboss-5.1.0.GA/server/default/deploy/queue nano ContactsQueue-service.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <server> <mbean xmbean-dd="xmdesc/Queue-xmbean.xml" name="jboss.messaging.destination:service=Queue,name=ContactsQueue" code="org.jboss.jms.server.destination.QueueService"> <attribute name="JNDIName">/queue/ContactsQueue</attribute> <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends> <depends>jboss.messaging:service=PostOffice</depends> </mbean> </server> * */ @MessageDriven(mappedName = "queue/ContactsQueue", messageListenerInterface = MessageListener.class, activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/ContactsQueue") }) public class ContactsMDB implements MessageListener { public void onMessage(Message inMessage) { try { String text = ((TextMessage) inMessage).getText(); System.out.println(String.format("Got message %s", text)); } catch (Exception ex) { ex.printStackTrace(); } } } }}} === ejbcontacts/src/main/java/org/allowed/bitarus/ContactsRemote.java === {{{ package org.allowed.bitarus; import javax.ejb.Remote; import java.util.List; @Remote public interface ContactsRemote { void add(String firstName, String lastName, String address, String phoneNumber); List<ContactEntity> getAll(); ContactEntity get(long id); void remove(long id); void edit(long id, String firstName, String lastName, String address, String phoneNumber); void sendMessage(String message); } }}} === ejbcontacts/src/main/java/org/allowed/bitarus/ContactsWS.java === {{{ package org.allowed.bitarus; import javax.annotation.Resource; import javax.ejb.Stateless; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.MessageProducer; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TextMessage; import javax.jws.WebMethod; import javax.jws.WebService; import org.allowed.bitarus.ContactsRemote; import javax.persistence.PersistenceContext; import javax.persistence.EntityManager; import java.util.List; import javax.persistence.NamedQuery; @Stateless @WebService public class ContactsWS implements ContactsRemote, ContactsLocal { @PersistenceContext(unitName = "puContactsDefaultDS") EntityManager em; @Resource(mappedName = "ConnectionFactory") private ConnectionFactory connectionFactory; @Resource(mappedName = "queue/ContactsQueue") private Queue queue; @WebMethod public void add(String firstName, String lastName, String address, String phoneNumber) { ContactEntity c = new ContactEntity(); c.setFirstName(firstName); c.setLastName(lastName); c.setAddress(address); c.setPhoneNumber(phoneNumber); c.setCreationDate(new java.util.Date()); em.persist(c); } @WebMethod public List<ContactEntity> getAll() { return em.createQuery("select a from ContactEntity a ").getResultList(); } @WebMethod public ContactEntity get(long id) { // return (ContactEntity) em.createQuery("select a from ContactEntity a where // a.id = :id").setParameter("id", id).getSingleResult(); return (ContactEntity) em.createNamedQuery("Contacts.byId").setParameter("id", id).getSingleResult(); } @WebMethod public void remove(long id) { ContactEntity ent = (ContactEntity) em.createNamedQuery("Contacts.byId").setParameter("id", id) .getSingleResult(); em.remove(ent); } @WebMethod public void edit(long id, String firstName, String lastName, String address, String phoneNumber) { ContactEntity ent = (ContactEntity) em.createNamedQuery("Contacts.byId").setParameter("id", id) .getSingleResult(); ent.setFirstName(firstName); ent.setLastName(lastName); ent.setAddress(address); ent.setPhoneNumber(phoneNumber); em.persist(ent); } @WebMethod public void sendMessage(String message) { try { Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer messageProducer = session.createProducer(queue); TextMessage textMessage = session.createTextMessage(); textMessage.setText(message); messageProducer.send(textMessage); messageProducer.close(); session.close(); connection.close(); } catch (Exception ex) { ex.printStackTrace(); } } } }}} === ejbcontacts/src/main/resources/META-INF/ejb-jar.xml === {{{ <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0"> <enterprise-beans> <session> <ejb-name>ContactsWS</ejb-name> <business-local>org.allowed.bitarus.ContactsLocal</business-local> <business-remote>org.allowed.bitarus.ContactsRemote</business-remote> <ejb-class>org.allowed.bitarus.ContactsWS</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> }}} === ejbcontacts/src/main/resources/META-INF/persistence.xml === {{{ <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="puContactsDefaultDS" transaction-type="JTA"> <jta-data-source>java:/PostgresDS</jta-data-source> <properties> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> <property name="hibernate.hbm2ddl.auto" value="update" /> </properties> </persistence-unit> </persistence> }}} === warcontacts/pom.xml === {{{ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.allowed.bitarus</groupId> <artifactId>warcontacts</artifactId> <version>0.0.1</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>javaee</groupId> <artifactId>javaee-api</artifactId> <version>5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.allowed.bitarus</groupId> <artifactId>ejbcontacts</artifactId> <version>0.0.1</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> </project> }}} === warcontacts/src/main/java/org/allowed/bitarus/Handler.java === {{{ package org.allowed.bitarus; import java.util.logging.Logger; import java.util.logging.Level; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; import javax.naming.InitialContext; import java.io.IOException; import java.util.List; import javax.naming.NamingEnumeration; import javax.naming.NameClassPair; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Map; public class Handler { private static final String CONTACTS_WS_LOCAL = "earcontacts-0.0.1/ContactsWS/local"; private ServletRequest request; private ServletResponse response; private JspWriter out; public Handler(ServletRequest request, ServletResponse response, JspWriter out) { this.request = request; this.response = response; this.out = out; } public Handler(PageContext pageContext) { this.request = pageContext.getRequest(); this.response = pageContext.getResponse(); this.out = (JspWriter) pageContext.getAttribute(PageContext.OUT); HttpServletRequest hsr = (HttpServletRequest) this.request; System.out.println(String.format("Current method %s", hsr.getMethod())); System.out.println(String.format("Path %s", hsr.getServletPath())); if ("POST".equals(hsr.getMethod())) { Map<String, String> params = hsr.getParameterMap(); for (String key : params.keySet()) { System.out.println(String.format("%s:%s", key, hsr.getParameter(key))); } handleAddPost(hsr); handleDeletePost(hsr); handleUpdatePost(hsr); } } private void handleUpdatePost(HttpServletRequest hsr) { if ("/update.jsp".equals(hsr.getServletPath())) { try { InitialContext context = new InitialContext(); ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL); long id = Integer.parseInt(hsr.getParameter("cid")); String firstName = hsr.getParameter("firstname"); String lastName = hsr.getParameter("lastname"); String address = hsr.getParameter("address"); String phoneNumber = hsr.getParameter("phonenumber"); contacts.edit(id, firstName, lastName, address, phoneNumber); redirectToIndex(hsr); } catch (Exception ex) { } } } private void handleDeletePost(HttpServletRequest hsr) { if ("/delete.jsp".equals(hsr.getServletPath())) { try { InitialContext context = new InitialContext(); ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL); contacts.remove(Integer.parseInt(hsr.getParameter("id"))); redirectToIndex(hsr); } catch (Exception ex) { } } } private void handleAddPost(HttpServletRequest hsr) { if ("/add.jsp".equals(hsr.getServletPath())) { try { InitialContext context = new InitialContext(); ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL); contacts.add(hsr.getParameter("firstname"), hsr.getParameter("lastname"), hsr.getParameter("address"), hsr.getParameter("phonenumber")); redirectToIndex(hsr); } catch (Exception ex) { } } } private void redirectToIndex(HttpServletRequest hsr) throws IOException { ((HttpServletResponse) this.response).sendRedirect(hsr.getContextPath() + "/index.jsp"); } public void writeHandler() { try { this.out.println(String.format("<p>Handler up %s</p>", this.request.getParameter("user"))); } catch (Exception ex) { } } public void writeIP() { try { this.out.print("!!! Your IP address is " + this.request.getRemoteAddr()); } catch (Exception ex) { } } public List<ContactEntity> getAllContacts() { List<ContactEntity> ret = null; try { InitialContext context = new InitialContext(); ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL); ret = contacts.getAll(); } catch (Exception ex) { } return ret; } public ContactEntity getContact(long id) { ContactEntity ret = null; try { InitialContext context = new InitialContext(); ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL); ret = contacts.get(id); } catch (Exception ex) { } return ret; } } }}} === warcontacts/src/main/webapp/add.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %> <html> <head> <jsp:include page="head.jsp" /> </head> <body> <jsp:include page="nav.jsp" /> <div class="container topspace"> <div class="row"> <div class="col-sm-2"></div> <div class="col-sm-8"> <form action="add.jsp" method="post" > <label for="firstname">First name:</label><br/> <input type="text" id="firstname" name="firstname" class="form-control"><br/> <label for="lastname">Last name:</label><br/> <input type="text" id="lastname" name="lastname" class="form-control"><br/> <label for="address">Address::</label><br/> <input type="text" id="Address:" name="address" class="form-control"><br/> <label for="phonenumber">Phone number:</label><br/> <input type="text" id="phonenumber" name="phonenumber" class="form-control"><br/> <input type="submit" value="Add" class="form-control btn btn-primary button"/> </form> </div> <div class="col-sm-2"></div> </div> </div> </body> </html> }}} === warcontacts/src/main/webapp/css/bootstrap.min.css === === warcontacts/src/main/webapp/css/warcontacts.css === {{{ .button{margin-top:2px; margin-bottom:2px;} .topspace { padding-top: 10px; } 2020-06-24T18:20:45 [vitor@debian:3 ~/JBoss5Docker/contacts] }}} === warcontacts/src/main/webapp/delete.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %> <html> <head> <jsp:include page="head.jsp" /> </head> <body> <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) ); %> <jsp:include page="nav.jsp" /> <div class="container topspace"> <div class="row"> <div class="col-sm-2"></div> <div class="col-sm-8"> <% if(ci!=null) { %> <p><strong>Id:</strong> <%= ci.getId() %></p> <p><strong>First name:</strong> <%= ci.getFirstName() %></p> <p><strong>Last name:</strong> <%= ci.getLastName() %></p> <p><strong>Creation date:</strong> <%= ci.getCreationDate() %></p> <p><strong>Address:</strong> <%= ci.getAddress() %></p> <p><strong>Phone:</strong> <%= ci.getPhoneNumber() %></p> <form action="delete.jsp" method="post"> <input type="hidden" id="id" name="id" value="<%=ci.getId()%>" /> <input type="submit" class="form-control btn btn-primary button" value="Delete"> </form> <% } %> </div> <div class="col-sm-2"></div> </div> </div> </body> </html> }}} === warcontacts/src/main/webapp/head.jsp === {{{ <link rel="stylesheet" href="css/bootstrap.min.css"/> <link rel="stylesheet" href="css/warcontacts.css"/> <script src="js/jquery-3.5.1.min.js"></script> <script src="js/bootstrap.min.js" ></script> }}} === warcontacts/src/main/webapp/index.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %> <html> <head> <jsp:include page="head.jsp" /> </head> <body> <jsp:include page="nav.jsp" /> <div class="container topspace"> <div class="row"> <div class="col-sm-2"></div> <div class="col-sm-8"> <% List<ContactEntity> contacts = h.getAllContacts(); %> <a href="add.jsp" class="btn btn-primary button">Add</a> <table class="table table-stripped" > <tr> <th>FirstName</th> <th>LastName</th> <th>Actions</th> </tr> <% for(int i=0; i<contacts.size() ;i++){ %> <tr> <% ContactEntity contact = ((ContactEntity)contacts.get(i)); %> <td><%= contact.getFirstName() %></td> <td><%= contact.getLastName() %></td> <td> <a href="view.jsp?id=<%=contact.getId()%>" class="btn btn-primary button">View</a> <a href="update.jsp?id=<%=contact.getId()%>" class="btn btn-primary button">Update</a> <a href="delete.jsp?id=<%=contact.getId()%>" class="btn btn-primary button">Delete</a> </td> </tr> <%}%> </table> </div> <div class="col-sm-2"></div> </div> </div> </body> </html> }}} === warcontacts/src/main/webapp/js/bootstrap.min.js === === warcontacts/src/main/webapp/js/jquery-3.5.1.min.js === === warcontacts/src/main/webapp/nav.jsp === {{{ <nav class="navbar navbar-dark bg-dark navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="index.jsp">Contacts</a> </div> <div id="navbar" class="collapse navbar-collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="index.jsp">List</a></li> </ul> </div> </div> </nav> }}} === warcontacts/src/main/webapp/update.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %> <html> <head> <jsp:include page="head.jsp" /> </head> <body> <jsp:include page="nav.jsp" /> <div class="container topspace"> <div class="row"> <div class="col-sm-2"></div> <div class="col-sm-8"> <% if( request.getParameter("id") != null ) { %> <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) ); %> <form action="update.jsp" method="post" > <label for="firstname">First name:</label><br/> <input class="form-control" type="text" id="firstname" name="firstname" value="<%= ci.getFirstName() %>"/><br/> <label for="lastname">Last name:</label><br/> <input class="form-control" type="text" id="lastname" name="lastname" value="<%= ci.getLastName() %>" /><br/> <label for="address">Address::</label><br/> <input class="form-control" type="text" id="Address:" name="address" value="<%= ci.getAddress() %>"/><br/> <label for="phonenumber">Phone number:</label><br/> <input class="form-control" type="text" id="phonenumber" name="phonenumber" value="<%= ci.getPhoneNumber() %>"/><br/> <input class="form-control" type="hidden" id="cid" name="cid" value="<%=ci.getId()%>"/> <input type="submit" value="Update" class="form-control btn btn-primary button" > </form> <% } %> </div> <div class="col-sm-2"></div> </div> </div> </body> </html> }}} === warcontacts/src/main/webapp/view.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %> <html> <head> <jsp:include page="head.jsp" /> </head> <body> <jsp:include page="nav.jsp" /> <div class="container topspace"> <div class="row"> <div class="col-sm-2"></div> <div class="col-sm-8"> <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) ); %> <p><strong>Id:</strong> <%= ci.getId() %></p> <p><strong>First name:</strong> <%= ci.getFirstName() %></p> <p><strong>Last name:</strong> <%= ci.getLastName() %></p> <p><strong>Creation date:</strong> <%= ci.getCreationDate() %></p> <p><strong>Address:</strong> <%= ci.getAddress() %></p> <p><strong>Phone:</strong> <%= ci.getPhoneNumber() %></p> </div> <div class="col-sm-2"></div> </div> </div> </body> </html> }}} === warcontacts/src/main/webapp/WEB-INF/web.xml === {{{ <?xml version="1.0"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> </web-app> }}} | 
JBoss5
- JEE5 certified  - Java EE 5 (May 11, 2006) (Java Servlet 2.5, JSP 2.1, JSTL 1.2, JSF 1.2, EJB 3.0, JDBC 3.0)
 
- https://docs.oracle.com/javaee/5/tutorial/doc/javaeetutorial5.pdf 
- Web container
- EJB container
- Requires jdk-1_5_0_22-linux-amd64.bin from Oracle to run
- run.sh -c options :minimal default all standard web
 
  
 
Locally on debian buster
cp jdk-1_5_0_22-linux-amd64.bin ~ cd ~ ./jdk-1_5_0_22-linux-amd64.bin unzip jboss-5.1.0.GA.zip JAVA_HOME=jdk1.5.0_22/ jboss-5.1.0.GA/bin/run.sh -b 0.0.0.0 http://127.0.0.1:8080/ wget https://archive.apache.org/dist/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.zip unzip apache-maven-3.1.1-bin.zip JAVA_HOME=jdk1.5.0_22/ ~/apache-maven-3.1.1/bin/mvn -version JAVA_HOME=~/jdk1.5.0_22/ ~/apache-maven-3.1.1/bin/mvn clean install
Docker
Dockerfile
FROM ubuntu:16.04 RUN apt-get update && apt-get install -y openssh-server unzip openjdk-8-jdk net-tools maven vim RUN mkdir /var/run/sshd RUN echo 'root:screencast' | chpasswd RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config # SSH login fix. Otherwise user is kicked off after login RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd ENV NOTVISIBLE "in users profile" RUN echo "export VISIBLE=now" >> /etc/profile RUN useradd userx RUN echo 'userx:userx' | chpasswd EXPOSE 22 8080 8081 8009 8009 CMD ["/usr/sbin/sshd", "-D"]
   1 wget http://sourceforge.net/projects/jboss/files/JBoss/JBoss-5.1.0.GA/jboss-5.1.0.GA.zip
   2 unzip  jboss-5.1.0.GA.zip
   3 
   4 nano Dockerfile
   5 
   6 docker build -t docker_jboss5 . 
   7 mkdir target
   8 docker run -d -p 8080:8080 --name jboss5_container  --mount type=bind,source="$(pwd)"/target,target=/app  docker_jboss5
   9 #docker run -d -P --name jboss5_container  --mount type=bind,source="$(pwd)"/target,target=/app  docker_jboss5
  10 mv ~/jboss-5.1.0.GA.zip target/
  11 docker exec -it jboss5_container  bash
  12 cd /app
  13 unzip jboss-5.1.0.GA.zip
  14 
  15 ./jdk-1_5_0_22-linux-amd64.bin
  16 /app# jdk1.5.0_22/bin/java -version
  17 #java version "1.5.0_22"
  18 #Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03)
  19 #Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_22-b03, mixed mode)
  20 
  21 #/app/jdk1.5.0_22/bin/java -jar run.jar 
  22 
  23 mvn -version
  24 #Apache Maven 3.3.9
  25 #Maven home: /usr/share/maven
  26 #Java version: 1.8.0_252, vendor: Private Build
  27 #Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
  28 #Default locale: en_US, platform encoding: ANSI_X3.4-1968
  29 #OS name: "linux", version: "4.19.0-6-amd64", arch: "amd64", family: "unix"
  30 
  31 cd /app/jboss-5.1.0.GA/bin
  32 JAVA_HOME=/app/jdk1.5.0_22 ./run.sh -c all -b 0.0.0.0
Example EJB for jboss5 in docker container
 
 
- docker exec -it jboss5_container bash
- cd /app/ejbjee5
- mvn clean compile package
- cp /app/ejbjee5/target/ejbjee5-0.0.1.jar /app/jboss-5.1.0.GA/server/default/deploy/
18:04:14,955 INFO  [JBossASKernel] Created KernelDeployment for: ejbjee5-0.0.1.jar
18:04:14,955 INFO  [JBossASKernel] installing bean: jboss.j2ee:jar=ejbjee5-0.0.1.jar,name=ScheduleWS,service=EJB3
18:04:14,955 INFO  [JBossASKernel]   with dependencies:
18:04:14,955 INFO  [JBossASKernel]   and demands:
18:04:14,955 INFO  [JBossASKernel]      jboss.ejb:service=EJBTimerService
18:04:14,955 INFO  [JBossASKernel]   and supplies:
18:04:14,956 INFO  [JBossASKernel]      Class:org.allowed.bitarus.ScheduleRemote
18:04:14,956 INFO  [JBossASKernel]      jndi:ScheduleWS/local-org.allowed.bitarus.ScheduleLocal
18:04:14,956 INFO  [JBossASKernel]      jndi:ScheduleWS/remote
18:04:14,956 INFO  [JBossASKernel]      Class:org.allowed.bitarus.ScheduleLocal
18:04:14,956 INFO  [JBossASKernel]      jndi:ScheduleWS/local
18:04:14,956 INFO  [JBossASKernel]      jndi:ScheduleWS/remote-org.allowed.bitarus.ScheduleRemote
18:04:14,956 INFO  [JBossASKernel] Added bean(jboss.j2ee:jar=ejbjee5-0.0.1.jar,name=ScheduleWS,service=EJB3) to KernelDeployment of: ejbjee5-0.0.1.jar
18:04:14,957 INFO  [EJB3EndpointDeployer] Deploy AbstractBeanMetaData@542c21cb{name=jboss.j2ee:jar=ejbjee5-0.0.1.jar,name=ScheduleWS,service=EJB3_endpoint bean=org.jboss.ejb3.endpoint.deployers.impl.EndpointImpl properties=[container] constructor=null autowireCandidate=true}
18:04:15,020 INFO  [SessionSpecContainer] Starting jboss.j2ee:jar=ejbjee5-0.0.1.jar,name=ScheduleWS,service=EJB3
18:04:15,020 INFO  [EJBContainer] STARTED EJB: org.allowed.bitarus.ScheduleWS ejbName: ScheduleWS
18:04:15,041 INFO  [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
        ScheduleWS/remote - EJB3.x Default Remote Business Interface
        ScheduleWS/remote-org.allowed.bitarus.ScheduleRemote - EJB3.x Remote Business Interface
        ScheduleWS/local - EJB3.x Default Local Business Interface
        ScheduleWS/local-org.allowed.bitarus.ScheduleLocal - EJB3.x Local Business Interface
18:04:15,097 INFO  [DefaultEndpointRegistry] register: jboss.ws:context=ejbjee5-0.0.1,endpoint=ScheduleWS
18:04:15,225 INFO  [WSDLFilePublisher] WSDL published to: file:/app/jboss-5.1.0.GA/server/default/data/wsdl/ejbjee5-0.0.1.jar/ScheduleWSService4435570151338675382.wsdl
18:04:15,248 INFO  [TomcatDeployment] deploy, ctxPath=/ejbjee5-0.0.1
./src/main/java/org/allowed/bitarus/ScheduleRemote.java
./src/main/java/org/allowed/bitarus/ScheduleLocal.java
./src/main/java/org/allowed/bitarus/ScheduleWS.java
   1 package org.allowed.bitarus;
   2 
   3 import javax.ejb.Stateless;
   4 import javax.jws.WebMethod;
   5 import javax.jws.WebService;
   6 import org.allowed.bitarus.ScheduleRemote;
   7 
   8 @Stateless
   9 @WebService
  10 public class ScheduleWS implements ScheduleRemote {
  11 
  12         @WebMethod
  13         public int addSchedule(int val1, int val2) {
  14                 return val1 + val2;
  15         }
  16 }
./src/main/resources/META-INF/ejb-jar.xml
   1 <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
   2         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   3         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
   4         version="3.0">
   5         <enterprise-beans>
   6                 <session>
   7                         <ejb-name>ScheduleWS</ejb-name>
   8                         <business-local>org.allowed.bitarus.ScheduleLocal</business-local>
   9                         <business-remote>org.allowed.bitarus.ScheduleRemote</business-remote>
  10                         <ejb-class>org.allowed.bitarus.ScheduleWS</ejb-class>
  11                         <session-type>Stateless</session-type>
  12                         <transaction-type>Container</transaction-type>
  13                 </session>
  14         </enterprise-beans>
  15 </ejb-jar>
./pom.xml
   1 <project xmlns="http://maven.apache.org/POM/4.0.0"
   2         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   3         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   4         <modelVersion>4.0.0</modelVersion>
   5         <groupId>org.allowed.bitarus</groupId>
   6         <artifactId>ejbjee5</artifactId>
   7         <version>0.0.1</version>
   8         <packaging>ejb</packaging>
   9         <dependencies>
  10                 <dependency>
  11                         <groupId>javaee</groupId>
  12                         <artifactId>javaee-api</artifactId>
  13                         <version>5</version>
  14                         <scope>provided</scope>
  15                 </dependency>
  16         </dependencies>
  17         <build>
  18                 <sourceDirectory>src/main/java</sourceDirectory>
  19                 <plugins>
  20                         <plugin>
  21                                 <artifactId>maven-compiler-plugin</artifactId>
  22                                 <configuration>
  23                                         <source>1.5</source>
  24                                         <target>1.5</target>
  25                                 </configuration>
  26                         </plugin>
  27                 </plugins>
  28         </build>
  29 </project>
- ./SoapUI-5.5.0
- new soap project
- initial wsdl: http://127.0.0.1:8080/ejbjee5-0.0.1/ScheduleWS?wsdl 
Example WAR for JBoss5 in docker container
 
 
- mvn clean install
- cp /app/warjee5/target/warjee5-0.0.1.war /app/jboss-5.1.0.GA/server/default/deploy
src/main/java/org/allowed/bitarus/TestBean.java
   1 package org.allowed.bitarus;
   2 import java.util.logging.Logger;
   3 import java.util.logging.Level;
   4 
   5 public class TestBean{
   6     private String name;
   7     private Logger logger;
   8     
   9     public TestBean(){
  10         this.logger = Logger.getLogger(this.getClass().getName() );
  11         this.logger.log(Level.INFO,"Created test bean");
  12         this.name="Ioooo";
  13     }   
  14     
  15     public String getName(){
  16         this.logger.info("getName called");
  17         return this.name;        
  18     }
  19     
  20     public void setName(String name){
  21         this.name=name;        
  22     }
  23 }
src/main/java/org/allowed/bitarus/Handler.java
   1 package org.allowed.bitarus;
   2 
   3 import java.util.logging.Logger;
   4 import java.util.logging.Level;
   5 import javax.servlet.ServletRequest;
   6 import javax.servlet.ServletResponse;
   7 import javax.servlet.jsp.JspWriter;
   8 import javax.servlet.jsp.PageContext;
   9 
  10 public class Handler{
  11     private ServletRequest request;
  12     private ServletResponse response;
  13     private JspWriter out;
  14     
  15     public Handler(ServletRequest request, ServletResponse response,JspWriter out){
  16         this.request = request;
  17         this.response = response;        
  18         this.out = out;
  19     }
  20 
  21     public Handler(PageContext pageContext){
  22         this.request = pageContext.getRequest();
  23         this.response = pageContext.getResponse();        
  24         this.out = (JspWriter) pageContext.getAttribute(pageContext.OUT) ;
  25     }
  26     
  27     public void writeHandler(){
  28         try{
  29           this.out.println(String.format("<p>Handler up %s</p>" , this.request.getParameter("user") ));
  30         }
  31         catch(Exception ex){            
  32         }          
  33     }
  34     
  35     public void writeIP(){
  36         try{
  37             this.out.print("!!! Your IP address is " + this.request.getRemoteAddr());
  38         }
  39         catch(Exception ex){            
  40         }          
  41     }
  42         
  43 }
src/main/webapp/otherindex.jsp
   1 <%@page import="org.allowed.bitarus.Handler" %>
   2 <jsp:useBean id="test" class="org.allowed.bitarus.TestBean" />
   3 <% //Handler h = new Handler(request,response,out); %>
   4 <% Handler h = new Handler(pageContext); %>
   5 <html>
   6     <body>        
   7         <p>Other Hello</p>
   8         <p>World <jsp:getProperty name="test" property="name" /> </p>
   9         <% h.writeHandler(); %>
  10         <h2><% out.print("Your IP address is " + request.getRemoteAddr()); %></h2>
  11         <h3><% h.writeIP(); %></h3>
  12     </body>
  13 </html>
src/main/webapp/index.jsp
   1 <%@page import="org.allowed.bitarus.Handler" %>
   2 <jsp:useBean id="test" class="org.allowed.bitarus.TestBean" />
   3 <% //Handler h = new Handler(request,response,out); %>
   4 <% Handler h = new Handler(pageContext); %>
   5 <html>
   6     <body>        
   7         <p>Hello</p>
   8         <p>World <jsp:getProperty name="test" property="name" /> </p>
   9         <% h.writeHandler(); %>
  10         <h2><% out.print("Your IP address is " + request.getRemoteAddr()); %></h2>
  11         <h3><% h.writeIP(); %></h3>
  12     </body>
  13 </html>
src/main/webapp/WEB-INF/web.xml
   1 <?xml version="1.0"?>
   2 <web-app version="2.5"
   3    xmlns="http://java.sun.com/xml/ns/javaee"
   4    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   5    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   6    <servlet>
   7         <servlet-name>index</servlet-name>
   8         <jsp-file>/index.jsp</jsp-file>
   9     </servlet>
  10     <servlet-mapping>
  11         <servlet-name>index</servlet-name>
  12         <url-pattern>/index**</url-pattern>
  13     </servlet-mapping>
  14 
  15    <servlet>
  16         <servlet-name>otherindex</servlet-name>
  17         <jsp-file>/otherindex.jsp</jsp-file>
  18     </servlet>
  19     <servlet-mapping>
  20         <servlet-name>otherindex</servlet-name>
  21         <url-pattern>/otherindex**</url-pattern>
  22     </servlet-mapping>
  23 
  24 </web-app>
pom.xml
   1 <project xmlns="http://maven.apache.org/POM/4.0.0"
   2         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   3         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   4         <modelVersion>4.0.0</modelVersion>
   5         <groupId>org.allowed.bitarus</groupId>
   6         <artifactId>warjee5</artifactId>
   7         <version>0.0.1</version>
   8         <packaging>war</packaging>
   9         <dependencies>
  10                 <dependency>
  11                         <groupId>javaee</groupId>
  12                         <artifactId>javaee-api</artifactId>
  13                         <version>5</version>
  14                         <scope>provided</scope>
  15                 </dependency>
  16         </dependencies>
  17         <build>
  18                 <sourceDirectory>src</sourceDirectory>
  19                 <plugins>
  20                         <plugin>
  21                                 <artifactId>maven-compiler-plugin</artifactId>
  22                                 <configuration>
  23                                         <source>1.5</source>
  24                                         <target>1.5</target>
  25                                 </configuration>
  26                         </plugin>
  27                 </plugins>
  28         </build>
  29 </project>
HyperSQL Database (HSQLDB)
HyperSQL is used for development, testing and deployment of database applications.
user: sa pwd: empty port: 1701 db path: /app/jboss-5.1.0.GA/server/default/data/hypersonic/localDB java -cp ./common/lib/hsqldb.jar org.hsqldb.util.SqlTool localDB #rcfile # vi /root/sqltool.rc urlid localDB url jdbc:hsqldb:/app/jboss-5.1.0.GA/server/default/data/hypersonic/localDB;shutdown=true username sa password /app/jboss-5.1.0.GA/server/default/data/hypersonic java -cp /app/jboss-5.1.0.GA/common/lib/hsqldb.jar org.hsqldb.util.SqlTool localDB \? \q # show tables \dt TABLE_SCHEM TABLE_NAME ----------- -------------- PUBLIC ADDENTITY sql> select * from addentity; ID CREATIONDATE OP1 OP2 RES -- ----------------------- --- --- --- 1 2020-06-20 15:05:29.037 1 7 8 2 2020-06-20 15:05:30.509 1 7 8 3 2020-06-20 15:05:31.137 1 7 8 4 2020-06-20 15:05:43.043 1 70 71 5 2020-06-20 15:09:01.0 299 1 300 6 2020-06-20 15:25:14.918 1 2 3 7 2020-06-20 15:25:42.434 10 20 30
EJB Jar with persistence
src/main/java/org/allowed/bitarus/AddEntity.java
   1 package org.allowed.bitarus;
   2 
   3 import java.util.Date;
   4 import javax.persistence.Id;
   5 import javax.persistence.Entity;
   6 import javax.persistence.Column;
   7 import javax.persistence.GeneratedValue;
   8 import javax.persistence.GenerationType;
   9 import javax.persistence.TemporalType;
  10 import javax.persistence.Temporal;
  11 
  12 @Entity
  13 public class AddEntity{
  14     @Id
  15     @GeneratedValue(strategy = GenerationType.IDENTITY) 
  16     private long id;
  17     @Column
  18     @Temporal(TemporalType.TIMESTAMP) 
  19     private Date creationDate;
  20     @Column
  21     private int op1;
  22     @Column
  23     private int op2;
  24     @Column
  25     private int res;
  26     
  27     public long getId(){return this.id;}
  28     public void setId(long id){ this.id=id;}
  29 
  30     public Date getCreationDate(){return this.creationDate;}
  31     public void setCreationDate(Date creationDate){ this.creationDate=creationDate;}
  32     
  33     public int getOp1(){return this.op1;}
  34     public void setOp1(int op1){ this.op1=op1;}        
  35 
  36 
  37     public int getOp2(){return this.op2;}
  38     public void setOp2(int op2){ this.op2=op2;}        
  39 
  40     public int getRes(){return this.res;}
  41     public void setRes(int res){ this.res=res;}        
  42 }
src/main/java/org/allowed/bitarus/AddLocal.java
src/main/java/org/allowed/bitarus/AddWS.java
   1 package org.allowed.bitarus;
   2 
   3 import javax.ejb.Stateless;
   4 import javax.jws.WebMethod;
   5 import javax.jws.WebService;
   6 import org.allowed.bitarus.AddRemote;
   7 import javax.persistence.PersistenceContext;
   8 import javax.persistence.EntityManager;
   9 import java.util.List;
  10 
  11 @Stateless
  12 @WebService
  13 public class AddWS implements AddRemote {
  14     @PersistenceContext(unitName="puDefaultDS")
  15     EntityManager em;
  16 
  17     @WebMethod
  18     public int add(int val1, int val2) {
  19         int res = val1 + val2;
  20         AddEntity me = new AddEntity();
  21         me.setRes(res);
  22         me.setOp1(val1);
  23         me.setOp2(val2);
  24         me.setCreationDate( new java.util.Date() );
  25         em.persist(me);
  26         return res;
  27     }
  28 
  29     @WebMethod
  30     public List<AddEntity> getAll(){
  31       return em.createQuery("select a from AddEntity a ").getResultList();
  32     }
  33 
  34 }
src/main/java/org/allowed/bitarus/AddRemote.java
src/main/resources/META-INF/ejb-jar.xml
   1 <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
   2         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   3         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
   4         version="3.0">
   5         <enterprise-beans>
   6                 <session>
   7                         <ejb-name>AddWS</ejb-name>
   8                         <business-local>org.allowed.bitarus.AddLocal</business-local>
   9                         <business-remote>org.allowed.bitarus.AddRemote</business-remote>
  10                         <ejb-class>org.allowed.bitarus.AddWS</ejb-class>
  11                         <session-type>Stateless</session-type>
  12                         <transaction-type>Container</transaction-type>
  13                 </session>
  14         </enterprise-beans>
  15 </ejb-jar>
src/main/resources/META-INF/persistence.xml
   1 <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
   2     <persistence-unit name="puDefaultDS" transaction-type="JTA">
   3         <jta-data-source>java:/DefaultDS</jta-data-source>
   4         <properties>
   5           <property name="hibernate.show_sql" value="true" />
   6           <property name="hibernate.format_sql" value="true" />
   7           <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
   8           <property name="hibernate.hbm2ddl.auto" value="update"/>
   9         </properties>
  10     </persistence-unit>
  11 </persistence>
pom.xml
   1 <project xmlns="http://maven.apache.org/POM/4.0.0"
   2         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   3         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   4         <modelVersion>4.0.0</modelVersion>
   5         <groupId>org.allowed.bitarus</groupId>
   6         <artifactId>ejbjee5</artifactId>
   7         <version>0.0.1</version>
   8         <packaging>ejb</packaging>
   9         <dependencies>
  10                 <dependency>
  11                         <groupId>javaee</groupId>
  12                         <artifactId>javaee-api</artifactId>
  13                         <version>5</version>
  14                         <scope>provided</scope>
  15                 </dependency>
  16         </dependencies>
  17         <build>
  18                 <sourceDirectory>src</sourceDirectory>
  19                 <plugins>
  20                         <plugin>
  21                                 <artifactId>maven-compiler-plugin</artifactId>
  22                                 <configuration>
  23                                         <source>1.5</source>
  24                                         <target>1.5</target>
  25                                 </configuration>
  26                         </plugin>
  27                 </plugins>
  28         </build>
  29 </project>
JNDIView
Show JNDI info. In kmx comsole chosse jboss, service=JNDIView, invoke list, Global JNDI Namespace
WAR web app that invokes ejb using JNDI name
- mvn clean install
- cp target/warjee5-0.0.1.war /app/jboss-5.1.0.GA/server/default/deploy/warjee5-0.0.1.war
pom.xml
   1 <project xmlns="http://maven.apache.org/POM/4.0.0"
   2         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   3         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   4         <modelVersion>4.0.0</modelVersion>
   5         <groupId>org.allowed.bitarus</groupId>
   6         <artifactId>warjee5</artifactId>
   7         <version>0.0.1</version>
   8         <packaging>war</packaging>
   9         <dependencies>
  10                 <dependency>
  11                         <groupId>javaee</groupId>
  12                         <artifactId>javaee-api</artifactId>
  13                         <version>5</version>
  14                         <scope>provided</scope>
  15                 </dependency>
  16                 <dependency>
  17                     <groupId>org.allowed.bitarus</groupId>
  18                     <artifactId>ejbjee5</artifactId>
  19                     <version>0.0.1</version>
  20                     <scope>provided</scope>
  21                 </dependency>
  22         </dependencies>
  23         <build>
  24                 <sourceDirectory>src</sourceDirectory>
  25                 <plugins>
  26                         <plugin>
  27                                 <artifactId>maven-compiler-plugin</artifactId>
  28                                 <configuration>
  29                                         <source>1.5</source>
  30                                         <target>1.5</target>
  31                                 </configuration>
  32                         </plugin>
  33                 </plugins>
  34         </build>
  35 </project>
src/main/java/org/allowed/bitarus/Handler.java
   1 package org.allowed.bitarus;
   2 
   3 import java.util.logging.Logger;
   4 import java.util.logging.Level;
   5 import javax.servlet.ServletRequest;
   6 import javax.servlet.ServletResponse;
   7 import javax.servlet.jsp.JspWriter;
   8 import javax.servlet.jsp.PageContext;
   9 import javax.naming.InitialContext;
  10 import java.util.List;
  11 import javax.naming.NamingEnumeration;
  12 import javax.naming.NameClassPair;
  13 
  14 public class Handler{
  15     private ServletRequest request;
  16     private ServletResponse response;
  17     private JspWriter out;
  18 
  19     public Handler(ServletRequest request, ServletResponse response,JspWriter out){
  20         this.request = request;
  21         this.response = response;        
  22         this.out = out;
  23     }
  24 
  25     public Handler(PageContext pageContext){
  26         this.request = pageContext.getRequest();
  27         this.response = pageContext.getResponse();        
  28         this.out = (JspWriter) pageContext.getAttribute(pageContext.OUT) ;
  29     }
  30     
  31     public void writeHandler(){
  32         try{
  33           this.out.println(String.format("<p>Handler up %s</p>" , this.request.getParameter("user") ));
  34         }
  35         catch(Exception ex){            
  36         }          
  37     }
  38     
  39     public void writeIP(){
  40         try{
  41             this.out.print("!!! Your IP address is " + this.request.getRemoteAddr());
  42         }
  43         catch(Exception ex){            
  44         }          
  45     }
  46  
  47    public void writeAddResults(){
  48       try{
  49           InitialContext context = new InitialContext();
  50           NamingEnumeration<NameClassPair> namingList = context.list("");
  51           while (namingList.hasMore()) {
  52               out.println(namingList.next().getName() + "<br/>" );
  53           }
  54 
  55           AddLocal addLocal = (AddLocal) context.lookup("AddWS/local");
  56           List<AddEntity> list = addLocal.getAll();
  57           for(int idx=0; idx<list.size(); idx++){
  58               this.out.println( list.get(idx).getCreationDate().toString() + "<br/>"  );
  59           }
  60       }
  61       catch(Exception ex){
  62       }
  63    }
  64 }
src/main/java/org/allowed/bitarus/TestBean.java
   1 package org.allowed.bitarus;
   2 import java.util.logging.Logger;
   3 import java.util.logging.Level;
   4 
   5 public class TestBean{
   6     private String name;
   7     private Logger logger;
   8     
   9     public TestBean(){
  10         this.logger = Logger.getLogger(this.getClass().getName() );
  11         this.logger.log(Level.INFO,"Created test bean");
  12         this.name="Ioooo";
  13     }   
  14     
  15     public String getName(){
  16         this.logger.info("getName called");
  17         return this.name;        
  18     }
  19     
  20     public void setName(String name){
  21         this.name=name;        
  22     }
  23 }
src/main/webapp/WEB-INF/web.xml
   1 <?xml version="1.0"?>
   2 <web-app version="2.5"
   3    xmlns="http://java.sun.com/xml/ns/javaee"
   4    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   5    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   6    <servlet>
   7         <servlet-name>index</servlet-name>
   8         <jsp-file>/index.jsp</jsp-file>
   9     </servlet>
  10     <servlet-mapping>
  11         <servlet-name>index</servlet-name>
  12         <url-pattern>/index**</url-pattern>
  13     </servlet-mapping>
  14    <servlet>
  15         <servlet-name>otherindex</servlet-name>
  16         <jsp-file>/otherindex.jsp</jsp-file>
  17     </servlet>
  18     <servlet-mapping>
  19         <servlet-name>otherindex</servlet-name>
  20         <url-pattern>/otherindex**</url-pattern>
  21     </servlet-mapping>
  22 </web-app>
src/main/webapp/index.jsp
   1 <%@page import="org.allowed.bitarus.Handler" %>
   2 <jsp:useBean id="test" class="org.allowed.bitarus.TestBean" />
   3 <% //Handler h = new Handler(request,response,out); %>
   4 <% Handler h = new Handler(pageContext); %>
   5 <html>
   6     <body>        
   7         <p>Hello</p>
   8         <p>World <jsp:getProperty name="test" property="name" /> </p>
   9         <% h.writeHandler(); %>
  10         <h2><% out.print("Your IP address is " + request.getRemoteAddr()); %></h2>
  11         <h3><% h.writeIP(); %></h3>
  12         <h3><% h.writeAddResults(); %></h3>
  13     </body>
  14 </html>
src/main/webapp/otherindex.jsp
   1 <%@page import="org.allowed.bitarus.Handler" %>
   2 <jsp:useBean id="test" class="org.allowed.bitarus.TestBean" />
   3 <% //Handler h = new Handler(request,response,out); %>
   4 <% Handler h = new Handler(pageContext); %>
   5 <html>
   6     <body>        
   7         <p>Other Hello</p>
   8         <p>World <jsp:getProperty name="test" property="name" /> </p>
   9         <% h.writeHandler(); %>
  10         <h2><% out.print("Your IP address is " + request.getRemoteAddr()); %></h2>
  11         <h3><% h.writeIP(); %></h3>
  12     </body>
  13 </html>
Spring 3.0.1 in JBoss 5
pom.xml
   1 <?xml version="1.0" encoding="UTF-8"?>
   2 <project xmlns="http://maven.apache.org/POM/4.0.0" 
   3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   5 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   6     <modelVersion>4.0.0</modelVersion>
   7     <groupId>org.allowed.bitarus</groupId>
   8     <artifactId>testSpringMVCJSP</artifactId>
   9     <version>0.1.0</version>
  10     <packaging>war</packaging>
  11     <dependencies>
  12                 <dependency>
  13                         <groupId>org.springframework</groupId>
  14                         <artifactId>spring-core</artifactId>
  15                         <version>3.0.1.RELEASE</version>
  16                 </dependency>
  17                 <dependency>
  18                         <groupId>org.springframework</groupId>
  19                         <artifactId>spring-web</artifactId>
  20                         <version>3.0.1.RELEASE</version>
  21                 </dependency> 
  22                 <dependency>
  23                         <groupId>org.springframework</groupId>
  24                         <artifactId>spring-webmvc</artifactId>
  25                         <version>3.0.1.RELEASE</version>
  26                 </dependency>
  27     </dependencies>
  28     <build>
  29         <sourceDirectory>src/main/java</sourceDirectory>
  30         <plugins>
  31            <plugin>
  32                 <artifactId>maven-compiler-plugin</artifactId>
  33                 <configuration>
  34                     <source>1.5</source>
  35                     <target>1.5</target>
  36                 </configuration>
  37             </plugin>
  38         </plugins>
  39     </build>
  40 </project>
src/main/java/org/allowed/bitarus/hello/HelloController.java
   1 package org.allowed.bitarus.hello;
   2 
   3 import org.springframework.stereotype.Controller;
   4 import org.springframework.ui.Model;
   5 import org.springframework.web.bind.annotation.RequestMapping;
   6 import org.springframework.web.bind.annotation.RequestParam;
   7 
   8 @Controller
   9 public class HelloController {
  10     @RequestMapping("/hello")
  11     public String hellox(@RequestParam(value="name", required=false,  defaultValue="World") String name, Model model) {
  12         model.addAttribute("name", name);
  13         return "greeting";
  14     }
  15 }
src/main/webapp/WEB-INF/mvc-dispatcher-servlet.xml
   1 <beans xmlns="http://www.springframework.org/schema/beans"
   2         xmlns:context="http://www.springframework.org/schema/context"
   3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4         xsi:schemaLocation="
   5         http://www.springframework.org/schema/beans     
   6         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   7         http://www.springframework.org/schema/context 
   8         http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   9         <context:component-scan base-package="org.allowed.bitarus.hello" />
  10         <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  11                 <property name="prefix">
  12                         <value>/WEB-INF/pages/</value>
  13                 </property>
  14                 <property name="suffix">
  15                         <value>.jsp</value>
  16                 </property>
  17         </bean>
  18 </beans>
src/main/webapp/WEB-INF/pages/greeting.jsp
src/main/webapp/WEB-INF/web.xml
   1 <web-app id="WebApp_ID" version="2.4"
   2         xmlns="http://java.sun.com/xml/ns/j2ee" 
   3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
   5         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
   6  
   7         <display-name>Spring MVC Application + JSP</display-name> 
   8         <servlet>
   9                 <servlet-name>mvc-dispatcher</servlet-name>
  10                 <servlet-class>
  11                        org.springframework.web.servlet.DispatcherServlet
  12                 </servlet-class>
  13                 <load-on-startup>1</load-on-startup>
  14         </servlet>
  15         <servlet-mapping>
  16                 <servlet-name>mvc-dispatcher</servlet-name>
  17                 <url-pattern>/</url-pattern>
  18         </servlet-mapping>
  19         <context-param>
  20                 <param-name>contextConfigLocation</param-name>
  21                 <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
  22         </context-param>
  23         <listener>
  24                 <listener-class>
  25                       org.springframework.web.context.ContextLoaderListener
  26                 </listener-class>
  27         </listener>
  28 </web-app>
EJB 3.0 Contacts, JPA
src/main/java/org/allowed/bitarus/ContactsLocal.java
   1 package org.allowed.bitarus;
   2 
   3 import javax.ejb.Local;
   4 import java.util.List;
   5 
   6 @Local
   7 public interface ContactsLocal {
   8     void add(String firstName, String lastName, String address, String phoneNumber);
   9     List<ContactEntity> getAll();
  10     ContactEntity get(long id);
  11     void remove(long id);
  12     void edit(long id, String firstName, String lastName, String address, String phoneNumber  );
  13 }
src/main/java/org/allowed/bitarus/ContactsWS.java
   1 package org.allowed.bitarus;
   2 
   3 import javax.ejb.Stateless;
   4 import javax.jws.WebMethod;
   5 import javax.jws.WebService;
   6 import org.allowed.bitarus.ContactsRemote;
   7 import javax.persistence.PersistenceContext;
   8 import javax.persistence.EntityManager;
   9 import java.util.List;
  10 import javax.persistence.NamedQuery;
  11 
  12 @Stateless
  13 @WebService
  14 public class ContactsWS implements ContactsRemote, ContactsLocal {
  15     @PersistenceContext(unitName="puContactsDefaultDS")
  16     EntityManager em;
  17 
  18     @WebMethod
  19     public void add(String firstName, String lastName, String address, String phoneNumber ) {
  20         ContactEntity c = new ContactEntity();
  21         c.setFirstName(firstName);
  22         c.setLastName(lastName);
  23         c.setAddress(address);
  24         c.setPhoneNumber(phoneNumber);
  25         c.setCreationDate( new java.util.Date() );
  26         em.persist(c);
  27     }
  28     
  29     @WebMethod
  30     public List<ContactEntity> getAll(){
  31       return em.createQuery("select a from ContactEntity a ").getResultList();
  32     }
  33 
  34     @WebMethod
  35     public ContactEntity get(long id){
  36       //return (ContactEntity) em.createQuery("select a from ContactEntity a where a.id = :id").setParameter("id", id).getSingleResult();
  37       return (ContactEntity) em.createNamedQuery("Contacts.byId").setParameter("id", id).getSingleResult();
  38     }
  39 
  40     @WebMethod
  41     public void remove(long id){
  42       ContactEntity ent = (ContactEntity) em.createNamedQuery("Contacts.byId").setParameter("id", id).getSingleResult();
  43       em.remove(ent);
  44     }
  45 
  46     @WebMethod
  47     public void edit(long id, String firstName, String lastName, String address, String phoneNumber  ){
  48       ContactEntity ent = (ContactEntity) em.createNamedQuery("Contacts.byId").setParameter("id", id).getSingleResult();
  49       ent.setFirstName(firstName);
  50       ent.setLastName(lastName);
  51       ent.setAddress(address);
  52       ent.setPhoneNumber(phoneNumber);
  53       em.persist(ent);
  54     }
  55 
  56 }
src/main/java/org/allowed/bitarus/ContactsRemote.java
   1 package org.allowed.bitarus;
   2 
   3 import javax.ejb.Remote;
   4 import java.util.List;
   5 
   6 @Remote
   7 public interface ContactsRemote {
   8     void add(String firstName, String lastName, String address, String phoneNumber);
   9     List<ContactEntity> getAll();
  10     ContactEntity get(long id);
  11     void remove(long id);
  12     void edit(long id, String firstName, String lastName, String address, String phoneNumber  );
  13 
  14 }
src/main/java/org/allowed/bitarus/ContactEntity.java
   1 package org.allowed.bitarus;
   2 
   3 import java.util.Date;
   4 import javax.persistence.Id;
   5 import javax.persistence.Entity;
   6 import javax.persistence.Column;
   7 import javax.persistence.GeneratedValue;
   8 import javax.persistence.GenerationType;
   9 import javax.persistence.TemporalType;
  10 import javax.persistence.Temporal;
  11 import javax.persistence.NamedQueries;
  12 import javax.persistence.NamedQuery;
  13 
  14 @Entity
  15 @NamedQueries( { @NamedQuery(name="Contacts.byId",query="select a from ContactEntity a where a.id = :id")   } )
  16 public class ContactEntity{
  17     @Id
  18     @GeneratedValue(strategy = GenerationType.IDENTITY) 
  19     private long id;
  20 
  21     @Column
  22     @Temporal(TemporalType.TIMESTAMP) 
  23     private Date creationDate;
  24 
  25     @Column
  26     private String firstName;
  27 
  28     @Column
  29     private String lastName;
  30 
  31     @Column
  32     private String address;
  33 
  34     @Column
  35     private String phoneNumber;
  36 
  37     public void setId(long id){this.id=id;}
  38     public long getId(){return this.id;}
  39 
  40     public void setCreationDate(Date creationDate){this.creationDate=creationDate;}
  41     public Date getCreationDate(){return this.creationDate;}
  42 
  43     public void setFirstName(String firstName){this.firstName=firstName;}
  44     public String getFirstName(){return this.firstName;}
  45 
  46     public void setLastName(String lastName){this.lastName=lastName;}
  47     public String  getLastName(){return this.lastName;}
  48 
  49     public void setAddress(String address){this.address=address;}
  50     public String getAddress(){return this.address;}
  51 
  52     public void setPhoneNumber(String phoneNumber){this.phoneNumber=phoneNumber;}
  53     public String getPhoneNumber(){return this.phoneNumber;}
  54 
  55 }
src/main/resources/META-INF/ejb-jar.xml
   1 <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
   2         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   3         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
   4         version="3.0">
   5         <enterprise-beans>
   6                 <session>
   7                         <ejb-name>ContactsWS</ejb-name>
   8                         <business-local>org.allowed.bitarus.ContactsLocal</business-local>
   9                         <business-remote>org.allowed.bitarus.ContactsRemote</business-remote>
  10                         <ejb-class>org.allowed.bitarus.ContactsWS</ejb-class>
  11                         <session-type>Stateless</session-type>
  12                         <transaction-type>Container</transaction-type>
  13                 </session>
  14         </enterprise-beans>
  15 </ejb-jar>
src/main/resources/META-INF/persistence.xml
   1 <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
   2     <persistence-unit name="puContactsDefaultDS" transaction-type="JTA">
   3         <jta-data-source>java:/DefaultDS</jta-data-source>
   4         <properties>
   5           <property name="hibernate.show_sql" value="true" />
   6           <property name="hibernate.format_sql" value="true" />
   7           <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
   8           <property name="hibernate.hbm2ddl.auto" value="update"/>
   9         </properties>
  10     </persistence-unit>
  11 </persistence>
pom.xml
   1 <project xmlns="http://maven.apache.org/POM/4.0.0"
   2         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   3         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   4         <modelVersion>4.0.0</modelVersion>
   5         <groupId>org.allowed.bitarus</groupId>
   6         <artifactId>ejbcontacts</artifactId>
   7         <version>0.0.1</version>
   8         <packaging>ejb</packaging>
   9         <dependencies>
  10                 <dependency>
  11                         <groupId>javaee</groupId>
  12                         <artifactId>javaee-api</artifactId>
  13                         <version>5</version>
  14                         <scope>provided</scope>
  15                 </dependency>
  16         </dependencies>
  17         <build>
  18                 <sourceDirectory>src</sourceDirectory>
  19                 <plugins>
  20                         <plugin>
  21                                 <artifactId>maven-compiler-plugin</artifactId>
  22                                 <configuration>
  23                                         <source>1.5</source>
  24                                         <target>1.5</target>
  25                                 </configuration>
  26                         </plugin>
  27                 </plugins>
  28         </build>
  29 </project>
WAR Contacts
External files:
- src/main/webapp/js/bootstrap.min.js
- src/main/webapp/js/jquery-3.5.1.min.js
- src/main/webapp/css/bootstrap.min.css
deploy_to_target.sh
rm ../warcontacts.tgz tar cvzf ../warcontacts.tgz ../warcontacts cp ../warcontacts.tgz ../target/ docker exec -it jboss5_container /bin/sh -c 'cd /app;rm -rf warcontacts; tar xvzf warcontacts.tgz' docker exec -it jboss5_container /bin/sh -c 'cd /app/warcontacts; rm /app/jboss-5.1.0.GA/server/default/deploy/warcontacts-0.0.1.war; mvn clean install;' docker exec -it jboss5_container /bin/sh -c 'cp /app/warcontacts/target/warcontacts-0.0.1.war /app/jboss-5.1.0.GA/server/default/deploy'
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.allowed.bitarus</groupId>
        <artifactId>warcontacts</artifactId>
        <version>0.0.1</version>
        <packaging>war</packaging>
        <dependencies>
                <dependency>
                        <groupId>javaee</groupId>
                        <artifactId>javaee-api</artifactId>
                        <version>5</version>
                        <scope>provided</scope>
                </dependency>
                <dependency>
                        <groupId>org.allowed.bitarus</groupId>
                        <artifactId>ejbcontacts</artifactId>
                        <version>0.0.1</version>
                        <scope>provided</scope>
                </dependency>
        </dependencies>
        <build>
                <plugins>
                        <plugin>
                                <artifactId>maven-compiler-plugin</artifactId>
                                <configuration>
                                        <source>1.5</source>
                                        <target>1.5</target>
                                </configuration>
                        </plugin>
                </plugins>
        </build>
</project>
src/main/java/org/allowed/bitarus/Handler.java
package org.allowed.bitarus;
import java.util.logging.Logger;
import java.util.logging.Level;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.naming.InitialContext;
import java.io.IOException;
import java.util.List;
import javax.naming.NamingEnumeration;
import javax.naming.NameClassPair;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
public class Handler {
        private static final String CONTACTS_WS_LOCAL = "ContactsWS/local";
        private ServletRequest request;
        private ServletResponse response;
        private JspWriter out;
        public Handler(ServletRequest request, ServletResponse response, JspWriter out) {
                this.request = request;
                this.response = response;
                this.out = out;
        }
        public Handler(PageContext pageContext) {
                this.request = pageContext.getRequest();
                this.response = pageContext.getResponse();
                this.out = (JspWriter) pageContext.getAttribute(PageContext.OUT);
                HttpServletRequest hsr = (HttpServletRequest) this.request;
                System.out.println(String.format("Current method %s", hsr.getMethod()));
                System.out.println(String.format("Path %s", hsr.getServletPath()));
                if ("POST".equals(hsr.getMethod())) {
                        Map<String, String> params = hsr.getParameterMap();
                        for (String key : params.keySet()) {
                                System.out.println(String.format("%s:%s", key, hsr.getParameter(key)));
                        }
                        handleAddPost(hsr);
                        handleDeletePost(hsr);
                        handleUpdatePost(hsr);
                }
        }
        private void handleUpdatePost(HttpServletRequest hsr) {
                if ("/update.jsp".equals(hsr.getServletPath())) {
                        try {
                                InitialContext context = new InitialContext();
                                ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL);
                                long id = Integer.parseInt(hsr.getParameter("cid"));
                                String firstName = hsr.getParameter("firstname");
                                String lastName = hsr.getParameter("lastname");
                                String address = hsr.getParameter("address");
                                String phoneNumber = hsr.getParameter("phonenumber");
                                contacts.edit(id, firstName, lastName, address, phoneNumber);
                                redirectToIndex(hsr);
                        } catch (Exception ex) {
                        }
                }
        }
        private void handleDeletePost(HttpServletRequest hsr) {
                if ("/delete.jsp".equals(hsr.getServletPath())) {
                        try {
                                InitialContext context = new InitialContext();
                                ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL);
                                contacts.remove(Integer.parseInt(hsr.getParameter("id")));
                                redirectToIndex(hsr);
                        } catch (Exception ex) {
                        }
                }
        }
        private void handleAddPost(HttpServletRequest hsr) {
                if ("/add.jsp".equals(hsr.getServletPath())) {
                        try {
                                InitialContext context = new InitialContext();
                                ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL);
                                contacts.add(hsr.getParameter("firstname"), hsr.getParameter("lastname"), hsr.getParameter("address"),
                                                hsr.getParameter("phonenumber"));
                                redirectToIndex(hsr);
                        } catch (Exception ex) {
                        }
                }
        }
        private void redirectToIndex(HttpServletRequest hsr) throws IOException {
                ((HttpServletResponse) this.response).sendRedirect(hsr.getContextPath() + "/index.jsp");
        }
        public void writeHandler() {
                try {
                        this.out.println(String.format("<p>Handler up %s</p>", this.request.getParameter("user")));
                } catch (Exception ex) {
                }
        }
        public void writeIP() {
                try {
                        this.out.print("!!! Your IP address is " + this.request.getRemoteAddr());
                } catch (Exception ex) {
                }
        }
        public List<ContactEntity> getAllContacts() {
                List<ContactEntity> ret = null;
                try {
                        InitialContext context = new InitialContext();
                        ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL);
                        ret = contacts.getAll();
                } catch (Exception ex) {
                }
                return ret;
        }
        public ContactEntity getContact(long id) {
                ContactEntity ret = null;
                try {
                        InitialContext context = new InitialContext();
                        ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL);
                        ret = contacts.get(id);
                } catch (Exception ex) {
                }
                return ret;
        }
}
src/main/webapp/add.jsp
<%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %>
<% Handler h = new Handler(pageContext); %>
<html>
    <head>
        <jsp:include page="head.jsp" />  
    </head>
    <body>       
        <jsp:include page="nav.jsp" />
        <div class="container topspace">
            <div class="row"> 
                <div class="col-sm-2"></div>
                <div class="col-sm-8">    
                    <form  action="add.jsp" method="post"  >
                        <label for="firstname">First name:</label><br/>
                        <input type="text" id="firstname" name="firstname" class="form-control"><br/>
                        <label for="lastname">Last name:</label><br/>
                        <input type="text" id="lastname" name="lastname" class="form-control"><br/>
                        <label for="address">Address::</label><br/>
                        <input type="text" id="Address:" name="address" class="form-control"><br/>
                        <label for="phonenumber">Phone number:</label><br/>
                        <input type="text" id="phonenumber" name="phonenumber" class="form-control"><br/>
                        <input type="submit" value="Add"  class="form-control btn btn-primary button"/>
                    </form>    
                </div> 
                <div class="col-sm-2"></div>   
            </div>
        </div>          
    </body>
</html>
src/main/webapp/css/warcontacts.css
.button{margin-top:2px; margin-bottom:2px;}
.topspace { padding-top: 10px; }    
src/main/webapp/delete.jsp
<%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %>
<% Handler h = new Handler(pageContext); %>
<html>
    <head>
        <jsp:include page="head.jsp" />  
    </head>
    <body>       
        <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) );  %> 
        <jsp:include page="nav.jsp" />
        <div class="container  topspace">
            <div class="row"> 
                <div class="col-sm-2"></div>
                <div class="col-sm-8">         
                    <% if(ci!=null) { %>
                        <p><strong>Id:</strong>  <%= ci.getId() %></p>
                        <p><strong>First name:</strong>  <%= ci.getFirstName() %></p>
                        <p><strong>Last name:</strong>  <%= ci.getLastName() %></p>
                        <p><strong>Creation date:</strong> <%= ci.getCreationDate() %></p>
                        <p><strong>Address:</strong>  <%= ci.getAddress() %></p>
                        <p><strong>Phone:</strong>  <%= ci.getPhoneNumber() %></p>
                        <form action="delete.jsp" method="post">
                            <input type="hidden" id="id" name="id" value="<%=ci.getId()%>"  />
                            <input type="submit" class="form-control btn btn-primary button" value="Delete">
                        </form>
                    <% }  %>
                </div> 
                <div class="col-sm-2"></div>   
            </div>
        </div>              
    </body>
</html>
src/main/webapp/head.jsp
<link rel="stylesheet" href="css/bootstrap.min.css"/> <link rel="stylesheet" href="css/warcontacts.css"/> <script src="js/jquery-3.5.1.min.js"></script> <script src="js/bootstrap.min.js" ></script>
src/main/webapp/index.jsp
<%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %>
<% Handler h = new Handler(pageContext); %>
<html>
        <head>
                <jsp:include page="head.jsp" />  
        </head>
    <body>        
        <jsp:include page="nav.jsp" />      
                <div class="container topspace">
                <div class="row"> 
                        <div class="col-sm-2"></div>
                        <div class="col-sm-8">
                                <% List<ContactEntity> contacts = h.getAllContacts(); %>
                                <a href="add.jsp" class="btn btn-primary button">Add</a>
                                <table class="table table-stripped" >
                                    <tr>
                                                        <th>FirstName</th>
                                                        <th>LastName</th>
                                                        <th>Actions</th>
                                </tr>
                                        <% for(int i=0; i<contacts.size() ;i++){  %>
                                        <tr>
                                                                <% ContactEntity contact = ((ContactEntity)contacts.get(i));  %>
                                                                <td><%= contact.getFirstName() %></td>
                                                                <td><%= contact.getLastName() %></td>
                                                                <td>
                                                                <a href="view.jsp?id=<%=contact.getId()%>" class="btn btn-primary button">View</a>
                                                                        <a href="update.jsp?id=<%=contact.getId()%>" class="btn btn-primary button">Update</a>
                                                                        <a href="delete.jsp?id=<%=contact.getId()%>" class="btn btn-primary button">Delete</a>     
                                                                </td>
                                        </tr>
                                        <%}%>
                               </table>
                        </div> 
                        <div class="col-sm-2"></div>   
                </div>
                </div> 
        </body>
</html>
src/main/webapp/nav.jsp
<nav class="navbar navbar-dark bg-dark navbar-fixed-top">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="index.jsp">Contacts</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
              <li class="active"><a href="index.jsp">List</a></li>
          </ul>
        </div>
    </div>
</nav>
src/main/webapp/update.jsp
<%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %>
<% Handler h = new Handler(pageContext); %>
<html>
    <head>
        <jsp:include page="head.jsp" />  
    </head>
    <body>       
        <jsp:include page="nav.jsp" />
        <div class="container topspace">
            <div class="row"> 
                <div class="col-sm-2"></div>
                <div class="col-sm-8">              
                                        <% if( request.getParameter("id") != null ) { %>
                                        <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) );  %>
                                                <form  action="update.jsp" method="post"  >
                                                        <label for="firstname">First name:</label><br/>
                                                        <input class="form-control" type="text" id="firstname" name="firstname" value="<%= ci.getFirstName() %>"/><br/>
                                                        <label for="lastname">Last name:</label><br/>
                                                        <input class="form-control" type="text" id="lastname" name="lastname" value="<%= ci.getLastName() %>" /><br/>
                                                        <label for="address">Address::</label><br/>
                                                        <input class="form-control" type="text" id="Address:" name="address" value="<%= ci.getAddress() %>"/><br/>
                                                        <label for="phonenumber">Phone number:</label><br/>
                                                        <input class="form-control" type="text" id="phonenumber" name="phonenumber" value="<%= ci.getPhoneNumber() %>"/><br/>
                                                        <input class="form-control" type="hidden" id="cid" name="cid" value="<%=ci.getId()%>"/> 
                                                        <input type="submit" value="Update" class="form-control btn btn-primary button" >
                                                </form>
                                        <% } %> 
                </div> 
                <div class="col-sm-2"></div>   
            </div>
        </div>                   
    </body>
</html>
src/main/webapp/view.jsp
<%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %>
<% Handler h = new Handler(pageContext); %>
<html>
    <head>
        <jsp:include page="head.jsp" />  
    </head>
    <body>       
        <jsp:include page="nav.jsp" />
        <div class="container topspace">
            <div class="row"> 
                <div class="col-sm-2"></div>
                <div class="col-sm-8">    
                    <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) );  %> 
                    <p><strong>Id:</strong>  <%= ci.getId() %></p>
                    <p><strong>First name:</strong>  <%= ci.getFirstName() %></p>
                    <p><strong>Last name:</strong>  <%= ci.getLastName() %></p>
                    <p><strong>Creation date:</strong> <%= ci.getCreationDate() %></p>
                    <p><strong>Address:</strong>  <%= ci.getAddress() %></p>
                    <p><strong>Phone:</strong>  <%= ci.getPhoneNumber() %></p>
                </div> 
                <div class="col-sm-2"></div>   
            </div>
        </div>         
    </body>
</html>
src/main/webapp/WEB-INF/web.xml
<?xml version="1.0"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>
EAR with JMS and PgSQL
 
 
Setup postgresql in docker
cd /app/jboss-5.1.0.GA/server/default/lib
wget https://jdbc.postgresql.org/download/postgresql-9.3-1103.jdbc3.jar
apt install postgresql-9.5
su postgres
mkdir -p /var/run/postgresql/9.5-main.pg_stat_tmp/
/usr/lib/postgresql/9.5/bin/postgres -D /var/lib/postgresql/9.5/main -c config_file=/etc/postgresql/9.5/main/postgresql.conf
su postgres
psql
create user appuser with login password '12345678';
create database app;
grant all privileges on database app to appuser;
\q
Datasource in Jboss , Local Tx Datasources
PostgresDS
org.postgresql.Driver
jdbc:postgresql://localhost/app?user=appuser&password=12345678
/app/jboss-5.1.0.GA/server/default/deploy# cat PostgresDS-ds.xml 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<datasources>
    <local-tx-datasource>
        <jndi-name>PostgresDS</jndi-name>
        <rar-name>jboss-local-jdbc.rar</rar-name>
        <use-java-context>true</use-java-context>
        <connection-definition>javax.sql.DataSource</connection-definition>
        <jmx-invoker-name>jboss:service=invoker,type=jrmp</jmx-invoker-name>
        <min-pool-size>0</min-pool-size>
        <max-pool-size>10</max-pool-size>
        <blocking-timeout-millis>30000</blocking-timeout-millis>
        <idle-timeout-minutes>30</idle-timeout-minutes>
        <prefill>false</prefill>
        <background-validation>false</background-validation>
        <background-validation-millis>0</background-validation-millis>
        <validate-on-match>true</validate-on-match>
        <statistics-formatter>org.jboss.resource.statistic.pool.JBossDefaultSubPoolStatisticFormatter</statistics-formatter>
        <isSameRM-override-value>false</isSameRM-override-value>
        <allocation-retry>0</allocation-retry>
        <allocation-retry-wait-millis>5000</allocation-retry-wait-millis>
        <security-domain xsi:type="securityMetaData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
        <metadata/>
        <local-transaction/>
        <prepared-statement-cache-size>0</prepared-statement-cache-size>
        <share-prepared-statements>false</share-prepared-statements>
        <set-tx-query-timeout>false</set-tx-query-timeout>
        <query-timeout>0</query-timeout>
        <use-try-lock>0</use-try-lock>
        <driver-class>org.postgresql.Driver</driver-class>
        <connection-url>jdbc:postgresql://localhost/app?user=appuser&password=12345678</connection-url>
    </local-tx-datasource>
</datasources>
Create JMS queue
mkdir -p /app/jboss-5.1.0.GA/server/default/deploy/queue
nano /app/jboss-5.1.0.GA/server/default/deploy/queue/ContactsQueue-service.xml 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<server>
    <mbean xmbean-dd="xmdesc/Queue-xmbean.xml" name="jboss.messaging.destination:service=Queue,name=ContactsQueue" code="org.jboss.jms.server.destination.QueueService">
        <attribute name="JNDIName">/queue/ContactsQueue</attribute>
        <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
        <depends>jboss.messaging:service=PostOffice</depends>
    </mbean>
</server>
Structure
.
├── deploy_to_target.sh
├── earcontacts
│   └── pom.xml
│
├── ejbcontacts
│   ├── pom.xml
│   └── src
│       └── main
│           ├── java
│           │   └── org
│           │       └── allowed
│           │           └── bitarus
│           │               ├── ContactEntity.java
│           │               ├── ContactsLocal.java
│           │               ├── ContactsMDB.java
│           │               ├── ContactsRemote.java
│           │               └── ContactsWS.java
│           └── resources
│               └── META-INF
│                   ├── ejb-jar.xml
│                   └── persistence.xml
├── pom.xml
└── warcontacts
    ├── pom.xml
    └── src
        └── main
            ├── java
            │   └── org
            │       └── allowed
            │           └── bitarus
            │               └── Handler.java
            └── webapp
                ├── add.jsp
                ├── css
                │   ├── bootstrap.min.css
                │   └── warcontacts.css
                ├── delete.jsp
                ├── head.jsp
                ├── index.jsp
                ├── js
                │   ├── bootstrap.min.js
                │   └── jquery-3.5.1.min.js
                ├── nav.jsp
                ├── update.jsp
                ├── view.jsp
                └── WEB-INF
                    └── web.xml
deploy_to_target.sh
rm ../contacts.tgz tar cvzf ../contacts.tgz ../contacts cp ../contacts.tgz ../target/ docker exec -it jboss5_container /bin/sh -c 'cd /app;rm -rf contacts; tar xvzf contacts.tgz' docker exec -it jboss5_container /bin/sh -c 'cd /app/contacts; rm /app/jboss-5.1.0.GA/server/default/deploy/earcontacts-0.0.1.ear; mvn clean install;' docker exec -it jboss5_container /bin/sh -c 'cp /app/contacts/earcontacts/target/earcontacts-0.0.1.ear /app/jboss-5.1.0.GA/server/default/deploy'
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.allowed.bitarus</groupId>
        <artifactId>contacts</artifactId>
        <version>1.0</version>
        <packaging>pom</packaging>
        <modules>
                <module>ejbcontacts</module>
                <module>warcontacts</module>
                <module>earcontacts</module>
        </modules>
</project>
earcontacts/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.allowed.bitarus</groupId>
        <artifactId>earcontacts</artifactId>
        <version>0.0.1</version>
        <packaging>ear</packaging>
        <dependencies>
                <dependency>
                        <groupId>org.allowed.bitarus</groupId>
                        <artifactId>warcontacts</artifactId>
                        <version>0.0.1</version>
                        <type>war</type>
                </dependency>
                <dependency>
                        <groupId>org.allowed.bitarus</groupId>
                        <artifactId>ejbcontacts</artifactId>
                        <version>0.0.1</version>
                        <type>ejb</type>
                </dependency>
        </dependencies>
        <build>
                <plugins>
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-ear-plugin</artifactId>
                                <version>2.10.1</version>
                                <configuration>
                                        <version>5</version>
                                        <defaultLibBundleDir>lib</defaultLibBundleDir>
                                        <filtering>true</filtering>
                                        <modules>
                                                <ejbModule>
                                                        <groupId>org.allowed.bitarus</groupId>
                                                        <artifactId>ejbcontacts</artifactId>
                                                        <bundleDir>/</bundleDir>
                                                </ejbModule>
                                                <webModule>
                                                        <groupId>org.allowed.bitarus</groupId>
                                                        <artifactId>warcontacts</artifactId>
                                                        <bundleDir>/</bundleDir>
                                                </webModule>
                                        </modules>
                                </configuration>
                        </plugin>
                        <plugin>
                                <artifactId>maven-compiler-plugin</artifactId>
                                <configuration>
                                        <source>1.5</source>
                                        <target>1.5</target>
                                </configuration>
                        </plugin>
                </plugins>
        </build>
</project>
ejbcontacts/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.allowed.bitarus</groupId>
        <artifactId>ejbcontacts</artifactId>
        <version>0.0.1</version>
        <packaging>ejb</packaging>
        <dependencies>
                <dependency>
                        <groupId>javaee</groupId>
                        <artifactId>javaee-api</artifactId>
                        <version>5</version>
                        <scope>provided</scope>
                </dependency>
        </dependencies>
        <build>
                <plugins>
                        <plugin>
                                <artifactId>maven-compiler-plugin</artifactId>
                                <configuration>
                                        <source>1.5</source>
                                        <target>1.5</target>
                                </configuration>
                        </plugin>
                </plugins>
        </build>
</project>
ejbcontacts/src/main/java/org/allowed/bitarus/ContactEntity.java
package org.allowed.bitarus;
import java.util.Date;
import javax.persistence.Id;
import javax.persistence.Entity;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.TemporalType;
import javax.persistence.Temporal;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
@Entity
@NamedQueries( { @NamedQuery(name="Contacts.byId",query="select a from ContactEntity a where a.id = :id")   } )
public class ContactEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id;
    @Column
    @Temporal(TemporalType.TIMESTAMP) 
    private Date creationDate;
    @Column
    private String firstName;
    @Column
    private String lastName;
    @Column
    private String address;
    @Column
    private String phoneNumber;
    public void setId(long id){this.id=id;}
    public long getId(){return this.id;}
    public void setCreationDate(Date creationDate){this.creationDate=creationDate;}
    public Date getCreationDate(){return this.creationDate;}
    public void setFirstName(String firstName){this.firstName=firstName;}
    public String getFirstName(){return this.firstName;}
    public void setLastName(String lastName){this.lastName=lastName;}
    public String  getLastName(){return this.lastName;}
    public void setAddress(String address){this.address=address;}
    public String getAddress(){return this.address;}
    public void setPhoneNumber(String phoneNumber){this.phoneNumber=phoneNumber;}
    public String getPhoneNumber(){return this.phoneNumber;}
}
ejbcontacts/src/main/java/org/allowed/bitarus/ContactsLocal.java
package org.allowed.bitarus;
import javax.ejb.Local;
import java.util.List;
@Local
public interface ContactsLocal {
        void add(String firstName, String lastName, String address, String phoneNumber);
        List<ContactEntity> getAll();
        ContactEntity get(long id);
        void remove(long id);
        void edit(long id, String firstName, String lastName, String address, String phoneNumber);
        void sendMessage(String message);
}
ejbcontacts/src/main/java/org/allowed/bitarus/ContactsMDB.java
package org.allowed.bitarus;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/*
mkdir -p /app/jboss-5.1.0.GA/server/default/deploy/queue
nano ContactsQueue-service.xml 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<server>
    <mbean xmbean-dd="xmdesc/Queue-xmbean.xml" name="jboss.messaging.destination:service=Queue,name=ContactsQueue" code="org.jboss.jms.server.destination.QueueService">
        <attribute name="JNDIName">/queue/ContactsQueue</attribute>
        <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
        <depends>jboss.messaging:service=PostOffice</depends>
    </mbean>
</server> 
 * */
@MessageDriven(mappedName = "queue/ContactsQueue", messageListenerInterface = MessageListener.class, activationConfig = {
                @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
                @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/ContactsQueue") })
public class ContactsMDB implements MessageListener {
        public void onMessage(Message inMessage) {
                try {
                        String text = ((TextMessage) inMessage).getText();
                        System.out.println(String.format("Got message %s", text));
                } catch (Exception ex) {
                        ex.printStackTrace();
                }
        }
}
ejbcontacts/src/main/java/org/allowed/bitarus/ContactsRemote.java
package org.allowed.bitarus;
import javax.ejb.Remote;
import java.util.List;
@Remote
public interface ContactsRemote {
        void add(String firstName, String lastName, String address, String phoneNumber);
        List<ContactEntity> getAll();
        ContactEntity get(long id);
        void remove(long id);
        void edit(long id, String firstName, String lastName, String address, String phoneNumber);
        void sendMessage(String message);
}
ejbcontacts/src/main/java/org/allowed/bitarus/ContactsWS.java
package org.allowed.bitarus;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jws.WebMethod;
import javax.jws.WebService;
import org.allowed.bitarus.ContactsRemote;
import javax.persistence.PersistenceContext;
import javax.persistence.EntityManager;
import java.util.List;
import javax.persistence.NamedQuery;
@Stateless
@WebService
public class ContactsWS implements ContactsRemote, ContactsLocal {
        @PersistenceContext(unitName = "puContactsDefaultDS")
        EntityManager em;
        @Resource(mappedName = "ConnectionFactory")
        private ConnectionFactory connectionFactory;
        @Resource(mappedName = "queue/ContactsQueue")
        private Queue queue;
        @WebMethod
        public void add(String firstName, String lastName, String address, String phoneNumber) {
                ContactEntity c = new ContactEntity();
                c.setFirstName(firstName);
                c.setLastName(lastName);
                c.setAddress(address);
                c.setPhoneNumber(phoneNumber);
                c.setCreationDate(new java.util.Date());
                em.persist(c);
        }
        @WebMethod
        public List<ContactEntity> getAll() {
                return em.createQuery("select a from ContactEntity a ").getResultList();
        }
        @WebMethod
        public ContactEntity get(long id) {
                // return (ContactEntity) em.createQuery("select a from ContactEntity a where
                // a.id = :id").setParameter("id", id).getSingleResult();
                return (ContactEntity) em.createNamedQuery("Contacts.byId").setParameter("id", id).getSingleResult();
        }
        @WebMethod
        public void remove(long id) {
                ContactEntity ent = (ContactEntity) em.createNamedQuery("Contacts.byId").setParameter("id", id)
                                .getSingleResult();
                em.remove(ent);
        }
        @WebMethod
        public void edit(long id, String firstName, String lastName, String address, String phoneNumber) {
                ContactEntity ent = (ContactEntity) em.createNamedQuery("Contacts.byId").setParameter("id", id)
                                .getSingleResult();
                ent.setFirstName(firstName);
                ent.setLastName(lastName);
                ent.setAddress(address);
                ent.setPhoneNumber(phoneNumber);
                em.persist(ent);
        }
        @WebMethod
        public void sendMessage(String message) {
                try {
                        Connection connection = connectionFactory.createConnection();
                        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
                        MessageProducer messageProducer = session.createProducer(queue);
                        TextMessage textMessage = session.createTextMessage();
                        textMessage.setText(message);
                        messageProducer.send(textMessage);
                        messageProducer.close();
                        session.close();
                        connection.close();
                } catch (Exception ex) {
                        ex.printStackTrace();
                }
        }
}
ejbcontacts/src/main/resources/META-INF/ejb-jar.xml
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
        version="3.0">
        <enterprise-beans>
                <session>
                        <ejb-name>ContactsWS</ejb-name>
                        <business-local>org.allowed.bitarus.ContactsLocal</business-local>
                        <business-remote>org.allowed.bitarus.ContactsRemote</business-remote>
                        <ejb-class>org.allowed.bitarus.ContactsWS</ejb-class>
                        <session-type>Stateless</session-type>
                        <transaction-type>Container</transaction-type>
                </session>
        </enterprise-beans>
</ejb-jar>
ejbcontacts/src/main/resources/META-INF/persistence.xml
<persistence version="1.0"
        xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
        <persistence-unit name="puContactsDefaultDS"
                transaction-type="JTA">
                <jta-data-source>java:/PostgresDS</jta-data-source>
                <properties>
                        <property name="hibernate.show_sql" value="true" />
                        <property name="hibernate.format_sql" value="true" />
                        <property name="hibernate.dialect"
                                value="org.hibernate.dialect.PostgreSQLDialect" />
                        <property name="hibernate.hbm2ddl.auto" value="update" />
                </properties>
        </persistence-unit>
</persistence>
warcontacts/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.allowed.bitarus</groupId>
        <artifactId>warcontacts</artifactId>
        <version>0.0.1</version>
        <packaging>war</packaging>
        <dependencies>
                <dependency>
                        <groupId>javaee</groupId>
                        <artifactId>javaee-api</artifactId>
                        <version>5</version>
                        <scope>provided</scope>
                </dependency>
                <dependency>
                        <groupId>org.allowed.bitarus</groupId>
                        <artifactId>ejbcontacts</artifactId>
                        <version>0.0.1</version>
                        <scope>provided</scope>
                </dependency>
        </dependencies>
        <build>
                <plugins>
                        <plugin>
                                <artifactId>maven-compiler-plugin</artifactId>
                                <configuration>
                                        <source>1.5</source>
                                        <target>1.5</target>
                                </configuration>
                        </plugin>
                </plugins>
        </build>
</project>
warcontacts/src/main/java/org/allowed/bitarus/Handler.java
package org.allowed.bitarus;
import java.util.logging.Logger;
import java.util.logging.Level;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.naming.InitialContext;
import java.io.IOException;
import java.util.List;
import javax.naming.NamingEnumeration;
import javax.naming.NameClassPair;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
public class Handler {  
        private static final String CONTACTS_WS_LOCAL = "earcontacts-0.0.1/ContactsWS/local";
        private ServletRequest request;
        private ServletResponse response;
        private JspWriter out;
        public Handler(ServletRequest request, ServletResponse response, JspWriter out) {
                this.request = request;
                this.response = response;
                this.out = out;
        }
        public Handler(PageContext pageContext) {
                this.request = pageContext.getRequest();
                this.response = pageContext.getResponse();
                this.out = (JspWriter) pageContext.getAttribute(PageContext.OUT);
                HttpServletRequest hsr = (HttpServletRequest) this.request;
                System.out.println(String.format("Current method %s", hsr.getMethod()));
                System.out.println(String.format("Path %s", hsr.getServletPath()));
                if ("POST".equals(hsr.getMethod())) {
                        Map<String, String> params = hsr.getParameterMap();
                        for (String key : params.keySet()) {
                                System.out.println(String.format("%s:%s", key, hsr.getParameter(key)));
                        }
                        handleAddPost(hsr);
                        handleDeletePost(hsr);
                        handleUpdatePost(hsr);
                }
        }
        private void handleUpdatePost(HttpServletRequest hsr) {
                if ("/update.jsp".equals(hsr.getServletPath())) {
                        try {
                                InitialContext context = new InitialContext();
                                ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL);
                                long id = Integer.parseInt(hsr.getParameter("cid"));
                                String firstName = hsr.getParameter("firstname");
                                String lastName = hsr.getParameter("lastname");
                                String address = hsr.getParameter("address");
                                String phoneNumber = hsr.getParameter("phonenumber");
                                contacts.edit(id, firstName, lastName, address, phoneNumber);
                                redirectToIndex(hsr);
                        } catch (Exception ex) {
                        }
                }
        }
        private void handleDeletePost(HttpServletRequest hsr) {
                if ("/delete.jsp".equals(hsr.getServletPath())) {
                        try {
                                InitialContext context = new InitialContext();
                                ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL);
                                contacts.remove(Integer.parseInt(hsr.getParameter("id")));
                                redirectToIndex(hsr);
                        } catch (Exception ex) {
                        }
                }
        }
        private void handleAddPost(HttpServletRequest hsr) {
                if ("/add.jsp".equals(hsr.getServletPath())) {
                        try {
                                InitialContext context = new InitialContext();
                                ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL);
                                contacts.add(hsr.getParameter("firstname"), hsr.getParameter("lastname"), hsr.getParameter("address"),
                                                hsr.getParameter("phonenumber"));
                                redirectToIndex(hsr);
                        } catch (Exception ex) {
                        }
                }
        }
        private void redirectToIndex(HttpServletRequest hsr) throws IOException {
                ((HttpServletResponse) this.response).sendRedirect(hsr.getContextPath() + "/index.jsp");
        }
        public void writeHandler() {
                try {
                        this.out.println(String.format("<p>Handler up %s</p>", this.request.getParameter("user")));
                } catch (Exception ex) {
                }
        }
        public void writeIP() {
                try {
                        this.out.print("!!! Your IP address is " + this.request.getRemoteAddr());
                } catch (Exception ex) {
                }
        }
        public List<ContactEntity> getAllContacts() {
                List<ContactEntity> ret = null;
                try {
                        InitialContext context = new InitialContext();
                        ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL);
                        ret = contacts.getAll();
                } catch (Exception ex) {
                }
                return ret;
        }
        public ContactEntity getContact(long id) {
                ContactEntity ret = null;
                try {
                        InitialContext context = new InitialContext();
                        ContactsLocal contacts = (ContactsLocal) context.lookup(CONTACTS_WS_LOCAL);
                        ret = contacts.get(id);
                } catch (Exception ex) {
                }
                return ret;
        }
}
warcontacts/src/main/webapp/add.jsp
<%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %>
<% Handler h = new Handler(pageContext); %>
<html>
    <head>
        <jsp:include page="head.jsp" />  
    </head>
    <body>       
        <jsp:include page="nav.jsp" />
        <div class="container topspace">
            <div class="row"> 
                <div class="col-sm-2"></div>
                <div class="col-sm-8">    
                    <form  action="add.jsp" method="post"  >
                        <label for="firstname">First name:</label><br/>
                        <input type="text" id="firstname" name="firstname" class="form-control"><br/>
                        <label for="lastname">Last name:</label><br/>
                        <input type="text" id="lastname" name="lastname" class="form-control"><br/>
                        <label for="address">Address::</label><br/>
                        <input type="text" id="Address:" name="address" class="form-control"><br/>
                        <label for="phonenumber">Phone number:</label><br/>
                        <input type="text" id="phonenumber" name="phonenumber" class="form-control"><br/>
                        <input type="submit" value="Add"  class="form-control btn btn-primary button"/>
                    </form>    
                </div> 
                <div class="col-sm-2"></div>   
            </div>
        </div>          
    </body>
</html>
warcontacts/src/main/webapp/css/bootstrap.min.css
warcontacts/src/main/webapp/css/warcontacts.css
.button{margin-top:2px; margin-bottom:2px;}
.topspace { padding-top: 10px; }    2020-06-24T18:20:45 [vitor@debian:3 ~/JBoss5Docker/contacts]
warcontacts/src/main/webapp/delete.jsp
<%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %>
<% Handler h = new Handler(pageContext); %>
<html>
    <head>
        <jsp:include page="head.jsp" />  
    </head>
    <body>       
        <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) );  %> 
        <jsp:include page="nav.jsp" />
        <div class="container  topspace">
            <div class="row"> 
                <div class="col-sm-2"></div>
                <div class="col-sm-8">         
                    <% if(ci!=null) { %>
                        <p><strong>Id:</strong>  <%= ci.getId() %></p>
                        <p><strong>First name:</strong>  <%= ci.getFirstName() %></p>
                        <p><strong>Last name:</strong>  <%= ci.getLastName() %></p>
                        <p><strong>Creation date:</strong> <%= ci.getCreationDate() %></p>
                        <p><strong>Address:</strong>  <%= ci.getAddress() %></p>
                        <p><strong>Phone:</strong>  <%= ci.getPhoneNumber() %></p>
                        <form action="delete.jsp" method="post">
                            <input type="hidden" id="id" name="id" value="<%=ci.getId()%>"  />
                            <input type="submit" class="form-control btn btn-primary button" value="Delete">
                        </form>
                    <% }  %>
                </div> 
                <div class="col-sm-2"></div>   
            </div>
        </div>              
    </body>
</html>
warcontacts/src/main/webapp/head.jsp
<link rel="stylesheet" href="css/bootstrap.min.css"/> <link rel="stylesheet" href="css/warcontacts.css"/> <script src="js/jquery-3.5.1.min.js"></script> <script src="js/bootstrap.min.js" ></script>
warcontacts/src/main/webapp/index.jsp
<%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %>
<% Handler h = new Handler(pageContext); %>
<html>
        <head>
                <jsp:include page="head.jsp" />  
        </head>
    <body>        
        <jsp:include page="nav.jsp" />      
                <div class="container topspace">
                <div class="row"> 
                        <div class="col-sm-2"></div>
                        <div class="col-sm-8">
                                <% List<ContactEntity> contacts = h.getAllContacts(); %>
                                <a href="add.jsp" class="btn btn-primary button">Add</a>
                                <table class="table table-stripped" >
                                    <tr>
                                                        <th>FirstName</th>
                                                        <th>LastName</th>
                                                        <th>Actions</th>
                                </tr>
                                        <% for(int i=0; i<contacts.size() ;i++){  %>
                                        <tr>
                                                                <% ContactEntity contact = ((ContactEntity)contacts.get(i));  %>
                                                                <td><%= contact.getFirstName() %></td>
                                                                <td><%= contact.getLastName() %></td>
                                                                <td>
                                                                <a href="view.jsp?id=<%=contact.getId()%>" class="btn btn-primary button">View</a>
                                                                        <a href="update.jsp?id=<%=contact.getId()%>" class="btn btn-primary button">Update</a>
                                                                        <a href="delete.jsp?id=<%=contact.getId()%>" class="btn btn-primary button">Delete</a>     
                                                                </td>
                                        </tr>
                                        <%}%>
                               </table>
                        </div> 
                        <div class="col-sm-2"></div>   
                </div>
                </div> 
        </body>
</html>
warcontacts/src/main/webapp/js/bootstrap.min.js
warcontacts/src/main/webapp/js/jquery-3.5.1.min.js
warcontacts/src/main/webapp/nav.jsp
<nav class="navbar navbar-dark bg-dark navbar-fixed-top">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="index.jsp">Contacts</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
              <li class="active"><a href="index.jsp">List</a></li>
          </ul>
        </div>
    </div>
</nav>
warcontacts/src/main/webapp/update.jsp
<%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %>
<% Handler h = new Handler(pageContext); %>
<html>
    <head>
        <jsp:include page="head.jsp" />  
    </head>
    <body>       
        <jsp:include page="nav.jsp" />
        <div class="container topspace">
            <div class="row"> 
                <div class="col-sm-2"></div>
                <div class="col-sm-8">              
                                        <% if( request.getParameter("id") != null ) { %>
                                        <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) );  %>
                                                <form  action="update.jsp" method="post"  >
                                                        <label for="firstname">First name:</label><br/>
                                                        <input class="form-control" type="text" id="firstname" name="firstname" value="<%= ci.getFirstName() %>"/><br/>
                                                        <label for="lastname">Last name:</label><br/>
                                                        <input class="form-control" type="text" id="lastname" name="lastname" value="<%= ci.getLastName() %>" /><br/>
                                                        <label for="address">Address::</label><br/>
                                                        <input class="form-control" type="text" id="Address:" name="address" value="<%= ci.getAddress() %>"/><br/>
                                                        <label for="phonenumber">Phone number:</label><br/>
                                                        <input class="form-control" type="text" id="phonenumber" name="phonenumber" value="<%= ci.getPhoneNumber() %>"/><br/>
                                                        <input class="form-control" type="hidden" id="cid" name="cid" value="<%=ci.getId()%>"/> 
                                                        <input type="submit" value="Update" class="form-control btn btn-primary button" >
                                                </form>
                                        <% } %> 
                </div> 
                <div class="col-sm-2"></div>   
            </div>
        </div>                   
    </body>
</html>
warcontacts/src/main/webapp/view.jsp
<%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %>
<% Handler h = new Handler(pageContext); %>
<html>
    <head>
        <jsp:include page="head.jsp" />  
    </head>
    <body>       
        <jsp:include page="nav.jsp" />
        <div class="container topspace">
            <div class="row"> 
                <div class="col-sm-2"></div>
                <div class="col-sm-8">    
                    <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) );  %> 
                    <p><strong>Id:</strong>  <%= ci.getId() %></p>
                    <p><strong>First name:</strong>  <%= ci.getFirstName() %></p>
                    <p><strong>Last name:</strong>  <%= ci.getLastName() %></p>
                    <p><strong>Creation date:</strong> <%= ci.getCreationDate() %></p>
                    <p><strong>Address:</strong>  <%= ci.getAddress() %></p>
                    <p><strong>Phone:</strong>  <%= ci.getPhoneNumber() %></p>
                </div> 
                <div class="col-sm-2"></div>   
            </div>
        </div>         
    </body>
</html>
warcontacts/src/main/webapp/WEB-INF/web.xml
<?xml version="1.0"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>