2014-07-04 232 views
3

我是Spring MVC的新手。我正在尝试将Thymeleaf与Spring 4集成,并且我用一个控制器/方法编写了一个helloworld程序。然而,当我启动Tomcat,访问我http://localhost:8080/helloSpring MVC:HTTP状态404:请求的资源不可用

HTTP Status 404 - 

type Status report 

message 

description The requested resource is not available. 

当在我的pom.xml文件中得到这个错误,我有以下几点:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>homeMadeSpring</groupId> 
    <artifactId>homeMadeSpringFirst</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <name>homeMadeSpringFirst</name> 
    <packaging>war</packaging> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <spring.version>4.0.5.RELEASE</spring.version> 
     <spring.security.version>3.2.4.RELEASE</spring.security.version> 
    </properties> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aop</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.thymeleaf</groupId> 
      <artifactId>thymeleaf</artifactId> 
      <version>2.1.2.RELEASE</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.thymeleaf</groupId> 
      <artifactId>thymeleaf-spring4</artifactId> 
      <version>2.1.2.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time</artifactId> 
      <version>2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-core</artifactId> 
      <version>${spring.security.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-config</artifactId> 
      <version>${spring.security.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-web</artifactId> 
      <version>${spring.security.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-taglibs</artifactId> 
      <version>${spring.security.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.0.1</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <finalName>homeMadeSpringFirst</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.1.1</version> 
      </plugin> 
      <plugin> 
       <groupId>org.mortbay.jetty</groupId> 
       <artifactId>jetty-maven-plugin</artifactId> 
       <version>8.1.2.v20120308</version> 
       <configuration> 
        <webAppConfig> 
         <contextPath>/homemade</contextPath> 
        </webAppConfig> 
        <scanIntervalSeconds>1</scanIntervalSeconds> 
        <stopKey>stop-jetty</stopKey> 
        <stopPort>9999</stopPort> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build>s 
</project> 

在我的src/main/resources目录,我有两个文件:applicationContext-security.xml和thymeleaf-pages.xml。

的applicationContext-security.xml文件的内容是:

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
      xmlns:beans="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:context="http://www.springframework.org/schema/context" 
      xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
      http://www.springframework.org/schema/security 
      http://www.springframework.org/schema/security/spring-security-3.2.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 


    <http pattern="/login" security="none"/> 
    <http pattern="/assets/**" security="none"/> 

    <http auto-config="true" use-expressions="true"> 
     <intercept-url pattern="/homeMadeSpring" access="isAuthenticated()" /> 

     <form-login 
       login-processing-url="/authentication" 
       login-page="/login" 
       authentication-failure-url="/login?error=true" 
       default-target-url="/hello" 
       always-use-default-target="false" 
       /> 
     <remember-me user-service-ref="userDetailsService"/> 
     <logout logout-url="/logout" 
       logout-success-url="/login"/> 
    </http> 

    <authentication-manager> 
     <authentication-provider user-service-ref="userDetailsService"/> 
    </authentication-manager> 


    <user-service id="userDetailsService"> 
     <user name="admin" password="admin" authorities="ROLE_USER"/> 
    </user-service> 

</beans:beans> 

**在我的百里香,pages.xml中,我有:**

<?xml version="1.0" encoding="UTF-8"?> 
<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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 


    <mvc:resources location="/assets/img/" mapping="/assets/img/**" /> 
    <mvc:resources location="/assets/css/" mapping="/assets/css/**" /> 
    <mvc:resources location="/assets/js/" mapping="/assets/js/**" /> 


    <bean id="httpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> 
     <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" /> 
    </bean> 

    <bean id="defaultMessageConverters" class="java.util.ArrayList"> 
     <constructor-arg> 
      <list> 
       <ref bean="httpMessageConverter"/> 
      </list> 
     </constructor-arg> 
    </bean> 

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" > 
     <property name="messageConverters" ref="defaultMessageConverters"/> 
     <property name="cacheSeconds" value="0"/> <!-- NO CACHE --> 
    </bean> 


    <bean id="homeController" class="controllers.HomeController"/> 


    <bean id="contentNegotiatingResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
     <property name="mediaTypes"> 
      <map> 
       <entry key="html" value="text/html"/> 
       <entry key="pdf" value="application/pdf"/> 
       <entry key="xsl" value="application/vnd.ms-excel"/> 
       <entry key="xml" value="application/xml"/> 
       <entry key="json" value="application/json"/> 
      </map> 
     </property> 
    </bean> 

    <bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver"> 
     <property name="prefix" value="/" /> 
     <property name="suffix" value=".html" /> 
     <property name="templateMode" value="HTML5" /> 
     <property name="cacheable" value="false"/> 
    </bean> 

    <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine"> 
     <property name="templateResolver" ref="templateResolver" /> 
    </bean> 


    <bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver"> 
     <property name="templateEngine" ref="templateEngine" /> 
     <property name="characterEncoding" value="UTF-8"/> 
    </bean> 

    <bean id="dateFormatter" class="util.DateFormatter"/> 



</beans> 

在SRC /主/ webapp/WEB-INF目录中,我的web.xml具有以下内容:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
    <display-name>HelloWorld</display-name> 
    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:applicationContext-security.xml</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>HelloWorld</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath:thymeleaf-pages.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

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

    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 

    <filter> 
     <filter-name>characterEncodingFilter</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
     <init-param> 
      <param-name>forceEncoding</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </filter> 

    <filter-mapping> 
     <filter-name>characterEncodingFilter</filter-name> 
     <url-pattern>/pages/*</url-pattern> 
    </filter-mapping> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <servlet-name>HelloWorld</servlet-name> 
    </filter-mapping> 
</web-app> 

最后,我的控制器:

@Controller 
public class HomeController 
{ 
    @RequestMapping(value = "/hello", method = RequestMethod.GET) 
    public String helloWorld(Model model) 
    { 
     return "pages/hello"; 
    } 
} 

我的项目结构的屏幕截图:

enter image description here

+0

您可以尝试将/ *作为HelloWorld servlet的url-pattern – coder

+0

您的上下文路径是什么? @coder你认为会做什么,为什么? –

+1

我有类似的问题,但在清理和重建后才能使用。 – CodyBugstein

回答

1

有两件事情在这里:

1)你已经配置好了jetty插件在您的pom.xml中使用上下文名称:自制,因此如果您使用的是jetty,则必须使用此上下文。

2)您已经配置了spring安全性,但您没有任何使用@RequestMapping(value =“/ login”)的控制器,要么删除spring安全性,要么在控制器中定义一个方法来处理登录页。

0

如果您熟悉基于Java的配置,那么你需要将该类添加到您的代码

@Configuration 
    @PropertySource("classpath:thymeleaf.properties") 
    public class ThymeleafConfiguration { 

     @Value("${templatePrefix}") 
     private String templatePrefix; 

     @Value("${templateMode}") 
     private String templateMode; 

    @Bean 
    public TemplateResolver templateResolver() { 
     TemplateResolver templateResolver = new ClassLoaderTemplateResolver(); 
     templateResolver.setPrefix(templatePrefix); 
     templateResolver.setTemplateMode(templateMode); 
     templateResolver.setOrder(1); 
     return templateResolver; 
    } 

    @Bean 
    public TemplateEngine templateEngine() { 
     TemplateEngine templateEngine = new SpringTemplateEngine(); 
     templateEngine.setTemplateResolver(templateResolver()); 
     return templateEngine; 
    } 
    } 

你的属性文件需要包含这些属性

templatePrefix =/mail/ 
templateMode =HTML5 

之后,仅仅包括配置上课时,你的百里香会起来工作。或者将其转换为XML

相关问题