2011-11-07 213 views
0

我有一个基本的目录应用程序工作正常,除了它似乎只是有时找到我使用mvc:资源标记配置的静态资源。我对董事会的搜索发现与处理程序映射有关的问题,但我的问题似乎有所不同。Spring MVC静态资源部分工作

具体来说,当通过映射到“/ person”的方法调用PersonController时,它将使用视图解析器返回personlist.jsp,并正确查找并使用静态css和js文件。没问题。

当通过映射到“/ person/{familyid}”(将人员列表缩小到特定族)的另一种方法调用相同的控制器时,它会返回相同的personlist.jsp ...但现在它无法找到或使用css和js文件(尽管它确实显示正确的数据)。

我不明白为什么有一个行为差异,因为两个场景使用相同的控制器,相同的返回字符串(返回“personlist”),并解析到相同的JSP(即具有相同的头部链接CSS,JS)。

我看着什么在浏览器的每一种情况下使用“查看源文件”回来了,两个页面返回相同的头部标签渲染为CSS和JS链接:

<link href="resources/css/directory.css" rel="stylesheet" type="text/css"></link> 
<script type="text/javascript" src="resources/scripts/jquery-1.7.min.js"></script> 
<script type="text/javascript" src="resources/scripts/directory.js"></script> 

我想这个问题可能与我的标签映射,所以我也试过这个:

<resources mapping="**/resources/**" and 
resources mapping="resources/**" 

但没有帮助。

我在这里接近正确使用静态资源(以及如果这是问题,正确的资源标记映射是什么)?谢谢。

我使用的是Spring 3.0.6,我的css和js文件分别位于/ WebContent/resources/css和/ WebContent/resources/scripts下,它们使用mvc:resource标签映射(见下文)。

PersonController:

@Controller 
public class PersonController { 

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class); 

    /** 
    * Simply selects the home view to render by returning its name. 
    */ 

    List<Person> personList; 
    Boolean familyCalled = false; 

    @Autowired 
    PersonService personService; 

    @RequestMapping(value="/people", method=RequestMethod.GET) 
    public String people(Model model) { 

     logger.debug("Received request to show peoplelist page"); 

     System.out.println("Running inside people() method of PersonController"); 
     personList = personService.getPersons(); 
     familyCalled = false; 
     model.addAttribute("personList", personList); 
     return "personlist"; 
     } 

    @RequestMapping(value="/people/{familyId}", method=RequestMethod.GET) 
    public String familyMembers(@PathVariable("familyId") String fid, Model model) { 
     System.out.println("Running inside familyMembers() method of PersonController"); 
     personList = personService.getPersonsInFamily(fid); 
     familyCalled = true; 
     model.addAttribute("personList", personList); 
     return "personlist"; 
     } 

Servlet的context.xml中(没有命名空间):

<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> 

    <!-- for transactions --> 
    <tx:annotation-driven/> 

    <!-- Needed for @PreAuthorize security on methods --> 
    <aop:aspectj-autoproxy/> 

    <context:annotation-config /> 

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> 
    <resources mapping="/resources/**" location="resources/" /> 

     <!-- Enables the Spring MVC @Controller programming model --> 
    <annotation-driven/> 

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> 
    <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> 

    <context:component-scan base-package="com.c3works.preps" /> 

</beans:beans> 

personlist.jsp(头部):

<head> 
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
</meta> 
     <title>XXXXXXXXXXXXXXXXXXX</title> 

     <link href="resources/css/directory.css" rel="stylesheet" type="text/css"> 
</link> 

     <script type="text/javascript" src="resources/scripts/jquery-1.7.min.js"> 
</script> 

     <script type="text/javascript" src="resources/scripts/directory.js"> 
</script> 

    </head> 

回答

1

你的URL是相对的,并且因此浏览器正在寻找错误位置的资源。 (检查生成的HTML代码)

一个解决方案是使用<spring:url>标记来构建资源的URL。

<spring:url var="banner" value="/resources/images/banner-graphic.png" />

<img src="${banner}" />

+0

问题解决了!感谢你及时的答复。 –