今天做老师的一个实验,试用一下ssm。实验的前端页面是在服务器上jsp返回的。
但是在请求jsp的js,css文件时报错404
然后就去百度了spring mvc怎么访问WEB-INF下的静态资源。。。
spring mvc 3.0之后提供了两种方法大家肯定可以百度的到。
一种就是<mvc:resources />。
贴一篇自己看过的感觉还行的文章。
https://www.cnblogs.com/caogen1991/p/7921748.html
还一种是在web.xml里面对于后缀是js,css的请求放开拦截。
在这个帖子的一楼有:
https://bbs.csdn.net/topics/392181601
我用的是上面的那种。
但是还是出问题了。
这是webapp的文件目录。
在spring-mvc的xml配置文件里面加上了:
<!-- 访问静态资源 -->
<!-- 将springmvc不能处理的请求交给tomcat -->
<mvc:default-servlet-handler/>
<mvc:resources mapping="/css/**" location="/WEB-INF/jsp/css/"/>
<mvc:resources mapping="/js/**" location="/WEB-INF/jsp/js/"/>
关于这段代码的各个属性值的解释都在上方的第一个链接里面了,我就不再复述了。大概意思就是将/WEB-INF/jsp/css里面的文件映射成虚拟路径/css/**,本来不能访问的css资源现在可以通过localhost:8080/css/xxxx.css访问了。
本以为这样就能够加载js和css了,没想到还是404.
在这里也尝试将mapping里面的虚拟路径更改成/**/css/**,/user/css/**,/*/css/**之类的,发现都不行。
我自己都不知道8080后面这个/user是怎么冒出来的,然后看了下自己的controller.我首先怀疑的就是这里。
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@ResponseBody
@RequestMapping(value = "/msg")
public User GetUser(){
User user = new User();
user = userService.getUserById(1);
return user;
}
@GetMapping(value = "/registerPage")
public String Register(){
return "register";
}
}
jsp页面就是下面那个方法返回的,返回的是register.jsp。(这个不懂的百度(ssm视图解析器)。。我也讨厌这个)
此时请求这个jsp页面的url是localhost:8080/user/registerPage.
然后在这个jsp里面引用js和css我写的是相对路径,jsp放在WEB-INF下的jsp文件夹中(上面贴过目录)
<link href="./css/registercss.css" type="text/css" rel="stylesheet">
<script src="./js/registerjs.js"></script>
然后。。请求css和js的url给我自动改成了带一个/user的。
明显localhost:8080/css/register.css才应该是正确的访问路径。
然后尝试改了一下controller。
@Controller
@RequestMapping("")
public class UserController {
@Autowired
private UserService userService;
@ResponseBody
@RequestMapping(value = "/msg")
public User GetUser(){
User user = new User();
user = userService.getUserById(1);
return user;
}
@GetMapping(value = "/registerPage")
public String Register(){
return "register";
}
}
发现把头上的user直接去掉是可以的。
@Controller
@RequestMapping("")
public class UserController {
@Autowired
private UserService userService;
@ResponseBody
@RequestMapping(value = "/user/msg")
public User GetUser(){
User user = new User();
user = userService.getUserById(1);
return user;
}
@GetMapping(value = "/user/registerPage")
public String Register(){
return "register";
}
}
把user放到里面是不可以的。
可是我就是想在头上加user。
然后一气之下跑到jsp里面把引用直接改成了。
<link href="http://localhost:8080/css/registercss.css" type="text/css" rel="stylesheet">
<script src="http://localhost:8080/js/registerjs.js"></script>
好了,现在不管我user的路由怎么写都可以,感觉好像不太好。。
总结:感觉继续深究要去看很多代码。。猜测是神秘生物将我的路径前面加了个user,不是很懂,希望大佬指教。
虽然不要把静态资源放在WEB-INF里面就不会有这么麻烦,可我就是想试试。。
最后这个方法肯定不是很好,看着就变扭。。