JSP小结
正文
1. JSP的概念
- JSP 是 Sun Microsystems 公司的一种规范,它将 Java 与 HTML 相结合。
- JSP 是使用Java 开发基于 Web 的应用程序不可或缺的部分
- JSP 可结合其他Java 组件一起使用
2. JSP运行方式
- 在浏览器输入:http://www.ysu.edu.cn,此时浏览器向服务器发送请求。
- url包括4部分:http(协议)、主机名(ysu.edu.cn)、端口号(http默认80)、文件名(缺省情况下会给,比如index.htm)
- Web Server处理Http请求
- 将文件内容(html)返回
-
Web Server只能处理html请求,如果请求的是jsp文件,此时,需要增加Application Server,Web Server把请求转发给Application Server
- Application Server处理jsp请求,将处理结果以html的形式返回给Web Server。
- Web Server将结果返回给浏览器
- Application Server在接收到jsp(test.jsp)请求后
- 将test.jsp转换为纯Java程序test_jsp.java
- 编译test_jsp.java,生成类文件,test_jsp.class
- 生成test_jsp类的对象(该对象处理客户端请求)
- 将该对象初始化(调用该对象的init()方法)
- 处理请求,返回html (调用该对象的service()方法)
- 该对象一直存在,直到Application Server退出
- 由上述处理过程可知,在第一次访问test.jsp文件后,就创建了该类的对象提供服务,因此,从第二次访问开始,将直接执行service()方法,无需重复创建
- 一个JSP程序的执行经历了初始化、服务、退出三个步骤。
- init() 初始化
- service() 执行服务
- destroy() 退出
- 当一个JSP程序要运行时,首先被编译为一个Servlet,作为一个Servlet运行。
- Servlet声明周期
- JSP的优点
- 编写一次,随处运行(和java一样)
- 组件和标记库的重用
- 动态内容与静态内容的分离
- 对脚本和动作的支持
- 多层企业应用程序体系结构的 Web 访问层
- 表示与实现的分离
- 持久性,只加载一次,与CGI、ASP相比速度快(最关键)
3. JSP指令
3.1 JSP简介
- 将有关页面的特殊处理信息传送到JSP容器
<%@ directive-name attribute-name=attribute-value attribute-name=attribute-value … %>
3.2 Jsp 类型
-
include 指令
- 使页面能将一个文件的内容包括在另一个文件中
- <%@ include file="localURL" %>
- 出现在一个 JSP 页面中的 include 指令的数量不受限制
-
page 指令
-
page 指令将页面特定的信息传递给 JSP 引擎
-
<@ page attribute = "value1" attribute2 = "value2" attribute3 =… %> -
page 属性
- info
- language 一般写java
- contentType 内容类型, text/html等
- extends 由哪些类派生
- import 导入包
- session
- buffer
- autoFlush
- isThreadSafe
- errorPage 错误由谁处理
- isErrorPage 表明当前页面是否为异常处理界面
-
-
taglib 指令
-
通知 JSP 容器,页面依赖于自定义标记库
-
标记库是扩展 JSP 的功能的自定义标记的集合
-
<%@ taglib uri = "tagLibraryURI" prefix = "tagPrefix" %>
-
4. JSP脚本元素
-
使开发者能直接将代码嵌入 JSP 页面
-
类型:
-
声明
-
代码段
-
表达式
-
4.1 声明<%! declaration %>
-
用于定义特定于 JSP 页面的变量和方法
-
语法:<%! declaration %>
-
声明的类型
-
–变量声明
-
定义为声明的变量成了 JSP 页面被转换和编译到的 servlet 类的实例变量
-
<%! private int x=0, y=0; String name = ""; %>
-
-
–方法声明
-
定义的方法将编译成的 Servlet 类的方法
-
可以由页面上所有脚本元素访问
-
<%! public int max (int x,int y) { if (x > y ) return x ; else return y ; } %>
-
-
–或者是一个内部类
-
4.2 表达式<%= expression %>
- 包含任何语言表达式
- 语法: <%= expression %>
- 不以分号结束
- 用于输出单个变量或某个计算的结果
- <%= 5 * 6 %>
4.3 代码段<% code %>
-
包含一个或多个有效而完整的语句
-
语法: <% // 这里是 Java 代码 %>
-
只要是合法即可,不一定非要完整,如下
-
<% String name= null; name = request.getParameter(“name”); if(name == null) { %>
4.4 三者的区别(Target)
- 变量声明后面必须带分号
- 表达式可以包含任何语言表达式,并不以分号结束
- 代码段中,如果语言要求语句以分号结束,则必须提供分号
- Jsp程序最终会转换为 java程序,这三者转换之后的代码是不一样的
下面,我们通过具体的代码,分析表达式,代码段,以及变量声明的区别
<%@ page language="java"%> <%! int declareVar = 10; int max(int x, int y) { return x > y ? x : y; } int maxArray(int[] a) { int ret = a[0]; for (int i = 1; i < a.length; i ++ ) { ret = max(ret, a[i]); } return ret; } String PrintArray(int []a) { String ret = "The array info:a[0]=" + a[0]; for (int i = 1; i < a.length; i ++ ) { ret = ret + " ,a[" + i + "]=" + a[i]; } return ret; } %> <% int codeSegVar = 0; %> <html lang="en"> <head> <meta charset="UTF-8"> <title>CalMax</title> </head> <body> <% int[] a = new int[5]; a[0] = 3; a[1] = 7; a[2] = -10; a[3] = 10; a[4] = 8; %> <%=PrintArray(a)%><br /> <!--输出原数组的信息 --> <%PrintArray(a);%><br /> <% int t = 3+5; %> <%= 3 + 5 %> Max=<%=maxArray(a)%> <!--不以分号结束--> </body> </html>
在上述代码中,我们引入了在 声明脚本元素中,声明变量、函数,
在代码段中声明声明变量和运行函数
在表达式中运行函数,做一些简单的运算,下面我们查看一下运行的结果。
同时我们发现一个有趣的事情 5 + 6; 13; 直接放在java里面是会报错的!!
通过阅读编译之后的java 文件可以发现
- 声明的语句直接放在类面的,而且他们不是protected public private这三种,而是java里面的第四种,缺省
- 表达式和代码段都是放在主函数里,但是表达式 直接输出到了 html 里面
- 然后代码段却是作为了service函数中的语句, service函数中前面有介绍,处理请求调用的是service方法
- 我们输出的规则,其实就是他们作为java文件中组成成分的规则
由此,我们不难辨别,在声明中声明变量和在代码段中声明变量的区别:
- 在声明中声明变量是 方法变量
- 在代码段中声明变量属于局部变量
5. 使用TomCat进行检验
求数组的最大值
<%@ page language="java"%> <%! int max(int x, int y) { return x > y ? x : y; } int maxArray(int[] a) { int ret = a[0]; for (int i = 1; i < a.length; i ++ ) { ret = max(ret, a[i]); } return ret; } String PrintArray(int []a) { String ret = "The array info:a[0]=" + a[0]; for (int i = 1; i < a.length; i ++ ) { ret = ret + " ,a[" + i + "]=" + a[i]; } return ret; } %> <html lang="en"> <head> <meta charset="UTF-8"> <title>CalMax</title> </head> <body> <% int[] a = new int[5]; a[0] = 3; a[1] = 7; a[2] = -10; a[3] = 10; a[4] = 8; %> <%=PrintArray(a)%><br /> <!--输出原数组的信息 --> Max=<%=maxArray(a)%> </body> </html>
安装TomCat的话,参考下面链接
下面我们讨论一下如何运行
-
windows + r --> services.msc 进入服务之后,我们打开Apache Tomcat的那个服务
-
服务打开之后
- 我们将写好的 文件名.jsp 文件复制到 Tomcat安装目录下面的
- webapps -> ROOT -> 里面即可
- 我们将写好的 文件名.jsp 文件复制到 Tomcat安装目录下面的
-
之后,我们打开任意浏览器输入
-
localhost:8086/文件名.jsp 回车即可
-
注: localhost:8086可以直接进入,查看tomcat是否安装成功
-
-
最后,我们可以查看 JSP文件生成的 Java文件和 class 文件
- 文件在安装 tomcat 目录下面的word文件夹
- work\Catalina\localhost\ROOT\org\apache\jsp
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!