= 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 * https://docs.oracle.com/javaee/5/tutorial/doc/ * 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 {{attachment:jeeTiers.png}} {{attachment:jeeContainers.png}} == 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"] }}} {{{#!highlight bash wget http://sourceforge.net/projects/jboss/files/JBoss/JBoss-5.1.0.GA/jboss-5.1.0.GA.zip unzip jboss-5.1.0.GA.zip nano Dockerfile docker build -t docker_jboss5 . mkdir target docker run -d -p 8080:8080 --name jboss5_container --mount type=bind,source="$(pwd)"/target,target=/app docker_jboss5 #docker run -d -P --name jboss5_container --mount type=bind,source="$(pwd)"/target,target=/app docker_jboss5 mv ~/jboss-5.1.0.GA.zip target/ docker exec -it jboss5_container bash cd /app unzip jboss-5.1.0.GA.zip ./jdk-1_5_0_22-linux-amd64.bin /app# jdk1.5.0_22/bin/java -version #java version "1.5.0_22" #Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03) #Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_22-b03, mixed mode) #/app/jdk1.5.0_22/bin/java -jar run.jar mvn -version #Apache Maven 3.3.9 #Maven home: /usr/share/maven #Java version: 1.8.0_252, vendor: Private Build #Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre #Default locale: en_US, platform encoding: ANSI_X3.4-1968 #OS name: "linux", version: "4.19.0-6-amd64", arch: "amd64", family: "unix" cd /app/jboss-5.1.0.GA/bin JAVA_HOME=/app/jdk1.5.0_22 ./run.sh -c all -b 0.0.0.0 }}} == Example EJB for jboss5 in docker container == {{attachment:ejbjarFiles.png}} * 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 === {{{#!highlight java package org.allowed.bitarus; import javax.ejb.Remote; @Remote public interface ScheduleRemote { int addSchedule(int val1, int val2); } }}} === ./src/main/java/org/allowed/bitarus/ScheduleLocal.java === {{{#!highlight java package org.allowed.bitarus; import javax.ejb.Local; @Local public interface ScheduleLocal { int addSchedule(int val1, int val2) ; } }}} === ./src/main/java/org/allowed/bitarus/ScheduleWS.java === {{{#!highlight java package org.allowed.bitarus; import javax.ejb.Stateless; import javax.jws.WebMethod; import javax.jws.WebService; import org.allowed.bitarus.ScheduleRemote; @Stateless @WebService public class ScheduleWS implements ScheduleRemote { @WebMethod public int addSchedule(int val1, int val2) { return val1 + val2; } } }}} === ./src/main/resources/META-INF/ejb-jar.xml === {{{#!highlight java ScheduleWS org.allowed.bitarus.ScheduleLocal org.allowed.bitarus.ScheduleRemote org.allowed.bitarus.ScheduleWS Stateless Container }}} === ./pom.xml === {{{#!highlight xml 4.0.0 org.allowed.bitarus ejbjee5 0.0.1 ejb javaee javaee-api 5 provided src/main/java maven-compiler-plugin 1.5 1.5 }}} * ./SoapUI-5.5.0 * new soap project * initial wsdl: http://127.0.0.1:8080/ejbjee5-0.0.1/ScheduleWS?wsdl * http://127.0.0.1:8080/ejbjee5-0.0.1/ScheduleWS {{{#!highlight xml 1 2 }}} {{{#!highlight xml 3 }}} == Example WAR for JBoss5 in docker container == {{attachment:warFile.png}} * mvn clean install * cp /app/warjee5/target/warjee5-0.0.1.war /app/jboss-5.1.0.GA/server/default/deploy * http://127.0.0.1:8080//warjee5-0.0.1/otherindex.jsp === 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/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; 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("

Handler up %s

" , this.request.getParameter("user") )); } catch(Exception ex){ } } public void writeIP(){ try{ this.out.print("!!! Your IP address is " + this.request.getRemoteAddr()); } catch(Exception ex){ } } } }}} === src/main/webapp/otherindex.jsp === {{{#!highlight html <%@page import="org.allowed.bitarus.Handler" %> <% //Handler h = new Handler(request,response,out); %> <% Handler h = new Handler(pageContext); %>

Other Hello

World

<% h.writeHandler(); %>

<% out.print("Your IP address is " + request.getRemoteAddr()); %>

<% h.writeIP(); %>

}}} === src/main/webapp/index.jsp === {{{#!highlight html <%@page import="org.allowed.bitarus.Handler" %> <% //Handler h = new Handler(request,response,out); %> <% Handler h = new Handler(pageContext); %>

Hello

World

<% h.writeHandler(); %>

<% out.print("Your IP address is " + request.getRemoteAddr()); %>

<% h.writeIP(); %>

}}} === src/main/webapp/WEB-INF/web.xml === {{{#!highlight xml index /index.jsp index /index** otherindex /otherindex.jsp otherindex /otherindex** }}} === pom.xml === {{{#!highlight xml 4.0.0 org.allowed.bitarus warjee5 0.0.1 war javaee javaee-api 5 provided src maven-compiler-plugin 1.5 1.5 }}} == HyperSQL Database (HSQLDB) == * http://hsqldb.org/ 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 == * 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 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 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 getAll(); } }}} === src/main/resources/META-INF/ejb-jar.xml === {{{#!highlight xml AddWS org.allowed.bitarus.AddLocal org.allowed.bitarus.AddRemote org.allowed.bitarus.AddWS Stateless Container }}} === src/main/resources/META-INF/persistence.xml === {{{#!highlight xml java:/DefaultDS }}} === pom.xml === {{{#!highlight xml 4.0.0 org.allowed.bitarus ejbjee5 0.0.1 ejb javaee javaee-api 5 provided src maven-compiler-plugin 1.5 1.5 }}} == 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 4.0.0 org.allowed.bitarus warjee5 0.0.1 war javaee javaee-api 5 provided org.allowed.bitarus ejbjee5 0.0.1 provided src maven-compiler-plugin 1.5 1.5 }}} === 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("

Handler up %s

" , 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 namingList = context.list(""); while (namingList.hasMore()) { out.println(namingList.next().getName() + "
" ); } AddLocal addLocal = (AddLocal) context.lookup("AddWS/local"); List list = addLocal.getAll(); for(int idx=0; idx" ); } } 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 index /index.jsp index /index** otherindex /otherindex.jsp otherindex /otherindex** }}} === src/main/webapp/index.jsp === {{{#!highlight html <%@page import="org.allowed.bitarus.Handler" %> <% //Handler h = new Handler(request,response,out); %> <% Handler h = new Handler(pageContext); %>

Hello

World

<% h.writeHandler(); %>

<% out.print("Your IP address is " + request.getRemoteAddr()); %>

<% h.writeIP(); %>

<% h.writeAddResults(); %>

}}} === src/main/webapp/otherindex.jsp === {{{#!highlight html <%@page import="org.allowed.bitarus.Handler" %> <% //Handler h = new Handler(request,response,out); %> <% Handler h = new Handler(pageContext); %>

Other Hello

World

<% h.writeHandler(); %>

<% out.print("Your IP address is " + request.getRemoteAddr()); %>

<% h.writeIP(); %>

}}} == 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 4.0.0 org.allowed.bitarus testSpringMVCJSP 0.1.0 war org.springframework spring-core 3.0.1.RELEASE org.springframework spring-web 3.0.1.RELEASE org.springframework spring-webmvc 3.0.1.RELEASE src/main/java maven-compiler-plugin 1.5 1.5 }}} === 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 /WEB-INF/pages/ .jsp }}} === src/main/webapp/WEB-INF/pages/greeting.jsp === {{{#!highlight html Getting Started: Serving Web Content

Hello ${name}

}}} === src/main/webapp/WEB-INF/web.xml === {{{#!highlight xml Spring MVC Application + JSP mvc-dispatcher org.springframework.web.servlet.DispatcherServlet 1 mvc-dispatcher / contextConfigLocation /WEB-INF/mvc-dispatcher-servlet.xml org.springframework.web.context.ContextLoaderListener }}} == 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 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 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 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 ContactsWS org.allowed.bitarus.ContactsLocal org.allowed.bitarus.ContactsRemote org.allowed.bitarus.ContactsWS Stateless Container }}} === src/main/resources/META-INF/persistence.xml === {{{#!highlight xml java:/DefaultDS }}} === pom.xml === {{{#!highlight xml 4.0.0 org.allowed.bitarus ejbcontacts 0.0.1 ejb javaee javaee-api 5 provided src maven-compiler-plugin 1.5 1.5 }}} == 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 === {{{ 4.0.0 org.allowed.bitarus warcontacts 0.0.1 war javaee javaee-api 5 provided org.allowed.bitarus ejbcontacts 0.0.1 provided maven-compiler-plugin 1.5 1.5 }}} === 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 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("

Handler up %s

", 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 getAllContacts() { List 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); %>








}}} === 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); %> <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) ); %>
<% if(ci!=null) { %>

Id: <%= ci.getId() %>

First name: <%= ci.getFirstName() %>

Last name: <%= ci.getLastName() %>

Creation date: <%= ci.getCreationDate() %>

Address: <%= ci.getAddress() %>

Phone: <%= ci.getPhoneNumber() %>

<% } %>
}}} === src/main/webapp/head.jsp === {{{ }}} === src/main/webapp/index.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %>
<% List contacts = h.getAllContacts(); %> Add <% for(int i=0; i <% ContactEntity contact = ((ContactEntity)contacts.get(i)); %> <%}%>
FirstName LastName Actions
<%= contact.getFirstName() %> <%= contact.getLastName() %> View Update Delete
}}} === src/main/webapp/nav.jsp === {{{ }}} === src/main/webapp/update.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %>
<% if( request.getParameter("id") != null ) { %> <% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) ); %>








<% } %>
}}} === src/main/webapp/view.jsp === {{{ <%@page import="org.allowed.bitarus.Handler, java.util.List, org.allowed.bitarus.ContactEntity" %> <% Handler h = new Handler(pageContext); %>
<% ContactEntity ci = h.getContact( Integer.parseInt( request.getParameter("id") ) ); %>

Id: <%= ci.getId() %>

First name: <%= ci.getFirstName() %>

Last name: <%= ci.getLastName() %>

Creation date: <%= ci.getCreationDate() %>

Address: <%= ci.getAddress() %>

Phone: <%= ci.getPhoneNumber() %>

}}} === src/main/webapp/WEB-INF/web.xml === {{{ }}} == EAR ==