2011. október 9., vasárnap

JSTL és a controller az AppEngine-ben

Az eddigi JDO példában a lekért adatokat egy egyszerű szervleten keresztül jelenítettem meg. A jobb használhatóság miatt érdemes szétválasztani a controller és view részeket, így a szervletek mellett megjelennek a JSP lapok, ahol a JSTL-t használom a jobb átláthatóság miatt. Az AppEngine-ben van néhány minimális korlátozás ezért a JSTL-hez is kell egy-két apró trükk. Az első, hogy a JSP lapokon használni kell az isELIgnored="false" kiegészítést.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>

A másik módosítás, hogy az Eclipse projekt build path-jébe fel kell venni a JSTL lib-eket, de ezek nem lehetnek az alap JSTL könyvtárak, hanem a telepített plugin könyvtárban lévőket kell használnunk. Ezeket másoljuk a WEB-INF\lib könyvtárba és adjuk az Eclipse build path-hez a projektben.

\plugins\com.google.appengine.eclipse.sdkbundle_1.5.4.r37v201109211906\appengine-java-sdk-1.5.4\lib\tools\jsp\repackaged-appengine-jakarta-jstl-1.1.2.jar
\plugins\com.google.appengine.eclipse.sdkbundle_1.5.4.r37v201109211906\appengine-java-sdk-1.5.4\lib\tools\jsp\repackaged-appengine-jakarta-standard-1.1.2.jar
http://someprog.blogspot.com/2010/08/google-app-engine-can-not-find-tag.html

Az átalakítás után az alap belépési ponton két irányba irányítjuk át a request-et: home és user.

index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.google.appengine.api.users.UserServiceFactory"%>
<%
    if (UserServiceFactory.getUserService().getCurrentUser() == null) {
		response.sendRedirect("/home.jsp");
    } else {
    	response.sendRedirect("/user/vehicles");
    }
%>

A home.jsp oldalról be lehet lépni és tovább lehet menni a felhasználói oldalra, ahogyan eddig is. A user/vehicles átirányítás a járműlistához megy, ha már belépett a felhasználó. A járműlista controllere a web.xml alapján a VehicleServlet, majd feldolgozás után onnan a vehicle.jsp-re ugrik.


VehicleServlet.java
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
		throws IOException, ServletException {

	UserService userService = UserServiceFactory.getUserService();
	User user = userService.getCurrentUser();

	PersistenceManager pm = null;
	try {

		pm = PMF.get().getPersistenceManager();
		AppUser currentUser = UserDao.getUser(pm, user);
		if (currentUser == null) {
			currentUser = initDatabase(pm, user);
		}
		
		request.setAttribute("appUser", currentUser);
		request.getRequestDispatcher("/WEB-INF/jsp/vehicles.jsp").forward(request, response);

	} finally {
		if (pm != null) {
			pm.close();
		}
	}
	
}

A request-be tesszük az appUser-t, átirányítjuk a megjelenítő oldalra, majd a JSP lapon kivesszük a járműveit és azok bejegyzéseit.

vehicles.jsp

A megjelenített adatok halmazának szebb ábrázolása miatt CSS elemeket is használok, így a JSP lapot nem kell telepakolni style elemekel. A létrejött fájlok nagy száma miatt átcsoportosítottam az elemeket, így külön mappába kerülnek a css és a js elemek is. A JSP lapok is kéttéválnak, ezért a gyökérben lesznek a publikus lapok, a WEB-INF\jsp mapában pedig a közvetlenül nem elérhető lapok. Ez utóbbiakat a szervleteken keresztül lehet elérni, így mindig a megfelelő adat is rendelkezésre fog állni.



A frissített kód itt elérhető, a módosítások eredménye pedig ez lett:


Nincsenek megjegyzések:

Megjegyzés küldése