GAE/J und Spring: Teil 2

Speichern von Daten per JDO

Als erstes werde ich mal die Domainenobjekte anlegen, in diesem Fall erstmal einen User und als 1:N die dazugehörigen WeightUnits, bestehend aus Gewicht/Tag. Außerdem benötigen wir noch die DAOs/Services sowie die PersistenceManagerFactory:

Für die Transaktionen muss noch die spring-tx.jar, spring-aop.jar und aopalliance-1.0.jar zum Classpath zugefügt werden.

Hier der User:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements Serializable
{
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Key key;

	@Persistent
	private String j_username;

	@Persistent
	private String j_password;

	@Persistent
	private String email;

	@Persistent
	private BigDecimal weight;

	@Persistent
	private BigDecimal desiredWeight;

	@Persistent(mappedBy = "user")
	private List weightUnits  = Lists.newArrayList();

//getter/setter
}

Und die WeightUnit:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class WeightUnit
{
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Key key;

	@Persistent
	private Date day;

	@Persistent
	private BigDecimal weight;

	@Persistent
	private User user;

//getter/setter

}

In der application-context.xml wird die PersistenceManagerFactory verdrahtet:


	

 	

 	

 	

 	

 	

 	

 	

anschließend benötigen wir die DAOs zum Speichern und Auslesen. Zu jeder DAOImpl gehört natürlich ein Interface, welches ich aus Platzgründen weg lasse:

public class UserDAOImpl extends JdoDaoSupport implements UserDAO
{

	@Override
	public void delete(User user)
	{
		// TODO Auto-generated method stub

	}

	@Override
	public User findUserById( Key key)
	{
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public User save(User user)
	{
			return getPersistenceManager().makePersistent(user);
	}

}

Ich verwende hier den JdoDaoSupport und binde mich damit an Spring, wer möchte kann sich die Factory auch selber injecten.

Anschließend noch Service/ServiceImpl erzeugen und in einen Controller injecten.

Damit die Session während eines Views nicht geschlossen werden, kommt noch ein OpenPersistenceInViewFilter in die web.xml.



	OpenPersistenceManagerInViewFilter
	org.springframework.orm.jdo.support.OpenPersistenceManagerInViewFilter


	OpenPersistenceManagerInViewFilter
	/*


Im nächsten Teil versuche ich dann, Spring Security in der Anwendung zum Laufen zu bekommen.




GAE/J und Spring: Teil 1

Aufsetzen eines GAE/J-Projekts

Download und Installation des Google App Engine SDK: SDK
Außerdem natürlich das Plugin für Eclipse: Plugin

Dann ein neues Web Application Project anlegen, dabei aber den Haken bei “Use Google Web Toolkit” rausnehmen
Anlegen

Als nächstes die Spring Libraries hinzufügen:

  • spring-core.jar
  • spring-beans.jar
  • spring-context.jar
  • spring-web.jar
  • spring-webmvc.jar
  • jstl.jar
  • standard.jar
  • commons-logging.jar

Auf keinen Fall die All-In-One spring.jar benutzen, da javax.naming.* von GAE nicht unterstützt wird.

Spring Security lasse ich vorerst weg!

Als nächstes in der web.xml das Dispatcher-Servlet bekanntmachen:



	
		dispatcher
		org.springframework.web.servlet.DispatcherServlet
		1
	

	
		dispatcher
		*.html
	

	

org.springframework.web.context.ContextLoaderListener
	
	
contextConfigLocation

			WEB-INF/application-context.xml
			
	

    
    	index.jsp
    

Achtung: Wer El/JSTL benutzen möchte, sollte die 2.4 Version im Schema verwenden, oder ElIgnored in der JSP auf false setzen!

Ich habe auch schon für später eine application-context.xml in der web.xml angelegt!

Eine JSP mit Formular, um sich anzumelden:

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="/jsp/include.jsp"%>




Username
Passwort

Der dazugehörende Controller:

package de.pmannel.login;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.web.servlet.view.RedirectView;

public class LoginController extends SimpleFormController
{

	@Override
	protected ModelAndView onSubmit(HttpServletRequest request,
			HttpServletResponse response, Object command, BindException errors)
			throws Exception
	{
		ModelAndView mv = new ModelAndView(new RedirectView(getSuccessView()));

		User user = (User)command;
		mv.addObject("username",user.getJ_username());
		return mv;
	}
}

Die Jsp, an die gepostet wird:

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="/jsp/include.jsp"%>

hi !

Der Controller dafür:

package de.pmannel.login;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class MyAppController implements Controller
{

	@Override
	public ModelAndView handleRequest(HttpServletRequest arg0,
			HttpServletResponse arg1) throws Exception
	{
		ModelAndView mv = new ModelAndView("myapp");

		mv.addObject("username",ServletRequestUtils.getStringParameter(arg0, "username"));

		return mv;
	}
}

und meine Dispatcher-Servlet.xml:



	




loginController
myAppController
		
		
	

	




	

	

	


	


in der include.jsp kommen folgende Taglibs:

<%@ taglib prefix="c" 			uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" 		uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="spring" 		uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" 		uri="http://www.springframework.org/tags/form" %>

Wenn dann alles soweit fertig ist, rechte Maustaste auf das Projekt, Run As –> Web Application!

Damit läuft GAE/J schonmal mit Spring MVC! Als nächstes versuche ich, mit Spring ORM und JDO den User im DataStore zu speichern.