JSP(JavaServer Pages)是什么
JSP是一种支持动态内容开发的网页技术,通过利用特殊的JSP标签插入Java代码到HTML页面。JavaServer Pages组件是一个
Java servlet
类型,是为了满足Java Web应用程序用户界面的一个角色。
Web服务器如何使用JSP创建网页
浏览器发送HTTP请求到网站服务器。
服务器识别HTTP请求是一个JSP页面,将其转发给JSP引擎。
JSP引擎从磁盘加载JSP页面,并将其转换为servlet的内容。
1)模板文本(html标签)转换为println()语句
2)JSP元素转换为相应的Java代码
JSP引擎把转换后的JSP文件编译成servlet的一个可执行类,并转发原始请求到servlet引擎。
服务器调用servlet引擎加载servlet类并执行它。servlet产生HTML格式输出,servlet引擎传递到服务器。
web服务器响应HTTP请求,转发静态的HTML内容到浏览器。
浏览器处理HTTP响应动态生成的HTML页面。
总结:
请求->jsp代码
–jsp引擎加载、转换、编译–servlet代码
->servlet代码
–servlet引擎加载、执行–html代码
->浏览器显示。
JSP生命周期
JSP生命周期是指从创建到破坏的过程。类似于servlet生命周期,不过多了将JSP编译成servlet的过程。
编译。当JSP从未被编译或代码已被修改,JSP引擎会编译页面。
初始化。 处理任何请求前调用jspInit(),仅执行一次。和servlet的init()方法一样。
JSP执行。调用_jspService()处理请求,直到JSP被销毁。
JSP销毁。关闭服务器或从服务器中移除是执行。
1.小脚本
小脚本(scriptlet)是有效的JAVA语言语句,变量或方法声明或表达式。
语法
<% code fragment %>
//示例
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
2.JSP声明
在JSP文件中使用该变量或方法之前,必须先声明变量或方法。
语法:
<%! declaration; %>
//实例
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
3.JSP表示式
JSP表达式元素包含一个脚本语言表达式,它被评估求值,转换为一个字符串,并在JSP文件中的指定输出位置。
语法:
<%= expression %>
//实例
<p>Today's date: <%= (new java.util.Date()).toLocaleString()%>p>
4.JSP注释
标记JSP容器应忽略的文本或语句。
语法:
<%-- This is JSP comment --%>
5.JSP指令
JSP指令影响servlet类的整体结构
语法:
<%@ directive attribute="value" %>
//实例
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
6.JSP动作
JSP动作使用XML语法中的结构来控制servlet引擎的行为
语法:
attribute="value" />
//实例
"Relative URL" />
7.JSP隐式对象
JSP支持9个自动定义的对象(可以直接在jsp页面中使用这些对象,不用创建),也称为隐式对象。
更多JSP元素内容参考:JSP基础语法
1.page指令
JSP中的page指令用于向容器提供与当前JSP页面相关的指令。可以在JSP页面的任何位置使用page指令进行编码。 按照惯例,page指令被编码在JSP页面的顶部。
语法:
<%@ page attribute = "value" %>
2.include指令
include指令用于在编译阶段包括一个文件。这个指令告诉容器在编译阶段将其他外部文件的内容合并到当前JSP文件中。可在JSP页面的任何位置使用include指令进行编码。
语法:
<%@ include file = "relative url" >
通常使用include
指令在一个公共主页中包含页眉和页脚。
3.taglib指令
taglib指令声明JSP页面使用一组自定义标签,标识库的位置,并提供了在JSP页面中标识自定义标签的方法。
语法:
<%@ taglib uri="uri" prefix = "prefixOfTag" >
uri
:属性值解析为容器理解的位置
prefix
:通知容器什么位置的标记是自定义操作
实例:
<%@ taglib uri = "http://www.example.com/custlib" prefix = "mytag" %>
<html>
<body>
<mytag:hello/>
body>
html>
1.jsp:include动作
此动作允许将文件插入到正在生成的页面中
语法:
<jsp:include page = "relative URL" flush = "true" />
page
: 要包括的页面的相对URLflush
:布尔属性确定包含的资源是否在包含其缓冲区之前被刷新。include指令
:把包含的页面所有元素标签全部拿过来输出.
jsp:include
:动态包含,把它的运行结果拿过来.
2. jsp:forward动作
动作终止当前页面的操作,并将请求转发到另一个资源
"Relative URL" />
page
:包含另一个资源的相对URL。
更多JSP动作参考:JSP动作
这里讨论下out
和PageContext
对象,其余7个是servlet已经有的。主要参考:jsp学习
out
out是什么?
out的对象类型为JspWriter,通过pageContext对象的getOut方法返回。
out的作用
JSP 页面中的操作和模板数据是通过out来响应回给浏览器的。
如何响应回给浏览器?
通过与ServletResponse
的 PrintWriter
对象关联,即我们常用的response.getWriter().write(“xxx”)。满足下面任一条件即可关联:
默认情况下out对象的缓存功能是打开的
pageContext
pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象封装了对其它8大隐式对象的引用。它自身还是一个域对象,可以用来保存数据。
查看jsp转换为相应的Servlet代码可知:
page
:是当前页面转换成Servlet类的实例。
pageContext
:javax.servlet.jsp.PageContext 的实例,该对象代表该JSP 页面上下文。
findAttribute()
按顺序在页面(pageContext)、请求(request域)、会话(session域,如果有效)和应用程序范围(application/servletContext)中搜索指定属性,并返回关联的值或 null。
注意:EL表达式中取值就是依靠pageContext.findAttribute()方法的.
另外:pageContext提供了获取8大隐式对象的getter方法,所以可以在EL表达式中通过pageContext来获得8大隐式对象。
EL,即Expression Language。用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作。使得我们可以轻松访问存储在JavaBeans的数据,减少在JSP中的java代码。
EL的简单语法
${expr}
expr
:指定表达式本身。
${expr}
:表示获取表达式expr
的值,然后在页面上输出。
JSP EL中最常见的操作符是:.
和[]
,这两个运算符用来访问Java Beans和内置JSP对象的各种属性。
例如:${stu.name}
就相当于:
<%
Student stu = (Student)pageContext.findAttribute("stu");
if(stu != null) out.print(stu.getName());
%>
.
操作符相当于调用stu对象中getName()返回的数据,最后把数据在页面输出。xx的范围变量可以理解为xx作用域对象的map
,和作用域对象并不相同。若要在EL表示式中获取某一作用域对象,可以通过pageContext来获取
${pageContext.request.queryString}
更过关于EL表示式的内容参考:JSP表达式语言(EL)
JSP标准标签库(JSP Standard Tag Library)在JSP规范的基础上,扩充了一个JSP的标签库来完成一些通用任务,比如XML数据处理、条件执行、数据库访问、循环和国际化。
如何使用
- 导入jar包jstl.jar和standard.jar
- 在jsp页面上,使用taglib指令来引入标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
常用标签
<c:set var="name" value="zhangsan" scope="session">c:set>
${sessionScope.name }
判断test里面的表达式是否满足,如果满足,就执行c:if标签中的输出 ,c:if 是没有else的。
"age" value="18" >
if test="${ age > 26 }">
年龄大于了26岁...
if>
if test="${ age <= 26 }">
年龄小于了26岁...
if>
------------------------------
定义一个变量名 flag 去接收前面表达式的值,然后存在session域中
if test="${ age > 26 }" var="flag" scope="session">
年龄大于了26岁...
if>
从1 开始遍历到10 ,得到的结果 ,赋值给 i ,并且会存储到page域中, step , 增幅为2,
<c:forEach begin="1" end="10" var="i" step="2">
${i }
c:forEach>
-----------------------------------------------
<c:forEach var="user" items="${list }">
${user.name } ----${user.age }
c:forEach>
更多JSTL的内容参考:JavaWeb之JSTL标签库