web 应用常见的资源存方式
在 Web-INF 下新建 lib, 存放要使用的 jar 包
在 Web-INF 下新建 jsp 文件夹, 存放 jsp 文件. 首页除外, 首页就放到 Web 下.
在 Web 下, 或 Web-INF 下, 新建 CSS,JS,image 文件夹, 存放相关文件.
Web-INF 目录是 Web 应用的安全目录, 里面的资源不能被浏览器直接访问.
Web 下的静态资源 (html,CSS,JS, 图片等) 都不能被浏览器直接访问,
直接放到 Web 下, 或者放到 Web-INF 下, 都是一样的.
Web 下的动态资源 (jsp) 可以被浏览器直接访问, 比如浏览器直接访问 Web 下的首页 index.jsp, 这是可以的.
如果把 jsp 放到 Web-INF 下, 那 jsp 受到 Web-INF 的保护, 浏览器就不能直接访问.
SpringMVC 提倡由 controller 处理请求, 调用视图来响应, 用户不能直接访问视图, 所以把 jsp 放到 Web-INF 下.
总得留个页面作为网站入口吧, 入口的 index.jsp 直接放在 Web 下, 用户可以直接访问.
lib 的存放
部署项目时, 会把 jar 包拷贝到输出目录的 Web-INF\lib 下.
在 Web-INF 下新建文件夹 lib, 把所需的 jar 包放到 lib 下,
部署项目时, 会把所有的 jar 包都拷贝到输出目录的 项目 \ Web-INF\lib 里.
如果我们是在 Web 下新建 lib 存放 jar 包, 或者在项目下新建 lib 存放 jar 包,
部署项目时, 会把所有的 jar 包拷贝到输出目录的 项目 \ Web-INF\lib 里, 并会把我们新建的 lib 文件夹拷贝到输出目录的 项目下, 这一步就多余了, 没必要.
如果部署时, jar 包拷贝不全, 参考:
静态资源配置
我们在 Web.xml 中使用 DispatcherServlet 拦截所有请求, 所有的请求都转交给 controller 处理.
就是说, 前端页面的 < img />要加载图片,<script src="">要加载 JS 脚本,<link />要加载的样式表, 这些请求都会被 DispatcherServlet 拦截,
而 DispatcherServlet 又找不到对应的 controller 来处理这些请求, 即使路径是对的, 在浏览器中 f12->Network, 看到状态码是 404, 或者 400(由于找不到所需的资源而引起的错误).
我们需要配置一下静态资源, 让 DispatcherServlet 放行某些静态资源的请求.
有 3 种配置方式.
配置方式一: 配置资源映射(最常用)
- <mvc:resources mapping="/js/**" location="/js/**" />
- <mvc:resources mapping="/css/**" location="/css/**" />
- <mvc:resources mapping="/image/**" location="/image/**" />
location 是实际地址, mapping 是映射地址. 一般我们不改路径, 只是让 DispatcherServlet 放行.
<mvc:resources />是以文件夹为单位配置的, 最小单位只能是文件夹, 不能是文件.
可以写上 ** 表示该文件夹下的所有东西, 也可以缺省 **.
这种方式可以放行对静态资源的请求, 对 Web-INF 下资源的请求, 对动态资源 (jsp) 的请求.
配置方式二: 配置默认的 ServletHandler
<mvc:default-servlet-handler default-servlet-name="default" />
配置 Web 服务器默认的 ServletHandler,DIspatcher 拦截到静态资源后, 找不到对应的 controller 来处理, 会交给 Web 服务器默认的 ServletHandler 来处理.
默认的 ServletHandler 会调用 Web 服务器的默认 Serlvet 来处理, Web 服务器的默认 Servlet 的处理方式都是直接放行(返回该资源作为响应).
但不同的 Web 服务器, 默认 Servlet 的 name 是不同的:
Tomcat,Jetty,Jboss,GlassFish 的默认 Servlet 的 name 是 default
Resin 的是 resin-file
WebLogic 的是 FileServlet
WebSphere 的是 SimpleFileServlet
更换 Web 服务器时, 需要修改 default-servlt-name, 配置简单但项目移植性差.
配置方式三: 在 Web.xml 中配置默认 Servlet 的映射
- <servlet-mapping>
- <servlet-name>default</servlet-name>
- <url-pattern>*.JS</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>default</servlet-name>
- <url-pattern>*.CSS</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>default</servlet-name>
- <url-pattern>*.jpg</url-pattern>
- </servlet-mapping>
使用多个 < filter-mapping>, 不能一个 < filter-mapping > 里配置多个 < url-pattern>, 也不能在一个 < url-pattern > 里配置多个规则.
麻烦且移植性差.
方式一, 三更灵活, 可以指定要加载的静态资源, 方式二是加载项目中所有的静态资源.
方式二, 三响应静态资源更快, 因为 Web 服务器启动时就会创建默认 Servlet 的实例, 就会加载静态资源, 静态资源一直在内存中, 响应快, 但吃服务器内存.
方式一是请求这个静态资源时才加载, 用完就释放, 速度慢, 但内存占用少.
来源: http://www.bubuko.com/infodetail-3402769.html