CSS样式表和JS脚本加载顺序

Css样式表文件要在<head>中先加载,这样网页显示时可以第一次就渲染出正确的布局和样式,网页就不会闪烁,或跳变

JS脚本尽可能放在<body>结束时再加载

Js脚本作为程序,要求按顺序执行,而且是由主线程(单个线程)去执行的,

如果很JS脚本放在头部,就会导致浏览器无法以多线程的方式加载和渲染页面

浏览会等待所有JS一个接一个执行完毕后才继续往下加载

其结果是网页打开速度变慢!

从现在开始,对于自己的作品,自己代码要达到产品级的要求

点击后执行一个JS函数(删除为例)

1.用<a>标签:
href=”javascript:函数名(参数)”

2.其他标签:onclick=”函数名(参数);函数名(参数)”

SpringMVC在URL路径中传参数

(删除为例)

传id时:

/user/remove?id=123      QueryString      查询字符串

/user/remove/123         Path            路径传参数

1.使用路径传参,更加美观,符合RESTful风格,SEO权重也比较高,有利网页排名

2.使用路径传参,要求映射必须支持占位符,所以Servlet不支持

SpringMVC通过下面的方式支持URL占位符

@RequestMapping(“/user/remove/{id}”)

占位符可以有多个

取值时,在请求处理方法中使用@PathVariable注解标记参数

(分页为例)

/user/list/3

/user/list/1   第一页又不希望有/1

如果把占位符写成 /user/list/{pageNo}

当访问/user/list时就会出现404,因为现在映射不匹配

解决的方法是

添加一个新请求处理方法,将映射设置为

@ReqMapping(“/user/list”)

Public String list(){

list(1)

}

SpringMVC 服务端数据验证

服务端验证是必须的!即使已经提供JS在浏览器实现了美观的数据验证

服务端也不能相信JS是靠谱的

服务端验证可以有效的抵御网络攻击,可以保证服务器安全,

同时也能有效地检查出不合法的数据,予以拒绝,避免将非法数据写入数据库或文件

服务端验证是有关系统安全的大事

在java中,专门有一个标准提案JSR303负责制定数据验证的规范

JSR303的常用实现是Hibernate-Validator

JSR303规定使用注解实现验证,定义验证规则,比如是否可空、是否符合正则表达式、长度、日期格式等是否正确。

SpringMVC通过@Valid调用数据验证

通过BindingResult或者Errors请求处理参数拿到验证结果

在请求处理方法中,应该先调用BindingResult.hasErrors()检查是否有错误,

再进行其他操作,否则会导致抛出异常

SpringMVC通过<form:errors path=”属性名”>在页面上显示错误信息

常用验证注解

下面是主要的验证注解及说明:

注解

适用的数据类型

说明

@AssertFalse

Boolean, boolean

验证注解的元素值是false

@AssertTrue

Boolean, boolean

验证注解的元素值是true

@DecimalMax(value=x)

BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence.

验证注解的元素值小于等于@ DecimalMax指定的value值

@DecimalMin(value=x)

BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence.

验证注解的元素值小于等于@ DecimalMin指定的value值

@Digits(integer=整数位数, fraction=小数位数)

BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence.

验证注解的元素值的整数位数和小数位数上限

@Future

java.util.Date, java.util.Calendar; Additionally supported by HV, if theJoda Time date/time API is on the class path: any implementations ofReadablePartial
andReadableInstant.

验证注解的元素值(日期类型)比当前时间晚

@Max(value=x)

BigDecimal, BigInteger, byte, short,int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type ofCharSequence (the numeric value represented by the character sequence is evaluated), any sub-type of Number.

验证注解的元素值小于等于@Max指定的value值

@Min(value=x)

BigDecimal, BigInteger, byte, short,int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of CharSequence (the numeric value represented by the char sequence is evaluated), any sub-type of Number.

验证注解的元素值大于等于@Min指定的value值

@NotNull

Any type

验证注解的元素值不是null

@Null

Any type

验证注解的元素值是null

@Past

java.util.Date, java.util.Calendar; Additionally supported by HV, if theJoda Time date/time API is on the class path: any implementations ofReadablePartial
andReadableInstant.

验证注解的元素值(日期类型)比当前时间早

@Pattern(regex=正则表达式, flag=)

String. Additionally supported by HV: any sub-type of CharSequence.

验证注解的元素值与指定的正则表达式匹配

@Size(min=最小值, max=最大值)

String, Collection, Map and arrays. Additionally supported by HV: any sub-type of CharSequence.

验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小

@Valid

Any non-primitive type(引用类型)

验证关联的对象,如账户对象里有一个订单对象,指定验证订单对象

@NotEmpty

CharSequence,Collection, Map and Arrays

验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)

@Range(min=最小值, max=最大值)

CharSequence, Collection, Map and Arrays,BigDecimal, BigInteger, CharSequence, byte, short, int, long and the respective wrappers of the primitive types

验证注解的元素值在最小值和最大值之间

@NotBlank

CharSequence

验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格

@Length(min=下限, max=上限)

CharSequence

验证注解的元素值长度在min和max区间内

@Email

CharSequence

验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

 

在SpringMVC中获取Session

在请求方法中添加HttpSession类型的参数即可获取到Session

Maven项目下载JavaDoc和源代码的方法

方法一:项目上点右键-->Maven-->Download JavaDoc/Sources

方法二:(全局)Window --Preferences-->Maven-->Download JavaDoc/Sources

 

下载源代码需要时间比较长! JavaDoc次之    Jar需要时间最短

 

 

SpringMVC
拦截器

Servlet的过滤器在SpringMVC依然有效

拦截器需要实现HandlerInterceptor接口

preHandle  前处理

postHandle  后处理,在控制器方法执行后执行

afterCompletion  在视图生成之后清理和释放资源

preHandle返回boolean值,true表示继续后续处理,false放弃后续处理

拦截器的装配

在springmvc-servlet.xml中添加

<mvc:interceptors>

<mvc:interceptor> 可以定义多个,按先后顺序执行拦截

<mvc:mapping> 拦截URL,可以多个

<mvc:excluding-mapping>   排除拦截的URL,
可以是多个

<bean class=”指定拦截器类”>   也可以写成<ref id=””>

示例:

静态资源拦截的处理

1.将静态资源交给Tomcat等服务器自带的默认处理器处理

2.在拦截器中排除静态资源URL,最好将静态资源收拢到一个文件夹中(static)

3.动静分离

CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器的更多相关文章

  1. yii2.0 如何按需加载并管理CSS样式及JS脚本

    链接:http://www.yiichina.com/tutorial/399 (注:以下为Yii2.0高级应用测试) Yii2.0对于CSS/JS 管理,使用AssetBundle资源包类. 视图如 ...

  2. JS脚本加载与执行对性能的影响

    高性能JavaScript-JS脚本加载与执行对性能的影响 在web产品优化准则中,很重要的一条是针对js脚本的加载和执行方式的优化.本篇文章简单描述一下其中的优化准则. 1. 脚本加载优化 1.1 ...

  3. 也说JS脚本加载控制

    问题背景 前端采用的 iframe + html 做后台管理系统.现在js.jquery插件非常多,每次页面都是引用就类似这样: <script src="../Scripts/jqu ...

  4. 【转】html、css、js文件加载顺序及执行情况

    原链接:http://www.cnblogs.com/Walker-lyl/p/5262075.html 今天看书,看到html,css,js加载执行情况,发现自己并不是真正的了解,网上搜了半小时依然 ...

  5. html、css、js文件加载顺序及执行情况

      HTML页面加载和解析流程 1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件. 2. 浏览器开始载入html代码,发现<head& ...

  6. 外部引入的js 判断js脚本加载是否完成,完成后执行 相应的动作(以引入百度地图js为例)

    可以使用JQuery的 $.getScript(url,function(){});方法 $.getScript("http://api.map.baidu.com/getscript?v= ...

  7. requere.js优化js脚本加载方案,使用篇。

    require.config({ paths: { "jquery": "jquery-3.2.1", 'index':"index" }} ...

  8. 前端设计中关于外部js文件加载的速度优化

    在一般情况下,许多人都是将<script>写在了<head>标签中,而许多浏览器都是使用单一的线程来加载js文件的,从上往下,从左往右. 若是加载过程出错,那么网页就会阻塞,就 ...

  9. 浏览器环境下Javascript脚本加载与执行探析之DOMContentLoaded

    在”浏览器环境下Javascript脚本加载与执行探析“系列文章的前几篇,分别针对浏览器环境下JavaScript加载与执行相关的知识点或者属性进行了探究,感兴趣的同学可以先行阅读前几篇文章,了解相关 ...

随机推荐

  1. atitit。gui 界面皮肤以及换肤总结 java .net c++

    atitit.gui 界面皮肤以及换肤总结 java .net c++ 1. Swing 的皮肤 1 1.1. windows风格 1 1.2. Mac风格 ( liquid 框架) 1 2. 如何给 ...

  2. <unistd.h>的close(0)导致std::cout被关闭

    代码如下:其中ZJ::open_max返回系统允许的打开的文件的最大个数 #include "util.h" #include <unistd.h> // int cl ...

  3. oracle中floor函数和to_number函数区别

     oracle中floor函数没有值默认是0,number函数没有值默认是空 

  4. 禁止sethc.exe运行 防止3389的sethc后门

    废话:在土司看到的一篇文章,发私信给那个哥们儿说让不让转载,结果还没回复我就在百度看到相同的文章.他自己也是转载的.这哥们儿ID迟早被ban 文章转载自:http://www.jb51.net/hac ...

  5. Unix系统编程()进程和程序

    进程(process)是一个可执行程序(program)的实例. 程序是包含了一系列信息的文件,这些信息描述了如何在运行时创建一个进程,所包括的内容如下所示. 二进制格式标识:每个程序文件都包含用于描 ...

  6. Android——手机尺寸相关的概念 +尺寸单位+关于颜色

    手机的尺寸: 屏幕对角线的长度,单位为英寸(2.54cm) 手机的分辨率: 屏幕能显示的像素的数量, 一般用在长方向上数量*宽方向上数量来表达 手机的像素密度: pixels per inch,也称P ...

  7. Github优秀开源项目

    王潜升 https://github.com/code4craft/webmagic 一个爬虫框架,除了不会反爬虫外(当然可以自己加)其他都很牛逼.这个项目更新还是很快的.   ansi分词  htt ...

  8. js 拼接字符串 穿参数 带有单引号

    var html="<a href=\"#\"  onclick=Unlock(\""+flid+"\",1)>弹出& ...

  9. TensorFlow基础笔记(5) VGGnet_test

    参考 http://blog.csdn.net/jsond/article/details/72667829 资源: 1.相关的vgg模型下载网址 http://www.vlfeat.org/matc ...

  10. 第二百六十一节,Tornado框架模板引擎本质

    Tornado框架模板引擎本质 只需要了解一下即可 本篇就来详细的剖析模板处理的整个过程. 上图是返回给用户一个html文件的整个流程,较之前的Demo多了绿色流线的步骤,其实就是把[self.wri ...