2014-07-03 74 views
1

我試圖用包含jsp和@Controller的Spring MVC啓動Jetty。開始碼頭後,我已經每次都警告如果我嘗試打電話給任何網頁。例如找不到頁面。 Spring MVC + Jetty

TTP://本地主機:8080/getMessageStats/

沒有映射找到用於與URI [/resources/css/bootstrap.min.css]在DispatcherServlet的名爲「org.springframework HTTP請求.web.servlet.DispatcherServlet-57ad85ed'在DispatcherServlet中使用URI [/resources/js/bootstrap.min.js]找不到具有URI的HTTP請求的映射,名稱爲'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-調度-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; 
} 

}

GetMess agesStatsController.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 /主/ web應用/ WEB-INF/MVC-調度-servlet.xml中; SRC /主/ web應用/ WEB-INF /頁/ * JSP。 src/main/webapp/resources/css和src/main/webapp/resources/js

夥計們,有什麼想法嗎?

+0

嘗試訪問這樣的http://本地主機:8080 /項目名/ pageName.jsp – SparkOn

+1

試過了,同樣的問題 – rado

回答

2

首先,當應用程序被部署它檢查web.xml和得到

<url-pattern>/*</url-pattern>

然後,它初始化DispatcherServlet的和使用

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

(WEB-INF初始化初始化paramerters必須以/開頭)

然後在mvc-dispatcher-servlet.xml視圖解析器解析呈現頁面。

變化<property name="prefix" value="WEB-INF/pages/"/>

<property name="prefix" value="/WEB-INF/pages/"/>

最後在你的控制器@RequestMapping("/getMessageStats")

所以最終啓動應用程序

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

調用GetMessagesStatsController和

的printWelcome()
http://localhost:8080/ProjectName/getMessageStats/json 

調用generateJsonResponse()

+0

我們在xml或其他地方設置的位置我們需要在url中寫入? – rado

+0

項目名稱是指您的工作臺中的項目名稱。 – SparkOn

+0

這樣工作!但現在它找不到在mvc-dispatcher-servlet.xml中解析的css文件,如。它給了我在名爲'org.springframework.web.servlet.DispatcherServlet-46bcb6d2' – rado

1

看起來像viewResolver有問題。更改前綴,以/WEB-INF /頁/,如下:

<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 /)+前綴(WEB- INF/pages /)+ request(getMessageStats)+後綴(.jsp)。

+0

我變了,它同樣的事情:沒有映射發現HTTP通過名爲'mvc-dispatcher'的DispatcherServlet中的URI [/WEB-INF/pages/getMessageStats.jsp]進行請求。真正的路徑是webapp/WEB-INF/pages/*。jsp。如果我設置它會給出相同的警告 – rado

+0

@rado發佈您的構建控制文件。看起來戰爭沒有得到正確的組裝(在運行時不應該有任何'webapp')。 – chrylis

+0

我運行它由MAVEN,在我的項目中像另一個服務,所以我不創建WAR文件。有趣的事情。如果我設置了/。我有WARN啓動碼頭:2014-07-03 12:31:46信息[主]服務器:300 - 碼頭 - 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 任何想法爲什麼? – rado