Spring MVC Static Resources部分工作

时间:2011-11-07 20:09:26

标签: spring-mvc

我有一个基本的目录应用程序工作正常,但它似乎有时只找到我使用mvc:resources标签配置的静态资源。我对电路板的搜索发现了与处理程序映射相关的问题,但我的问题似乎有所不同。

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

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

我不明白为什么存在行为差异,因为两个场景都使用相同的Controller,相同的返回String(返回“personlist”),并解析为相同的JSP(即具有相同的Head部分链接) css,js)。

我使用'view source'查看了每个案例在浏览器中返回的内容,并且两个页面都为css和js链接返回相同的head标记呈现:

<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 个答案:

答案 0 :(得分:1)

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

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

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

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