2013-03-17 84 views
1

我遇到了应用程序的一些问题。我有一个注册表格,该表格从控制器 发布到另一页面,此页面显示注册表格中的查询结果。在结果页面上,我选择一条记录,并将 数据返回给注册页面。用户应该能够在记录返回或再次执行查询后更新记录。Spring MVC页面HTTP状态400和URL不正确

我遇到的问题是,当用户在注册表单上并执行查询时,他们被张贴到结果页面 显示结果页面,但url不会改变。注册网址为http://localhost:8084/crimeTrack/citizen_registration.htm 当通过点击查询按钮发布到结果页时,url仍然是http://localhost:8084/crimeTrack/citizen_registration.htm 当在结果页面上(具有多条记录)单击/选择记录时,用户将被回发到注册页面 已选择的记录,它显示给用户现在再次执行更新或查询,网址为http://localhost:8084/crimeTrack/getCitizen/1985121244.htm ,用户现在在注册页面上。

如果我点击查询/更新一次我正在一个HTTP 400错误,网址为阅读http://localhost:8084/crimeTrack/getCitizen/citizen_registration.htm/ ,这是不是在控制器一个有效的URL映射。当注册页面是 请求时,我认为url应该是http://localhost:8084/crimeTrack/citizen_registration.htm。我不确定POST结果页面将用户带回注册页面时的URL是否应为http://localhost:8084/crimeTrack/getCitizen/1985121244.htm 附加号码是公民号码。下是我的代码,我不知道我是否正确地进行这些调用,我想要得到的结果的解释以及对所遇到的问题的解决方案。

这是注册页面的例子和其他的页面遵循相同的模式

的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:

页面使用jQuery的提交

<!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");当U服务器点击查询,但我越来越404 Not Found - http://localhost:8084/crimeTrack/citizenList.htm"

Servlet。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'概念可以为您的要求 – 2013-03-18 08:42:01

+0

尝试修改解决方案您的请求映射像这样......'@RequestMapping(value =“getCitizen.htm/{socialSecurityNumber}”,method = RequestMethod.POST)' – 2013-03-18 08:44:21

+0

我得到getCitizen url映射工作以及PathVariable问题是当我在注册页面上执行查询时,我被带到结果列表页面,当我在该页面上点击结果时。然后它将我带回到注册页面,所以我现在有一条记录显示给我。现在,这里是问题的地方,如果我点击更新或查询我得到HTTP 404错误http:// localhost:8084/crimeTrack/getCitizen/citizen_registration.htm这是一个不正确的网址idk如何getCitizen获得追加到citizen_registration – devdar 2013-03-19 00:05:07

回答

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)更改您的submitPage函数,根据哪个按钮设置动作被点击

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 2013-03-19 18:38:36

+0

我遇到的问题是,当我在注册表单上,我点击查询我被带到citizenList.htm,并罚款我不使用重定向到这个页面我做一个返回新的ModelAndView(“citizenList”) ;并返回页面结果正常,但URL不会改变它保持为http:// localhost:8084/crimeTrack/citizen_registration.htm。 – devdar 2013-03-19 18:43:29

+1

嗯,我明白了,你正在返回新的ModelAndView(“citizenList”),你希望看到URL改变为localhost:8084/crimeTrack/citizenList.htm。那是对的吗?如果是这种情况,您需要一个单独的控制器方法来检索映射到您想要查看的URL的citizenList。现在,您拥有了映射到citizen_registration.htm的handleRequest方法中的所有内容。你想要的东西像@RequestMapping(“/ citizenList.htm”)公共ModelAndView getCitizenList()... – clav 2013-03-19 19:33:45

2

的问题是你在这里使用相对路径,当你说action="citizen_registration.htm"

将其更改为

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

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

这并没有解决问题以任何方式,如果表单提交时没有js问题仍然存在 – devdar 2013-03-17 21:57:49