在jsp开发中,会频繁使用到一些现象html
例如HttpSession,ServletContext,ServletContext,HttpServletRequet。若是咱们每次要使用这些对象都去建立这些对象就显示很是麻烦。因此Sun公司设计Jsp时,在jsp页面加载完毕以后就会自动帮开发者建立好这些对象,而开发者只须要直接使用这些对象调用方法便可!,这些建立好的对象就叫内置对象。java
举例:web
servlet: sql
HttpSession session = request.getSession(true); (须要开发者作)浏览器
jsp:缓存
tomcat服务器: HttpSession session = request.getSession(true);(不须要开发者作)tomcat
开发者作的: session.getId();服务器
内置对象名 类型 request HttpServletRequest response HttpServletResponse config ServletConfig application ServletContext session HttpSession exception Throwable page Object(this) out JspWriter pageContext PageContext
out对象类型,jspWriter类,至关于带缓存的printWritersession
PrintWriter:app
writer(内容):直接向浏览器写出内容
JspWriter
writer(内容):向jsp缓冲区写出内容
当知足如下条件之一,缓冲区内容写出:
1)缓冲区满了
2)刷新缓冲区
3)关闭缓冲区
4)执行完jsp页面
pageContext对象的类型是PageContext,叫jsp的上下文对象
public class 01_hello_jsp { public void _jspService(request,response){ 建立内置对象 HttpSession session =....; ServletConfig config = ....; 把8个常常使用的内置对象封装到PageContext对象中 PageContext pageContext = 封装; 调用method1方法 method1(pageContext); } public void method1(PageContext pageContext){ 但愿使用内置对象 从PageContext对象中获取其余8个内置对象 JspWriter out =pageContext.getOut(); HttpServletRequest rquest = pageContext.getRequest(); ........ } }
使用场景: 在自定义标签的时候,PageContext对象频繁使用到
ServletContext context域
HttpServletRequet request域
HttpSession session域 --Servlet学习的
PageContext page域 --jsp学习的
做用: 保存数据和获取数据,用于共享数据
#保存数据
1)默认状况下,保存到page域
pageContext.setAttritube("name");
2)能够向四个域对象保存数据
pageContext.getAttribute("name",域范围常量)
域范围常量:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext..SESSION_SCOPE
PageContext.APPLICATION_SCOPE
3)自动在四个域中搜索数据
pageContext.findAttribute("name");
顺序: page域 -> request域 -> session域- > context域(application域)
四个域对象:
pageContext page域
request request域
session session域
application context域
1)域对象做用:
保存数据 和 获取数据 ,用于数据共享。
2)域对象方法:
setAttribute("name",Object) 保存数据
getAttribute("name") 获取数据
removeAttribute("name") 清除数据
3)域对象做用范围:
page域: 只能在当前jsp页面中使用(当前页面)
request域: 只能在同一个请求中使用(转发)
session域: 只能在同一个会话(session对象)中使用(私有的)
context域: 只能在同一个web应用中使用。(全局的)
Servlet技术: 开发动态资源。是一个java类,最擅长写java代码
jsp技术: 开发动态资源。经过java代码最擅长输出html代码。
各取所长:
在web项目中涉及到逻辑:
1)接收参数 servlet作
2)处理业务逻辑,返回结果 servlet作
3)显示数据到浏览器 jsp作
4)跳转到其余页面 servlet作
servlet+jsp模式
servlet:
1)接收参数
2)处理业务逻辑
3)把结果保存到域对象中
4)跳转到jsp页面
Jsp:
1)从域对象取出数据
2)把数据显示到浏览器
servlet的数据 -> jsp页面
List<Contact> 使用域对象 共享数据
jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<% %>。
之后开发jsp的原则: 尽可能在jsp页面中少写甚至不写java代码。
使用EL表达式替换掉jsp表达式
EL表达式做用: 向浏览器输出域对象中的变量值或表达式计算的结果!!!
语法: ${变量或表达式}
1)输出基本数据类型变量
1.1 从四个域获取
${name}
1.2 指定域获取
${pageScope.name}
域范围: pageScoep / requestScope / sessionScope / applicationScope
2)输出对象的属性值
Student
3)输出集合对象
List 和 Map
4)EL表达式计算
jsp标签做用:替换jsp脚本。
1)流程判断(if for循环)
2)跳转页面(转发,重定向)
3)。。。。。
1)内置标签(动做标签): 不须要在jsp页面导入标签
2)jstl标签: 须要在jsp页面中导入标签
3)自定义标签 : 开发者自行定义,须要在jsp页面导入标签
转发标签: <jsp:forward />
参数标签: <jsp:pararm/>
包含标签: <jsp:include/>
原理: 包含与被包含的页面先各自翻译成java源文件,而后再运行时合并在一块儿。
(先翻译再合并),动态包含
静态包含 vs 动态包含的区别?
1) 语法不一样
静态包含语法: <%@inclue file="被包含的页面"%>
动态包含语法: <jsp:include page="被包含的页面">
2)参数传递不一样
静态包含不能向被包含页面传递参数
动态包含能够向被包含页面传递参数
3)原理不一样
静态包含: 先合并再翻译
动态包含: 先翻译再合并
JSTL (全名:java standard tag libarary - java标准标签库 )
核心标签库 (c标签库) 每天用
国际化标签(fmt标签库)
EL函数库(fn函数库)
xml标签库(x标签库)
sql标签库(sql标签库)
1) 导入jstl支持的jar包(标签背后隐藏的java代码)
注意:使用javaee5.0的项目自动导入jstl支持jar包
2)使用taglib指令导入标签库
<%@taglib uri="tld文件的uri名称" prefix="简写" %>
3)在jsp中使用标签
核心标签库的重点标签:
保存数据:
<c:set></c:set>
获取数据:
<c:out value=""></c:out>
单条件判断
<c:if test=""></c:if>
多条件判断
<c:choose></c:choose>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
循环数据
<c:forEach></c:forEach>
<c:forTokens items="" delims=""></c:forTokens>
重定向
<c:redirect></c:redirect>