一个jsp页面最后变成一个servlet
三个指令:
page,include,taglib
指令表示方式:
<%@ page import="foo.*" %> import是page指令的一个属性
五种种jsp元素:
scriptlet:<% ... %>
指令: <%@ ... %>
表达式:<%= ... %>
声明:<%! ... %>
动作:<jsp:include page="wickedFooter.jsp" />
表达式“=”后的内容会当做参数传递给打印语句,例如<%= hah %>被转换为out.print("hah")
不能把返回值为void的函数放在表达式中,表达式没有分好
声明后的内容被当做生成servlet的实例变量和方法,声明中即可以放变量也可以放方法,例如:
<%! int count = 1%>
<%! int count() {
return ++count;
}
%>
jsp转换为servlet时服务方法中声明的隐式对象:
JspWriter out
HttpServletRequest request
HttpServletResponse response
HttpSession session
ServletContext application
ServletConfig config
Throwable exception
PageContext pageContext
Object page
jsp生命周期:
1.容器读取web应用的web.xml,但是对.jsp不做任何处理,直至得到第一个请求
2.当客户点击这个链接,容器尝试将.jsp转换为servlet的java代码,这阶段会发现jsp语法错误
3.容器尝试把这个servlet .java源文件编译为一个.class文件,这里会捕获到java语法错误
4.容器加载新生成的servlet类
5.容器实例化servlet,并导致servlet的jspInit()方法运行,对象现在成为一个真正的servlet,准备就绪,可以接受用户请求了
6.容器创建一个新线程处理这个客户的请求,servlet的_jspService()方法运行
jsp的编译和转换在jsp声明周期中,编译和转换至发生一次
为jsp配置servlet初始化参数,与常规servlet配置基本相同,唯一区别是必须在<servlet>标记中增加一个<jsp-file>元素,例如:
<web-app...> <servlet> <servlet-name>MyTestInit</servlet-name> <jsp-file>/TestInit.jsp</jsp-file> <init-param> <param-name>email</param-name> <param-value>[email protected]</param-value> <init-param> </servlet> <servlet-mapping> <servlet-name>MyTestInit</servlet-name> <url-pattern>/TestInit.jsp</url-pattern> </servlet-mapping> </web-app>
jsp定义的四个作用域:
application,pageContext,session,request
在DD中配置禁用脚本元素:
<web-app...> ... <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <script-invalid> true </script-invalid> </jsp-property-group> </jsp-config> </web-app>
配置忽略el:
在<jsp-property-group>标签中加入以下标签即可:
<el-ignored> true </el-ignoed>
也可以在page指令中设置,指令优先级高于配置文件