2013-03-17 5 views
1

У меня возникают некоторые проблемы с приложением. У меня есть регистрационная форма, которая представляет собой сообщение на другую страницу с контроллера На этой странице отображаются результаты запроса из регистрационной формы. На странице результатов я выбираю запись, и она возвращает меня с данными на страницу регистрации. Пользователь должен иметь возможность обновлять запись после ее возврата или выполнения запроса.Spring MVC Pages HTTP Status 400 и неправильный адрес

Проблемы, с которыми я столкнулся, - это когда пользователь находится в регистрационной форме и выполняет запрос, отправленный на страницу результатов , но страница результатов отображается, однако URL-адрес не изменяется. Регистрационный URL-адрес: http://localhost:8084/crimeTrack/citizen_registration.htm при отправке на страницу результатов, нажав кнопку запроса, URL-адрес еще http://localhost:8084/crimeTrack/citizen_registration.htm , когда запись нажата/выбрана на странице результатов (которая содержит несколько записей), пользователь отправляется на страницу регистрации с выбранная запись, и пользователю будет предложено выполнить обновление или запрос еще раз, url - http://localhost:8084/crimeTrack/getCitizen/1985121244.htm , и пользователь сейчас находится на странице регистрации.

Если я нажимаю запрос/обновление еще раз я получаю 400 ошибкуHTTP и URL читает http://localhost:8084/crimeTrack/getCitizen/citizen_registration.htm/ , и это не является допустимым отображение URL в контроллере. Я думаю, что URL должен быть http://localhost:8084/crimeTrack/citizen_registration.htm, когда запрашивается страница регистрации . Я не уверен, когда POST с страницы результатов вернет пользователя на страницу регистрации, должен быть адрес http://localhost:8084/crimeTrack/getCitizen/1985121244.htm прилагаемый номер является номером гражданина. Под моим кодом я не уверен, правильно ли я делаю эти звонки, и мне хотелось бы получить объяснение результатов, которые я получаю, а также решение проблем;

Страницы представлены с использованием JQuery:

Это пример для страницы регистрации и все другие страницы по той же схеме

JScript

function submitPage(){ 

    document.getElementById("citizenRegistration").action="citizen_registration.htm"; 
    //document.getElementById("citizenRegistration").target="_self";  
    document.getElementById("citizenRegistration").method = "POST"; 
    document.getElementById("citizenRegistration").submit(); 

} 

citizen_registration.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN"> 
<html lang="en"> 

    <head> 


    <title>Citizen Registration</title> 

</head> 
    <body>    
      <div id="tab1" class="divGroup"> 
       <form:form id="citizenRegistration" name ="citizenRegistration" commandName="citizens"> 
        ........................ 
         <div class="buttons"> 
          <ol> 
           <li><input class="button" id="save" type="submit" name= "user_request" value="Save"/> 
            <input class="button" id="update" type="submit" name= "user_request" value="Update"/> 
            <input class="button" id="query" type="submit" name= "user_request" value="Query"/> 
           </li>  

       </form:form> 
      </div>   
    </body> 
</html> 

citizenList.jsp

<!DOCTYPE html> 
<html lang="en"> 

<head> 

    <script type="text/javascript"> 

    function submitPage(socialSecurityNumber){  

     document.getElementById("citizenList").action="getCitizen/1985121244.htm";//harded coded for testing 
     //document.getElementById("citizenList").target="_self";  
     document.getElementById("citizenList").method = "POST"; 
     document.getElementById("citizenList").submit(); 

    } 

function GetCitizenTypeDescription(citizenTypeId){     
     $.ajax({ 
     type:'GET', 
     url:'getCitizenTypeDescription.htm', 
     data:{citizenTypeId:citizenTypeId}, 
     dataType: 'text',  

     success: function (data) {  
     $('.citizenTypeId').each(function(i){    
       if($(this).val() === citizenTypeId){ 
        //finds parent div 
        var parent = $(this).parent(); 
        //search for child element wit class name citizenTypeDesc 
        var thisCitizenTypeDesc = parent.children('.citizenTypeDesc');     
        thisCitizenTypeDesc.text(data); 
       } 
     }); 
    } 


    }); 

}  
    <title>Citizen Search Results</title> 

</head> 
<body> 
<form:form id="citizenList" name ="citizenList"> 
<div id ="content"> 
<c:forEach items="${citizens}" var="citizen"> 
<div id="table">  
    <div> 
     <p><canvas class="canvas" height="240" width="320"></canvas> 
    </div> 
     <label class="citizenTypeDesc"></label></br> 

     <a class="socialSecurityNumber" href="${citizen.socialSecurityNumber}">${citizen.fName} ${citizen.lName}</a> 
     <input type="hidden" id="photo" value="${citizen.photo}" class="photos"/> 
     <input type="hidden" id="socialSecurityNumber" value="${citizen.socialSecurityNumber}" /> 
     <input type="hidden" class="citizenTypeId" value="${citizen.citizenTypeId}"/> 

</div> 
</c:forEach> 
</div> 
</form:form> 
</body> 
</html> 

CitizenRegistrationController.java

@Controller 
public class CitizenRegistrationController { 


    private final Logger logger = Logger.getLogger(getClass()); 

    @Autowired 
    private CitizenTypeManager citizenTypeManager; 
    ............ 

    Map<String, Object> myCitizenType = new HashMap<String, Object>(); 
    ....... 

    @InitBinder("citizens") 
    protected void initBinder(WebDataBinder binder){   

     //removes white spaces 
     binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); 

     //formats date 
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 

     //By passing true this will convert empty strings to null 
     binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); 
     dateFormat.setLenient(false); 

     //binder.setValidator(new OfficerRegistrationValidation()); 
     binder.setValidator(citizenRegistrationValidation); 

     binder.registerCustomEditor(Integer.class,new CustomIntEditor()); 


    } 

    @RequestMapping(value="citizen_registration.htm", method = RequestMethod.GET) 
    public ModelAndView loadPage(@ModelAttribute Citizens citizen, 
           BindingResult result, 
           ModelMap m, 
           Model model, 
           HttpServletRequest request, 
           HttpServletResponse response) throws Exception { 



     try{ 
      logger.debug("In Http method for CitizenRegistrationController");  

      myCitizenType.put("citizenTypeList",  this.citizenTypeManager.getCitizenType()); 
      myGender.put("genderList",     this.genderManager.getGenderList());    
      ...... 



      return new ModelAndView("citizen_registration"); 

     }catch(Exception e){ 

      logger.error("Exception in CitizenRegistrationController - ModelAndView loadPage "+e); 
      request.setAttribute("error",e.getMessage()); 
      return new ModelAndView("error_page"); 

     } 

    } 

    @RequestMapping(value="citizen_registration.htm", method = RequestMethod.POST) 
    public ModelAndView handleRequest(@Valid @ModelAttribute Citizens citizen, 
             BindingResult result, 
             ModelMap m, 
             Model model, 
             @RequestParam(value="user_request") String user_request) throws Exception { 


     try{ 
      logger.debug("In Http method for CitizenRegistrationController - Punishment Registration"); 
      logger.debug("User Request Is " + user_request); 


       if(result.hasErrors()){ 

        logger.debug("Has Errors"); 
        return new ModelAndView("citizen_registration"); 
       }else{ 

        //check if its a save of an update 

        if(user_request.equals("Save")){ 

         citizenManager.RegisterCitizen(citizen); 
         model.addAttribute("icon","ui-icon ui-icon-circle-check"); 
         model.addAttribute("results","Record Was Saved"); 
         return new ModelAndView("citizen_registration"); 

        }else if (user_request.equals("Query")){ 
         logger.debug("about to preform query"); 
         //citizenManager.getListOfCitizens(citizen); 
         if(citizenManager.getListOfCitizens(citizen).isEmpty()){ 

          model.addAttribute("icon","ui-icon ui-icon-circle-close"); 
          model.addAttribute("results","Notice: Query Caused No Records To Be Retrived!");        


         }else{ 
          model.addAttribute("citizens",citizenManager.getListOfCitizens(citizen)); 
          return new ModelAndView("citizenList"); 


         }      

        }else if (user_request.equals("Update")){ 
         logger.info("About to do update"); 

         citizenManager.UpdateCitizen(citizen); 

         return new ModelAndView("citizen_registration");       
        }     
       } 

        logger.debug("Has No Errors");  

      return new ModelAndView("citizen_registration"); 

     }catch(Exception e){ 

      logger.error("Exception in CitizenRegistrationController - ModelAndView loadPage "+e); 
      //request.setAttribute("error",e.getMessage()); 

      return new ModelAndView("citizen_registration"); 

     } 

    } 

     @RequestMapping(value="getCitizen/{socialSecurityNumber}.htm", method = RequestMethod.POST) 
     public ModelAndView getCitizen(@PathVariable Integer socialSecurityNumber,@ModelAttribute Citizens citizen, 
             BindingResult result,ModelMap m,Model model,HttpServletRequest request, 
             HttpServletResponse response) { 

      try { 
       model.addAttribute("citizens",citizenManager.getCitizen(socialSecurityNumber)); 
       //model.addAttribute("citizens",citizenManager.getCitizen(socialSecurityNumber)); 
      } catch (Exception e) { 

       logger.error("Exception in CitizenRegistrationController - ModelAndView getCitizen "+e); 
      } 

      return new ModelAndView("citizen_registration");  

     } 


    @RequestMapping(value="getCitizenTypeDescription.htm", method=RequestMethod.GET) 
    public @ResponseBody String citizenTypeDescription(@RequestParam Integer citizenTypeId)throws Exception{ 

     String data = "No Data Found"; 

     try{ 

      data = citizenTypeManager.getCitizenTypeDescription(citizenTypeId); 

     }catch(Exception e){ 
      data = e.getMessage();   
      logger.error("Exception In getCitizenTypeDescription.htm error : " + e); 
     } 

     return data;  

    } 
//setter methods  
    /** 
    * @param citizenTypeManager the citizenTypeManager to set 
    */ 
    public void setCitizenTypeManager(CitizenTypeManager citizenTypeManager) { 
     this.citizenTypeManager = citizenTypeManager; 
    } 
    ................................ 

} 

Редактировать

Я попытался с помощью return new ModelAndView("redirect:/citizenList.htm"); в контроллере, когда у ser, но я получаю 404 Not Found - http://localhost:8084/crimeTrack/citizenList.htm"

Сервлет.XML

<?xml version="1.0" encoding="UTF-8"?> 

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

     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 
          http://www.springframework.org/schema/beans/spring-context-3.0.xsd"> 




<!-- __________________________________________________________________________________________________ -->  

    <!-- Supports annotations and allows the use of @Controller, @Required, @RequestMapping --> 
    <context:annotation-config/>  

    <context:component-scan base-package="com.crimetrack.business"/> 
    <context:component-scan base-package="com.crimetrack.jdbc"/> 
    <context:component-scan base-package="com.crimetrack.service"/> 
    <context:component-scan base-package="com.crimetrack.web" /> 

    <mvc:annotation-driven /> 

    <mvc:resources mapping="/resources/**" location="/public-resources/"/> 

<!-- __________________________________________________________________________________________________ -->  

    <!-- Forwards requests to the "/" resource to the "login" view --> 
    <mvc:view-controller path="/login" view-name="login"/> 

    <!-- Forwards requests to the "/" resource to the "officer_registration" view --> 
    <mvc:view-controller path="/officer_registration" view-name="officer_registration"/> 


    <!-- Forwards requests to the "/" resource to the "citizenList" view --> 
    <mvc:view-controller path="/citizenList" view-name="citizenList"/> 


    <!-- Forwards requests to the "/" resource to the "citizen_registration" view --> 
    <mvc:view-controller path="/citizen_registration" view-name="citizen_registration"/> 

<!-- __________________________________________________________________________________________________ -->  

    <!-- <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> --> 

    <!-- Is used to process method level annotations --> 
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>  
<!-- __________________________________________________________________________________________________ -->  

    <!-- <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> --> 

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
      <property name="basename" value="messages"/> 
    </bean> 


    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> 
<!-- __________________________________________________________________________________________________ --> 


     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> 
     <property name="prefix" value="/WEB-INF/jsp/"></property> 
     <property name="suffix" value=".jsp"></property>   
     </bean> 



</beans> 
+0

'@ PathVariable' концепция может быть решением для вашего требования –

+0

Попробуйте изменить ваш запрос выглядит следующим образом: '@RequestMapping (value =" getCitizen.htm/{socialSecurityNumber} ", method = RequestMethod.POST)' –

+0

Я получаю отображение URL-адреса getCitizen для работы, а также PathVariable проблема, когда я на странице регистрации, я выполняю запрос, и я попал на страницу списка результатов, когда я нахожусь на этой странице, я нажимаю на результаты. Затем он возвращает меня на страницу регистрации, так что теперь у меня есть запись, отображаемая мне. Теперь вот где проблема, если я нажимаю обновление или запрос, я получаю ошибку Http 404 http: // localhost: 8084/crimeTrack/getCitizen/citizen_registration.htm, которая является неправильным идентификатором URL-адреса, как getCitizen присоединяется к registration_registration – devdar

ответ

1

1) изменить тип входного сигнала на кнопку вместо покориться и добавить событие OnClick, который будет вызывать вашу функцию submitPage переходящая в действии позвонить

<input class="button" id="save" type="button" name="user_request" value="Save"  onclick="submitPage('citizen_registration.htm');"/> 
<input class="button" id="update" type="button" name="user_request" value="Update" onclick="submitPage('citizen_registration.htm');"/> 
<input class="button" id="query" type="button" name="user_request" value="Query" onclick="submitPage('citizen_list.htm');"/> 

2) изменить свою функцию отправки, чтобы установить действие, основанное на какой кнопке была нажата

function submitPage(action){ 
    document.getElementById("citizenRegistration").action = action; 
    document.getElementById("citizenRegistration").method = "POST"; 
    document.getElementById("citizenRegistration").submit(); 
} 

3) есть 2 метода контроллера, один сопоставляются для сохранения/обновления, другой отображается в список

@RequestMapping(value="citizen_list.htm", method = RequestMethod.POST) 
public ModelAndView getCitizenList(@Valid @ModelAttribute Citizens citizen, BindingResult result, ModelMap m, Model model, @RequestParam(value="user_request") String user_request) throws Exception { 

    try{ 
     logger.debug("about to preform query"); 
     //citizenManager.getListOfCitizens(citizen); 
     if(citizenManager.getListOfCitizens(citizen).isEmpty()){ 
      model.addAttribute("icon","ui-icon ui-icon-circle-close"); 
      model.addAttribute("results","Notice: Query Caused No Records To Be Retrived!");        
     }else{ 
      model.addAttribute("citizens",citizenManager.getListOfCitizens(citizen)); 
      return new ModelAndView("citizenList"); 
     } 
    }catch(Exception e){ 
     logger.error("Exception in CitizenRegistrationController - ModelAndView loadPage "+e); 
     //request.setAttribute("error",e.getMessage()); 
     return new ModelAndView("citizen_registration"); 
    } 
} 

@RequestMapping(value="citizen_registration.htm", method = RequestMethod.POST) 
public ModelAndView handleRequest(@Valid @ModelAttribute Citizens citizen, BindingResult result, ModelMap m, Model model, @RequestParam(value="user_request") String user_request) throws Exception { 

    try{ 
     logger.debug("In Http method for CitizenRegistrationController - Punishment Registration"); 
     logger.debug("User Request Is " + user_request); 

     if(result.hasErrors()){ 
      logger.debug("Has Errors"); 
      return new ModelAndView("citizen_registration"); 
     }else{ 
      //check if its a save of an update 
      if(user_request.equals("Save")){ 
       citizenManager.RegisterCitizen(citizen); 
       model.addAttribute("icon","ui-icon ui-icon-circle-check"); 
       model.addAttribute("results","Record Was Saved"); 
       return new ModelAndView("citizen_registration"); 
      } else if (user_request.equals("Update")){ 
       logger.info("About to do update"); 
       citizenManager.UpdateCitizen(citizen); 
       return new ModelAndView("citizen_registration");       
      }     
     } 

     logger.debug("Has No Errors");  
     return new ModelAndView("citizen_registration"); 

    }catch(Exception e){ 
     logger.error("Exception in CitizenRegistrationController - ModelAndView loadPage "+e); 
     //request.setAttribute("error",e.getMessage()); 
     return new ModelAndView("citizen_registration"); 
    } 
} 
+0

. Я отправляю страницу с помощью jscript. Я не думаю, что есть какая-либо необходимость. включить действие в тег формы? – devdar

+0

проблема, с которой я сталкиваюсь, когда я нахожусь в регистрационной форме, и я нажимаю запрос, я попал в файл citizenList.htm, и это прекрасно, я не использую перенаправление, чтобы перейти на эту страницу, я возвращаю новый ModelAndView («citizenList») ; и страница возвращается с результатами, однако URL-адрес не изменяет его, как http: // localhost: 8084/crimeTrack/citizen_registration.htm. – devdar

+1

А, я вижу, вы возвращаете новый ModelAndView («civilList»), и вы ожидаете увидеть изменение URL-адреса на что-то вроде localhost: 8084/crimeTrack/citizenList.htm. Это верно? Если это так, вам нужен отдельный метод контроллера для извлечения списка граждан, который отображается на URL, который вы хотите увидеть. Прямо сейчас у вас есть все в методе handleRequest, который сопоставляется с citizen_registration.htm. Вы хотите что-то вроде @RequestMapping ("/ citizenList.htm") public ModelAndView getCitizenList() ... – clav

2

Проблема заключается в использовании относительных путей здесь, когда вы говорите action="citizen_registration.htm".

Изменить его

document.getElementById("citizenRegistration").action="/crimeTrack/citizen_registration.htm"; 

или

document.getElementById("citizenRegistration").action="../citizen_registration.htm"; 
+0

Это не решило проблему в любом случае, если форма отправлена ​​без js. Проблема все еще существует. – devdar