java - spring mvc转发到jsp

标签 java servlets spring-mvc

我目前已将 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 时,会发生以下情况:

  1. 服务器找不到请求

  2. 请求被发送到 404 错误页面(在本例中是我的搜索 Controller )

  3. 搜索 Controller 执行搜索

  4. 搜索 Controller 返回 View 名称(对于本例,我们假设返回 test.jsp)

  5. 基于服务器记录器,我可以看到,一旦我的搜索 Controller 返回 View 名称,org.springframework.web.servlet.view.JSTLView就会被初始化(所以我可以假设它被 InternalResourceViewResolver 正确拾取)

  6. 服务器尝试将内容返回到浏览器,导致 404!

有几件事让我感到困惑:

  1. test.jsp 明显存在于 /WEB-INF/jsp/ 目录下时,我不能 100% 确定为什么此问题无法解决。

  2. 即使存在其他问题,为什么会导致 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/

相关文章:

java - Android:应用程序不断预填充 sqlite 数据库

java - 加载 MSCAPI Java keystore 而不加载私钥(硬 token )

Java - 帮助将字符串转换为类对象

java - JVM如何处理静态变量?

java - 单击按钮更改jsp

security - 当已通过身份验证的用户访问登录页面时如何重定向到另一个页面

java - 对 servlet 的多个 ajax 调用

web-services - Spring MVC如何成为REST框架?

java - 在 URL 中带有时间戳的 Spring RequestMapping

spring-mvc - Spring MVC(xml 配置噩梦?)vs spring roo?