我目前已将 web.xml 配置为捕获 404 并将它们发送到我的 spring Controller ,该 Controller 将在给定原始 URL 请求的情况下执行搜索。
就捕获和搜索而言,功能已经全部具备,但是当我尝试返回 View 时,问题就开始出现了。
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="1">
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="jsp" value="text/html" />
</map>
</property>
<property name="defaultContentType" value="application/json" />
<property name="favorPathExtension" value="true" />
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value="" />
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
<property name="ignoreAcceptHeader" value="true" />
</bean>
这是我的 MVC 配置文件中的一个片段。
问题在于将 View 的路径解析为/WEB-INF/jsp/
目录。在我的 JBoss 设置中使用记录器,我可以看到,当我通过转到不存在的页面来测试此搜索 Controller 时,会发生以下情况:
服务器找不到请求
请求被发送到 404 错误页面(在本例中是我的搜索 Controller )
搜索 Controller 执行搜索
搜索 Controller 返回 View 名称(对于本例,我们假设返回
test.jsp
)基于服务器记录器,我可以看到,一旦我的搜索 Controller 返回 View 名称,
org.springframework.web.servlet.view.JSTLView
就会被初始化(所以我可以假设它被InternalResourceViewResolver
正确拾取)服务器尝试将内容返回到浏览器,导致 404!
有几件事让我感到困惑:
当
test.jsp
明显存在于/WEB-INF/jsp/
目录下时,我不能 100% 确定为什么此问题无法解决。即使存在其他问题,为什么会导致 404?理论上,导致另一个 404 的 404 错误页面不应该创建无限循环吗?
感谢您的帮助或指点!
Controller 类[不完整]:
@Controller
public class SiteMapController {
//--------------------------------------------------------------------------------------
@Autowired(required=true)
private SearchService search;
@Autowired(required=true)
private CatalogService catalog;
//--------------------------------------------------------------------------------------
@RequestMapping(value = "/sitemap", method = RequestMethod.GET)
public String sitemap (HttpServletRequest request, HttpServletResponse response) {
String forwardPath = "";
try {
long startTime = System.nanoTime() / 1000000;
String pathQuery = (String) request.getAttribute("javax.servlet.error.request_uri");
Scanner pathScanner = new Scanner(pathQuery).useDelimiter("\\/");
String context = pathScanner.next();
List<ProductLightDTO> results = new ArrayList<ProductLightDTO>();
StringBuilder query = new StringBuilder();
String currentValue;
while (pathScanner.hasNext()) {
currentValue = pathScanner.next().toLowerCase();
System.out.println(currentValue);
if (query.length() > 0)
query.append(" AND ");
if (currentValue.contains("-")) {
query.append("\"");
query.append(currentValue.replace("-", " "));
query.append("\"");
}
else {
query.append(currentValue + "*");
}
}
//results.addAll(this.doSearch(query.toString()));
System.out.println("Request: " + pathQuery);
System.out.println("Built Query:" + query.toString());
//System.out.println("Result size: " + results.size());
long totalTime = (System.nanoTime() / 1000000) - startTime;
System.out.println("Total TTP: " + totalTime + "ms");
if (results == null || results.size() == 0) {
forwardPath = "home.jsp";
}
else if (results.size() == 1) {
forwardPath = "product.jsp";
}
else {
forwardPath = "category.jsp";
}
}
catch (Exception ex) {
System.err.println(ex);
}
System.out.println("Returning view: " + forwardPath);
return forwardPath;
}
}
最佳答案
1 . I'm not 100% sure why this isn't resolving when test.jsp clearly exists under the /WEB-INF/jsp/ directory.
这是因为您确实使用 suffix = ""
配置了 View 解析器,因此该文件必须命名为 test
(无扩展名)。
2 . Even if there was some other problem, why would this result in a 404? Shouldn't a 404 error page that results in another 404 theoretically create an infinite loop?
我很确定这是针对 Spring MVC 中无限重定向循环的某种保护的结果。
注意:在 Controller 中,spring 期望 View 名称作为结果,因此 test
而不是 test.jsp
(或者更好,使用 模型和 View
)
关于java - spring mvc转发到jsp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032558/