首先,我们要了解,JSP最终会编译成为一个Servlet,可以这么理解:它每一行HTML代码编译后都会在response.getWriter().write("......")中。和Servlet一样,只实例化一次。生命周期方法为:jspInit()、_jspService()、jspDestroy()
JSP脚本一共有三种:
1、JSP 声明(<%! ... %>):用于定义实例变量或者实例方法,每个语句后面需要加分号
2、JSP Scriptlet(<% ...%>):用于定义局部变量。每个语句后面需要加分号
3、JSP 表达式(<%= ... %>):用于打印值,语句后面不能加分号
例如:<%=user.getName();%>会转换成out.write(user.getName(););,无法通过编译。
JSP指令也有三种:
1、page指令:
<%@page import="com.xxx.xxx"%>
2、taglib指令:用于引入标记库,这个放后面再详细说明
<%@ taglib tagdir="/WEB-INF/tags/xxx"%>
3、include指令:引入一个重复使用的JSP片段
<%@ include file="xxx.jsp"%>
这里主要讲page指令属性(13个)
常用的属性:
import:导包。默认有java.lang、javax.servlet、javax.serlvlet.http和javax.serlvet.jsp
contentType:就是设置response.setContentType的MIME类型值
errorPage:指向一个jsp URL,如果该jsp出现异常则会访问到指向的jsp
isErrorPage:默认值为false,如果其他的jsp使用errorPage指向当前的jsp,并且isErrorPage为true,则可以使用JSP exception隐式对象。
isELIgnored:默认为false,如果设置为true则表示忽略EL表达式
pageEncoding:定义编码格式。默认ISO-8859-1,除非contentType已经定义了编码格式。
不常用的属性:
language:目前可取值只有"java"
session:设置页面是否有隐式对象session。默认为true,包含。
buffer:指定缓存大小
autoFlush:是否自动刷新输出,默认为true
info:暂时没搞清楚这是干嘛的
谨慎使用的属性:
isThreadSafe:默认值为true,表明我这个jsp就是线程安全的,你别搞事情。如果设置为false,则该jsp生成的servlet每个请求都会将其实例化一次,很影响性能。
extends:JSP最终会变成servlet,这里就相当于继承。
最后说一句,在JSP开发过程中,一律不允许用JSP脚本,尽管使用脚本能实现我们想要的效果,但是,请使用标准动作或者是EL表达式代替它。当然,如果不是什么特殊的情况,EL是最好的选择了。
禁用脚本的方法:在web.xml中进行如下设置
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>