From faaafb23020528a9b9269cf62693754749151751 Mon Sep 17 00:00:00 2001 From: enono Date: Fri, 9 Dec 2011 15:55:05 +0100 Subject: [PATCH] Add kitchensink-jsp --- .gitignore | 1 + kitchensink-jsp/.factorypath | 5 + kitchensink-jsp/pom.xml | 341 ++++++++++++++++++ kitchensink-jsp/readme.md | 99 +++++ .../controller/MemberRegistration.java | 71 ++++ .../data/MemberListProducer.java | 48 +++ .../kitchensinkjsp/model/Member.java | 84 +++++ .../kitchensinkjsp/rest/JaxRsActivator.java | 18 + .../rest/MemberResourceRESTService.java | 46 +++ .../servlet/MemberRegistrationServlet.java | 107 ++++++ .../kitchensinkjsp/util/Resources.java | 33 ++ .../main/resources/META-INF/persistence.xml | 17 + kitchensink-jsp/src/main/resources/import.sql | 2 + .../src/main/webapp/WEB-INF/beans.xml | 9 + kitchensink-jsp/src/main/webapp/index.jsp | 94 +++++ .../src/main/webapp/registrationForm.jsp | 56 +++ .../src/main/webapp/registrationResult.jsp | 35 ++ .../src/main/webapp/resources/css/screen.css | 40 ++ .../src/main/webapp/resources/gfx/banner.png | Bin 0 -> 41473 bytes .../src/main/webapp/resources/gfx/logo.png | Bin 0 -> 4582 bytes .../test/MemberRegistrationTest.java | 49 +++ .../src/test/resources/arquillian.xml | 23 ++ pom.xml | 3 + 23 files changed, 1181 insertions(+) create mode 100644 kitchensink-jsp/.factorypath create mode 100644 kitchensink-jsp/pom.xml create mode 100644 kitchensink-jsp/readme.md create mode 100644 kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/controller/MemberRegistration.java create mode 100644 kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/data/MemberListProducer.java create mode 100644 kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/model/Member.java create mode 100644 kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/rest/JaxRsActivator.java create mode 100644 kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/rest/MemberResourceRESTService.java create mode 100644 kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/servlet/MemberRegistrationServlet.java create mode 100644 kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/util/Resources.java create mode 100644 kitchensink-jsp/src/main/resources/META-INF/persistence.xml create mode 100644 kitchensink-jsp/src/main/resources/import.sql create mode 100644 kitchensink-jsp/src/main/webapp/WEB-INF/beans.xml create mode 100644 kitchensink-jsp/src/main/webapp/index.jsp create mode 100644 kitchensink-jsp/src/main/webapp/registrationForm.jsp create mode 100644 kitchensink-jsp/src/main/webapp/registrationResult.jsp create mode 100644 kitchensink-jsp/src/main/webapp/resources/css/screen.css create mode 100644 kitchensink-jsp/src/main/webapp/resources/gfx/banner.png create mode 100644 kitchensink-jsp/src/main/webapp/resources/gfx/logo.png create mode 100644 kitchensink-jsp/src/test/java/org/jboss/as/quickstarts/helloworldjsp/test/MemberRegistrationTest.java create mode 100644 kitchensink-jsp/src/test/resources/arquillian.xml diff --git a/.gitignore b/.gitignore index 95c24606ba..3b0fc8527a 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ bin .openshift */.gitignore .gitkeep +/helloworld-jsp diff --git a/kitchensink-jsp/.factorypath b/kitchensink-jsp/.factorypath new file mode 100644 index 0000000000..16e422aead --- /dev/null +++ b/kitchensink-jsp/.factorypath @@ -0,0 +1,5 @@ + + + + + diff --git a/kitchensink-jsp/pom.xml b/kitchensink-jsp/pom.xml new file mode 100644 index 0000000000..ef91f5d561 --- /dev/null +++ b/kitchensink-jsp/pom.xml @@ -0,0 +1,341 @@ + + + 4.0.0 + + org.jboss.as.kitchensink-jsp + 7.1.0-SNAPSHOT + war + JBoss AS Quickstarts: kitchensink JSP + + + + + UTF-8 + + + + 2.0.0.Final + + + + + + + + org.jboss.spec + jboss-javaee-web-6.0 + ${javaee6.web.spec.version} + pom + import + + + + + + + + + + + javax.enterprise + cdi-api + provided + + + + + org.jboss.spec.javax.annotation + jboss-annotations-api_1.1_spec + provided + + + + + org.jboss.spec.javax.servlet + jboss-servlet-api_3.0_spec + provided + + + + + org.jboss.spec.javax.ws.rs + jboss-jaxrs-api_1.1_spec + provided + + + + + org.hibernate.javax.persistence + hibernate-jpa-2.0-api + provided + + + + + org.jboss.spec.javax.ejb + jboss-ejb-api_3.1_spec + provided + + + + + javax.servlet + jstl + 1.2 + runtime + + + + + + + org.hibernate + hibernate-validator + 4.2.0.Final + provided + + + org.slf4j + slf4j-api + + + + + + + + + org.hibernate + hibernate-jpamodelgen + 1.1.1.Final + provided + + + + + junit + junit + 4.10 + test + + + + + + org.jboss.arquillian.junit + arquillian-junit-container + 1.0.0.CR4 + test + + + + org.jboss.arquillian.protocol + arquillian-protocol-servlet + 1.0.0.CR4 + test + + + + + + + ${project.artifactId} + + + + maven-compiler-plugin + 2.3.1 + + 1.6 + 1.6 + + + + maven-war-plugin + 2.1.1 + + + false + + + + + + org.jboss.as.plugins + jboss-as-maven-plugin + 7.1.0.Beta1b + + + + + + + + + default + + true + + + + + maven-surefire-plugin + 2.4.3 + + true + + + + + + + + + + + + + jboss-public-repository + JBoss Repository + http://repository.jboss.org/nexus/content/groups/public + + + + + false + + + + + + + jboss-public-repository + JBoss Repository + http://repository.jboss.org/nexus/content/groups/public + + + + false + + + + + + + + arq-jbossas-managed + + + org.jboss.as + jboss-as-arquillian-container-managed + 7.1.0.Beta1b + test + + + + + + + + + + + jboss-public-repository + JBoss Repository + http://repository.jboss.org/nexus/content/groups/public + + + + + false + + + + + + + jboss-public-repository + JBoss Repository + http://repository.jboss.org/nexus/content/groups/public + + + + false + + + + + + + arq-jbossas-remote + + + org.jboss.as + jboss-as-arquillian-container-remote + 7.1.0.Beta1b + test + + + + + + + + + + openshift + + + + maven-war-plugin + 2.1.1 + + deployments + ROOT + + + + + + + + JBoss AS Quickstarts: kitchensink JSP + http://jboss.org/jbossas + jboss-as-kitchensink-jsp + diff --git a/kitchensink-jsp/readme.md b/kitchensink-jsp/readme.md new file mode 100644 index 0000000000..b36317a983 --- /dev/null +++ b/kitchensink-jsp/readme.md @@ -0,0 +1,99 @@ +jboss-as-kitchensink-jsp +======================== + +What is it? +----------- + +jboss-as-kitchensink-jsp is a deployable Maven 3 project to help you +get your foot in the door developing with Java EE 6 on JBoss AS 7 or EAP 6. This +project is setup to allow you to create a compliant Java EE 6 application +using *JSP 2.0* *EL 2.0* *JSTL 1.2* *CDI 1.0*, *EJB 3.1*, *JPA 2.0* and Bean Validation 1.0. + +This project rebuilds the presentation tier of the kitchensink quickstart app + using JSP and JSTL instead of JSF features. + +It is another app based on JSP that reused all other components from the +Member Registration template. +It reused the persistence unit and some sample persistence and transaction code to help +you get your feet wet with database access in enterprise Java. + +System requirements +------------------- + +All you need to build this project is Java 6.0 (Java SDK 1.6) or better, Maven +3.0 or better. + +The application this project produces is designed to be run on a JBoss AS 7 or EAP 6. +The following instructions target JBoss AS 7, but they also apply to JBoss EAP 6. + +With the prerequisites out of the way, you're ready to build and deploy. + +Deploying the application +------------------------- + +First you need to start JBoss AS 7 (or EAP 6). To do this, run + + $JBOSS_HOME/bin/standalone.sh + +or if you are using windows + + $JBOSS_HOME/bin/standalone.bat + +To deploy the application, you first need to produce the archive to deploy using +the following Maven goal: + + mvn package + +You can now deploy the artifact to JBoss AS by executing the following command: + + mvn jboss-as:deploy + +This will deploy `target/jboss-as-kitchensink-jsp.war`. + +The application will be running at the following URL . + +To undeploy from JBoss AS, run this command: + + mvn jboss-as:undeploy + +You can also start JBoss AS 7 and deploy the project using Eclipse. See the JBoss AS 7 +Getting Started Guide for Developers for more information. + +Running the Arquillian tests +============================ + +By default, tests are configured to be skipped. The reason is that the sample +test is an Arquillian test, which requires the use of a container. You can +activate this test by selecting one of the container configuration provided +for JBoss AS 7 (remote). + +To run the test in JBoss AS 7, first start a JBoss AS 7 instance. Then, run the +test goal with the following profile activated: + + mvn clean test -Parq-jbossas-remote + +Importing the project into an IDE +================================= + +If you created the project using the Maven archetype wizard in your IDE +(Eclipse, NetBeans or IntelliJ IDEA), then there is nothing to do. You should +already have an IDE project. + +Detailed instructions for using Eclipse with JBoss AS 7 are provided in the +JBoss AS 7 Getting Started Guide for Developers. + +If you created the project from the commandline using archetype:generate, then +you need to import the project into your IDE. If you are using NetBeans 6.8 or +IntelliJ IDEA 9, then all you have to do is open the project as an existing +project. Both of these IDEs recognize Maven projects natively. + +Downloading the sources and Javadocs +==================================== + +If you want to be able to debug into the source code or look at the Javadocs +of any library in the project, you can run either of the following two +commands to pull them into your local repository. The IDE should then detect +them. + + mvn dependency:sources + mvn dependency:resolve -Dclassifier=javadoc diff --git a/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/controller/MemberRegistration.java b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/controller/MemberRegistration.java new file mode 100644 index 0000000000..3909dab20e --- /dev/null +++ b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/controller/MemberRegistration.java @@ -0,0 +1,71 @@ +package org.jboss.as.quickstarts.kitchensinkjsp.controller; + +import java.util.logging.Logger; + +import javax.annotation.PostConstruct; +import javax.ejb.Stateful; +import javax.enterprise.event.Event; +import javax.enterprise.inject.Model; +import javax.enterprise.inject.Produces; +import javax.inject.Inject; +import javax.inject.Named; +import javax.persistence.EntityManager; + +import org.jboss.as.quickstarts.kitchensinkjsp.model.Member; + +// The @Stateful annotation eliminates the need for manual transaction demarcation +@Stateful +// The @Model stereotype is a convenience mechanism to make this a request-scoped bean that has an +// EL name +// Read more about the @Model stereotype in this FAQ: +// http://sfwk.org/Documentation/WhatIsThePurposeOfTheModelAnnotation +@Model +public class MemberRegistration { + + @Inject + private Logger log; + + @Inject + private EntityManager em; + + @Inject + private Event memberEventSrc; + + private Member newMember; + + @Produces + @Named + public Member getNewMember() { + + log.info("getNewMember: called"+newMember); + return newMember; + + } + + + public void register() throws Exception { + + try{ + + log.info("Registering " + newMember.getName()); + em.persist(newMember); + memberEventSrc.fire(newMember); + initNewMember(); + } + catch (Exception e) { + Throwable t=e; + while((t.getCause())!=null){ t=t.getCause();} + log.info("Exception:"+t.getMessage()); + throw ((Exception)t); + } + + } + + + + @PostConstruct + public void initNewMember() { + newMember = new Member(); + log.info("@PostConstruct:initNewMember called"); + } +} diff --git a/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/data/MemberListProducer.java b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/data/MemberListProducer.java new file mode 100644 index 0000000000..254b421837 --- /dev/null +++ b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/data/MemberListProducer.java @@ -0,0 +1,48 @@ +package org.jboss.as.quickstarts.kitchensinkjsp.data; + +import org.jboss.as.quickstarts.kitchensinkjsp.model.Member; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.enterprise.context.RequestScoped; +import javax.enterprise.event.Observes; +import javax.enterprise.event.Reception; + +import javax.enterprise.inject.Produces; +import javax.inject.Inject; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +@RequestScoped +public class MemberListProducer { + @Inject + private EntityManager em; + + private List members; + + // @Named provides access the return value via the EL variable name "members" in the UI (e.g., + // Facelets or JSP view) + @Produces + @Named + public List getMembers() { + return members; + } + + public void onMemberListChanged(@Observes(notifyObserver = Reception.IF_EXISTS) final Member member) { + retrieveAllMembersOrderedByName(); + } + + @PostConstruct + public void retrieveAllMembersOrderedByName() { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery criteria = cb.createQuery(Member.class); + Root member = criteria.from(Member.class); + // Swap criteria statements if you would like to try out type-safe criteria queries, a new + // feature in JPA 2.0 + // criteria.select(member).orderBy(cb.asc(member.get(Member_.name))); + criteria.select(member).orderBy(cb.asc(member.get("name"))); + members = em.createQuery(criteria).getResultList(); + } +} diff --git a/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/model/Member.java b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/model/Member.java new file mode 100644 index 0000000000..f78a060c09 --- /dev/null +++ b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/model/Member.java @@ -0,0 +1,84 @@ +package org.jboss.as.quickstarts.kitchensinkjsp.model; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; +import javax.validation.constraints.Digits; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import javax.xml.bind.annotation.XmlRootElement; + +import org.hibernate.validator.constraints.Email; +import org.hibernate.validator.constraints.NotEmpty; + +@Entity +@XmlRootElement +@Table(name="MemberJSP", uniqueConstraints = @UniqueConstraint(columnNames = "email")) +public class Member implements Serializable { + /** Default value included to remove warning. Remove or modify at will. **/ + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue + private Long id; + + @NotNull + @Size(min = 1, max = 25) + @Pattern(regexp = "[A-Za-z ]*", message = "must contain only letters and spaces") + private String name; + + @NotNull + @NotEmpty + @Email + private String email; + + @NotNull + @Size(min = 10, max = 12) + @Digits(fraction = 0, integer = 12) + @Column(name = "phone_number") + private String phoneNumber; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + + public String toString(){ + return getName()+":"+getEmail()+":"+getPhoneNumber(); + + } +} \ No newline at end of file diff --git a/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/rest/JaxRsActivator.java b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/rest/JaxRsActivator.java new file mode 100644 index 0000000000..0a7e5f702d --- /dev/null +++ b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/rest/JaxRsActivator.java @@ -0,0 +1,18 @@ +package org.jboss.as.quickstarts.kitchensinkjsp.rest; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; + +/** + * A class extending {@link Application} and annotated with @ApplicationPath is the Java EE 6 + * "no XML" approach to activating JAX-RS. + * + *

+ * Resources are served relative to the servlet path specified in the {@link ApplicationPath} + * annotation. + *

+ */ +@ApplicationPath("/rest") +public class JaxRsActivator extends Application { + /* class body intentionally left blank */ +} diff --git a/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/rest/MemberResourceRESTService.java b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/rest/MemberResourceRESTService.java new file mode 100644 index 0000000000..a92ed40c57 --- /dev/null +++ b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/rest/MemberResourceRESTService.java @@ -0,0 +1,46 @@ +package org.jboss.as.quickstarts.kitchensinkjsp.rest; + +import java.util.List; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; + +import org.jboss.as.quickstarts.kitchensinkjsp.model.Member; + +/** + * JAX-RS Example + * + * This class produces a RESTful service to read the contents of the members table. + */ +@Path("/members") +@RequestScoped +public class MemberResourceRESTService { + @Inject + private EntityManager em; + + @GET + @Produces("text/xml") + public List listAllMembers() { + // Use @SupressWarnings to force IDE to ignore warnings about "genericizing" the results of + // this query + @SuppressWarnings("unchecked") + // We recommend centralizing inline queries such as this one into @NamedQuery annotations on + // the @Entity class + // as described in the named query blueprint: + // https://blueprints.dev.java.net/bpcatalog/ee5/persistence/namedquery.html + final List results = em.createQuery("select m from Member m order by m.name").getResultList(); + return results; + } + + @GET + @Path("/{id:[0-9][0-9]*}") + @Produces("text/xml") + public Member lookupMemberById(@PathParam("id") long id) { + return em.find(Member.class, id); + } +} diff --git a/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/servlet/MemberRegistrationServlet.java b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/servlet/MemberRegistrationServlet.java new file mode 100644 index 0000000000..096d707bd9 --- /dev/null +++ b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/servlet/MemberRegistrationServlet.java @@ -0,0 +1,107 @@ +package org.jboss.as.quickstarts.kitchensinkjsp.servlet; + +import java.io.IOException; + +import javax.inject.Inject; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jboss.as.quickstarts.kitchensinkjsp.controller.MemberRegistration; +import org.jboss.as.quickstarts.kitchensinkjsp.data.MemberListProducer; +import org.jboss.as.quickstarts.kitchensinkjsp.model.Member; + +/** + * Servlet implementation class MemberRegistrationServlet + */ +@WebServlet("/register.do") +public class MemberRegistrationServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + @Inject + MemberRegistration registrationService; + + @Inject + MemberListProducer memberListService; + + /** + * Default constructor. + */ + public MemberRegistrationServlet() { + // TODO Auto-generated constructor stub + } + + + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + StringBuilder errorMessage= new StringBuilder(); + + try { + + System.out.println("EMAIL='"+request.getParameter("email")+"'"); + Member member; + //create a new member, remember :) the memberservice do not + //call the initMethod if an error occur during the previous persist request + + while((member=registrationService.getNewMember())==null) + { registrationService.initNewMember(); + } + + String value; + + if((value=request.getParameter("name")).length()<1) + { + errorMessage.append("Name can not be null\n"); + } + else + { + member.setName(value); + + if((value=request.getParameter("email")).length()<1) + { + errorMessage.append("email required!\n"); + } + else + { + member.setEmail(value); + + if((value=request.getParameter("phoneNumber")).length()<1){ + errorMessage.append("phoneNumber required \n"); + } + else // all parameters are filled, register + { + member.setPhoneNumber(value); + + log("\n*****************Try Registration of Member="+member); + registrationService.register(); + request.setAttribute("infoMessage", member.getName()+" Registered!"); + } + } + } + + } catch (Exception e) { + + + Throwable t=e; + while((t.getCause())!=null){ t=t.getCause();} + + errorMessage.append("Error========>"+t.getMessage()); + request.setAttribute("infoMessage", ""); + e.printStackTrace(); + } + finally + { + request.setAttribute("errorMessage", errorMessage.toString()); + RequestDispatcher resultView = request.getRequestDispatcher("index.jsp"); + resultView.forward(request,response); + } + } + +} diff --git a/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/util/Resources.java b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/util/Resources.java new file mode 100644 index 0000000000..52a02b2127 --- /dev/null +++ b/kitchensink-jsp/src/main/java/org/jboss/as/quickstarts/kitchensinkjsp/util/Resources.java @@ -0,0 +1,33 @@ +package org.jboss.as.quickstarts.kitchensinkjsp.util; + +import java.util.logging.Logger; + +import javax.enterprise.inject.Produces; +import javax.enterprise.inject.spi.InjectionPoint; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +/** + * This class uses CDI to alias Java EE resources, such as the persistence context, to CDI beans + * + *

+ * Example injection on a managed bean field: + *

+ * + *
+ * @Inject
+ * private EntityManager em;
+ * 
+ */ +public class Resources { + // use @SuppressWarnings to tell IDE to ignore warnings about field not being referenced directly + @SuppressWarnings("unused") + @Produces + @PersistenceContext + private EntityManager em; + + @Produces + public Logger produceLog(InjectionPoint injectionPoint) { + return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName()); + } +} diff --git a/kitchensink-jsp/src/main/resources/META-INF/persistence.xml b/kitchensink-jsp/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..3ac23a6401 --- /dev/null +++ b/kitchensink-jsp/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,17 @@ + + + + + java:jboss/datasources/ExampleDS + + + + + + + \ No newline at end of file diff --git a/kitchensink-jsp/src/main/resources/import.sql b/kitchensink-jsp/src/main/resources/import.sql new file mode 100644 index 0000000000..4cd4457e40 --- /dev/null +++ b/kitchensink-jsp/src/main/resources/import.sql @@ -0,0 +1,2 @@ +-- You can use this file to load seed data into the database using SQL statements +insert into MemberJSP (id, name, email, phone_number) values (0, 'John Smith', 'john.smith@mailinator.jsp.com', '2125551212') ; diff --git a/kitchensink-jsp/src/main/webapp/WEB-INF/beans.xml b/kitchensink-jsp/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 0000000000..c782f570a2 --- /dev/null +++ b/kitchensink-jsp/src/main/webapp/WEB-INF/beans.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/kitchensink-jsp/src/main/webapp/index.jsp b/kitchensink-jsp/src/main/webapp/index.jsp new file mode 100644 index 0000000000..b6d0c4205d --- /dev/null +++ b/kitchensink-jsp/src/main/webapp/index.jsp @@ -0,0 +1,94 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="ISO-8859-1"%> + + + + + Java EE 6 Starter Application + + + + + + +
+
+ + + + + + <%@ include file="registrationForm.jsp" %> + + + + <%@ include file="registrationResult.jsp" %> + +
+ +
+ + diff --git a/kitchensink-jsp/src/main/webapp/registrationForm.jsp b/kitchensink-jsp/src/main/webapp/registrationForm.jsp new file mode 100644 index 0000000000..8bbfaa0d69 --- /dev/null +++ b/kitchensink-jsp/src/main/webapp/registrationForm.jsp @@ -0,0 +1,56 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="ISO-8859-1"%> + + + + +registrationPage.jsp + + +

Welcome to JBoss AS 7!

+ +

You have successfully deployed a Java EE 6 web application + on JBoss AS 7. +

+ +
+

Register (JSP Sample)

+ + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + +
+

+ + + + +

+
+ + + + + + \ No newline at end of file diff --git a/kitchensink-jsp/src/main/webapp/registrationResult.jsp b/kitchensink-jsp/src/main/webapp/registrationResult.jsp new file mode 100644 index 0000000000..f3b9f5daee --- /dev/null +++ b/kitchensink-jsp/src/main/webapp/registrationResult.jsp @@ -0,0 +1,35 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="ISO-8859-1"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + +RegistrationAction + + + + + + + + + + + + + + + + + + + + + + +
NameEmailPhoneNumber
+ + + \ No newline at end of file diff --git a/kitchensink-jsp/src/main/webapp/resources/css/screen.css b/kitchensink-jsp/src/main/webapp/resources/css/screen.css new file mode 100644 index 0000000000..d0b387f1ee --- /dev/null +++ b/kitchensink-jsp/src/main/webapp/resources/css/screen.css @@ -0,0 +1,40 @@ +body { + margin: 0; + padding: 0; + background-color: #EAECEE; + font-family: Verdana, sans-serif; + font-size: 0.9em; +} +#container { + margin: 0 auto; + padding: 0 20px 10px 20px; + border: 1px solid #666666; + width: 865px; /* subtract 40px from banner width for padding */ + background: #FFFFFF url(../gfx/banner.png) no-repeat; + padding-top: 110px; +} +#sidebar { + font-size: 0.9em; + width: 225px; + float: right; + border: 1px solid #666666; + background: #EAECEE; + padding: 0 15px 5px 15px; +} +#sidebar ul { + padding-left: 30px; +} +#footer { + clear: both; + text-align: center; + color: #666666; + font-size: 0.85em; + padding: 3em 0 0 0; +} +code { + font-size: 1.1em; +} +span.invalid { + padding-left: 3px; + color: red; +} diff --git a/kitchensink-jsp/src/main/webapp/resources/gfx/banner.png b/kitchensink-jsp/src/main/webapp/resources/gfx/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..0b178ae699d0930d6da47aa323f8f672ee45f573 GIT binary patch literal 41473 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 vKi`o1%uMvhIT` createTestArchive() { + return ShrinkWrap.create(WebArchive.class, "test.war") + .addClasses(Member.class, MemberRegistration.class, Resources.class) + .addAsResource("META-INF/persistence.xml", "META-INF/persistence.xml") + .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); + } + + @Inject + MemberRegistration memberRegistration; + + @Inject + Logger log; + + @Test + public void testRegister() throws Exception { + Member newMember = memberRegistration.getNewMember(); + newMember.setName("Jane Doe"); + newMember.setEmail("jane@mailinator.com"); + newMember.setPhoneNumber("2125551234"); + memberRegistration.register(); + assertNotNull(newMember.getId()); + log.info(newMember.getName() + " was persisted with id " + newMember.getId()); + } + +} diff --git a/kitchensink-jsp/src/test/resources/arquillian.xml b/kitchensink-jsp/src/test/resources/arquillian.xml new file mode 100644 index 0000000000..42e278341d --- /dev/null +++ b/kitchensink-jsp/src/test/resources/arquillian.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + /path/to/jboss/as + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 163b9f3e57..a3d37528c7 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,8 @@ helloworld numberguess greeter + helloworld-jsp + kitchensink-jsp kitchensink html5-mobile kitchensink-ear @@ -35,6 +37,7 @@ servlet-async servlet-filterlistener helloworld-mdb +