网页未找到。 Spring MVC + 码头

Posted

技术标签:

【中文标题】网页未找到。 Spring MVC + 码头【英文标题】:Page not found. Spring MVC + Jetty 【发布时间】:2014-07-03 09:09:08 【问题描述】:

我正在尝试使用包含 jsp 和 @Controller 的 Spring MVC 启动 Jetty。启动码头后,如果我尝试调用任何页面,我每次都会收到警告。例如

ttp://localhost:8080/getMessageStats/

在名称为 'org.springframework.web.servlet.DispatcherServlet-57ad85ed' 的 DispatcherServlet 中未找到带有 URI [/resources/css/bootstrap.min.css] 的 HTTP 请求的映射 未找到带有 URI 的 HTTP 请求的映射 [/ resources/js/bootstrap.min.js] 在 DispatcherServlet 中,名称为 'org.springframework.web.servlet.DispatcherServlet-57ad85ed'

web.xml

<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>Spring MVC Application</display-name>

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/cloud/*</url-pattern>
</servlet-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

<context:component-scan base-package="net.cloud.web.statistics"/>

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<mvc:resources mapping="/resources/**" location="/resources/" />

<mvc:annotation-driven />

WebServer.class

public class WebServer 
private static final Logger log = LoggerFactory.getLogger(WebServer.class);

private static final String CONTEXT_PATH = "/";
private Server httpServer;

@Value("$http_statistics_port")
private Integer port;

@Value("$start_page_path")
private String startPagePath;

public void init() 
    try 
        httpServer = new Server(port);
        httpServer.setHandler(getServletContextHandler());
        httpServer.setStopAtShutdown(true);

        httpServer.start();
        log.info("WebServer start ...");
        httpServer.join();

     catch (Exception ex) 
        log.error("Exception in http server. Exception: ", ex.getMessage());
    



private static ServletContextHandler getServletContextHandler() throws IOException 
    WebAppContext contextHandler = new WebAppContext();
    contextHandler.setErrorHandler(null);
    contextHandler.setContextPath(CONTEXT_PATH);

    WebApplicationContext context = getContext();

    contextHandler.addServlet(new ServletHolder(new DispatcherServlet(context)), CONTEXT_PATH);
    contextHandler.addEventListener(new ContextLoaderListener(context));
    contextHandler.setResourceBase(new ClassPathResource("webapp").getURI().toString());
    contextHandler.setDescriptor("/webapp/WEB-INF/web.xml");
    return contextHandler;


private static WebApplicationContext getContext() 
    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.setConfigLocation("webapp/WEB-INF/");
    log.info("CONTEXT name  locations ", context.getDisplayName(), context.getConfigLocations());

    return context;

GetMessagesStatsController.class

    @Controller
@RequestMapping("/getMessageStats")
public class GetMessageStatsController 

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String printWelcome(ModelMap model) 

        GetMessageStatsRPC rpc = new GetMessageStatsRPC();

        model.addAttribute("result", rpc.getResult());

        return "getMessageStats";
    

    @RequestMapping(value = "/json", method = RequestMethod.GET)
    public @ResponseBody
    String generateJsonResponse() 

        GetMessageStatsRPC rpc = new GetMessageStatsRPC();

        return rpc.getResult().toString();
    

项目树(抱歉,上传图片没有评级)。类:

src/java/main/net/.../WebServer.class;src/java/main/net/.../GetMessagesStatsController.class src/main/webapp/WEB-INF/web.xml; src/main/webapp/WEB-INF/mvc-dispatcher-servlet.xml; src/main/webapp/WEB-INF/pages/*.jsp; src/main/webapp/resources/css 和 src/main/webapp/resources/js

伙计们,有什么想法吗?

【问题讨论】:

尝试像这样访问localhost:8080/ProjectName/pageName.jsp 【参考方案1】:

首先在部署应用程序时,它会检查 web.xml 并获取

&lt;url-pattern&gt;/*&lt;/url-pattern&gt;

然后它初始化 DispatcherServlet 并使用初始化参数初始化

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>

(WEB-INF 必须以 / 开头)

然后在mvc-dispatcher-servlet.xml 中,视图解析器解析渲染页面。

更改&lt;property name="prefix" value="WEB-INF/pages/"/&gt;

&lt;property name="prefix" value="/WEB-INF/pages/"/&gt;

终于在你的控制器里@RequestMapping("/getMessageStats")

所以最终启动应用程序

http://localhost:8080/ProjectName/getMessageStats/

调用 GetMessagesStatsController 的 printWelcome() 和

 http://localhost:8080/ProjectName/getMessageStats/json

调用 generateJsonResponse()

【讨论】:

我们在哪里设置 xml 或其他我们需要在 url 中写入 的地方? 这样就成功了!但是现在找不到在mvc-dispatcher-servlet.xml中解析的css文件,比如.它给了我在 DispatcherServlet 中找不到带有 URI [/css/bootstrap.min.css] 的 HTTP 请求的映射,名称为 'org.springframework.web.servlet.DispatcherServlet-46bcb6d2' Refer this 告诉我你能不能解决它 似乎我错过了什么。你能告诉我是否有项目树:cloud -> src -> main -> java -> net -> ... java classes and cloud -> src -> main -> webapp -> css;云 -> src -> main -> webapp -> js; cloud -> src -> main -> webapp -> WEB-INFO (web.xml & etc) 我在这个位置的高位写的 mvc:resources 映射是否正确?我在我的 jsp 中发现的另一件事: 。这是什么 $pageContext.request.contextPath ? 您现在的具体问题是什么?【参考方案2】:

看起来 viewResolver 有问题。将前缀改为/WEB-INF/pages/,如下:

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

没有斜杠表示相对路径,所以它会在 relativePath(getMessageStats/) + prefix(WEB-INF/pages/) + request(getMessageStats) +suffix(.jsp) 处找到页面。

【讨论】:

我已经改变了,同样的事情:在 DispatcherServlet 中找不到带有 URI [/WEB-INF/pages/getMessageStats.jsp] 的 HTTP 请求的映射,名称为 'mvc-dispatcher' 。真正的路径是 webapp/WEB-INF/pages/*.jsp。如果我设置 它会给出相同的警告 @rado 发布您的构建控制文件。看起来战争没有正确组装(运行时不应该有任何webapp)。 我由 MAVEN 运行它,在我的项目中就像另一个服务一样,所以我不创建 WAR 文件。有趣的事情。如果我设置 /。我在启动 Jetty 时收到了警告:2014-07-03 12:31:46 INFO [main] Server:300 - jetty-9.1.2.v20140210 2014-07-03 12:31:46 WARN [main] WebAppContext: 501 - 上下文 oejwWebAppContext@21069cba/,file:/home/rado/Development/hg.unisender.com/unicore/cloud/target/classes/webapp/,STARTING java.lang.reflect.InvocationTargetException 任何想法启动失败为什么? 我以为你不能通过路径“/webapp/WEB-INF/web.xml”访问web.xml 你能告诉我们目标/类目录吗?您可以尝试打印“/webapp/WEB-INF/web.xml”的整个路径来检查路径 它是 src/main/webapp/WEB-INF/web.xml

以上是关于网页未找到。 Spring MVC + 码头的主要内容,如果未能解决你的问题,请参考以下文章

Spring mvc:资源未找到 *.ico 文件

Spring MVC + Eclipse:HTTP 404 – 未找到

获取此 org.springframework.web.servlet.DispatcherServlet noHandlerFound 错误和警告:在 Spring MVC 中未找到 HTTP 请求

ssm(spring,spring mvc,mybatis)框架

Spring mvc 基本原理

spring MVC配置详解