经典技术回顾和借鉴-JSP编程 jsp技术概述
yuyutoo 2024-11-06 21:00 4 浏览 0 评论
前言:在CGI(通用网关接口)编程风行的日子,人们纷纷寻思简化并让其更加灵活的新方法和新技术,包括PHP、JSP、ASP。1997年SUN公司推出了servlet,1999年初,SUN公司推出了JSP,实际上在servlet基础上修改而成。JSP即Java服务器页面(Java Server Page),将HTML和JAVA代码使用某种方式结合起来,完成前后端的有效交互。本文通过JSP历史回顾和应用总结来审视过去和开拓未来。
1.从实例项目入手
其实,从现在看来JSP依然极具魅力,据了解很多JSP老项目还在维护。下面使用STS作为IDE构建一个实例项目,先体验其效果。
1.1 动态web项目模板
如下图,使用new dynamic web project创建项目:
1.2修改文件编码
进入preferences修改JSP文件的编码:
1.3 编写简单的JSP文件
新增一个JSP文件到WebContent目录,如下
然后检查并修改编码,应该都是UTF-8,如下图:
如果不是,就修改。
1.4运行和测试
选中项目名称,点邮件菜单的Run as ...-->Run on server
之后出现如下界面:
若没有现存的tomcat server,就自己加一个。点Finish。然后自动调用chrome,界面如下:
自动调用浏览器设置的地方是windows-->Web browser菜单:
1.5增加功能:显示IP地址
(1)显示ip地址:getRemoteAddr
(2)变量声明<%! %>
(3)表达式<%=%>
2.JSP语言介绍
2.1语法
语法 | 描述 |
<%-- 注释 --%> | JSP注释,注释内容不会被发送至浏览器甚至不会被编译 |
<!-- 注释 --> | HTML注释,通过浏览器查看网页源代码时可以看见注释内容 |
<\% | 代表静态 <%常量 |
%\> | 代表静态 %> 常量 |
\' | 在属性中使用的单引号 |
\" | 在属性中使用的双引号 |
2.2指令
指令 | 描述 |
<%@ page ... %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include ... %> | 包含其他文件 |
<%@ taglib ... %> | 引入标签库的定义,可以是自定义标签 |
2.3Page指令属性
属性 | 描述 |
buffer | 指定out对象使用缓冲区的大小 |
autoFlush | 控制out对象的 缓存区 |
contentType | 指定当前JSP页面的MIME类型和字符编码 |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
extends | 指定servlet从哪一个类继承 |
import | 导入要使用的Java类 |
info | 定义JSP页面的描述信息 |
isThreadSafe | 指定对JSP页面的访问是否为线程安全 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 指定JSP页面是否使用session |
isELIgnored | 指定是否执行EL表达式 |
isScriptingEnabled | 确定脚本元素能否被使用 |
2.4行为标签
行为标签语法:<jsp:行为名称 attribute="value" />
语法 | 描述 |
jsp:include | 用于在当前页面中包含静态或动态资源 |
jsp:useBean | 寻找和初始化一个JavaBean组件 |
jsp:setProperty | 设置 JavaBean组件的值 |
jsp:getProperty | 将 JavaBean组件的值插入到 output中 |
jsp:forward | 从一个JSP文件向另一个文件传递一个包含用户请求的request对象 |
jsp:plugin | 用于在生成的HTML页面中包含Applet和JavaBean对象 |
jsp:element | 动态创建一个XML元素 |
jsp:attribute | 定义动态创建的XML元素的属性 |
jsp:body | 定义动态创建的XML元素的主体 |
jsp:text | 用于封装模板数据 |
使用bean是最好用的行为标签,例如,我们创建一个java类:
然后,在JSP中使用useBea/setProperty/getProperty三个行为标签:
测试:
2.5隐含对象(默认创建的对象)
对象 | 描述 |
request | HttpServletRequest类的实例 |
response | HttpServletResponse类的实例 |
out | PrintWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
2.6判断语句
判断语句包括两种:if else和switch case
示例如下:
2.7循环语句
循环语句包括两种:for和while
示例如下:
2.8运算符
类别 | 操作符 | 结合性 |
后缀 | () [] . (点运算符) | 左到右 |
一元 | ++ - - ! ~ | 右到左 |
可乘性 | * / % | 左到右 |
可加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | > >= < <= | 左到右 |
相等/不等 | == != | 左到右 |
位与 | & | 左到右 |
位异或 | ^ | 左到右 |
位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | || | 左到右 |
条件判断 | ?: | 右到左 |
赋值 | = += -= *= /= %= >>= <<= &= ^= |= | 右到左 |
逗号 | , | 左到右 |
2.9变量类型
布尔值(boolean):true 和 false;
整型(int):与 Java 中的一样;
浮点型(float):与 Java 中的一样;
字符串(string):以单引号或双引号开始和结束;
Null:null。
2.10表单处理
以下提供一个例子来说明:
(1)创建FormProcess.jsp文件:
其中提供了两个input输入框。
(2)再创建FormProcessMain.jsp文件,如下:
其中使用request对象的getParameter方法来获取Get参数。
2.11过滤器
JSP过滤器实际上和Servlet过滤器一样。
以下通过示例来说明:
(1)在web.xml中增加一个过滤器:
(2)然后创建过滤器处理类com.hunting.LogFilter,如下:
2.12JSTL(JSP标准标签库)
(1)核心标签:
标签 | 描述 |
<c:out> | 用于在JSP中显示数据,就像<%= ... > |
<c:set> | 用于保存数据 |
<c:remove> | 用于删除数据 |
<c:catch> | 用来处理产生错误的异常状况,并且将错误信息储存起来 |
<c:if> | 与我们在一般程序中用的if一样 |
<c:choose> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来判断条件是否成立 |
<c:otherwise> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach> | 基础迭代标签,接受多种集合类型 |
<c:forTokens> | 根据指定的分隔符来分隔内容并迭代输出 |
<c:param> | 用来给包含或重定向的页面传递参数 |
<c:redirect> | 重定向至一个新的URL. |
<c:url> | 使用可选的查询参数来创造一个URL |
(2)格式化标签:
标签 | 描述 |
<fmt:formatNumber> | 使用指定的格式或精度格式化数字 |
<fmt:parseNumber> | 解析一个代表着数字,货币或百分比的字符串 |
<fmt:formatDate> | 使用指定的风格或模式格式化日期和时间 |
<fmt:parseDate> | 解析一个代表着日期或时间的字符串 |
<fmt:bundle> | 绑定资源 |
<fmt:setLocale> | 指定地区 |
<fmt:setBundle> | 绑定资源 |
<fmt:timeZone> | 指定时区 |
<fmt:setTimeZone> | 指定时区 |
<fmt:message> | 显示资源配置文件信息 |
<fmt:requestEncoding> | 设置request的字符编码 |
(3)SQL标签:
标签 | 描述 |
<sql:setDataSource> | 指定数据源 |
<sql:query> | 运行SQL查询语句 |
<sql:update> | 运行SQL更新语句 |
<sql:param> | 将SQL语句中的参数设为指定值 |
<sql:dateParam> | 将SQL语句中的日期参数设为指定的java.util.Date 对象值 |
<sql:transaction> | 在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行 |
(4)XML标签:
标签 | 描述 |
<x:out> | 与<%= ... >,类似,不过只用于XPath表达式 |
<x:parse> | 解析 XML 数据 |
<x:set> | 设置XPath表达式 |
<x:if> | 判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体 |
<x:forEach> | 迭代XML文档中的节点 |
<x:choose> | <x:when>和<x:otherwise>的父标签 |
<x:when> | <x:choose>的子标签,用来进行条件判断 |
<x:otherwise> | <x:choose>的子标签,当<x:when>判断为false时被执行 |
<x:transform> | 将XSL转换应用在XML文档中 |
<x:param> | 与<x:transform>共同使用,用于设置XSL样式表 |
3.JSP历史
下面从前后端分离角度展现JSP的产生和发展脉络。
3.1互联网的产生
1957年美国国防部(DoD)组建了高级研究计划局(ARPA)。1961年7月,MIT工程师Leonard Kleinrock发表Information Flow in Large Communication Nets论文。1962年8月, MIT工程师J.C.R. Licklider和W. Clark发表On-Line Man Computer Communication论文。1967 2月,在ARPA IPTO PI会议上,Larry Roberts组织了有关ARPANET设计方案的讨论。互联网雏形ARPANET由此产生。
互联网最初的目的是访问和复制文件从一台计算机到另一台远程计算机,两台计算机之间有网络,但速度慢,而且经常专用于大学或者研究机构是昂贵的,不支持大规模用户。1970年,ARPANET主机开始使用网络控制协议(NCP),这就是后来的传输控制协议(TCP)的雏形。
人们基于TCP/IP构建了更快的网络,其中应用层文件传输协议(FTP)规范提供了交换这些文件的标准方法。1973年,文件传输协议(FTP)推出,用于在异构系统之间交换文件。FTP传输的文件并不能有效查看,因此发明了超文本标记语言(HTML),使我们能够在互联网上看到文档。
3.2万维网的产生
1989年蒂姆伯纳斯-李写了一份关于建立一个通过网络传输超文本系统的报告,其中创建了单行 HTTP 协议,这个协议在1991年被命名为HTTP/0.9,万维网由此产生,1996年超文本传送协议HTTP 1.0发布。
尽管FTP可以传输HTML文件,但是并没有提供有效小文件传输机制和无状态管理能力,超文本传输协议(HTTP)才被发明出来专门用于传输HTML文档,HTTP是一种无连接/无状态协议,这使得许多短连接更加有效,而且可以不使用密码就可以获取HTML文档,这让万维网真正到来,真正体现了互联网的快捷、免费思维。
3.3通用网关接口的产生
上面提到了TCP/IP,HTTP,FTP都是通信管道,后来大家把注意力转向内容。我们感兴趣的文件随着IT技术的发展而快速爆发,例如数据库快速发展导致各种应用系统快速发展。同时,数据的更新频度更加快速,这种即时信息推动了互联网流量快速增长。通过基于HTTP的HTML,最终用户可以浏览位于远程服务器上的文件。
当时,远程服务器属于局域网,局域网连接到互联网需要专用设备,可惜的是这种专用设备并不好用(直到后来路由器和交换机被思科发明出来),因此通用网关接口(CGI)规范被制定出来,它允许Web服务器超越文件服务器并从内部数据库中获取数据,并动态更改HTML。
最初,CGI是在1993年由美国国家超级电脑应用中心(NCSA)为NCSA HTTPd Web服务器开发的,当年NCSA内部有一份简单的CGI规范说明,后来在1997年Ken Coar领导的团队制定了CGI1.1规范,并提交RFC。CGI规范是Web应用程序开发中的一个重大突破,确保了相同的CGI程序在不同的Web服务器上工作。
CGI成为传递动态内容的最常用手段。只是互联网发展太快了,CGI的性能无法跟上,每个对CGI脚本的请求都会产生一个单独的进程。这种设计让CGI在高峰负载时也消耗大量资源。解决方案非常多,功能性和可伸缩性成为关键。
许多CGI替代者都采用服务器端编程技术来实现业务逻辑,包括ASP、ColdFusion、PHP和Perl等等,其中至今仍然在大量使用的是PHP ,PHP 继承自一个老的工程,名叫 PHP/FI,PHP/FI 在 1995 年由 Rasmus Lerdorf 创建,最初只是一套简单的 Perl 脚本,用来跟踪访问他主页的人。然后,即使是PHP,最终由于可移植性和面向对象的编程设计,Java超越了PHP和其他CGI平台。
3.4 JSP的产生
Java自1991年诞生以来已经走过了很长的一段路,当时Sun公司推出了“绿色计划”,试图集成数字消费设备,如电视机、CD播放机和计算机。OAK(名字来自高斯林窗外的一棵橡树!)诞生了,但直到出现HotJava和小程序,才开始活跃起来。1995年,Sun发布了开源Java,向微软发起了挑战,反响巨大。这促使Java深入到服务器端开发领域。
Sun在Java中加入了Internet功能,并在1997年6月发布了servlet接口。servlet以CGI替代为目标。与CGI为每个请求启动一个进程不同,servlet使用更细粒度的线程在单个进程中运行。servlet采用了更有效的体系架构,能够应对互联网上的复杂情况。Java servlet为开发Java Web组件提供了基础。servlet优点是每个额外的并发请求带来的额外开销非常小。
servlet技术需要真正的Java编程技能才能有效应用,外观和良好体验为web应用带来了巨大方便,但是图像支持还不是那么良好。于是Sun公司在1998年发布了JavaServer Pages (JSP),这来自于微软ASP的启发,也有些人说是复制的,它使得编写动态HTML页面变得容易。
使用JSP的使用非常简单,有些工具(例如Dreamweaver)能让非程序员来构建WWW网站前端页面,当然要servlet带动后端服务器代码(例如javabean)才能完成完整的WWW网站构建工作,这样构建的WWW网站具有模块化、可维护、可伸缩和可移植优点,从而完成简单网站到复杂Web应用程序的转变,从而实现前后端分离。
JSP官方版本1.0和1.1都出现在1999年,都很受欢迎,版本1.2出现于2001年,是目前最流行的实现。
3.5 Node的产生
JSP终究还是含有Java代码,前后端没有彻底分离,因此人们在2009年发明了node-js,这让前端开发人员崛起,他们单纯使用HTML+CSS+JavaScript前端语言就能完成前端页面的开发,而不需要使用含有各种后端交互印记的标签。
于是,基于node-js的React、Angela、VUE框架成为潮流。
相关推荐
- URL URI傻傻分不清楚,dart告诉你该怎么用
-
简介如果我们要访问一个网站,需要知道这个网站的地址,网站的地址一般被称为URL,他的全称是UniformResourceLocator。那么什么是URI呢?...
- 你最深爱的编程语言其实很烂
-
我最近写了几篇比较严肃的博客,是关于一些沮丧的事情,结果我开始有些忧郁。很严重。所以,我想应该说些比较轻松的事情。我要做的就是数落大家最喜欢的编程语言。你会问我为什么,为什么要搞这种恶作剧?亲爱的朋友...
- 路由器交换机基础配置6——命令行显示信息设置
-
一、控制命令行显示信息设备中的部分命令执行后会出现提示、警告、执行结果等显示信息,用户可以控制这些显示信息的显示方式,以方便阅读。1、提示和警告信息提供中、英文两种语言显示。可以通过language-...
- python是一种什么类型的编程语言
-
Python(英国发音:/'paθn/美国发音:/'paθɑn/)是一种广泛使用的解释型、高级编程、通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年。可以视之为一种改良(加入一些其他编程...
- 60年了,LISP语言的进化史是否会引发你对AI未来的新思考?
-
图:pixabay作为长期垄断AI领域的高级计算机语言程序,Lisp语言到底经过了怎样的变迁?也许,我们可能已经忘记了一些在今天仍然有用的东西,或者说,至少了解这些历史对一些新的想法产生有所影响。o2...
- Java 和 JavaScript 的关系
-
Java和JavaScript不同之处:●出身不同:Javascript与Java是由不同的公司开发的不同产品。Javascript是Netscape公司的脚本语言,而Java...
- Micro:命令行文本编辑器 (Go)
-
Micro是一款基于终端的文本编辑器,使用Go开发。Micro是个命令行编辑器,主要特性是易用,直观,并且包含所有现代化终端的优点。功能:易用常用快捷键绑定(ctrl-s,ctrl-c,...
- 7 行代码 3 分钟:从零开始实现一门编程语言
-
本文最初发布于MattMight的个人博客。...
- 码上去学海南公司:C语言到底能干什么?我列举了8种经典案例
-
虽然C语言执行速度极快,占用资源极少,但是它使用起来非常麻烦,完全没有Java、Python、Go、JavaScript、C#等方便和灵活,会严重拖慢项目的开发进度,所以,通常只有在“不得不”的情...
- 什么是 JavaScript?
-
本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师然冬...
- 新人如何自学安卓手机软件开发?
-
当我们问一个人,你是做什么的,听到我是做软件开发的,不由自主就会感觉,这个人好厉害。越来越多的人投身于软件开发行业,可能有些人本身不是学这个专业的,出于对这个行业的热爱,自学软件开发。现在这个社会,多...
- Android开发基础入门(一):UI与基础控件
-
Android基础入门前言:...
- 第02章 《小Z安卓程序员之路》Android Studio
-
不积跬步无以至千里,不积小流无以成江海!!每天进步一点点我是杨哲丶,一个梦想把科技和艺术结合在一起的程序猿!!小Z在开始查询的如何使用SVN和如何使用Git版本控制工具的时候,发现网上大部分居然是关于...
- 支付宝团队 | 移动客户端实战教程(iOS和Android)
-
今天给大家推荐一个非常好的PPT,是github在线的,是支付宝团队内部分享技术用的PPT,适合Web端和移动端的同学入门客户端开发,是我见过的最详细的《iOS&Android开发从入门到...
- 只需二步,就可以在win11操作系统上运行Android程序,非常简单
-
你想像过吗,只需几个简单的步骤即可在你的Windows电脑上运行Android应用程序。现在,在Windows11中运行安卓应用程序现在就像在手机上运行应用程序一样简单。微软和亚马逊联手打造了数千款...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)