1、Jsp的执行过程
问题: 访问http://localhost:8080/day12/hello.jsp 如何显示效果?
1)访问到01.hello.jsp页面,tomcat扫描到jsp文件,在%tomcat%/work把jsp文件翻译成java源文件
(01.hello.jsp -> _01_hello_jsp.java) (翻译)
2)tomcat服务器把java源文件编译成class字节码文件 (编译)
(_01_hello_jsp.java -> _01_hello_jsp.class)
3)tomcat服务器构造_01_hello_jsp类对象
4)tomcat服务器调用_01_hello_jsp类里面方法,返回内容显示到浏览器。
第一次访问jsp:
走(1)(2)(3)(4)
第n次访问jsp:
走(4)
注意:
1)jsp文件修改了或jsp的临时文件被删除了,要重新走翻译(1)和编译(2)的过程
2、(1)Jsp语法:
1)jsp表达式:<%=变量或表达式%> 向浏览器输出变量或表达式计算的结果
2)jsp脚本: <% java代码 %> 执行java代码 原理:翻译到_jspService()方法中
3)jsp声明: <%! 变量或方法 %> 声明jsp的成员变量或成员方法
4)jsp注释: <%!-- jsp注释 --%> 用于注释jsp代码,不会翻译到java文件中,也不会执行。
(2)jsp的三大指令
include指令:用于包含其他页面。原理:先合并再翻译,叫静态包含
page指令:告诉tomcat服务器如何把jsp文件翻译成java文件
language: 翻译的动态语言。
import: 类导入
jsp文件编码问题:
pageEncoding: 告诉tomcat服务器使用什么编码翻译jsp文件(jsp->java文件)
contentType: tomcat服务器发送给浏览器的数据编码(tomcat服务器->浏览器)
异常错误相关的:
errorPage: 指定当前jsp页面的错误处理页面。
isErorrPage: 指定当前页面是否为错误处理页面。false,不是错误处理页面,则不能使用 exception内置对象;true,是错误处理页面,可以使用exception内置对象。
配置全局的错误处理页面:
<!-- 全局错误处理页面配置 -->
<error-page>
<error-code>500</error-code>
<location>/common/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/common/404.html</location>
</error-page>
session: 是否开启session功能。false,不能用session内置对象;true,可以使用session内 置对象。
buffer: jsp页面的缓存区大小。
isELIgnore: 是否忽略EL表达式
3、9大内置对象
内置对象名 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext
4、(1)Jsp的4个域对象
request
session
application
pageContext
作用范围:
pageContext : 处于当前jsp页面中有效的!!
request: 处于同一个请求中有效的!!
session: 处于同一个会话中有效的!
application: 处于同一个web应用中有效的!
2)EL表达式
替代jsp表达式,用于向浏览器输出域对象中的变量值和表达式计算的结果。
语法:
${变量}
3.1 输出普通字符串: ${name}
3.2 输出对象属性: ${student.name} 注意: .name 相当于 .getName()方法
3.3 输出List集合: ${list[0].name } 注意: [0] 相当于 get(下标)方法
3.4 输出map集合: ${map[key].name} 注意: [key]相当于get(key)方法
3)jsp标签 替代jsp脚本,用于在jsp页面中执行java代码
内置标签:
<jsp:foward/> request.getRequesetDipsacher("/路径").foward(request,response);
<jsp:param/> 参数标签 ?name=eric
<jsp:include/> 包含其他页面 ,动态包含
静态包含: 先合并再翻译。不能传递参数
动态包含: 先翻译再合并。可以传递参数
jstl标签库 (java标准标签库)
使用步骤:
1)确保jstl支持的jar包存在于项目中
2)在jsp页面中导入标签库
<%@taglib uri="标签库声明文件tld文件的标记" prefix="前缀"%>
3)使用标签库中的标签
核心标签库:
<c:set /> 保存数据到域对象中
<c:out/> 从域中取出数据
<c:if/> 单条件判断
<c:choose/> + <c:when/> + <c:otherwise/> 多条件判断
<c:forEach /> 遍历数据
<c:forTokens/> 遍历特殊字符串
<c:redirect/> 重定向
5、自定义标签&编码实战
1)自定义标签步骤:
编写标签处理器类,继承SimpleTagSupport类,覆盖doTag方法
在WEB-INF目录下建立tld文件,在tld配置标签
在jsp页面导入标签库,使用taglib指令
在jsp页面中使用标签库中的标签
2)自定义标签生命周期:
SimpleTag接口:
setJspContext(JspContext context) --传入pagContext对象
setParent(JspTag tag) --传入父标签对象
setXXX(参数) --给属性赋值
setJspBody(JspFrament jspBody) --传入标签体内容
doTag() --执行标签
3)自定义标签的作用:
控制是否输出标签体内容
输出: this.getJspBody().invoke(null)
不输出: 不调用invoke(null)方法
控制标签余下内容是否输出
输出: 什么不都做!
不输出: 抛出SkipPageException异常
重复输出标签体内容
重复调用: this.getJspBody().invoke(null)
修改标签体内容
StringWriter sw = new StringWriter();
this.getJspBody().invoke(sw);
String content = sw.toString();
//修改内容
//手动输出到浏览器
this.getJspContext().getOut().writer(修改过的内容);
带属性的标签
a)在标签处理器类中声明成员变量和setter方法,用于给属性变量赋值。
b)在tld文件中声明属性
c) 使用属性
4)JavaBean规范
必须要有无参的构造方法
所有成员属性必须私有化 (private)
必须提供公开的getter和setter方法
5)MVC开发模式
MVC就是servlet+jsp+javabean的开发模式
M,Model,javabean实现,封装业务数据
V,View,jsp实现,显示数据
C,Controller,servlet实现,接收参数,调用业务逻辑,跳转视图
6)三层结构开发
dao层: 数据访问对象。实现对数据的操作相关的方法
service层: 业务逻辑对象。实现对项目的业逻辑处理相关的方法
web层: 表现层。处理和用户直接相关的,接收参数,处理参数,跳转视图,展示数据。
6、