JSP( Java Server Pages )
一、简介
jsp本质是一个简化的Servlet,
JSP技术有点类似ASP技术,它是在传统的网页HTML文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为 (*.jsp)
某种意义上的静态页面(html)和动态页面(jsp)
1.1 JSP出现的原因
JSP出现之前,如何使用Servlet返回前端页面呢?伪代码
public void doGet() {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello world</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("head");
out.println("</html>");
}
JSP出现之后,过程就是 jsp解释器 把jsp解释成servlet的class 然后当作servlet来使用访问,html代码被写回浏览器,重点在于jsp解释器是如何把jsp翻译成java文件的
1.2 JSP中嵌套 java 代码
声明标签 <%!变量或者方法声明%>
表达式标签 <%= 表达式%> 在页面上显示的效果
程序代码标签 <%java代码%> 页面上动态展示内容
<!-- html注释内容,查看源码时能看到 -->
<%-- jsp注释,查看页面源码时看不到 --%>
二、JSP九大内置对象
JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、 pagecontext、config、page、exception,九个内置对象(又叫隐含对象),不需要预先声明就可以在脚本代码和表达式中随意使用
2.1 request 对象
request 对象代表了客户端的请求信息。request对象的作用域为一次请求。
2.2 response 对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。作用域只在JSP页面内有效
2.3 session 对象
session 对象是由服务器自动创建的与用户请求相关的对象。session对象的value可以使复杂的对象类型
application 对象保存在服务器中,作用域是服务器运行的时候。
2.5 out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区,输出完毕后需要关闭输出流
2.6 pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext由容器维护,在JSP页面中可以直接使用 pageContext 对象。
2.7 config 对象
config 对象的主要作用是取得服务器的配置信息,Servlet 初始化时,容器把某些信息通过 config 对象传递配置信息
2.8 page 对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针
2.9 exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用
三、JSP三大指令
page、include、taglib
3.1 page
配置页面信息
<%@ page ... %>
属性
- autoFlush 是否清除缓存 (默认true)
- ContentType 页面的类型(utf-8、GBK、GB2312、GB18030、ISO-8859-1)
- errorPage 错误页面(可以实现请求转发)
- isErrorPage 为True当前页面就是错误处理页面,上面提到过 exception 对象配合使用
- import 导入类,导入包
- isElIgnored 是否屏蔽EL表达式
- isThreadSafe 是否允许同步
- language脚本应用语言(默认为java)
- pageEncoding(字符编码集)
- session 是否允许使用session
3.2 include
作用:把另一个页面包含在当前页面
<%@ include file=".jsp"%>
较少使用,注意的是Tomcat版本6.0之前很少使用,6.0后Tomcat支持include
3.3 taglib
作用:申明该JSP文件使用了自定义的标签
<%@taglib uri="uri" prefix="tagPrefix" %>
属性
-
uri属性:用来指定标签库的存放位置
-
prefix属性:指定该标签库必须使用的前缀
如:
<%@taglib uri="http:java.sun.com/.../core" prefix="c" %>
使用标签库
四、JSP七大动作
4.1 include 动态引入
引入页面
<jsp:include page="page.jsp">
4.2 useBean 动作
使用JavaBean
<jsp:useBean id="对象名" class="包名.类名" scope="(request/page/application/session)"/>
<!-- 作用域默认为page(本页面有效) -->
4.3 getProperty 动作
从对象中取出属性值
<jsp:getProperty name="javaBean" property="javaBean对象属性名" />
4.4 setProperty 动作
设置对象属性
<jsp:setProperty name="javaBean" property="javaBean对象属性名" value="值"/>
4.5 forward 动作
<jsp:forward page="login.jsp" />
4.6 param 动作
传递参数,到达跳转页面可以通过 request.getParameter(“参数名”)方式取出参数值
<jsp:forward page="转向页面的url" >
<jsp:param name="参数名1" value="参数值1">
<jsp:param name="参数名2" value="参数值2">
</jsp:forward>
4.7 plugin 动作
添加插件
<jsp:plugin>
五、EL 表达式
EL表达式(Expression Language),最初被定义在JSTL中,JSP2.0时被分离出来成为JSP的规范
作用:简化对象和变量的访问
5.1 EL表达式语法
${username}
${sessionScope.username}
需要注意的是:如果没有指定变量的作用域,那么容器会依次从pageContext -> request -> session -> application 中查找该变量或对象
作用域:pageScope(当前页面),requestScope(当前请求范围),sessionScope(当前session会话),applicationScope(应用程序范围)
5.2 EL基础操作符
类型 | 定义 |
---|---|
运算 | + 、-、* 、/(div) 除 、%(mod) 余数 |
逻辑 | and、&&、or、||、!、not |
关系 | ==,eq、!=,ne、>,gt、<,lt、<=,le、>=,ge。可以与其他值进行比较,或与布尔型、字符串型、 整型或浮点型文字进行比较 |
Empty | 判断是否为null或者empty, |
其他 | .、[]、() |
六、JSTL
JSP标准标签库(JSTL)是一个JSP标签集合,封装好了JSP应用的通用核心功能
作用:简化jsp页面中编写代码
6.1 使用
-
下载
jakarta-taglibs-standard-1.1.2.zip
包并解压,将jakarta-taglibs-standard-1.1.2/lib/
下的两个 jar 文件:standard.jar
和jstl.jar
文件拷贝到/WEB-INF/lib/
下 -
在JSP页面中引入
<%@ taglib prefix=”页面使用的名称” uri=”功能范围的路径”%>
-
功能范围 URI 前缀 core http://java.sun.com/jsp/jstl/core c i18n http://java.sun.com/jsp/jstl/fmt fmt sql http://java.sun.com/jsp/jstl/sql sql xml http://java.sun.com/jsp/jstl/xml x function http://java.sun.com/jsp/jstl/function f 常用的有core核心标签,和i18n格式化标签
6.2 核心标签
引用,仅仅在这里做简单的记录,如果想要使用就得查具体的标签用法
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签 | 描述 |
---|---|
<c:out> | 用于在JSP中显示数据,就像<%= … > |
<c:set> | 用于保存数据 |
<c:remove> | 用于删除数据 |
<c:catch> | 用来处理产生错误的异常状况,并且将错误信息储存起来 |
<c:if> | 与我们在一般程序中用的if一样 |
<c:choose> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来判断条件是否成立 |
<c:otherwiset> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach> | 基础迭代标签,接受多种集合类型 |
<cforTokens> | 根据指定的分隔符来分隔内容并迭代输出 |
<c:param> | 用来给包含或重定向的页面传递参数 |
<c:redirect> | 重定向至一个新的URL. |
<c:url> | 使用可选的查询参数来创造一个URL |
6.3 格式化标签
引用,在这里做简单的记录,如果想要使用就得查具体的标签用法
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
标签 | 描述 |
---|---|
<fmt:formatNumber> | 使用指定的格式或精度格式化数字 |
<fmt:parseNumber> | 解析一个代表着数字,货币或百分比的字符串 |
<fmt:formatDate> | 使用指定的风格或模式格式化日期和时间 |
<fmt:parseDate> | 解析一个代表着日期或时间的字符串 |
<fmt:bundle> | 绑定资源 |
<fmt:setLocale> | 指定地区 |
<fmt:setBundle> | 绑定资源 |
<fmt:timeZone> | 指定时区 |
<fmt:setTimeZone> | 指定时区 |
<fmt:message> | 显示资源配置文件信息 |
<fmt:requestEncoding> | 设置request的字符编码 |
6.4 其他
我们可以发现还有很多其他的标签,有趣的是sql标签,jstl提供了访问数据库的标签,甚至还有xml标签,程序员不用写dao不用写数据库连接(但还是要写sql语句)就可以在jsp页面中访问数据库,对于当时来说还是很方便,使用不多,了解即可
七、JSP为什么被淘汰
从使用来看可以发现,编写jsp的程序员需要具备什么能力技术,前后端都需要,一个程序员至少得负责一个完整的jsp页面编写,又要研究前端的ajax/jquery/js/html知识,又要会java方面的能力,对于小网站来说还算挺方便,但随着需求变更,一个大项目需要的数据很多,页面展示,数据获取都需要一个人来完成就很困难了,所以趋势就是前后端分离,那jsp这个囊括前后端的技术就慢慢过时了
之前提到过,jsp就是servlet的简化形式,让servlet输出html信息更容易,还是会走到servlet那一套init(),service()方法,前端页面渲染都是通过DOM,无论使用jsp与否,jsp就是另一种途径而已
八、面试.
-
jsp内置对象
-
数据作用域
-
jsp与servlet的区别
jsp先编译成servlet然后再编译成calss文件