一个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>10000@qq.com</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指令中设置,指令优先级高于配置文件