Java spring-mvc转发到jsp

Java spring-mvc转发到jsp,java,servlets,spring-mvc,Java,Servlets,Spring Mvc,我目前已将web.xml配置为捕获404并将其发送到spring控制器,该控制器将在给定原始URL请求的情况下执行搜索 在捕获和搜索过程中,功能都在那里,但是当我尝试返回视图时,问题开始出现 <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="1"> <property name="mediaTypes"> <ma

我目前已将web.xml配置为捕获404并将其发送到spring控制器,该控制器将在给定原始URL请求的情况下执行搜索

在捕获和搜索过程中,功能都在那里,但是当我尝试返回视图时,问题开始出现

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

我将此作为答案发布,因为它太长,但可能不是答案

http://localhost:8080/webapp/servlet-mapping-url/controller-mapping/method-mapping
如果您的控制器处理请求的方法没有返回视图名称字符串或视图对象,也没有直接写入输出流,则spring dispatcher应该将视图名称解析为
/WEB-INF/jsp/controller mapping/method mapping.jsp

这意味着jsp必须位于名为
/WEB-INF/jsp/controller mapping/
的文件夹下。但是,如果控制器方法返回视图名称或视图对象,spring dispatcher将使用该名称或对象

还有其他许多可能的映射组合,但这是最常见的一种。如果你能展示你的控制器类,它会更容易

更新

如果您使用的是
DefaultAnnotationHandlerMapping
,则应始终使用
@RequestMapping(value=“/mapping string”)
对类进行注释。否则,spring dispatcher将在没有其他匹配项时尝试拾取它

由于控制器已映射,因此必须将方法映射更改为
value={“”“/”}

对于返回的视图名称,不需要放置
.jsp

如果返回的视图名称是
home
,那么spring dispatcher将解析为
/WEB-INF/jsp/home.jsp

如果返回的视图名称是
path/home
,则spring dispatcher将解析为
/WEB-INF/jsp/path/home.jsp

另外,您使用了forwardPath一词,但它不是真正的转发。它只是一个视图名称

@Controller
@RequestMapping(value = "/sitemap")
public class SiteMapController {

    @RequestMapping(value = {"", "/"}, method = RequestMethod.GET)
    public String sitemap (HttpServletRequest request, HttpServletResponse response) {  
            ...
            if (results == null || results.size() == 0) {
                forwardPath = "home";
            }
            else if (results.size() == 1) {
                forwardPath = "product";
            }
            else {
                forwardPath = "category";
            }
            ...
        return forwardPath;
    }
}
一,。当test.jsp显然存在于/WEB-INF/jsp/下时,我不能100%确定为什么不能解决这个问题 目录

这是因为您确实使用
后缀=“
配置了视图解析器,因此文件必须命名为
test
(无扩展名)

二,。即使存在其他问题,为什么会出现404?404错误页面不应该这样吗 理论上会导致另一个404创建无限循环

我很确定这是对SpringMVC中无限重定向循环的一些保护的结果


注意:在控制器中,spring希望得到一个视图名称,因此
test
而不是
test.jsp
(或者更好,使用
ModelAndView

尝试设置视图解析器的顺序。例如:

@Bean
public ViewResolver getViewResolver(){
  InternalResourceViewResolver resolver = new InternalResourceViewResolver();
  resolver.setViewClass(JstlView.class);
  resolver.setPrefix("/WEB-INF/jsp/");
  resolver.setSuffix(".jsp");
  resolver.setOrder(1);
  return resolver;
}

在步骤4中,您说假设返回了视图名test.jsp,但返回的是什么。(参见日志文件)我的意思是,根据我的日志和我的可视化std输出验证,它实际上返回了“home.jsp”、“product.jsp”或“search.jsp”,但对于上面的示例,我要说的是假设它返回“test.jsp”,也就是请求的url是什么,以及
test.jsp
的确切位置是哪里?您需要这三个信息来判断哪里出了问题。我已经在#1结尾处说明了“/WEB-INF/jsp/”下存在“test.jsp”。另外,我声明这是一个404捕获,所以任何不存在的请求都会转到这里。但即使直接通过“/dispatcher/sitemap.jsp”调用控制器也有相同的行为。几乎所有无法解析的视图名称都给出404,控制器是否得到正确处理无关紧要。@jerluc我已经更新了答案,如果有任何问题,请告诉我。返回不带.jsp的视图名只会创建另一个404,重新调用控制器。我将尝试更改控制器的扩展名以匹配jsp以外的内容,以防在匹配的控制器和通过url/sitemap或url/sitemap/访问的实际jspdid之间出现混淆?结尾的斜杠也让它与众不同。实际上我刚刚发现了一件非常有趣的事情。似乎这种行为只出现在chrome中,但当我在firefox中查看它时,视图会按预期返回!我在想,
Accept
header中可能会有不同?chrome对json有更高的q值吗?
@Bean
public ViewResolver getViewResolver(){
  InternalResourceViewResolver resolver = new InternalResourceViewResolver();
  resolver.setViewClass(JstlView.class);
  resolver.setPrefix("/WEB-INF/jsp/");
  resolver.setSuffix(".jsp");
  resolver.setOrder(1);
  return resolver;
}