2013-03-26 3 views
0

Я struggeling используя основные методы Crud с приложением двигателя:Использование Spring с App Engine

Мой код выглядит следующим образом:

Мой CustomerController:

@Controller 
public class CustomerController { 

@RequestMapping(value = "/add", method = RequestMethod.GET) 
public String getAddCustomerPage(ModelMap model) { 
    return "command"; 
} 

@RequestMapping(value = "/list", method = RequestMethod.POST) 
public ModelAndView add(HttpServletRequest request, ModelMap model) { 

    String email = request.getParameter("email"); 
    String password = request.getParameter("password"); 

    Customer c = new Customer(); 
    c.setEmail(email); 
    c.setPassword(password); 
    c.setDate(new Date()); 

    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    try { 
     pm.makePersistent(c); 
    } finally { 
     pm.close(); 
    } 

    return new ModelAndView("redirect:command"); 

} 

// get all customers 
@RequestMapping(value = "/list", method = RequestMethod.GET) 
public String listCustomer(ModelMap model) { 

    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    Query q = pm.newQuery(Customer.class); 
    q.setOrdering("date desc"); 

    List<Customer> results = null; 

    try { 
     results = (List<Customer>) q.execute(); 

     if (results.isEmpty()) { 
      model.addAttribute("customerList", null); 
     } else { 
      model.addAttribute("customerList", results); 
     } 

    } finally { 
     q.closeAll(); 
     pm.close(); 
    } 

    return "list"; 

} 

мой MVC-диспетчерская-сервлет :

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

<context:component-scan base-package="com.Trium.controller" /> 
<mvc:annotation-driven /> 

<bean 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="suffix"> 
     <value>.jsp</value> 
    </property> 
</bean> 

и форма Я хочу proceede в command.jsp:

<form id="myForm" class="form-horizontal" action="add" 
            method="post"> 
            <fieldset> 
             <div class="control-group"> 

              <!-- Text input--> 
              <label class="control-label" for="input01">Email:</label> 
              <div class="controls"> 
               <input name="email" placeholder="email" 
                class="input-xlarge" type="text" 
                value="<%=request.getParameter("email")%>"> 
              </div> 
             </div> 
             <div class="control-group"> 
              <!-- Text input--> 
              <label class="control-label" for="input01">Password:</label> 
              <div class="controls"> 
               <input name="password" placeholder="password" 
                class="input-xlarge" type="text" 
                value="<%=request.getParameter("password")%>"> 
              </div> 
             </div> 

            </fieldset> 
           </form> 

Когда я хочу proceede форму от http://127.0.0.1:8888/command.jsp. Я получаю:

http://127.0.0.1:8888/add Ошибка 404

В GAE я получаю:

ВНИМАНИЕ: Не найдено отображение запроса HTTP с URI [/ добавить] в DispatcherServlet с именем «mvc- диспетчер '

Пожалуйста, помогите мне найти то, что неправильно отображается в моем приложении.

UPDATE

<?xml version="1.0" encoding="UTF-8" standalone="no"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <!-- Servlets --> 
    <servlet> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <!-- Default page to serve --> 
    <welcome-file-list> 
     <welcome-file>login.jsp</welcome-file> 
    </welcome-file-list> 

    <servlet> 
     <servlet-name>SystemServiceServlet</servlet-name> 
     <servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class> 
     <init-param> 
      <param-name>services</param-name> 
      <param-value/> 
     </init-param> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>SystemServiceServlet</servlet-name> 
     <url-pattern>/_ah/spi/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

UPDATE - 2

Mär 26, 2013 4:59:11 PM com.google.appengine.tools.development.ApiProxyLocalImpl log 
INFO: javax.servlet.ServletContext log: Initializing Spring root WebApplicationContext 
Mär 26, 2013 4:59:11 PM org.springframework.web.context.ContextLoader initWebApplicationContext 
INFO: Root WebApplicationContext: initialization started 
Mär 26, 2013 4:59:17 PM org.springframework.web.context.support.XmlWebApplicationContext prepareRefresh 
INFO: Refreshing Root WebApplicationContext: startup date [Tue Mar 26 16:59:17 UTC 2013]; root of context hierarchy 
Mär 26, 2013 4:59:19 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml] 
Mär 26, 2013 4:59:21 PM org.springframework.context.annotation.ClassPathBeanDefinitionScanner registerDefaultFilters 
INFO: JSR-330 'javax.inject.Named' annotation found and supported for component scanning 
Mär 26, 2013 4:59:25 PM org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init> 
INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring 
Mär 26, 2013 4:59:25 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 
INFO: Pre-instantiating singletons in org.s[email protected]7f5fde46: defining beans [customerController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,mvcContentNegotiationManager,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0,org.springframework.format.support.FormattingConversionServiceFactoryBean#0,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0,org.springframework.web.servlet.handler.MappedInterceptor#0,org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0,org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#0,org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver#0,org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,org.springframework.web.servlet.view.InternalResourceViewResolver#0,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy 
Mär 26, 2013 4:59:27 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/list],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView com.Trium.controller.CustomerController.add(javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:27 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/delete/{key}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView com.Trium.controller.CustomerController.delete(java.lang.String,javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:27 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/update],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView com.Trium.controller.CustomerController.update(javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:27 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/add],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.Trium.controller.CustomerController.getAddCustomerPage(org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:27 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/update/{name}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.Trium.controller.CustomerController.getUpdateCustomerPage(java.lang.String,javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:27 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/list],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.Trium.controller.CustomerController.listCustomer(org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:27 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/login],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView com.Trium.controller.CustomerController.login(javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:30 PM org.springframework.web.context.ContextLoader initWebApplicationContext 
INFO: Root WebApplicationContext: initialization completed in 18804 ms 
Mär 26, 2013 4:59:37 PM com.google.appengine.tools.development.ApiProxyLocalImpl log 
INFO: javax.servlet.ServletContext log: Initializing Spring FrameworkServlet 'mvc-dispatcher' 
Mär 26, 2013 4:59:37 PM org.springframework.web.servlet.DispatcherServlet initServletBean 
INFO: FrameworkServlet 'mvc-dispatcher': initialization started 
Mär 26, 2013 4:59:37 PM org.springframework.web.context.support.XmlWebApplicationContext prepareRefresh 
INFO: Refreshing WebApplicationContext for namespace 'mvc-dispatcher-servlet': startup date [Tue Mar 26 16:59:37 UTC 2013]; parent: Root WebApplicationContext 
Mär 26, 2013 4:59:37 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml] 
Mär 26, 2013 4:59:37 PM org.springframework.context.annotation.ClassPathBeanDefinitionScanner registerDefaultFilters 
INFO: JSR-330 'javax.inject.Named' annotation found and supported for component scanning 
Mär 26, 2013 4:59:37 PM org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init> 
INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring 
Mär 26, 2013 4:59:37 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 
INFO: Pre-instantiating singletons in org.s[email protected]3c050a95: defining beans [customerController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,mvcContentNegotiationManager,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0,org.springframework.format.support.FormattingConversionServiceFactoryBean#0,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0,org.springframework.web.servlet.handler.MappedInterceptor#0,org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0,org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#0,org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver#0,org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,org.springframework.web.servlet.view.InternalResourceViewResolver#0,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; parent: org.s[email protected]7f5fde46 
Mär 26, 2013 4:59:37 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/list],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView com.Trium.controller.CustomerController.add(javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:37 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/delete/{key}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView com.Trium.controller.CustomerController.delete(java.lang.String,javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:37 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/update],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView com.Trium.controller.CustomerController.update(javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:37 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/add],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.Trium.controller.CustomerController.getAddCustomerPage(org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:37 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/update/{name}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.Trium.controller.CustomerController.getUpdateCustomerPage(java.lang.String,javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:37 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/list],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.Trium.controller.CustomerController.listCustomer(org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:37 PM org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping registerHandlerMethod 
INFO: Mapped "{[/login],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView com.Trium.controller.CustomerController.login(javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap) 
Mär 26, 2013 4:59:38 PM org.springframework.web.servlet.DispatcherServlet initServletBean 
INFO: FrameworkServlet 'mvc-dispatcher': initialization completed in 657 ms 
Mär 26, 2013 4:59:38 PM com.google.apphosting.utils.jetty.JettyLogger info 
INFO: Started [email protected]:8888 
Mär 26, 2013 4:59:38 PM com.google.appengine.tools.development.AbstractServer startup 
INFO: Server default is running at http://localhost:8888/ 
Mär 26, 2013 4:59:38 PM com.google.appengine.tools.development.AbstractServer startup 
INFO: The admin console is running at http://localhost:8888/_ah/admin 
Mär 26, 2013 5:59:38 PM com.google.appengine.tools.development.DevAppServerImpl start 
INFO: Dev App Server is now running 
Mär 26, 2013 6:00:11 PM org.springframework.web.servlet.PageNotFound handleHttpRequestMethodNotSupported 
WARNING: Request method 'POST' not supported 

Теперь я получаю другое исключение. Тем не менее, я ничего не изменился от ранее; P

**WARNING: Request method 'POST' not supported** 
+1

Можете ли вы поделиться своим web.xml? – CodeChimp

+0

Каков корень контекста приложения? Кроме того, у вас нет метода обработчика для '/ add' с методом' POST', но ваша форма 'POST' '' add' –

ответ

2

Вы можете также добавить журнал сервер при запуске вашего AppEngine приложения в IDE, пожалуйста? Весна регистрирует все сопоставления URL-адресов при запуске.

Также в вашем контексте: конфигурация компонента-сканирования, ваш базовый пакет имеет в нем символ верхнего регистра?

com.Trium.controller 

Я пытаюсь угадать, так как я не знаю пакет CustomerController.

+0

да, это именно путь пакета! – maximus

+0

хорошо, что не нужно, хорошая практика иметь заглавные буквы в ваших пакетах, но это не вредно ... Я думаю, @Sotirios Delimanolis имеет ваш ответ :) –

2

Я чувствую, что вы не возвращаете страницу входа, когда на самом деле вызывается локальный хост. Для загрузки главной страницы необходимо добавить следующее сопоставление контроллера.

@RequestMapping(value = "/", method = RequestMethod.GET) 
public String indexPage(ModelMap map) { 
    return "login"; 
} 

Теперь получите доступ к вашему локальному хосту: 8888 в качестве страницы входа.

Попробуйте вернуть имя страницы вместо возврата URL-адреса.

@RequestMapping(value = "/add", method = RequestMethod.GET) 
public String getAddCustomerPage(ModelMap model) { 
    return "command"; 
} 
+0

thx для вашего ответа! Однако, когда я это делаю, я также получаю: 'Ошибка 405 Метод запроса 'POST' не поддерживается' – maximus

+0

@maximus вам не хватает одной маленькой вещи вместо того, чтобы возвращать страницу **/add ** url. Пожалуйста, верните имя страницы JSP. –

+0

Я обновил свой ответ в соответствии с вашими потребностями –

2

У вас есть это:

@RequestMapping(value = "/add", method = RequestMethod.GET) 
public String getAddCustomerPage(ModelMap model) { 
    return "command"; 
} 

, который обрабатывает запросы GET. Но ваша форма command.jsp делает POST к add

<form id="myForm" class="form-horizontal" action="add" method="post"> 

Таким образом, вам нужен другой метод обработки для обработки этого действия. Мне кажется, у вас уже есть, что в другом методе обработчика

@RequestMapping(value = "/list", method = RequestMethod.POST) 
public ModelAndView add(HttpServletRequest request, ModelMap model) { 

    String email = request.getParameter("email"); 
    String password = request.getParameter("password"); 

    Customer c = new Customer(); 
    c.setEmail(email); 
    c.setPassword(password); 
    c.setDate(new Date()); 

    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    try { 
     pm.makePersistent(c); 
    } finally { 
     pm.close(); 
    } 

    return new ModelAndView("redirect:command"); 

} 

Изменение формы POST к /list

<form id="myForm" class="form-horizontal" action="list" method="post"> 

Кроме того, вы не должны делать redirect:command. Это в основном делает новый запрос localhost:8888/command, который не существует. Сделайте это до redirect:add, который вызовет метод обработчика выше и сделает command.jsp.

Смежные вопросы