gpt4 book ai didi

spring - 无法将 dispatcherServlet 映射到上下文根

转载 作者:行者123 更新时间:2023-12-03 11:58:58 28 4
gpt4 key购买 nike

这是我用于 spring mvc 的当前配置:

1- web.xml:

<servlet>  
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/config/dispatcherServlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

2- dispatcherServlet.xml:
<context:component-scan base-package="com.app" />
<context:annotation-config />
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>

3- Controller :我的网页直接在webapp文件夹下
@Controller
public class SearchController {

private Log log = LogFactory.getLog(getClass());

@RequestMapping("/search.jsp")
public String search(Model model, HttpServletRequest request,
HttpSession session) {
log.debug("Search Controller");
return "search";
}

问题:尝试访问搜索页面时,如下所示:
http://localhost:8080/MyAPP/search.jsp

没有调用 Controller ,但是当我将调度程序 servlet 映射到 /mapping/* 时并按如下方式访问搜索页面:
http://localhost:8080/MyAPP/mapping/search.jsp

Controller 被正确调用,我正在使用 spring 3.0.5.RELEASE .

请指教,谢谢。

最佳答案

我认为您忘记了在您的 Web 服务器/servlet 容器中配置的内置默认 servlet。例如在 Tomcat7/conf/web.xml 中存在:

<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>

这是 catch *.jsp在它到达 Spring 之前。我通过删除所有 Spring 配置在本地对此进行了测试,但仍然可以获得 search.jsp .

How DefaultAnnotationHandlerMapping works应该有助于解释为什么这样做会起作用。

当您拥有 <url-pattern>/mapping/*</url-pattern>您创建了比简单 / 更具体的匹配项所以请求被默认(即 Tomcat)servlet 忽略并路由到您正确配置的 Controller 。

解决此问题的一种方法是使用 <url-pattern>/*</url-pattern> 强制通过 servlet 执行所有操作。但您还需要进行一些其他更改以避免映射分辨率问题。

我将 *.jsp 文件移动到(标准?)子目录 /WEB-INF并添加
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>/WEB-INF/*</url-pattern>
</servlet-mapping>

web.xml 并更改 dispatcherServlet.xml 像这样匹配:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>

如果您不进行这些更改,请向 /search.jsp 提出请求将由您配置为 /search.jsp 的 InternalResourceViewResolver 解析将 Tomcat 发送到无限转发循环中!

No mapping found for HTTP request with URI [/WEB-INF/pages/apiForm.jsp]可能在这里有用。

旁白:对于我的大多数 Spring XML 配置项目,我使用 /WEB-INF/views使 View 层与/WEB-INF 根目录中的任何配置分开。

关于spring - 无法将 dispatcherServlet 映射到上下文根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14233337/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com