/* * JBoss, Home of Professional Open Source * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual * contributors by the @authors tag. See the copyright.txt in the * distribution for a full listing of individual contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.as.quickstarts.bmt; import java.io.IOException; import java.io.PrintWriter; import javax.annotation.Resource; import javax.inject.Inject; import javax.persistence.EntityManagerFactory; import javax.persistence.PersistenceUnit; 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 javax.transaction.*; /** * <p> * A servlet which shows how to manually manage transactions and database resources using * both managed (session bean) and non-managed (simple CDI pojo) components. Reasons * why the developer might want to control transaction demarcation are various, for example * application requirements may need to access synchronizations or there may be XAResources * that are not supported by the JEE container. * </p> * * <p> * The servlet is registered and mapped to /BMT using the {@linkplain WebServlet * @HttpServlet}. The {@link ManagedComponent} and {@link UnManagedComponent} are injected by CDI. * </p> * * @author Mike Musgrove * */ @WebServlet("/BMT") public class TransactionServlet extends HttpServlet { static String PAGE_HEADER = "<html><head><title>bmt</title></head><body>"; static String PAGE_CONTENT = "<h1>Stepping Outside the Container (with JPA and JTA)</h1>" + "<form>" + "<input checked type=\"checkbox\" name=\"strategy\" value=\"managed\" /> Use bean managed Entity Managers <br />" + "Key: <input type=\"text\" name=\"key\" /><br />" + "Value: <input type=\"text\" name=\"value\" /><br />" + "<input type=\"submit\" value=\"Submit\" /><br />" + "</form>"; static String PAGE_FOOTER = "</body></html>"; /* * Inject a stateless bean. Although stateless beans are thread safe it is probably not a * solution that scales particularly well. */ @Inject ManagedComponent managedBean; /* * Create a CDI POJO that will manage both transactions and the JPA EntityManager itself */ @Inject UnManagedComponent unManagedBean; /** * <p>Servlet entry point. * </p> * <p>The behaviour of the servlet is controlled by servlet query parameter or form parameters. * If parameters named "key" and "value" are present then that pair is added (or the key is updated if it already * exists) to the database. If the form parameter "strategy" is not set to the value "managed" then * both the transaction and the EntityManager are controlled manually. Otherwise the Entity Manager is controlled * by the container and the transaction is controlled by the developer. * </p> * @param req the HTTP request * @param resp the HTTP response * @throws ServletException * @throws IOException */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); String responseText; String key = req.getParameter("key"); String value = req.getParameter("value"); String txStrategy = req.getParameter("strategy"); if ("managed".equalsIgnoreCase(txStrategy)) responseText = managedBean.updateKeyValueDatabase(key, value); else responseText = unManagedBean.updateKeyValueDatabase(key, value); writer.println(PAGE_HEADER); writer.println(PAGE_CONTENT); writer.println("<p>" + responseText + "</p>"); writer.println(PAGE_FOOTER); writer.close(); } }