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
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:
01 | < web-app xmlns = "http://java.sun.com/xml/ns/j2ee" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation = "http://java.sun.com/xml/ns/j2ee" version = "2.4" > |
02 |
03 | < servlet > |
04 | < servlet-name >dispatcher</ servlet-name > |
05 | < servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class > |
06 | < load-on-startup >1</ load-on-startup > |
07 | </ servlet > |
08 |
09 | < servlet-mapping > |
10 | < servlet-name >dispatcher</ servlet-name > |
11 | < url-pattern >*.html</ url-pattern > |
12 | </ servlet-mapping > |
13 |
14 | <!-- Loads the Spring-Context.xml --> |
15 | < listener > |
16 | < listener-class >org.springframework.web.context.ContextLoaderListener</ listener-class > |
17 | </ listener > |
18 | < context-param > |
19 | < param-name >contextConfigLocation</ param-name > |
20 | < param-value > |
21 | WEB-INF/application-context.xml |
22 | </ param-value > |
23 | </ context-param > |
24 |
25 | < welcome-file-list > |
26 | < welcome-file >index.jsp</ welcome-file > |
27 | </ welcome-file-list > |
28 | </ web-app > |
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:
01 | <%@ page language= "java" contentType= "text/html;charset=UTF-8" pageEncoding= "UTF-8" %> |
02 | <%@ include file= "/jsp/include.jsp" %> |
03 |
04 |
05 |
06 | <form:form commandname= "Login" method= "post" > |
07 | <table> |
08 | <tbody><tr> |
09 | <td>Username</td> |
10 | <td> |
11 | <form:input path= "j_username" ></form:input></td> |
12 | </tr> |
13 | <tr> |
14 | <td>Passwort</td> |
15 | <td> |
16 | <form:password path= "j_password" ></form:password></td> |
17 | </tr> |
18 | <tr> |
19 | <td colspan= "2" > |
20 | <input value= "Absenden" type= "submit" ></td> |
21 | </tr> |
22 | </tbody></table> |
23 | </form:form> |
Der dazugehörende Controller:
01 | package de.<b style= "color: black; background-color: rgb(160, 255, 255);" >pmannel</b>.login; |
02 |
03 | import javax.servlet.http.HttpServletRequest; |
04 | import javax.servlet.http.HttpServletResponse; |
05 |
06 | import org.springframework.validation.BindException; |
07 | import org.springframework.web.servlet.ModelAndView; |
08 | import org.springframework.web.servlet.mvc.SimpleFormController; |
09 | import org.springframework.web.servlet.view.RedirectView; |
10 |
11 | public class LoginController extends SimpleFormController |
12 | { |
13 |
14 | @Override |
15 | protected ModelAndView onSubmit(HttpServletRequest request, |
16 | HttpServletResponse response, Object command, BindException errors) |
17 | throws Exception |
18 | { |
19 | ModelAndView mv = new ModelAndView( new RedirectView(getSuccessView())); |
20 |
21 | User user = (User)command; |
22 | mv.addObject( "username" ,user.getJ_username()); |
23 | return mv; |
24 | } |
25 | } |
Die Jsp, an die gepostet wird:
1 | <%@ page language= "java" contentType= "text/html;charset=UTF-8" pageEncoding= "UTF-8" %> |
2 | <%@ include file= "/jsp/include.jsp" %> |
3 |
4 | hi <c:out value= "${username}" >! |
5 | </c:out> |
Der Controller dafür:
01 | package de.<b style= "color: black; background-color: rgb(160, 255, 255);" >pmannel</b>.login; |
02 |
03 | import javax.servlet.http.HttpServletRequest; |
04 | import javax.servlet.http.HttpServletResponse; |
05 |
06 | import org.springframework.web.bind.ServletRequestUtils; |
07 | import org.springframework.web.servlet.ModelAndView; |
08 | import org.springframework.web.servlet.mvc.Controller; |
09 |
10 | public class MyAppController implements Controller |
11 | { |
12 |
13 | @Override |
14 | public ModelAndView handleRequest(HttpServletRequest arg0, |
15 | HttpServletResponse arg1) throws Exception |
16 | { |
17 | ModelAndView mv = new ModelAndView( "myapp" ); |
18 |
19 | mv.addObject( "username" ,ServletRequestUtils.getStringParameter(arg0, "username" )); |
20 |
21 | return mv; |
22 | } |
23 | } |
und meine Dispatcher-Servlet.xml:
01 | < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xmlns:util = "http://www.springframework.org/schema/util" xmlns:tx = "http://www.springframework.org/schema/tx" xsi:schemalocation="http://www.springframework.org/schema/beans |
02 |
04 |
06 |
08 |
10 |
12 |
14 |
16 |
17 | < bean id = "defaultHandlerMapping" class = "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" > |
18 | < property name = "order" value = "0" > |
19 | < property name = "alwaysUseFullPath" value = "true" > |
20 | < property name = "mappings" > |
21 | < props > |
22 | < prop key = "/login.html" >loginController</ prop > |
23 | < prop key = "/secure/myapp.html" >myAppController</ prop > |
24 | </ props > |
25 | </ property > |
26 | </ property > |
27 |
28 | < bean id = "loginController" class = "de.pmannel.login.LoginController" > |
29 | < property name = "commandClass" value = "de.pmannel.login.User" > |
30 | < property name = "commandName" value = "Login" > |
31 | < property name = "formView" value = "login" > |
32 | < property name = "successView" value = "secure/myapp.html" > |
33 | </ property > |
34 |
35 | < bean id = "myAppController" class = "de.pmannel.login.MyAppController" ></ bean > |
36 |
37 | < bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver" > |
38 | < property name = "prefix" value = "/jsp/" > |
39 | < property name = "suffix" value = ".jsp" > |
40 | </ property > |
41 |
42 | </ property ></ bean ></ property ></ property ></ property ></ bean ></ property ></ bean ></ beans > |
in der include.jsp kommen folgende Taglibs:
1 | <%@ taglib prefix= "c" uri= "http://java.sun.com/jsp/jstl/core" %> |
2 | <%@ taglib prefix= "fmt" uri= "http://java.sun.com/jsp/jstl/fmt" %> |
3 | <%@ taglib prefix= "spring" uri= "http://www.springframework.org/tags" %> |
4 | <%@ 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.