JSP简述
Java Sever Pages----->Java服务器界面 用于前后端结合
jsp为什么淘汰?
由于JSP的前后端耦合性极高,编写代码非常臃肿。前后端的代码放在一起,所以JSP可以看成是已经被淘汰的技术。
为什么还要学jsp?
由于一些公司的项目较老,更新换代成本较高,只能选择不断维护。而维护的同时就需要用到jsp老知识
JSP在编译后也是一个和Java文件,并且会生成class文件,可以打开Tome cat 指定路径查看:
D:\simon\tools\Tomcat\apache-tomcat-8.5.20\work\Catalina\localhost\ROOT\org\apache\jsp
由此可以得出:
JSP本质上就是一个Servlet
JSP生成Java文件剖析
下面是JSP文件编译后生成的Java文件
// 类声明定义
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
可以看出 index_jsp继承了HttpJspBase类,继续向上找,发现HttpJspBase继承了JspPage,JspPage继承了Servlet
public interface HttpJspPage extends JspPage {
public interface JspPage extends Servlet {
所以说JSP就是一个Servlet
JSP语法
<!-- HTML注释 -->
<%-- JSP注释 --%>
JSP声明语句: <%!%>
特点:定义全局变量,可以声明方法、类、支持任意Java数据类型
<!-- JSP声明语句 -->
<%!
String str = "全局变量";
static{
System.out.println("静态代码块");
} %>
JSP表达式:<%=%>
特点:常用于输出内容、插入表达式
<input type="text" name="<%= 变量或表达式 %>" value="<%= 变量或表达式%>">
JSP脚本程序:<%%>
特点:定义局部变量、编写语句 不能定义方法 也可输出内容
<% for (int i = 0; i < 10; i++) { %>
<h1>HELLO WORLD <%= i %></h1>
<% } %>
注释:
<!-- HTML注释 -->
<%-- JSP代码注释 --%>
区别:在网页中查看源代码时:jsp注释不会显示,但HTML注释会显示
JSP指令
Page
- 定制错误页面
<%-- 头文件page 声明了页面类型 编码集 语言等 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 显示声明这个是一个错误界面 --%>
<%@ page isErrorPage="true" %>
<%-- 错误页面也可以在web.xml中声明 如下: --%>
<!-- ERROR Page -->
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
- 其他指令如:autoFlush:是否被刷新 import : 导包 …
include
<%-- 提取公共页面 例如网页的头部尾部导航栏 --%>
<%@ include file="./beInclude.jsp" %>
<!-- @include 属于是将另一个页面包含进来 所以一旦出现同名变量就会报错 -->
<!-- --------------- -->
<!-- 利用jsp标签 属于是将页面进行拼接 每个页面中的变量相互独立 -->
<%-- 也可以用jsp标签提取公共页 --%>
<jsp:include page="beInclude.jsp"/>
taglib
标签库 引入:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSP的内置对象
在第一次访问jsp网页时,会由服务器将该jsp文件转换为Java文件并生成字节码文件,在生成的Java文件中会包含经常使用的一些内置对象
// 如下所示
final javax.servlet.jsp.PageContext pageContext; // 上下文
final javax.servlet.ServletContext application;// 存储数据
final javax.servlet.ServletConfig config; // 配置信息
javax.servlet.jsp.JspWriter out = null; // 输出
final java.lang.Object page = this; // 当前页面
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
// 除此之外 还包含了
HttpRequest req // 请求
HttpResponse resp // 响应
Execption // 异常错误
九大内置对象
- PageContext // 可以访问所有的jsp内置对象
// 常用
pageContetx.getRequest()//返回当前页面中的request对象。
pageContetx.getResponse()//使用此方法将返回当前页面中的response对象。
pageContetx.getPage()//此方法返回当前页面中的page对象。
pageContetx.getSession()//返回当前页面中的session对象。
pageContetx.getOut()//返回当前页面中的out对象。
pageContetx.setAttribute(String name)//给指定的属性名设置属性值。
pageContetx.getAttribute(String name)//根据属性名称找到相应的属性值。
pageContetx.findAttribute(String name)//寻找一个属性并返回,如果没有找到则返回一个null。
- Request // 请求
request.setAttribute(String name,Object value) //储存此请求中的属性
request.getAttribute(String name) //返回指定属性的属性值
request.getParameter(String name) //返回name指定参数的参数值
request.getParameterValues(String name) //返回包含参数name的所有值的数组
- Response
response.getCharacterEncoding() //返回响应用的是何种字符编码
response.getWriter() //返回可以向客户端输出字符的一个对象
response.sendRedirect(java.lang.String location) //重新定向客户端的请求
- Session
session.getId()//返回session的ID号
session. setAttribute(String name,Object value)//将value值存在session域中,名字为name
session.getAttribute(String name)//返回与此会话中的指定名称绑定在一起的值,如果没有值绑定在该名称下,则返回null
session.invalidate()//销毁session
- out
- aplication
application.setAttribute(key,value)//设置应用对象中指定名字的属性值
application.getAttribute(key)//获取应用对象中指定名字的属性值
application.getAttributeNames()//获取应用对象中所有属性的名字 枚举
- config
- Page
- execption
pageContext.setAttribute的作用域
// 只在一个网页中有效
pageContext.setAttribute("name1","张一");
// 只在一个请求中有效 请求转发时将会携带
request.setAttribute("name2","张二");
// 在一次会话中均可读取 打开浏览器到关闭浏览器
session.setAttribute("name3","张三");
// 在服务器中有效 从打开服务器到关闭服务器
application.setAttribute("name4","张四");
使用场景:
- request: 客户端向服务端请求的数据,用过之后即销毁。再次请求需要重新加载----> 新闻
- Session : 用户向服务器请求得到的数据需要保存,后续还会使用 购物车
- application: 用户向服务器发送请求,使用该数据,使用完毕后还可以给其他用户使用
JSP标签
-
<jsp:forward page="beInclude.jsp"> <jsp:param name="name" value="张三"/> <jsp:param name="age" value="18"/> </jsp:forward> <%-- 在另一jsp中获取 --%> 姓名:<%= request.getParameter("name")%> 年龄:<%= request.getParameter("age")%> // 注意处理编码问题
EL表达式
全称 Express Language
-
获取数据
按照域对象从小到大进行获取,依次是:
pageContext < request < Session < application
-
执行运算
-
获取Web
<%
pageContext.setAttribute("name","张三");
request.setAttribute("name","张四");
session.setAttribute("name","张五");
application.setAttribute("name","张六");
List<String> list = new ArrayList<>();
list.add(0,"张三");
list.add(1,"张四");
list.add(2,"张五");
list.add(3,"张六");
list.add(4,"张七");
request.setAttribute("list",list);
%>
<pre>
获取pageContext作用域中的name: ${pageScope.name}
获取request作用域中的name: ${requestScope.name}
获取session作用域中的name: ${sessionScope.name}
获取application作用域中的name: ${applicationScope.name}
获取集合指定索引的数据:${list[0]} ${list[4]}
<%-- 张三 和 张七 --%>
获取集合长度:${list.size()}
</pre>