Servlet、Jsp学习笔记
jsp 转化流程
JSP页面本质上是一个Servlet。然而,用JSP页面开发比使用Servlet更容易,JSP页面在JSP容器中运行,一个Servlet容器通常也是JSP容器。例如,Tomcat就是一个Servlet/JSP容器。当一个JSP页面第一次被请求时,Servlet/JSP容器主要做以下两件事情:
jsp文本文件–》jsp页面实现类 -》编译该servlet实现类-》处理客户请求
转换JSP页面到JSP页面实现类,该实现类是一个实现javax.servlet.jsp.JspPage接口或子接口
javax.servlet.jsp.HttpJspPage的Java类。JspPage是
javax.servlet.Servlet的子接口,这使得每一个JSP页面都是一个Servlet。该实现类的类名由Servlet/JSP容器生
成。一般来说xx.jsp转换的servlet 名称会变为 xx_jsp如果转换成功,Servlet/JSP容器随后编译该Servlet类,并装载和实例化该类,像其他正常的Servlet一样执行生命周期操作。每个servlet 在容器内都是单例
EL表达式
主要的两种表达形式:
${object["propertyName"]}
${object.propertyName}
限制在JSP页面中编写脚本和 EL 表达式
(限制在jsp页面中写java代码)在web.xml中只能有一个标签
<jsp-config>
<!-- 限制在页面中编写java语句 -->
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
<!-- 限制页面使用EL语言 -->
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
include动作 和 include指令的区别
这里,理解include指令和include动作非常重要。对于include指令,资源引入发生在页面转换时,即当JSP容器将页面转换为生成的Servlet时。而对于include动作,资源引入发生在请求页面时。因此,使用include动作是可以传递参数的,而include指令不支持。
jsp文本文件—-(b)–》jsp页面实现类 —(a)—》编译该servlet实现类-》处理客户请求
<jsp:include page="jspf/menu.jsp">
<jsp:param name="text" value="How are you?"/>
</jsp:include>
这是发生在A处
<%@ include file="url"%> 发生在b处
监听器分类
javax.servlet.ServletContextListener:它能够响应ServletContext生命周期事件,它提供了ServletContext创建之后和ServletContext关闭之前的会被调用的方法。
javax.servlet.ServletContextAttributeListener:它能够响应ServletContext范围的属性添加、删除、替换事件。
- javax.servlet.http.HttpSessionListener:它能够响应HttpSession的创建、超时和失效事件。
- javax.servlet.http.HttpSessionAttributeListener:它能响应HttpSession范围的属性添加、删除、替换事件。
- javax.servlet.http.HttpSessionActivationListener:它在一个HttpSession激活或者失效时被调用。
- javax.servlet.http.HttpSessionBindingListener:可以实现这个接口来保存HttpSession范围的属性。当有属性从HttpSession添加或删除时,HttpSessionBindingListener 接口能够做出响应。
- javax.servlet.ServletRequestListener:它能够响应一个ServletRequest的创建或删除。
- javax.servlet.ServletRequestAttributeListener:它能响应ServletRequest范围的属性值添加、删除、修改事件。
- javax.servlet.AsyncListener:一个用于异步操作的监听器
Decorator模式
Decorator模式或者Wrapper模式允许修饰或者封装
(在字面意义中,即修改行为)一个对象,即使你没有该对象的源代码或者该对象标识为final。
Decorator模式适用于无法继承该类(例如,对象的实现类使用final标识)或者无法创建该类的实例,但可以从另外的系统中可以取得该类的实现时。例如,
Servlet容器方法。只有一种方法可以修改ServletRequest或者ServletResponse行为,即在另外的对象中封装该实例。**唯一的限制是,修饰对象必须继承一个接口,然后
实现接口以封装这些方法。**
public class Decorator implements Component {
private Component decorated;//被包装的对象
// constructor takes a Component implementation public Decorator(Component component) {
this.decorated = component;
}
// undecorated method
@Override
public void methodA(args) {
decorated.methodA(args);
}
// decorated method
@Override
public void methodB(args) {
decorated.methodB(args)
}
}