Spring MVC页面HTTP状态400和不正确的URL

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

我遇到的问题是当用户在注册表单上并执行查询时,他们被发布到结果页面,显示结果页面但是url没有改变。 注册url为http://localhost:8084/crimeTrack/citizen_registration.htm当点击http://localhost:8084/crimeTrack/citizen_registration.htm时,点击查询按钮,url仍然是http://localhost:8084/crimeTrack/citizen_registration.htm /在结果页面上选择/有几条记录,用户被发回到具有所选记录的注册页面,并显示该用户现在再次执行更新或查询,url为http://localhost:8084/crimeTrack/getCitizen/1985121244.htm ,用户现在在注册页面上。

如果我再次单击查询/更新,我收到HTTP 400错误 ,并且URL正在读取http://localhost:8084/crimeTrack/getCitizen/citizen_registration.htm/ ,这不是Controller中的有效URL映射。 我认为当请求注册页面时,url应为http://localhost:8084/crimeTrack/citizen_registration.htm 。 我不确定结果页面中的POST何时将用户带回注册页面的URL应为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

    Citizen Registration   
........................

citizenList.jsp

     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); } }); } }); } Citizen Search Results   

CitizenRegistrationController.java

 @Controller public class CitizenRegistrationController { private final Logger logger = Logger.getLogger(getClass()); @Autowired private CitizenTypeManager citizenTypeManager; ............ Map myCitizenType = new HashMap(); ....... @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"); 在用户单击查询时在控制器中但是我得到404 Not Found - http://localhost:8084/crimeTrack/citizenList.htm"

servlet.xml中

                      <!--  -->    <!--  -->            

1)将输入类型更改为按钮而不是提交并添加一个onclick事件,该事件将调用您的submitPage函数传递给要调用的操作

    

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"); } } 

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

将其更改为

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

要么

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