JSP页面跳转异常求助:提交后无法展示议员结果页面
JSP议员查询项目页面跳转异常排查与修复
问题描述
JSP议员查询项目存在页面跳转异常:点击提交按钮后,无法正常跳转到结果页面展示对应选区的议员数据。尝试过将JSP文件移至WEB-INF目录、删除自定义错误页、修改路径配置及beans.xml,但触发了此前已解决的404和循环路径错误,已恢复原有配置。调试发现请求URI存在拼写错误(cirocoscrizione而非circoscrizione),响应内容包含多个页面代码。
相关代码文件
beans.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app> <absolute-ordering> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </absolute-ordering> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <error-page> <error-code>500</error-code> <location>/webapp/500.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/webapp/404.jsp</location> </error-page> <servlet-mapping> <servlet-name>ParlamentareController</servlet-name> <url-pattern>/Parlamento</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>AggiugiParlamentare</display-name> <servlet-name>AggiugiParlamentare</servlet-name> <servlet-class>com.giuggiola.controller.ParlamentareController</servlet-class> </servlet> <servlet-mapping> <servlet-name>AggiugiParlamentare</servlet-name> <url-pattern>/addParlamentare</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>CercaParlamentareDalPartito</display-name> <servlet-name>CercaParlamentareDalPartito</servlet-name> <servlet-class>com.giuggiola.controller.ParlamentareController</servlet-class> </servlet> <servlet-mapping> <servlet-name>CercaParlamentareDalPartito</servlet-name> <url-pattern>/getParlamentare3</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>Cerca_parlamentare_dalla_circoscrizione</display-name> <servlet-name>Cerca_parlamentare_dalla_circoscrizione</servlet-name> <jsp-file>/cerca_parlamentare_dalla_circoscrizione.jsp</jsp-file> <servlet-class>com.giuggiola.controller.ParlamentareController</servlet-class> </servlet> <servlet-mapping> <servlet-name>Cerca_parlamentare_dalla_circoscrizione</servlet-name> <url-pattern>/cerca_parlamentare_dalla_circoscrizione</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>indexcontroller</display-name> <servlet-name>indexcontroller</servlet-name> <servlet-class>com.giuggiola.controller.IndexController</servlet-class> </servlet> <servlet-mapping> <servlet-name>indexcontroller</servlet-name> <url-pattern>/error</url-pattern> </servlet-mapping> <!-- <servlet> <description></description> <display-name>lista_parlamentari_circoscrizione</display-name> <servlet-name>lista_parlamentari_circoscrizione</servlet-name> <jsp-file>/lista_parlamentari_circoscrizione.jsp</jsp-file> <servlet-class>com.giuggiola.controller.ParlamentareController</servlet-class> </servlet> <servlet-mapping> <servlet-name>lista_parlamentari_circoscrizione</servlet-name> <url-pattern>/lista_parlamentari_circoscrizione</url-pattern> </servlet-mapping> --> <servlet> <servlet-name>jsptest</servlet-name> <jsp-file>/lista_parlamentari_circoscrizione.jsp</jsp-file> </servlet> <servlet-mapping> <servlet-name>jsptest</servlet-name> <url-pattern>/lista_parlamentari_circoscrizione.jsp</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>error</display-name> <servlet-name>error</servlet-name> <servlet-class>com.giuggiola.controller.ParlamentareController</servlet-class> </servlet> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>/error2</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>error</display-name> <servlet-name>error</servlet-name> <servlet-class>com.giuggiola.controller.IndexController</servlet-class> </servlet> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>src/main/resources/static/error</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>Cerca_parlamentare_dal_nome</display-name> <servlet-name>Cerca_parlamentare_dal_nome</servlet-name> <servlet-class>com.giuggiola.controller.ParlamentareController</servlet-class> </servlet> <servlet-mapping> <servlet-name>Cerca_parlamentare_dal_nome</servlet-name> <url-pattern>/getParlamentare</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>AggiornaParlamentare</display-name> <servlet-name>AggiornaParlamentare</servlet-name> <servlet-class>com.giuggiola.controller.ParlamentareController</servlet-class> </servlet> <servlet-mapping> <servlet-name>AggiornaParlamentare</servlet-name> <url-pattern>/updateParlamentare</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>CancellaParlamentare</display-name> <servlet-name>CancellaParlamentare</servlet-name> <servlet-class>com.giuggiola.controller.ParlamentareController</servlet-class> </servlet> <servlet-mapping> <servlet-name>CancellaParlamentare</servlet-name> <url-pattern>/cancellaParlamentare</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>LeggiParlamentare</display-name> <servlet-name>LeggiParlamentare</servlet-name> <servlet-class>com.giuggiola.controller.ParlamentareController</servlet-class> </servlet> <servlet-mapping> <servlet-name>LeggiParlamentare</servlet-name> <url-pattern>/parlamentare/{nome}</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>ListaParlamentari</display-name> <servlet-name>ListaParlamentari</servlet-name> <servlet-class>com.giuggiola.controller.ParlamentareController</servlet-class> </servlet> <servlet-mapping> <servlet-name>ListaParlamentari</servlet-name> <url-pattern>/lista_parlamentari</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>ListaPeriodiCariche</display-name> <servlet-name>ListaPeriodiCariche</servlet-name> <servlet-class>com.giuggiola.controller.ParlamentareController</servlet-class> </servlet> <servlet-mapping> <servlet-name>ListaPeriodiCariche</servlet-name> <url-pattern>/lista_periodi_cariche</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>Parlamentari</display-name> <servlet-name>Parlamentari</servlet-name> <servlet-class>com.giuggiola.controller.ParlamentareController</servlet-class> </servlet> <servlet-mapping> <servlet-name>Parlamentari</servlet-name> <url-pattern>/parlamentari</url-pattern> </servlet-mapping> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/webapp/WEB-INF/" /> <property name="suffix" value=".jsp" /> </bean> </web-app>
ParlamentareController.java
@GetMapping("/cerca_parlamentare_dalla_circoscrizione") public ModelAndView getParlamentare4(@RequestParam("circoscrizione") String circoscrizionee) { ModelAndView mv = new ModelAndView(); List<Parlamentare> parlamentari = parlamRepo.findByCircoscrizione(circoscrizionee); mv.addObject(parlamentari); mv.setViewName("lista_parlamentari_circoscrizione.jsp"); return mv; }
cerca_parlamentare_dalla_circoscrizione.jsp
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Cerca un parlamentare dalla circoscrizione</title> </head> <body> <h2>Ricerca parlamentare in base alla circoscrizione:</h2> <form method="POST" action="\lista_parlamentari_circoscrizione.jsp" modelAttribute="parlamentari"> <table> <tr> <td>Circoscrizione:</td> <td> <input type="text" name="circoscrizione"><br></td> </tr> <tr> <td> <td><input type="submit" value="invio" action="\lista_parlamentari_circoscrizione.jsp"></td></br> </tr> </table> </form> </body> </html>
lista_parlamentari_circoscrizione.jsp
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Lista parlamentari di quella circoscrizione</title> </head> <body> <!-- <form action="getParlamentare4"> --> <c:forEach items="${parlamentari}" var="parlamentare" > <td>Nome:</td> <td><c:out value="${parlamentare.getPk().getNome()}"/></td> <br> </tr> <tr> <td>Partito:</td> <td><c:out value="${pk.partito}"/></td><br> </tr> <tr> <td>Circoscrizione:</td> <c:forEach items="${pk.getCircoscrizione()}" var="CIRCOSCRIZIONE"> <td><c:out value="${CIRCOSCRIZIONE}"/></td> <br> </c:forEach> </tr> <br> <tr> <td>Data di nascita:</td> <td><c:out value="${parlamentare.data_nascita}"/><br></td> </tr> <tr> <td>Luogo:</td> <td><c:out value="${parlamentare.luogo}"/><br></td> </tr> <tr> <td>Titolo di studi:</td> <td><c:out value="${parlamentare.titolo_studi}"/><br></td> </tr> <tr> <td>Mandati:</td><br> <c:forEach items="${parlamentare.mandati}" var="mandato"> <table> <tr> <td>Mandato:</td> <td><c:out value="${mandato}"/></td><br> </tr> </table> </c:forEach> </tr> <tr> <td>Commissioni:</td> <c:forEach items="${parlamentare.commissioni}" var="commissione"> <table> <tr> <td>Commissione:</td> <td><c:out value="${commissione}"/></td><br> </tr> </table> </c:forEach> </c:forEach> </body> </html>
修复方案
1. 统一请求方法与表单提交路径
- 将表单的
method改为GET(匹配控制器的@GetMapping),action指向控制器映射路径,而非直接访问JSP:
<form method="GET" action="/cerca_parlamentare_dalla_circoscrizione">
- 若需使用POST方法,将控制器注解改为
@PostMapping或@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST})。
2. 修正控制器视图名称与模型数据传递
- 视图解析器已配置前缀和后缀,视图名称无需加
.jsp:
mv.setViewName("lista_parlamentari_circoscrizione");
- 传递模型数据时指定键名,确保JSP能正确获取:
mv.addObject("parlamentari", parlamentari);
3. 修复JSP中的EL表达式错误
- 在结果JSP顶部引入JSTL核心标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 修正
pk属性的引用方式,需通过循环变量parlamentare访问:
<td><c:out value="${parlamentare.pk.partito}"/></td><br> <!-- 替换原${pk.partito} --> <c:forEach items="${parlamentare.pk.circoscrizione}" var="CIRCOSCRIZIONE"> <!-- 替换原${pk.getCircoscrizione()} -->
4. 清理beans.xml冗余配置
- 删除重复的
servlet定义(如两个errorservlet),避免请求映射冲突。 - 移除直接将JSP映射为servlet的配置(如
jsptest),统一由Spring MVC的DispatcherServlet处理所有请求。
5. 统一拼写规范
- 检查所有涉及
circoscrizione的代码,确保表单输入名、控制器参数名、数据库字段名拼写一致,避免因拼写错误导致参数无法传递或查询失败。
内容的提问来源于stack exchange,提问作者utente1234567890
相关产品推荐
相关产品推荐

