JSP:Java Server Page

1. JSP的特点:

概念

JSP:Java Server Page (Java服务器端的页面,运行在服务器上的页面)

用户在浏览器端看到的页面,其实是JSP运行的结果。

特点

JSP上可以同时编写:HTML Java代码

Java代码写以下格式中: <% %>

在浏览器上能否看到Java代码?

不能,在浏览器上看到的只是JSP运行的结果

2. JSP与Servlet之间的关系

JSP的执行过程

  1. JSP代码由Tomcat翻译成Servlet
  2. 由JVM将Servlet编译成字节码文件,再运行

运行jsp文件控制台输出的路径:Using CATALINA_BASE: "C:\Users\就一夹心怎么了\.IntelliJIdea2019.1\system\tomcat\Tomcat_8_5_51_Heima143_JavaWeb_14"中的work一直点进去
最后路径就是:C:\Users\就一夹心怎么了\.IntelliJIdea2019.1\system\tomcat\Tomcat_8_5_51_Heima143_JavaWeb_14\work\Catalina\localhost\day30_01_jsp_war_exploded\org\apache\jsp
有个.java 和.class文件,打开java文件可以看到

public final class demo1_jsp extends org.apache.jasper.runtime.HttpJspBase
其实也就是 public abstract class HttpJspBase extends HttpServlet  
由此可以知道 JSP本质上就是一个Servlet 

3.JSP的3种脚本元素

代码片段、表达式、声明

在JSP页面中编写Java代码的方式,不建议在JSP上写过多的Java代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP的三种脚本元素</title>
</head>
<body>

<h1>表达式</h1>
<%--
语法: <%=变量名%>
作用:在页面上输出变量的值,本质上相当于这句话:out.print(变量名)
--%>

<%
//定义一个变量
String name = "武松";
%>
姓名: <%=name%>
<h1>代码片段</h1>
<%--
语法:<% Java代码 %>
作用:在JSP中编写任何的Java代码,只要符合Java语法规则都可以
--%>
<%
//注释:符合Java的语法规则
for (int i = 0; i < 5; i++) {
out.print("Hello JSP <br/>");
}
%>
<h1>声明</h1>
<%--
语法: <%! 声明变量或方法 %>
作用: 在JSP中声明全局变量,本质上是一个类中成员变量
--%>

<%!
String name = "武大";
%>

输出局部变量: <%=name%> <br/>
输出全局变量: <%=this.name%> <br/>

</body>
</html>

 

4. JSP中九个内置对象

JSP本质上就是一个Servlet,在Servlet中常用的一些对象可以直接在JSP上使用,不需要自己去创建。这些对象称为内置对象。

对象名对应的类型功能描述
request HttpServletRequest 请求对象
response HttpServletResponse 响应对象
pageContext PageContext 页面上下文
session HttpSession 会话对象
application ServletContext 上下文对象
config ServletConfig 读取web.xml中init-param配置参数
out JspWriter 类似于PrintWriter,带缓存的,速度更快
page Object 表示this,代表当前JSP生成的Servlet对象
exception Throwable 出现在异常的页面中,表示异常对象

 

 

 

 

 

 

 

 

 

 

5. PageContext对象的作用

页面上下文,也是一个作用域,它的作用范围是:只在当前JSP页面起作用

总共有4个作用域,页面域中在JSP中才有用,Servlet中没有页面域这个对象

作用域大小比较:页面域 < 请求域 < 会话域 < 上下文域
所有的作用域,它的底层数据结构都是Map结构

作用域有关的方法

“键”为String类型

void setAttribute("键",Object 值)  向作用域中添加键和值,如果键存在就是修改
Object getAttribute("键") 通过键从作用域中获取值
void removeAttribute("键") 通过键删除键和值

 

 

 

 

页面域的特有方法  

removeAttribute("键")  删除所有四个作用域中键和值
findAttribute("键") 通过键按从小到大的顺序去查找每个使用域的值

 

 

 

PageContext主要有2个功能:

 

  1. 是一个作用域对象

  2. 通过它可以获取其它的8个内置对象 

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>页面上下文PageContext的方法</title>
</head>
<body>
<h2>页面上下文PageContext的方法</h2>
<h3>作用一:页面上下文是一个作用域对象</h3>
<%
    //向页面域添加键和值
    pageContext.setAttribute("name", "牛魔王");
    //向请求域添加键和值
    request.setAttribute("name", "红孩儿");
    //向会话域添加键和值
    session.setAttribute("name", "铁扇公主");
    //向上下文域添加键和值
    application.setAttribute("name", "太上老君");

    //删除四个作用域中同名的键和值
    //pageContext.removeAttribute("name");

    //只删除其中一个作用域的键和值
    //PageContext.PAGE_SCOPE = 1 页面域
    //PageContext.REQUEST_SCOPE = 2 请求域
    //PageContext.SESSION_SCOPE = 3 会话域
    //PageContext.APPLICATION_SCOPE = 4 上下文域
    pageContext.removeAttribute("name", PageContext.PAGE_SCOPE);
%>

页面域 :<%=pageContext.getAttribute("name")%> <br/>
请求域 :<%=request.getAttribute("name")%> <br/>
会话域 :<%=session.getAttribute("name")%> <br/>
上下文域 :<%=application.getAttribute("name")%> <hr/>
自动查找作用域 :<%=pageContext.findAttribute("name")%> <br/>


<h3>作用二:可以获取其它8个内置对象</h3>
<%--只要有这个对象,就可以得到页面上所有的内置对象了--%>
请求对象: <%=pageContext.getRequest()%><br/>
会话对象: <%=pageContext.getSession()%><br/>
上下文对象: <%=pageContext.getServletContext()%><br/>
</body>
</html>

 

6. JSP的指令:include

三大指令是

include 用来包含另一个页面
page  指定JSP页面的属性
taglib  导入第三方标签库

 

 

 

 

指令的格式

<%@指令名 属性名="属性值"%>

include指令语法

<%@include file="被包含的页面"%>

<div id="header">
    <%--相当于把header.jsp中原代码复制到这个位置--%>
    <%@include file="header.jsp"%>
</div>

7. JSP的指令:page

page指令概述

  1. 作用:设置JSP页面上功能,告诉tomcat将JSP翻译成Servlet的时候有哪些限制

  2. 位置:通常放在页面的最前面,但其实可以放在页面的任意位置

导包的属性

language="java" 指JSP页面上使用的编程语言,默认是Java
import="java.util.*"
如果JSP页面上使用了其它的类,需要导入包,使用这个属性导包,有两种格式:
1. 每个import属性导入一个包   

如:<%@ page import="java.util.Date" %>   

       <%@ page import="java.text.SimpleDateFormat" %>

2. 一个import属性导入多个包,使用逗号隔开  

如:<%@ page import="java.util.Date,java.text.SimpleDateFormat" %>

与编码相关的属性

contentType="text/html; charset=utf-8"
相当于servlet中这句话:
response.setContentType("text/html; charset=utf-8");
JSP页面上必须加上这句话,如果没有的话,整个页面是欧洲码表(即iso-8859-1)

是否会创建会话

session="true|false"
默认是true,如果设置为false,在页面上就不能使用会话对象。

是否可以使用EL

isELIgnored="true|false"
在JSP页面上默认是可以使用EL表达式语言,默认是false
如果设置为true,页面禁用表达式语言,EL表达式会原样输出。

8. JSP的三个动作:include、forward和param

include:包含

  1. 作用:用来包含另一个JSP页面或Servlet

  2. 语法:<jsp:include page="被包含的页面"/>

include动作与指令的区别

 静态包含动态包含
语法格式 <%@include file="被包含的页面"%> <jsp:include page="被包含的页面"/>
包含的方式 如果A页面包含了B页面,相当于把B页面的代码先复制到A页面中,再去翻译成Servlet 如果A页面包含了B页面,先将B页面翻译成Servlet执行,A页面包含的是B页面执行的结果
生成Servlet个数 最终只会生成1个Servlet 最终会生成2个Servlet

 

 

 

 

 

 

 

 

 

注意:使用静态包含,A和B页面中不能出现同名的变量定义

forward和param:

  1. forward作用:实现转发的功能

  2. param的功能:转发的时候带参数

转发前

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>forward动作</h2>
<%--
作用:相当于转发
    转发的同时还可以带参数
    使用jsp:param这个标签来指定参数,可以带多个参数
        name参数名
        value参数值
--%>

<%
    //设置请求的编码,而且放在转发前的页面上
    request.setCharacterEncoding("utf-8");
%>
<jsp:forward page="demo2_result.jsp">
    <jsp:param name="user" value="Yblue"/>
    <jsp:param name="age" value="24"/>
    <jsp:param name="job" value="种田"/>
</jsp:forward>
</body>
</html>

转发后

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
转发到的demo2<hr/>
接收传递过来的参数:<br/>
<%=request.getParameter("user")%><br/>
<%=request.getParameter("age")%><br/>
<%=request.getParameter("job")%><br/>
</body>
</html>

 

 

想看更多精彩内容,可以关注我的CSDN

我的CSDN

posted @ 2020-09-02 23:09  Yblue  阅读(209)  评论(0编辑  收藏  举报