JSP的基本使用总结_Nice2cu_Code的博客-程序员信息网_jsp用法

技术标签: java  tomcat  jsp  servlet  Java后端总结与心得  

JSP的使用

还可以看看博主的其他文章:

MySQL的时使用,看这篇就够了,传送地址:MySQL必知必会
Servlet服务器必知必会,传送地址:初学Servlet服务器,看这篇就够了

一、JSP的介绍与创建

  1. JSP的全称是Java Server Pages,即Java的服务器页面
  2. JSP的主要作用是代替Servlet程序回传HTML页面的数据
  3. web目录(或其他)右击 --> new --> JSP/JSPX --> 输入文件名 --> 选择JSP file创建

二、JSP的本质

JSP页面本质上是一个Servlet程序,第一次访问JSP页面时(运行Tomcat服务器后在浏览器地址栏输入路径),Tomcat服务器会将此JSP页面翻译成为一个Java源文件,并对其进行编译成为.class字节码文件(一个.java,一个.class),当打开.java文件时发现其中的内容是:
在这里插入图片描述
而HttpJspBase类直接继承于HttpServlet类,即JSP翻译出来的Java类间接继承于HttpServlet类,证明JSP页面是一个Servlet程序

三、JSP的语法

JSP头部的page指令:
在这里插入图片描述
JSP头部的page指令可以修改JSP页面中的一些重要属性或行为
(以下属性均写在page指令中,默认page指令中没有出现的属性都采用默认值):

(1) contentType属性:表示JSP返回的数据类型是什么,即response.setContentType()的参数值
(2) language属性:表示JSP翻译之后是什么语言文件(目前只支持Java)
(3) pageEncoding属性:表示当前JSP文件本身的字符集(可在IDEA右下角看到)
(4) import属性:表示导包(导类),与Java一致
(5) autoFlush属性:设置当out输出流缓冲区满了之后是否自动刷新缓冲区,默认值是true
(6) buffer属性:设置out缓冲区的大小,默认是8kb
注意:out缓冲区满了之后不能自动刷新的话会报错
(7) errorPage属性:设置当JSP页面运行出错时自动跳转到的页面(错误信息页面)的路径,这个 路径一般都是以斜杠打头,表示请求的地址是http://ip:port/工程路径/,对应代码web目录
(8) isErrorPage属性:设置当前JSP页面是否是错误信息页面,默认是false,如果是true可以 获取错误信息
(9) session属性:设置访问当前JSP页面时是否会创建HttpSession对象,默认值是true
(10) 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源文件:
在这里插入图片描述

2. 表达式脚本

格式:<%=表达式 %>
作用:在浏览器的JSP页面上输出数据(只有此脚本可以在浏览器的页面上输出数据)
特点:
(1) 所有的表达式脚本都会被翻译到对应的Java类的_jspService()方法中,故表达式脚本可以 直接使用_jspService()方法参数中的对象
(2) 表达式脚本都会被编译后的Java类中的out.print()方法输出到浏览器页面上
(3) 表达式脚本中的表达式不能以分号结束

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

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

启动Tomcat服务器后浏览器的运行结果:
在这里插入图片描述
对应的翻译后的Java源文件(在_jspService方法中):
在这里插入图片描述
注意:

  1. write方法中的标签、转义字符自动识别为对应的
    功能,不在页面输出,执行各自代表的功能

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

  3. 只有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方法中):
在这里插入图片描述

五、JSP三种注释

  1. HTML注释:<!--HTML注释-->
    HTML注释会被翻译到JSP文件对应的Java类的_jspService方法中,以out.write()输出到客户端,
    write方法会自动识别标签,执行标签对应的功能,不会在浏览器的页面上输出注释
  2. Java注释:(1) //单行注释 (2) /*多行注释*/
    Java注释要写在声明脚本和代码脚本中才被认为是Java注释,会被翻译到JSP文件对应的Java类的_jspService方法中,在对应的Java类中也是注释
  3. JSP注释:<%- -这是JSP注释- -%>
    JSP注释中的内容不会在JSP文件翻译后的Java类中出现,即注释中的内容没有任何功能

六、JSP九大内置对象

JSP的内置对象指的是Tomcat服务器将JSP页面翻译为Java类之后内部提供的九大对象:
(将page指令的isErrorPage属性写成true可以出现exception对象)
在这里插入图片描述
request:请求对象
response:响应对象
pageContext:JSP的上下文对象
session:会话对象
application:ServletContext对象
config:ServletConfig对象
out:JSP输出流对象
page:指向当前JSP的对象
exception:异常对象

七、JSP四大域对象

在这里插入图片描述
域对象是指可以像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:
在这里插入图片描述
运行结果2:
在这里插入图片描述
注意:若四个域对象在使用时范围都可满足要求,则使用的优先顺序是(范围从小到大):
pageContext --> request --> session --> application

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

  1. 相同点:response表示响应,用于给客户端(浏览器)返回内容
    out同样也是用于给客户端(浏览器)输出内容
  2. 不同点:
    在这里插入图片描述
  3. 注意:由于官方的代码中翻译后的Java代码底层都是使用out进行输出,故一般都使用out进行 输出,out又分为write方法和print方法:
    (1) out.print():会将任何内容转换成字符串后调用write方法输出
    (2) out.write():输出字符串没有问题,但输出int型时会将int转换成char输出,导致输出的并非是想要的数字而是数字对应的ASCII码
    结论:JSP页面的代码脚本中任何要输出在浏览器的内容均使用out.print()方法

九、JSP的常用标签

1. 静态包含

(1)使用场景:
在这里插入图片描述
(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>

运行结果:
在这里插入图片描述
(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>

注意:

  1. 设置参数的标签要写在动态包含之中
  2. 出现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>

运行结果:
在这里插入图片描述
(3)动态包含的底层原理:
在这里插入图片描述

十、ServletContextListener监听器

1. Listener监听器的介绍

(1) Listener监听器是JavaWeb的三大组件之一
(2) Listener监听器是JavaEE的规范(接口)
(3) Listener监听器的作用是监听某件事物的变化,然后通过回调函数反馈给程序做一些处理

2. ServletContextListener监听器

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

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

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对象销毁

注意:

  1. 查看翻译后的Java源文件的方法:启动Tomcat服务器访问到JSP页面之后在控制台输出的信息的前端找到Using CATALINA_BASE中的路径,在硬盘中打开此目录,点击work --> Catalina --> localhost,找到对应的工程文件夹寻找即可
  2. 访问JSP页面其实是在执行对应的翻译后的Java代码的_jspService方法:翻译后的Java类中没有service方法,而是重写了父类的_jspService方法,这个方法会被父类的service方法调用
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_49343190/article/details/107932765

智能推荐

关于 VMware 的 VMnet 0/1/8_我来烤烤你的博客-程序员信息网_vmnet0

关于 VMware 的 VMnet 0/1/8NAT模式?桥接模式?仅主机模式?桥接:与host具有完全同等地位,共享网络空间NAT:host是宿主机,旗下所有虚拟机能通过SNAT访问外网仅主机:host是宿主机,通过DHCP为所有slave分配IP(只能在dhcp指定的网段内通信)# 补充:仅主机模式加上NAT功能就等于NAT模式=VMware菜单【编辑】&gt; 虚拟网络编辑器 &gt;&gt; VMnet 0/1/8 三项分别是什么?答:这是开启了虚拟机之后默认生成的 3

Android:获得屏幕物理尺寸、密度及分辨率_sunguodong1001的博客-程序员信息网

一、分辨率需要注意的原来经常使用的getHeight()与getWidth()已经不推荐使用了,建议使用getSize()来替代。此方法原型如下:[java] view plain copy public void getSize(Point outSize) {      synchronized (this) {         

Python开发第三篇_蜗牛你慢点Ⅷ的博客-程序员信息网

函数一、函数参数传值形参:函数在定义的时候给定的参数实参:函数在运行时赋给的参数:1 def func(i):#i为定义时的参数,为形参2 pass3 func(name)#name为运行时的参数,为实参,实参与形参的名字可以相同传值方式:位置传值:按照定义时的顺序,用实参给形参赋值 1 def func(x,y,z): 2 print(&quot;x-...

基于机器学习的UEBA在账号异常检测中的应用_Rnan-prince的博客-程序员信息网_ueba算法

UEBA​ UEBA用户实体行为分析,更多UEBA相关概念参考《UEBA白皮书》UEBA的核心点1.跨越SIEM/ROC产品,UEBA产品考虑更多的数据源。​ 从网络设备、系统、应用、数据库和用户处收集数据,有更多的数据,是其成功的条件之一。2.数据驱动,但并不是单纯依靠数据驱动。一般都是数据驱动+专家驱动的混合系统。单纯的数据驱动的问题:​ 1.在学习之处很难拿到十分完善的数据,每当有新的数据源都需要重新进行学习,对于工程化来说是一场灾难​ 2.增加features很

python3_将多个.py文件打包成exe程序并添加图标_檬柠wan的博客-程序员信息网_python打包带图标

一、安装pyinstaller打开DOS窗口输入以下命令:pip install pyinstaller二、打包1、准备打包的文件打包的项目为Tkinter目录下的所有python文件,其中test.py为主文件2、打包流程① 生成主函数对应的spec文件,命令在Tkinter路径下使用:pyi-makespec test.py执行命令后,Tkinter目录下会生成test.spec文件② 修改spec文件,加入需要打包的所有python文件spec文件中主要包含4个clas

基于深度学习的计算机视觉垃圾分类系统_biyezuopinvip的博客-程序员信息网_基于深度学习的垃圾分类

基于深度学习的计算机视觉 - 垃圾分类(附源码)1. 实验介绍1.1 实验背景自今年 7 月 1 日起,上海市将正式实施 《上海市生活垃圾管理条例》。垃圾分类,看似是微不足道的“小事”,实则关系到13亿多人生活环境的改善,理应大力提倡。垃圾识别分类数据集中包括玻璃 (glass) 、硬纸板 (cardboard) 、金属 (metal) 、纸 (paper) 、塑料 (plastic) 、一般垃圾 (trash) ,共6个类别。生活垃圾由于种类繁多,具体分类缺乏统一标准,大多人在实际操作时会“选

随便推点

linux中的raid_asd0351992的博客-程序员信息网

参考文档 http://www.cnblogs.com/ivictor/p/6099807.html制作raid5 http://blog.51cto.com/11134648/2103384RAID 0又称为Stripe或Striping,它代表了所有RAID级别中最高的存储性能。RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求...

Java运算如何确保精度(BigDecimal)_醺泽的博客-程序员信息网_bigdecimal如何保证精度的

Java运算如何确保精度(BigDecimal)在Java中使用浮点型数字进行运算,可能会出现误差等问题,为提高算数精度,避免计算误差,我们采用BigDecimal类加以描述。BigDecimal类的含义为:不可变的,任意精度的带符号十进制数。BigDecimal的高精度的原理:浮点型数值运算时发生精度丢失的原因是,在二进制存储中,正数部分其存储单元并非相连的,而是随着数值的增大,存储位置也在变大,这样在整数运算中由于二进制占有的部分的增多,就会导致其出现运算误差,但如果将其小数部分转换成整数,通过整

一个计算机专业学生几年的编程经验汇总(转)(二)_小小IT墨鱼的博客-程序员信息网

Java杂谈(四)         不知不觉已经写到第四篇了,论坛里面不断的有朋友鼓励我写下去。坚持自己的作风,把一切迷惑不容易理清楚的知识讲出来,讲到大家都能听懂,那么自己就真的懂了。最近在公司实习的时候Trainer跟我讲了很多经典事迹,对还未毕业的我来说是笔不小的财富,我自己的信念是:人在逆境中成长的速度要远远快过顺境中,这样来看一切都能欣然接受了。        好了,闲话不说了,第三篇讲

pytorch中Linear类中weight的形状问题源码探讨_墨氲的博客-程序员信息网_ptorch linear指定weigh和bais

import torchfrom torch import nnm = nn.Linear(20, 30)input = torch.randn(128, 20)output = m(input)print(output.size())print(m.weight.shape)来看一下输出:out:torch.Size([128, 30])torch.Size([30,...

推荐文章

热门文章

相关标签