现在SPA用哪个比较好的js编辑器,Ember.js还是AngularJS

servlet的url映射定义为'/'表示映射全部路径
struts的过滤器是*.action,在spring mvc中设置成*.action或者*.do......也是可以的,但是spring mvc就是霸气,它就是要处理一切路径.
对于静态资源,在tomcat服务器上,必须通过servlet才能访问,除此之外别无他法.
即便是你自己不写servlet来访问静态资源,tomcat无论如何也要找到一个servlet来处理静态资源,所以别觉得用servlet处理会慢,无论如何都要用servlet来处理.
一言以蔽之,在tomcat容器中,处理资源的基本单位是servlet,进行数据操作计算的基本单位也是servlet.
前人之述备矣,天下文章一大抄.
&& Spring MVC 中的核心 servlet - DispatcherServlet,我们在 web.xml 文件中通常这样定义:
&servlet-name&mvc&/servlet-name&
&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&
&init-param&
&param-name&contextConfigLocation&/param-name&
&param-value&/WEB-INF/classes/conf/spring/mvc-*.xml&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&mvc&/servlet-name&
&url-pattern&/&/url-pattern&
&/servlet-mapping&
&&&&&&& 很明显,该 servlet 对应的 url-pattern 定义成 /,因此该 servlet 会匹配上诸如 /images/a.jpg, /css/hello.css 等这些静态资源,甚至包括 /jsp/stock/index.jsp 这些 jsp 也会匹配。但是并没有定义相应的 Controller 来处理这些资源,因此这些请求通常是无法完成的。 &&&&&&& 很麻烦?没有 Struts 方便?此言差矣,因此你在 Struts 定义其核心 filter 的 url-pattern 是 *.action,当然不会对处理 jsp 和静态资源操作影响了。Spring MVC 若也定义类似的 url-pattern,同样不存在问题。
&&&&&&& 说到这里,我们应该想一个问题。Tomcat 中,只有 servlet 能够处理请求,即使是 jsp,也会被编译成 servlet。我们即便使用 Struts,定义 *.action 的url-pattern,那 .css, *.gfi 等这些静态资源到底是谁来处理了???你可不要想当然的认为我不是输入了图片的路径了吗?如,/images/a/b/c.gif。请注意,servlet 容器中,只有 servlet 采用处理资源!
&&&&&&& 由 servlet 处理这些资源那是一定了。不过,不同的 servlet 容器/应用服务器,处理这些静态资源的 servlet 的名字不大一样:
Tomcat, Jetty, JBoss, and GlassFish:默认 Servlet 名字为 "default"
Google App Engine:默认 Servlet 名字为 "_ah_default"
Resin:默认 Servlet 名字为 "resin-file"
WebLogic:默认 Servlet 名字为 "FileServlet"
WebSphere:默认 Servlet 名字为 "SimpleFileServlet"
&&& ◇ 方案一:激活 Tomcat 的 defaultServlet 来处理静态资源
&servlet-mapping&
&servlet-name&default&/servlet-name&
&url-pattern&*.jpg&/url-pattern&
&/servlet-mapping&
&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,同时,要写在 DispatcherServlet 的前面, 让 defaultServlet 先拦截。 &&& ◇ 方案二:Spring 3.0.4 以后版本提供了 &mvc:resources /&
&&mvc:resources location="/resources/" mapping="/resources/**"/&&&&
&&&&&&& /resources/** 映射到 ResourceHttpRequestHandler 进行处理,location 指定静态资源的位置,可以是 web application 根目录下、jar 包里面,这样可以把静态资源压缩到 jar 包中。cache-period 可以使得静态资源进行 web cache。
&&&&&&& 使用 &mvc:resources /& 元素,会把 mapping 的 URI 注册到 SimpleUrlHandlerMapping 的 urlMap 中,key 为 mapping 的 URI pattern 值,而 value 为 ResourceHttpRequestHandler,这样就巧妙的把对静态资源的访问由 HandlerMapping 转到 ResourceHttpRequestHandler 处理并返回,所以就支持 classpath 目录, jar 包内静态资源的访问。
&&& ◇ 方案三:使用 &mvc:default-servlet-handler /&
&&&&&&& &mvc:default-servlet-handler /& 会把 "/**" url 注册到 SimpleUrlHandlerMapping 的 urlMap 中,把对静态资源的访问由 HandlerMapping 转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回。DefaultServletHttpRequestHandler 使用就是各个 Servlet 容器自己的默认 Servlet。
&&&&&&& 补充说明下以上提到的 HandlerMapping 的 order 的默认值:
DefaultAnnotationHandlerMapping:0
&mvc:resources /& 自动注册的 SimpleUrlHandlerMapping:
&mvc:default-servlet-handler/& 自动注册的 SimpleUrlHandlerMapping:
&&&&&&& Spring 会先执行 order 值比较小的。当访问一个 a.jpg 图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,我们没有叫 a.jpg 的 Controller。再按 order 值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹配 "/**" 的,所以一定会匹配上,再响应图片。
&&&&&&& Spring MVC 中,访问一个图片,还要走层层匹配。性能肯定好不到哪里去。不仅仅是 Spring MVC,即便 Struts,它们毕竟存活于 servlet 容器,只要由 servlet 容器处理这些静态资源,必然要将这些资源读入 JVM 的内存区中。所以,处理静态资源,我们通常会在前端加 apache 或 nginx。
其中处理静态资源的类是org.springframework.web.servlet.resource.ResourceHttpRequestHandler,而且在location的描述中说明Each location must point to a valid directory. 即每个location都必须指向一个有效的目录。
下面看一下org.springframework.web.servlet.resource.ResourceHttpRequestHandler中是如何处理静态资源请求的:&
首先它实现了org.springframework.web.HttpRequestHandler这个接口的handleRequest方法:
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 这里根据配置来设置缓存的header
checkAndPrepare(request, response, true);
// 获取要获取的资源,如果不存在,直接返回404错误
Resource resource = getResource(request);
if (resource == null) {
logger.debug("No matching resource found - returning 404");
response.sendError(HttpServletResponse.SC_NOT_FOUND);
// 省略部分代码&&
// 返回相应的资源,即把资源文件写到响应中
writeContent(response, resource);
而getResource方法实现如下:
protected Resource getResource(HttpServletRequest request) {
String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
// 省略部分处理和检验路径的代码&&
// 这里循环从配置的location下查找请求的静态资源
for (Resource location : this.locations) {
if (logger.isDebugEnabled()) {
logger.debug("Trying relative path [" + path + "] against base location: " + location);
Resource resource = location.createRelative(path);
// 判断资源存在而且能够读取
if (resource.exists() && resource.isReadable()) {
// 这里就是3.2.12及以后处理上的差别,在3.2.12前,不会判断该资源是否在指定的路径下,直接就返回了resource,而3.2.12及以后做了如下判断
if (isResourceUnderLocation(resource, location)) {
if (logger.isDebugEnabled()) {
logger.debug("Found matching resource: " + resource);
if (logger.isTraceEnabled()) {
logger.trace("resource=\"" + resource + "\" was successfully resolved " +
"but is not under the location=\"" + location);
return null;
else if (logger.isTraceEnabled()) {
logger.trace("Relative resource doesn't exist or isn't readable: " + resource);
catch (IOException ex) {
logger.debug("Failed to create relative resource - trying next resource location", ex);
return null;
下面看看isResourceUnderLocation的实现:
private boolean isResourceUnderLocation(Resource resource, Resource location) throws IOException {
if (!resource.getClass().equals(location.getClass())) {
return false;
String resourceP
String locationP
if (resource instanceof UrlResource) {
resourcePath = resource.getURL().toExternalForm();
locationPath = location.getURL().toExternalForm();
else if (resource instanceof ClassPathResource) {
resourcePath = ((ClassPathResource) resource).getPath();
locationPath = ((ClassPathResource) location).getPath();
else if (resource instanceof ServletContextResource) {
resourcePath = ((ServletContextResource) resource).getPath();
locationPath = ((ServletContextResource) location).getPath();
resourcePath = resource.getURL().getPath();
locationPath = location.getURL().getPath();
// 这里是对路径的处理,如果我们配置的是/res/**,那么直接拼接成了/res/**/,如果请求资源为/res/jquery.js,
//那么会判断res/jquery.js是否以/res/**/开头,如果不是,则返回该location下没有该资源,导致不能404错误
locationPath = (locationPath.endsWith("/") ||
!StringUtils.hasLength(locationPath) ? locationPath : locationPath + "/");
if (!resourcePath.startsWith(locationPath)) {
return false;
if (resourcePath.contains("%")) {
// Use URLDecoder (vs UriUtils) to preserve potentially decoded UTF-8 chars...
if (URLDecoder.decode(resourcePath, "UTF-8").contains("../")) {
if (logger.isTraceEnabled()) {
logger.trace("Resolved resource path contains \"../\" after decoding: " + resourcePath);
return false;
return true;
'/'表示根目录,以'/'结尾的路径表示文件夹,location为'/'表示该路径下的全部文件相当于'/**','/*'表示单级目录,所以'/'=='/**'&'/*'
mvc:resource可以设置多个属性
在@RequestMapping注解中,如果没有参数,则表示这个servlet是默认的servlet,会处理一切资源.
&!-- 对静态资源文件的访问
&mvc:default-servlet-handler/&
&!-- 对静态资源文件的访问
方案二 --&
&mvc:resources mapping="/images/**" location="/images/" cache-period=""/&
&mvc:resources mapping="/js/**" location="/js/" cache-period=""/&
&mvc:resources mapping="/css/**" location="/css/" cache-period=""/&
&!-- 对静态资源文件的访问
方案二的简便写法--&
&&mvc:resources location="/" mapping="/" /&&
阅读(...) 评论()spring mvc(27)
昨天写过一篇
在写 mvc:resources 配置,少写了一些。因此,在项目访问时,报错404.
&!-- 过滤静态资源 --&
&mvc:resources mapping=&/js/**& location=&/js/& /&
&mvc:resources mapping=&/pages/assets/**& location=&/pages/assets/& /&
&mvc:resources mapping=&/pages/js/**& location=&/pages/js/& /&
&mvc:annotation-driven/&
&mvc:default-servlet-handler/&
上面三个是过滤静态资源,而下面两个,分别是:
1、&!-- 启用spring mvc 注解 --&
mvc:annotation-driven:
参考文章地址:
最后的配置如果没有&mvc:annotation-driven/&,那么所有的Controller可能就没有解析,所有当有请求时候都没有匹配的处理请求类,就都去&mvc:default-servlet-handler/&即default
servlet处理了。添加上&mvc:annotation-driven/&后,相应的do请求被Controller处理,而静态资源因为没有相应的Controller就会被default servlet处理。总之没有相应的Controller就会被default servlet处理就ok了。
要使用spring mvc中的@Controller注解,就必须要配置&mvc:annotation-driven
/&,否则org.springframework.web.servlet.DispatcherServlet无法找到控制器并把请求分发到控制器。
2、&!-- 配置默认servlet handler --&
mvc:default-servlet-handler:
参考文章:
下面一段文字,为完全复制:
&mvc:default-servlet-handler /&会把/** url注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler处理并返回。DefaultServletHttpRequestHandler使用的就是各个Servlet容器自己默认的Servlet。
也就是说,在springMVC中,mvc:default-servlet-handler,等同于
在web.xml中配置default。
***********************************************************分割线***********************************************************
在web.xml中配置拦截的方式,&激活Tomcat的defaultServlet来处理静态文件 & & &在web.xml中配置default是有缺点的,暂时忘记缺点是什么了,以后补记。
web.xml,是由tomcat加载,来进行筛选过滤的。
参考文章:
是针对 tomcat,WebLogic等,不同服务器,配置是不同的。
在web.xml中 的 default ,是针对tomcat 服务器的配置。
要写在DispatcherServlet的前面, 让&defaultServlet先拦截,这个就不会进入Spring了&
Tomcat, Jetty, JBoss, and GlassFish& 默认 Servlet的名字 -- &default&
Google App Engine 默认 Servlet的名字 -- &_ah_default&
Resin 默认 Servlet的名字 -- &resin-file&
WebLogic 默认 Servlet的名字& -- &FileServlet&
WebSphere& 默认 Servlet的名字 -- &SimpleFileServlet&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:70079次
积分:2001
积分:2001
排名:第15410名
原创:115篇
转载:93篇
评论:11条
(1)(2)(16)(7)(33)(15)(14)(10)(7)(3)(7)(28)(7)(11)(14)(10)(32)spring(1)
一、我们都知道在基于Spring的Application中,需要在web.xml中增加下面类似的配置信息:
此处需要特别强调的是&/使用的是/,而不是/*,如果使用/*,那么请求时可以通过DispatcherServlet转发到相应的Action或者Controller中的,但是返回的内容,如返回的jsp还会再次被拦截,这样导致404错误,即访问不到jsp。所以如果以后发现总是有404错误的时候,别忘了check一下&/的配置是否是/*.
二、其实Spring 的Servlet拦截器匹配规则(即&...&)都可以自己定义,例:当映射为@RequestMapping(&/user/add&)时
1、拦截*.do、*.htm, 例如:/user/add.do
这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。
2、拦截/,例如:/user/add
可以实现现在很流行的REST风格。很多互联网类型的应用很喜欢这种风格的URL。
弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。想实现REST风格,事情就是麻烦一些。后面有解决办法还算简单。
3、拦截/*,这是一个错误的方式,请求可以走到Action中,但转到jsp时再次被拦截,不能访问到jsp。
三、如何访问到静态的文件,如jpg,js,css?
如果你的DispatcherServlet拦截&*.do&这样的有后缀的URL,就不存在访问不到静态资源的问题。&
如果你的DispatcherServlet拦截&/&,为了实现REST风格,拦截了所有的请求,那么同时对*.js,*.jpg等静态文件的访问也就被拦截了。&
我们要解决这个问题。
目的:可以正常访问静态文件,不可以找不到静态文件报404。
方案一:激活Tomcat的defaultServlet来处理静态文件
&特点:1.&&要配置多个,每种文件配置一个。
&&&&&&&&&&&&2.&&要写在DispatcherServlet的前面,
让&defaultServlet先拦截请求,这样请求就不会进入Spring了。
&&&&&&&&&&&&3. 高性能。
Tomcat, Jetty, JBoss, and GlassFish 自带的默认Servlet的名字
-- &default&&
Google App Engine&自带的&默认Servlet的名字
-- &_ah_default&&
Resin&自带的&默认Servlet的名字
-- &resin-file&&
WebLogic&自带的&默认Servlet的名字&&--
&FileServlet&&
WebSphere&&自带的&默认Servlet的名字
-- &SimpleFileServlet&
方案二: 在spring3.0.4以后版本提供了mvc:resources , &使用方法:
images/**映射到 ResourceHttpRequestHandler进行处理,location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中。cache-period
可以使得静态资源进行web cache&
如果出现下面的错误,可能是没有配置的原因。&
报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'&
使用元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,&
key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,&
这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问.&
另外需要注意的一点是,不要对SimpleUrlHandlerMapping设置defaultHandler.因为对static uri的defaultHandler就是ResourceHttpRequestHandler,&
否则无法处理static resources request.
方案三 ,使用
会把&/**& url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回.&
DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet.
补充说明:多个HandlerMapping的执行顺序问题:
DefaultAnnotationHandlerMapping的order属性值是:0&
&&SPAN class=Apple-converted-space&&mvc:resources/&&&自动注册的&SimpleUrlHandlerMapping&的order属性值是:&
自动注册&的SimpleUrlHandlerMapping&的order属性值是:&
spring会先执行order值比较小的。当访问一个a.jpg图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,因为我们没有叫a.jpg的Action。然后再按order值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹配 &/**&的,所以一定会匹配上,就可以响应图片。&访问一个图片,还要走层层匹配。不知性能如何?
最后再说明一下,方案二、方案三 在访问静态资源时,如果有匹配的(近似)总拦截器,就会走拦截器。如果你在拦截中实现权限检查,要注意过滤这些对静态文件的请求。
如何你的DispatcherServlet拦截 *.do这样的URL后缀,就不存上述问题了。还是有后缀方便。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6626次
排名:千里之外
原创:12篇
(1)(1)(1)(1)(4)(8)(3)

我要回帖

更多关于 比较好用的js date库 的文章

 

随机推荐