YPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.***w3.org/TR/REC-html40/loose.dtd">
YPE web-app>
常规JSP
JSP页面最终会由容器来生成Servlet类的,比如Tomcat容器生成JSP的Servlet类放在work目录里。因此在JSP里可以用很多简化的语法供容器使用,这篇就来整理一下。
JSP语法
scriptlet:
可以在里面写Java代码,如;
指令:
可以在页面转换时向容器给出特殊的指示;它有三个指令:page、include和taglib;而指令又有很多属性如import是page的属性:;
表达式:
表达式会成为out.println()或out.print()的参数,因此等价于;
声明:
是JSP转换成Servlet类的声明,因此可以声明类变量(静态变量)、实例变量、方法等;
注释:
就像Java代码中的注释一样,在把JSP转换成Servlet时会把注释去掉;
隐式对象
JSP的隐式对象不仅仅有out,还有一些其他的:
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out;
final java.lang.Object page = this;
final javax.servlet.http.HttpServletRequest request;
final javax.servlet.http.HttpServletResponse response;
JSP生成的Servlet
在Tomcat的work目录里我们可以看到由JSP生成的Servlet类,该类继承org.apache.jasper.runtime.HttpJspBase,其中有以下三个方法
_jspInit()
_jspDestroy()
_jspService()
他们分别由父类的init()、destroy()和service()方法调用;前面都带有"_"号,表明我们不能去覆盖他们,下划线的意思是“不要碰我!”.如我用的是Tomcat7,在JSP中:
int i=5;
}%>
会报异常:
org.apache.jasper.JasperException: Unable to compile class for JSP:
初始化JSP
通常,我们会把初始化参数分配给单独的servlet或JSP页面。这个指定的servlet或者JSP页面通过ServletConfig的 getInitParameter方法来读取这些参数。但在某些情况下,需要提供系统范围内的初始化参数,任何servlet或者JSP页面可以通过 ServletContext的getInitParameter方法来读取这些初始化参数。但并不推荐这样做,通常是使用MVC架构,在C中非常合适。
为JSP配置初始化参数是在
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.s***un.com/dtd/web-app_2_3.dtd" >
而index.jsp
Hello World!
但输出
Hello World!
null
null
38602359
38602359
可见并为取到JSP的初始化参数,但如果我在web.xml设置
这是为什么呢?没明白,先留着!
JSP属性
JSP比普通的Servlet多了一个作用域,共有4个作用域
而pageContext的setAttribute和getAttribute都有重载,就多了一个int类型的作用域设置
public static final int PAGE_SCOPE = 1;
public static final int REQUEST_SCOPE = 2;
public static final int SESSION_SCOPE = 3;
public static final int APPLICATION_SCOPE = 4;
只能取到相应的作用域的属性,但pageContext还有一个方法findAttribute,它从最严格的作用域查起,逐步转向不那么严格的作用域,也就是先在请求作用域查找,再查找会话作用域,最后查找应用作用域,只要在一个作用查到就停止。例如