JSP的基本使用总结

简介: JSP的基本使用总结

JSP的使用

一、JSP的介绍与创建

JSP的全称是Java Server Pages,即Java的服务器页面

JSP的主要作用是代替Servlet程序回传HTML页面的数据

web目录(或其他)右击 --> new --> JSP/JSPX --> 输入文件名 --> 选择JSP file创建

二、JSP的本质

JSP页面本质上是一个Servlet程序,第一次访问JSP页面时(运行Tomcat服务器后在浏览器地址栏输入路径),Tomcat服务器会将此JSP页面翻译成为一个Java源文件,并对其进行编译成为.class字节码文件(一个.java,一个.class),当打开.java文件时发现其中的内容是:


595234ed530173ff017fef1e0305f8dc.png


而HttpJspBase类直接继承于HttpServlet类,即JSP翻译出来的Java类间接继承于HttpServlet类,证明JSP页面是一个Servlet程序


三、JSP的语法

JSP头部的page指令:


JSP头部的page指令可以修改JSP页面中的一些重要属性或行为

(以下属性均写在page指令中,默认page指令中没有出现的属性都采用默认值):


contentType属性:表示JSP返回的数据类型是什么,即response.setContentType()的参数值

language属性:表示JSP翻译之后是什么语言文件(目前只支持Java)

pageEncoding属性:表示当前JSP文件本身的字符集(可在IDEA右下角看到)

import属性:表示导包(导类),与Java一致

autoFlush属性:设置当out输出流缓冲区满了之后是否自动刷新缓冲区,默认值是true

buffer属性:设置out缓冲区的大小,默认是8kb

注意:out缓冲区满了之后不能自动刷新的话会报错

errorPage属性:设置当JSP页面运行出错时自动跳转到的页面(错误信息页面)的路径,这个 路径一般都是以斜杠打头,表示请求的地址是http://ip:port/工程路径/,对应代码web目录

isErrorPage属性:设置当前JSP页面是否是错误信息页面,默认是false,如果是true可以 获取错误信息

session属性:设置访问当前JSP页面时是否会创建HttpSession对象,默认值是true

extends属性:设置JSP页面翻译出来的Java类默认继承谁

注意:以上默认值除非有特殊需要,否则不建议修改


四、JSP中的常用脚本

1. 声明脚本

格式:<%! 声明Java代码 %>

作用:可以给JSP翻译出来的Java类定义属性、方法、静态代码块、内部类等

特点:不会在浏览器的页面上显示出来,仅存在于翻译后的Java类中


代码演示:声明脚本的使用(此JSP文件在web目录下,名为First.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--1.声明类属性--%>
    <%!
        private String name;
        private static Map<String, Object> map;
    %>
    <%--2.声明类方法--%>
    <%!
        public int sum() {
            return 12;
        }
    %>
    <%--3.声明静态代码块--%>
    <%!
        static {
            map = new HashMap<String, Object>();
            map.put("key1", "value1");
        }
    %>
</body>
</html>

对应的翻译后的java源文件:

e0e3bd64c4bca7fda0e4d0cf289636b7.png


2. 表达式脚

格式:<%=表达式 %>

作用:在浏览器的JSP页面上输出数据(只有此脚本可以在浏览器的页面上输出数据)

特点:

(1) 所有的表达式脚本都会被翻译到对应的Java类的_jspService()方法中,故表达式脚本可以 直接使用_jspService()方法参数中的对象

(2) 表达式脚本都会被编译后的Java类中的out.print()方法输出到浏览器页面上

(3) 表达式脚本中的表达式不能以分号结束


代码演示:表达式脚本的使用(此JSP文件在web目录下,名为First.jsp)

<%=22 %> <br/>
<%="可以输出字符串" %> <br/>
<%=map %> <br/>
<%--使用_jspSe=rvice方法中的对象--%>
<%=request.getParameter("username") %>

启动Tomcat服务器后浏览器的运行结果:

196899fd7c7129475421684e8e1174d3.png


对应的翻译后的Java源文件(在_jspService方法中):


b8d4c80615de65f8c343b7b0e621b9a1.png

注意:


write方法中的标签、转义字符自动识别为对应的

功能,不在页面输出,执行各自代表的功能

out的两个方法也在_jspService方法中,也都是java语言

只有print、write方法、表达式脚本中的内容才可在浏览器中显示,其余Java代码的sout在控制台输出

3. 代码脚本

格式:<% Java语句 %>

作用:在JSP页面中可以编写需要的Java代码

特点:

(1) 代码脚本翻译后都在_jspService方法中,故代码脚本可以直接使用此方法参数中的对象

(2) 可以由多个代码脚本块组合完成一个完整的Java语句

(3) 代码脚本还可以和表达式脚本一起组合使用,在JSP页面上输出数据


代码演示:代码脚本的使用(此JSP文件在web目录下,名为First.jsp)


<%--1.if语句--%>
<%
    int i = 1;
    if (i == 1) {
        System.out.println("我爱祖国!");
    } else {
        System.out.println("我很爱祖国!");
    }
%> <br/>
<%--2.for循环语句--%>
<%
    for (int j = 0 ; j < 3; j++) {
        System.out.println("第" + j + "次循环");
    }
%> <br/>
<%--3.使用_jspService方法参数中的对象--%>
<%
    String username = request.getParameter("username");
    System.out.println("username对应的值为:" + username);
%>

运行结果:

启动Tomcat服务器后在地址栏输入:http://localhost:8080/MyTest/First.jsp?username=Jaychou


对应的翻译后的Java源文件(在_jspService方法中):

image-20230420214046289.png


五、JSP三种注释

HTML注释:<!--HTML注释-->

HTML注释会被翻译到JSP文件对应的Java类的_jspService方法中,以out.write()输出到客户端,

write方法会自动识别标签,执行标签对应的功能,不会在浏览器的页面上输出注释

Java注释:(1) //单行注释 (2) /*多行注释*/

Java注释要写在声明脚本和代码脚本中才被认为是Java注释,会被翻译到JSP文件对应的Java类的_jspService方法中,在对应的Java类中也是注释

JSP注释:<%- -这是JSP注释- -%>

JSP注释中的内容不会在JSP文件翻译后的Java类中出现,即注释中的内容没有任何功能

六、JSP九大内置对象

JSP的内置对象指的是Tomcat服务器将JSP页面翻译为Java类之后内部提供的九大对象:

(将page指令的isErrorPage属性写成true可以出现exception对象)


82160ccde0f006d19d160f7b9169abad.png


request:请求对象

response:响应对象

pageContext:JSP的上下文对象

session:会话对象

application:ServletContext对象

config:ServletConfig对象

out:JSP输出流对象

page:指向当前JSP的对象

exception:异常对象


七、JSP四大域对象

d0282d20d606a6031bf6d649854c56b3.png

域对象是指可以像Map一样存取数据的对象,四个域对象功能一样,只是对数据的存取范围不同


代码演示1:四个域对象存取数据的范围的不同(在web目录下创建scope1.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope1</title>
</head>
<body>
    <h1>scope1.jsp页面</h1>
    <%
        //向四个域对象中分别保存数据
        pageContext.setAttribute("key", "pageContext");
        request.setAttribute("key", "request");
        session.setAttribute("key", "session");
        application.setAttribute("key", "application");
    %>
    <%-- <jsp:forward page=""></jsp:forward>是请求转发标签,
         page属性设置请求转发的路径 --%>
    <jsp:forward page="/scope2.jsp"></jsp:forward>
</body>

代码演示2:在web目录下创建scope2.jsp

<head>
    <title>Title</title>
</head>
<body>
    <h1>scope2.jsp页面</h1>
    <%-- JSP页面中不加任何标签直接输入的内容被write方法输出在浏览器的页面上   --%>
    pageContext域是否有值:<%=pageContext.getAttribute("key")%> <br>
    request域是否有值:<%=request.getAttribute("key")%> <br>
    session域是否有值:<%=session.getAttribute("key")%> <br>
    application域是否有值:<%=application.getAttribute("key")%> <br>
</body>

运行结果1:


5c8c800025ac21faad683f986be9f0a4.png


八、JSP的out输出和response.getWriter输出的异同

相同点:response表示响应,用于给客户端(浏览器)返回内容

out同样也是用于给客户端(浏览器)输出内容


不同点:

image-20230421140703865.png


注意:由于官方的代码中翻译后的Java代码底层都是使用out进行输出,故一般都使用out进行 输出,out又分为write方法和print方法:

(1) out.print():会将任何内容转换成字符串后调用write方法输出

(2) out.write():输出字符串没有问题,但输出int型时会将int转换成char输出,导致输出的并非是想要的数字而是数字对应的ASCII码

结论:JSP页面的代码脚本中任何要输出在浏览器的内容均使用out.print()方法


九、JSP的常用标签

1. 静态包含

(1)使用场景:


eef968db083d1fd8eb81a386edad9f53.png


(2)使用方法:

<%@include file=“”%>

其中file属性设置要包含的JSP页面,以/打头,代表http://ip:port/工程路径/,对应web目录


代码演示1:在web目录下创建body.jsp

<body>
    头部信息 <br>
    主体信息 <br>
    <%@include file="/foot.jsp"%>
</body>

代码演示2:在web目录下创建foot.jsp

<body>
    页脚信息 <br>
</body>

运行结果:


e484eaab397a153da3d3d5111c2111e0.png


(3)静态包含的特点:

①静态包含不会将被包含的JSP页面翻译成.java.class文件

②静态包含是把被包含的页面的代码拷贝到body.jsp对应的Java文件的对应位置执行输出


2. 动态包含

(1)使用方法:

<jsp:include page=””></jsp:include>

其中page属性设置要包含的JSP页面,与静态包含一致


(2)动态包含的特点:

①动态包含将被包含的JSP页面翻译成.java.class文件

②动态包含还可以传递参数

③动态包含底层使用如下代码调用被包含的JSP页面执行输出:

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, “/foot.jsp”, out, false);


代码演示1:在web目录下创建body.jsp

<body>
    头部信息 <br>
    主体信息 <br>
    <jsp:include page="/foot.jsp">
        <jsp:param name="username" value="Jaychou"/>
        <jsp:param name="password" value="root"/>
    </jsp:include>
</body>

注意:


设置参数的标签要写在动态包含之中

出现Expecting “jsp:param” standard action with “name” and “value” attributes异常,两个原因:

①动态包含中未设置参数但没有把<jsp:include page=””></jsp:include>放在一行上

②动态包含中加了注释

代码演示2:在web目录下创建foot.jsp

<body>
    页脚信息 <br>
    <%=request.getParameter("username")%>
</body>

运行结果:


099d5213d5156ce662bf8466e22eadd7.png


(3)动态包含的底层原理:

image-20230421140703865.png


2. ServletContextListener监听器

ServletContextListener监听器可以监听ServletContext对象的创建和销毁(web工程启动时创建,停止时销毁),监听到创建和销毁之后都会调用ServletContextListener监听器的方法进行反馈:


public interface ServletContextListener extends EventListener {
    //在ServletContext对象创建之后调用
    public void contextInitialized(ServletContextEvent sce);
    //在ServletContext对象销毁之后调用
    public void contextDestroyed(ServletContextEvent sce);
}
123456

3. ServletContextListener监听器的使用步骤

(1) 编写一个类实现ServletContextListener接口

(2) 重写两个方法

(3) 在web.xml文件中配置监听器

代码演示1:创建一个类

public class ListenerTest implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象创建");
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象销毁");
    }
}

代码演示2:在web.xml中配置

<listener>
    <!-- <listener-class>标签中写上述程序的全类名 -->
    <listener-class>com.qizegao.servlet.ListenerTest</listener-class>
</listener>

运行结果:

Tomcat服务器启动之后控制台输出ServletContext对象创建

Tomcat服务器停止之后控制台输出ServletContext对象销毁


注意:


查看翻译后的Java源文件的方法:启动Tomcat服务器访问到JSP页面之后在控制台输出的信息的前端找到Using CATALINA_BASE中的路径,在硬盘中打开此目录,点击work --> Catalina --> localhost,找到对应的工程文件夹寻找即可

访问JSP页面其实是在执行对应的翻译后的Java代码的_jspService方法:翻译后的Java类中没有service方法,而是重写了父类的_jspService方法,这个方法会被父类的service方法调用


目录
相关文章
|
6月前
|
存储 缓存 Java
JSP九大内置对象及基本使用
JSP九大内置对象及基本使用
142 0
|
6月前
|
Java
JSP 教程 之 JSP 语法 13
JSP教程介绍了JSP的基础语法,包括Java的for、while和do...while循环。示例展示了如何使用这些循环控制字体大小。for循环代码显示不同大小的&quot;百度&quot;,while循环版本则因初始 fontSize 为0而多输出一行。
35 2
|
6月前
|
Java
JSP 教程 之 JSP 语法 15
JSP教程简述基础语法,包括支持的Java运算符,如一元、可乘性、可加性等,遵循特定结合性。同时,JSP有布尔、整型、浮点型、字符串和Null字面量。
37 1
|
6月前
|
XML Java 数据格式
JSP 教程 之 JSP 语法 3
**JSP语法简述:**了解JSP声明,用于声明变量和方法,如`&lt;%! int i = 0; %&gt;`, 先声明后使用。也可用XML格式 `&lt;jsp:declaration&gt;...&lt;/jsp:declaration&gt;`。
38 4
|
6月前
|
Java
JSP 教程 之 JSP 语法 14
`JSP语法基础涵盖Java运算符:从后缀()[] .到逻辑&&和||,包括一元++、-,算术* / %,比较&gt; &lt;,位操作符,赋值= +=等,以及条件?:,遵循特定结合性。`
36 1
|
6月前
|
Java
JSP 教程 之 JSP 语法 2
JSP教程简述基础语法,包括解决中文编码问题。在JSP文件头部添加`&lt;%@ page ... charset=UTF-8 %&gt;`和`&lt;meta charset=&quot;utf-8&quot;&gt;`确保中文显示正常。示例代码展示如何输出&quot;Hello World!&quot;及访问者的IP地址。
33 4
|
6月前
|
XML Java 应用服务中间件
JSP 教程 之 JSP 语法 1
JSP教程介绍了基础语法,包括脚本程序的使用,允许插入Java代码。示例展示了一个简单的&quot;Hello World&quot;页面,显示用户IP。要运行,需确保Apache Tomcat已安装并配置好,将代码保存为hello.jsp,放在指定目录下,通过http://localhost:8080/hello.jsp访问。
43 4
|
6月前
|
Java API
JSP 教程 之 JSP 语法 11
JSP教程介绍了基础语法,包括Java语言的全面支持。示例展示了如何使用if...else和switch...case控制流语句。if...else示例显示非周末情况,switch...case示例根据变量`day`输出对应星期,当`day`为3时输出“星期三”。
40 1
|
6月前
|
Java API
JSP 教程 之 JSP 语法 10
JSP语法教程简述了基础概念,强调JSP支持全套Java控制流。示例展示了如何使用`if...else`判断语句:根据变量`day`值决定显示“今天是周末”或“今天不是周末”。代码以`&lt;%@...%&gt;`指令开始,设定页面属性,接着是`&lt;%!...%&gt;`声明变量,最后`&lt;%...%&gt;`内执行条件判断。结果输出“今天不是周末”。
32 1
|
6月前
|
Java
JSP 教程 之 JSP 语法 6
JSP教程简述基础语法,包括注释和输出日期。注释类型有隐藏的JSP注释(&lt;%-- --%&gt;)和HTML注释。示例显示当前日期如&quot;2024-05-18 08:40:07&quot;。语法亮点:JSP表达式&lt;%= %&gt;用于输出,静态代码使用&lt;% %&gt;和&lt;%常量 %\&gt;。属性值内单引号(&#39;)和双引号(&quot;)需转义。
22 1