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文件
// 类声明定义
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注释 --%>
JSP声明语句: <%!%>
特点:定义全局变量,可以声明方法、类、支持任意Java数据类型
<%!
String str = "全局变量";
static{
System.out.println("静态代码块");
} %>
JSP表达式:<%=%>
特点:常用于输出内容、插入表达式
JSP脚本程序:<%%>
特点:定义局部变量、编写语句 不能定义方法 也可输出内容
<% for (int i = 0; i < 10; i++) { %>
HELLO WORLD <%= i %>
<% } %>
注释:
<%-- JSP代码注释 --%>
区别:在网页中查看源代码时:jsp注释不会显示,但HTML注释会显示
<%-- 头文件page 声明了页面类型 编码集 语言等 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 显示声明这个是一个错误界面 --%>
<%@ page isErrorPage="true" %>
<%-- 错误页面也可以在web.xml中声明 如下: --%>
404
/error/404.jsp
500
/error/500.jsp
<%-- 提取公共页面 例如网页的头部尾部导航栏 --%>
<%@ include file="./beInclude.jsp" %>
<%-- 也可以用jsp标签提取公共页 --%>
标签库 引入:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
在第一次访问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 // 异常错误
// 常用
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.setAttribute(String name,Object value) //储存此请求中的属性
request.getAttribute(String name) //返回指定属性的属性值
request.getParameter(String name) //返回name指定参数的参数值
request.getParameterValues(String name) //返回包含参数name的所有值的数组
response.getCharacterEncoding() //返回响应用的是何种字符编码
response.getWriter() //返回可以向客户端输出字符的一个对象
response.sendRedirect(java.lang.String location) //重新定向客户端的请求
session.getId()//返回session的ID号
session. setAttribute(String name,Object value)//将value值存在session域中,名字为name
session.getAttribute(String name)//返回与此会话中的指定名称绑定在一起的值,如果没有值绑定在该名称下,则返回null
session.invalidate()//销毁session
application.setAttribute(key,value)//设置应用对象中指定名字的属性值
application.getAttribute(key)//获取应用对象中指定名字的属性值
application.getAttributeNames()//获取应用对象中所有属性的名字 枚举
pageContext.setAttribute的作用域
// 只在一个网页中有效
pageContext.setAttribute("name1","张一");
// 只在一个请求中有效 请求转发时将会携带
request.setAttribute("name2","张二");
// 在一次会话中均可读取 打开浏览器到关闭浏览器
session.setAttribute("name3","张三");
// 在服务器中有效 从打开服务器到关闭服务器
application.setAttribute("name4","张四");
使用场景:
<%-- 在另一jsp中获取 --%>
姓名:<%= request.getParameter("name")%>
年龄:<%= request.getParameter("age")%>
// 注意处理编码问题
全称 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>