Spring MVC静态资源部分工作
问题内容:
我有一个基本的目录应用程序,除了看起来似乎有时只能使用mvc:resources标记配置的静态资源外,其他都可以正常运行。我在木板上的搜索发现了与处理程序映射有关的问题,但是我的问题似乎有所不同。
具体来说,当通过映射到“ /
person”的方法调用PersonController时,它将使用视图解析器返回personlist.jsp并正确查找并使用静态css和js文件。没问题。
当通过另一个映射到“ / person /
{familyid}”的方法调用同一控制器(将人员列表缩小到特定的家庭)时,它返回相同的personlist.jsp…但是现在它无法找到或使用css和js文件(尽管它确实显示正确的数据)。
我不明白为什么会有行为上的差异,因为两种情况都使用相同的Controller,相同的return String(返回“
personlist”)并解析为相同的JSP(即,css,js具有相同的Head section链接) )。
我使用“查看源代码”查看了每种情况在浏览器中返回的内容,并且两个页面为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>
问题答案:
您的网址是相对的,因此浏览器在错误的位置寻找资源。(检查结果HTML代码)
一种解决方案是使用<spring:url>
标记构建资源的url。
<spring:url var="banner" value="/resources/images/banner-graphic.png" />
<img src="${banner}" />