我是springmvc的初学者并遵循教程。但我收到了一个错误,我花了三天时间。所以我想把它带到这里。首先请看我的代码:
的web.xml
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--Sitemesh: Decorates pages with layouts -->
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
servlet的context.xml中
<resources mapping="/resources/**" location="/resources/" />
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<beans:import resource="controllers.xml" />
我的控制器java类
@RequestMapping("/example")
public ModelAndView showMessage(
@RequestParam(value = "name", required = false, defaultValue = "World") String name)
throws IOException {
ModelAndView mv = new ModelAndView("example");
String response = readAll("http://localhost:53000/product");
JSONArray productsArray = new JSONArray(response);
products = new ArrayList<Product>();
if (null != productsArray){
for (int i=0; i< productsArray.length(); i++) {
JSONObject productobj = productsArray.getJSONObject(i);
Product product = new Product();
product.setId(productobj.getInt("id"));
product.setName(productobj.getString("name"));
product.setDescription(productobj.getString("description"));
product.setPrice(productobj.getDouble("price"));
product.setBalance(productobj.getInt("balance"));
product.setImageUrl(productobj.getString("image_url"));
specificationsMap.put(product.getId(), productobj.getJSONObject("specification"));
products.add(product);
}
mv.addObject("productList", products);
}
return mv;
}
我收到了一个错误:
No mapping found for HTTP request with URI [/springweb/example] in DispatcherServlet with name 'appServlet'
这就是我调用example
视图的方式:
<li><a href="<c:url value="/example" />">Example</a></li>
我在这里找不到什么错。寻求帮助。 感谢。
答案 0 :(得分:1)
我通过在controllers.xml类中添加<mvc:annotation-driven />
解决了这个问题。
感谢您的帮助。
答案 1 :(得分:0)
将servlet-context.xml代码写入文件名appServlet.xml
或 更改web.xml中的代码
<!-- Processes application requests -->
<servlet>
<servlet-name>servlet-context</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servlet-context</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
希望这可能有用:)
答案 2 :(得分:0)
c:url会自动添加上下文根和jSessionid。这是c:url的默认行为以及使用它的目的。
如果您不需要添加jsessionid,那么您可以使用简单的<a href="/example">
如果你必须使用c:url,那么你可以尝试设置上下文manullay,如<a href="<c:url context="/" value="/example" />">
答案 3 :(得分:0)
你应该将映射到spring {mvc servlet'从/
更改为/*
,所以就像
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
不同之处在于/
映射的含义是捕获未被任何其他servlet映射的所有请求,并且由于您的sitemash过滤器映射了所有,这将永远不会起作用。进行更改时,还应配置<mvc:resources>
元素,以便从映射中排除静态文件。
Servlet规则的映射由Servlet 3.0 specification
定义用于映射到servlet的路径是来自的请求URL 请求对象减去上下文路径和路径参数。该 下面的URL路径映射规则按顺序使用。 第一次成功 匹配用于未尝试进一步匹配:
- 容器将尝试查找请求路径与servlet路径的完全匹配。成功的比赛选择 的servlet。
- 容器将递归尝试匹配最长的路径前缀。这是通过逐步降低路径树的目录来完成的 一次,使用'/'字符作为路径分隔符。最长的 match确定所选的servlet。
- 如果URL路径中的最后一个段包含扩展名(例如.jsp),则servlet容器将尝试匹配处理的servlet 请求延期。扩展名被定义为 最后一个'。'字符后的最后一段。
- 如果前三个规则都没有导致servlet匹配,则容器将尝试提供适合的内容 资源要求。如果&#34;默认&#34; servlet是为 应用程序,它将被使用。许多容器提供隐含的 用于提供内容的默认servlet。
醇>