EAR with JMS and PgSQL
Setup postgresql in docker
1 cd /app/jboss-5.1.0.GA/server/default/lib
2 wget https://jdbc.postgresql.org/download/postgresql-9.3-1103.jdbc3.jar
3 apt install postgresql-9.5
4
5 su postgres
6 mkdir -p /var/run/postgresql/9.5-main.pg_stat_tmp/
7 /usr/lib/postgresql/9.5/bin/postgres -D /var/lib/postgresql/9.5/main -c config_file=/etc/postgresql/9.5/main/postgresql.conf
8
9 su postgres
10 psql
11
12 create user appuser with login password '12345678';
13 create database app;
14 grant all privileges on database app to appuser;
15 \q
16
17 Datasource in Jboss , Local Tx Datasources
18 PostgresDS
19 org.postgresql.Driver
20 jdbc:postgresql://localhost/app?user=appuser&password=12345678
21
22 /app/jboss-5.1.0.GA/server/default/deploy# cat PostgresDS-ds.xml
23 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
24 <datasources>
25 <local-tx-datasource>
26 <jndi-name>PostgresDS</jndi-name>
27 <rar-name>jboss-local-jdbc.rar</rar-name>
28 <use-java-context>true</use-java-context>
29 <connection-definition>javax.sql.DataSource</connection-definition>
30 <jmx-invoker-name>jboss:service=invoker,type=jrmp</jmx-invoker-name>
31 <min-pool-size>0</min-pool-size>
32 <max-pool-size>10</max-pool-size>
33 <blocking-timeout-millis>30000</blocking-timeout-millis>
34 <idle-timeout-minutes>30</idle-timeout-minutes>
35 <prefill>false</prefill>
36 <background-validation>false</background-validation>
37 <background-validation-millis>0</background-validation-millis>
38 <validate-on-match>true</validate-on-match>
39 <statistics-formatter>org.jboss.resource.statistic.pool.JBossDefaultSubPoolStatisticFormatter</statistics-formatter>
40 <isSameRM-override-value>false</isSameRM-override-value>
41 <allocation-retry>0</allocation-retry>
42 <allocation-retry-wait-millis>5000</allocation-retry-wait-millis>
43 <security-domain xsi:type="securityMetaData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
44 <metadata/>
45 <local-transaction/>
46 <prepared-statement-cache-size>0</prepared-statement-cache-size>
47 <share-prepared-statements>false</share-prepared-statements>
48 <set-tx-query-timeout>false</set-tx-query-timeout>
49 <query-timeout>0</query-timeout>
50 <use-try-lock>0</use-try-lock>
51 <driver-class>org.postgresql.Driver</driver-class>
52 <connection-url>jdbc:postgresql://localhost/app?user=appuser&password=12345678</connection-url>
53 </local-tx-datasource>
54 </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>