javascript
为什么运行了java文件老是404_java – 为什么Spring MVC用404响应并报告“在...
您的標(biāo)準(zhǔn)Spring MVC應(yīng)用程序?qū)⑼ㄟ^(guò)您在Servlet容器中注冊(cè)的DispatcherServlet提供所有請(qǐng)求.
DispatcherServlet查看其ApplicationContext,如果可用,則使用ContextLoaderListener注冊(cè)的ApplicationContext用于設(shè)置其請(qǐng)求服務(wù)邏輯的特殊bean. These beans are described in the documentation.
incoming requests to handlers and a list of pre- and post-processors
(handler interceptors) based on some criteria the details of which
vary by HandlerMapping implementation. The most popular implementation
supports annotated controllers but other implementations exists as
well.
DispatcherServlet查找此類型的所有bean并按某種順序注冊(cè)它們(可以自定義).在提供請(qǐng)求時(shí),DispatcherServlet循環(huán)遍歷這些HandlerMapping對(duì)象并使用getHandler測(cè)試每個(gè)對(duì)象,以找到可以處理傳入請(qǐng)求的對(duì)象,表示為標(biāo)準(zhǔn)HttpServletRequest.從4.3.x開(kāi)始,如果沒(méi)有找到任何,你看到的是logs the warning
No mapping found for HTTP request with URI [/some/path] in DispatcherServlet with name SomeName
和either拋出NoHandlerFoundException或立即提交404 Not Found狀態(tài)代碼的響應(yīng).
為什么DispatcherServlet找不到可以處理我的請(qǐng)求的HandlerMapping?
最常見(jiàn)的HandlerMapping實(shí)現(xiàn)是RequestMappingHandlerMapping,它處理將@Controller bean注冊(cè)為處理程序(實(shí)際上是他們的@RequestMapping注釋方法).您可以自己聲明這種類型的bean(使用@Bean或< bean>或其他機(jī)制),也可以使用the built-in options.這些是:
>使用@EnableWebMvc注釋您的@Configuration類.
>聲明一個(gè)< mvc:annotation-driven /> XML配置中的成員.
正如上面的鏈接所描述的,這兩個(gè)都將注冊(cè)一個(gè)RequestMappingHandlerMapping bean(以及一堆其他的東西).但是,沒(méi)有處理程序,HandlerMapping不是很有用. RequestMappingHandlerMapping需要一些@Controller bean,所以你需要通過(guò)Java配置中的@Bean方法或< bean>來(lái)聲明它們. XML配置中的聲明或通過(guò)@Controller注釋類的組件掃描.確保這些豆子存在.
如果您收到警告消息和404,并且您已正確配置了上述所有內(nèi)容,則您將請(qǐng)求發(fā)送到錯(cuò)誤的URI,該URI不會(huì)被檢測(cè)到的@RequestMapping帶注釋的處理程序方法處理.
spring-webmvc庫(kù)提供了其他內(nèi)置的HandlerMapping實(shí)現(xiàn).例如,BeanNameUrlHandlerMapping地圖
from URLs to beans with names that start with a slash (“/”)
而你總是可以自己寫(xiě).顯然,您必須確保您發(fā)送的請(qǐng)求至少匹配一個(gè)已注冊(cè)的HandlerMapping對(duì)象的處理程序.
如果您沒(méi)有隱式或顯式注冊(cè)任何HandlerMapping bean(或者如果detectAllHandlerMappings為真),則DispatcherServlet會(huì)注冊(cè)一些defaults.這些在DispatcherServlet.properties中定義在與DispatcherServlet類相同的包中.它們是BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping(類似于RequestMappingHandlerMapping但已棄用).
調(diào)試
Spring MVC將記錄通過(guò)RequestMappingHandlerMapping注冊(cè)的處理程序.例如,像@Controller一樣
@Controller
public class ExampleController {
@RequestMapping(path = "/example", method = RequestMethod.GET, headers = "X-Custom")
public String example() {
return "example-view-name";
}
}
將在INFO級(jí)別記錄以下內(nèi)容
Mapped "{[/example],methods=[GET],headers=[X-Custom]}" onto public java.lang.String com.spring.servlet.ExampleController.example()
這描述了已注冊(cè)的映射.當(dāng)您看到?jīng)]有找到處理程序的警告時(shí),請(qǐng)將消息中的URI與此處列出的映射進(jìn)行比較. @RequestMapping中指定的所有限制必須與Spring MVC匹配才能選擇處理程序.
其他HandlerMapping實(shí)現(xiàn)記錄它們自己的語(yǔ)句,這些語(yǔ)句應(yīng)該提示它們的映射和相應(yīng)的處理程序.
類似地,在DEBUG級(jí)別啟用Spring日志記錄以查看Spring注冊(cè)的bean.它應(yīng)該報(bào)告它找到哪些帶注釋的類,它掃描哪些包,以及它初始化的bean.如果您所期望的那些不存在,那么請(qǐng)查看您的ApplicationContext配置.
其他常見(jiàn)錯(cuò)誤
DispatcherServlet只是一個(gè)典型的Java EE Servlet.您可以使用典型的< web.xml>注冊(cè)它. < servlet的類>和< servlet-mapping>聲明,或直接通過(guò)WebApplicationInitializer中的ServletContext#addServlet,或Spring引導(dǎo)使用的任何機(jī)制.因此,您必須依賴于Servlet specification中指定的url映射邏輯,請(qǐng)參閱第12章.另請(qǐng)參閱
考慮到這一點(diǎn),一個(gè)常見(jiàn)的錯(cuò)誤是使用/ *的url映射注冊(cè)DispatcherServlet,從@RequestMapping處理程序方法返回視圖名稱,并期望呈現(xiàn)JSP.例如,考慮一個(gè)像這樣的處理程序方法
@RequestMapping(path = "/example", method = RequestMethod.GET)
public String example() {
return "example-view-name";
}
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
您可能希望請(qǐng)求是forwarded到路徑為/WEB-INF/jsps/example-view-name.jsp的JSP資源.這不會(huì)發(fā)生.相反,假設(shè)上下文名稱為Example,DisaptcherServlet將報(bào)告
No mapping found for HTTP request with URI [/Example/WEB-INF/jsps/example-view-name.jsp] in DispatcherServlet with name ‘dispatcher’
因?yàn)镈ispatcherServlet映射到/ *和/ *匹配所有內(nèi)容(具有更高優(yōu)先級(jí)的完全匹配除外),所以將選擇DispatcherServlet來(lái)處理JstlView中的轉(zhuǎn)發(fā)(由InternalResourceViewResolver返回).幾乎在所有情況下,DispatcherServlet都不會(huì)配置為處理這樣??的請(qǐng)求.
相反,在這種簡(jiǎn)單的情況下,您應(yīng)該將DispatcherServlet注冊(cè)到/,將其標(biāo)記為默認(rèn)servlet.默認(rèn)servlet是請(qǐng)求的最后一個(gè)匹配項(xiàng).這將允許您的典型servlet容器在嘗試使用默認(rèn)servlet之前選擇映射到* .jsp的內(nèi)部Servlet實(shí)現(xiàn)來(lái)處理JSP資源(例如,Tomcat具有JspServlet).
這就是你在你的例子中看到的.
總結(jié)
以上是生活随笔為你收集整理的为什么运行了java文件老是404_java – 为什么Spring MVC用404响应并报告“在...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql opensuse_opens
- 下一篇: 制作计算器窗口java_Java实现的窗