标签 JSP/Servlet 及相关技术详解 下的文章 - 小吴博客
首页
资源下载
关于
搜 索
1
通过 Tampermonkey 实现学习通全自动刷课
1,228 阅读
2
易语言下载与安装
46 阅读
3
易语言的配置
39 阅读
4
Filter 介绍
18 阅读
5
JSP 脚本中的 9 个内置对象
17 阅读
Java
Java面向对象基础
Java企业应用开发
数据结构
Spring Boot
数据库
Mysql数据库原理
网页前端
HTML/CSS/JS
Vue框架
C++
C++程序设计
计算机网络
概述
物理层
数据链路层
网络层
运输层
应用层
网络安全
互联网上的音频/视频服务
无线网络和移动网络
Linux系统管理
实战教程
其他
易语言
登录
/
注册
搜 索
标签搜索
JSP/Servlet 及相关技术详解
下载与配置
小吴
累计撰写
12
篇文章
首页
分类
Java
Java面向对象基础
Java企业应用开发
数据结构
Spring Boot
数据库
Mysql数据库原理
网页前端
HTML/CSS/JS
Vue框架
C++
C++程序设计
计算机网络
概述
物理层
数据链路层
网络层
运输层
应用层
网络安全
互联网上的音频/视频服务
无线网络和移动网络
Linux系统管理
实战教程
其他
易语言
页面
资源下载
关于
用户登录
登录
注册
找到
9
篇与
JSP/Servlet 及相关技术详解
相关的结果
2022-12-25
JSP 的基本原理
JSP 的本质是 Servlet,当用户向指定 Servlet 发送请求时,Servlet 利用输出流动态生成 HTML 页面,包括每一个静态的 HTML 标签和所有在 HTML 页面中出现的内容。 由于包括大量的 HTML 标签、大量的静态文本及格式等,导致 Servlet 的开发效率极为低下。所有的表现逻辑,包括布局、色彩及图像等,都必须耦合在 Java 代码中,这的确让人不胜其烦。JSP 的出现弥补了这种不足,JSP 通过在标准的 HTML 页面中嵌入 Java 代码,其静态的部分无须 Java 程序控制,只有那些需要从数据库读取或需要动态生成的页面内容,才使用 Java 脚本控制。 从上面的介绍可以看出,JSP 页面的内容由如下两部分组成。 ➢ 静态部分:标准的 HTML 标签、静态的页面内容,这些内容与静态 HTML 页面相同。 ➢ 动态部分:受 Java 程序控制的内容,这些内容由 Java 脚本动态生成。 下面是一个最简单的JSP页面代码。<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %> <html> <head> <title>欢迎</title> </head> <body> 欢迎学习 Java Web 知识,现在时间是: <%out.println(new java.util.Date());%> </body> </html> 上面的页面中第 8 行代码放在<%和%>之间,表明这些是 Java 脚本,而不是静态内容,通过这种方式就可以把 Java 代码嵌入 HTML 页面中,这就变成了动态的 JSP 页面。在浏览器中浏览该页面,将看到如下图所示的页面。 上面 JSP 页面必须放在 Web 应用中才有效,所以编写该 JSP 页面之前应该先构建一个Web应用。在后面介绍的内容都必须运行在 Web 应用中,所以也必须先构建 Web 应用。 从表面上看,,,JSP 页面已经不再需要 Java 类,似乎完全脱离了 Java 面向对象的特征。事实上JSP的本质依然是 Servlet(一个特殊的Java类)每个 JSP 页面就是一个 Servlet 实例——JSP 页面由系统编译成 Servlet,Servlet 再负责响应用户请求。也就是说,JSP 其实也是 Servlet 的一种简化,使用 JSP 时,其实还是使用 Servlet,因为 Web 应用中的每个 JSP 页面都会由 Servlet 容器生成对应的 Servlet。对于 Tomcat 而言,JSP 页面生成的 Servlet 放在 work 路径对应的 Web 应用下。 再看如下一个简单的 JSP 页面。<!-- 表明这是一个 JSP 页面 --> <%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %> <html> <head> <title> 第二个JSP页面 </title> </head> <body> <!-- 下面是 Java 脚本 --> <%for(int i = 0;i < 7;i++){ out.println("<font size='" + i + "'>"); %> 小吴博客</font> <br/> <%}%> </body> </html> 当启动 Tomcat 之后,可以在 Tomcat 的 work\Catalina\localhost\jspPrinciple\org\apache\jsp 目录到如下文件(本 Web 应用名为jspPrinciple,上面 JSP 页的名为 test.jsp): test_jsp.java 和 test_jsp.class。这两个文件都是由 Tomcat 生成的,Tomcat 根据 JSP 页面生成对应 Servlet 的 Java 文件和 class文件。 下面是 test_jsp.java 文件的源代码,这是一个特殊的 Java 类,是一个 Servlet 类。// JSP 页面经过 Tomcat 编译后默认的包 package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; // 继承 HttpJspBase 类,该类其实是 Httpservlet 的子类 public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private static final java.util.Set<java.lang.String> _jspx_imports_packages; private static final java.util.Set<java.lang.String> _jspx_imports_classes; static { _jspx_imports_packages = new java.util.HashSet<>(); _jspx_imports_packages.add("javax.servlet"); _jspx_imports_packages.add("javax.servlet.http"); _jspx_imports_packages.add("javax.servlet.jsp"); _jspx_imports_classes = null; } private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public java.util.Set<java.lang.String> getPackageImports() { return _jspx_imports_packages; } public java.util.Set<java.lang.String> getClassImports() { return _jspx_imports_classes; } public javax.el.ExpressionFactory _jsp_getExpressionFactory() { if (_el_expressionfactory == null) { synchronized (this) { if (_el_expressionfactory == null) { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); } } } return _el_expressionfactory; } public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { if (_jsp_instancemanager == null) { synchronized (this) { if (_jsp_instancemanager == null) { _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } } } return _jsp_instancemanager; } public void _jspInit() { } public void _jspDestroy() { } // 用于响应用户请求的方法 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { final java.lang.String _jspx_method = request.getMethod(); if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD"); return; } final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null; try { response.setContentType("text/html; charset=UTF-8"); pageContext = _jspxFactory.getPageContext(this, request, response, "", true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write("<!-- 表明这是一个 JSP 页面 -->\r\n"); out.write("\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write(" <title> 第二个JSP页面 </title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.write("<!-- 下面是 Java 脚本 -->\r\n"); for(int i = 0;i < 7;i++){ out.println("<font size='" + i + "'>"); out.write("\r\n"); out.write("小吴博客</font>\r\n"); out.write("<br/>\r\n"); } out.write("\r\n"); out.write("</body>\r\n"); out.write("</html>"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { if (response.isCommitted()) { out.flush(); } else { out.clearBuffer(); } } catch (java.io.IOException e) if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else throw new ServletException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } } } 初学者看到上面的 Java 类可能有点难以阅读,其实这就是一个 Servlet 类的源代码,该 Java 类主要包含如下三个方法(去除方法名中的_jsp 前缀,再将首字母小写)。 ➢ init():初始化 JSP/Servlet 的方法。 ➢ destroy():销毁 JSP/Servlet 之前的方法。 ➢ service():对用户请求生成响应的方法。 即使读者暂时不了解上面提供的 Java 代码,也依然不会影响 JSP 页面的编写,因为这都是由 Web 容器负责生成的,后面介绍了编写 Servlet 的知识之后再来看这个 Java 类将十分清晰。浏览该页面可看到如下图所示的页面。 从上图中可以看出,JSP 页面里的 Java 代码不仅仅可以输出动态内容,还可以动态控制页面里的静态内容,例如,从上图中看到将“小吴博客”重复输出了7次。 根据上图所示的执行效果,再次对比 test.jsp 和 test_jsp.java 文件,可得到一个结论:JSP 页面中的所有内容都由 test_jsp.java 文件的页面输出流来生成。下图显示了 JSP 页面的工作原理。 根据上面的 JSP 页面工作原理图,可以得到如下 4 个结论。 ➢ JSP 文件必须在 JSP 服务器内运行。 ➢ JSP 文件必须生成 Servlet 才能执行。 ➢ 每个 JSP 页面的第一个访问者速度很慢,因为必须等待 JSP 编译成 Servlet。 ➢ JSP 页面的访问者无须安装任何客户端,甚至不需要可以运行 Java 的运行环境,因为 JSP 页面输送到客户端的是标准 HTML 页面。 JSP 技术的出现,大大提高了 Java 动态网站的开发效率,所以得到了 Java 动态网站开发者的广泛支持。
2022年12月25日
11 阅读
0 评论
5 点赞
2022-12-25
Web 应用和 web.xml 文件
JSP、Servlet、Listener 和 Filter 等都必须运行在 Web 应用中,所以先来学习如何构建一个 Web 应用。构建 Web 应用 在前文中已经介绍了如何通过 Eclipse 来构建一个 Web 应用,但如果你仅学会在 Eclipse 等IDE工具中单击“下一步”、“确定”等按钮,那你将很难成为一个真正的程序员。 笔者一直坚信:要想成为一个优秀的程序员,应该从基本功练起,所有的代码都应该用简单的文本编辑器(包括 EditPlus、UltraEdit 等工具)完成。 坚持使用最原始的工具来学习技术,会让你对整个技术的每个细节有更准确的把握。比如说你掌握了通过 Eclipse 来构建一个 Web 应用的内容,但你是否知道 Eclipse 创建 Web 应用时为你做了些什么?如果你还不清楚 Eclipse 所干的每件事情,那你还不能使用它。 真正优秀的程序员当然可以使用 IDE 工具,但真正的程序员,即使使用 vi(UNIX 下无格式编辑器)、记事本也一样可以完成非常优秀的项目。正确对待 IDE 工具的态度是:可以使用 IDE 工具,但绝不可依赖于 IDE 工具。学习阶段,前期不要使用 IDE 工具;开发阶段,使用 IDE 工具。真正技术掌握了,无论用什么 IDE 工具都得心应手。不要盲目相信有些人的“掌握这些细节没用的······”说法,有些程序员的心态是:凡是他不会的,就是没用的。 对于 IDE 工具,业内有一个说法:IDE 工具会加快高手的开发效率,但会使初学者更白痴。 下面将“徒手”建立一个 Web 应用,请按如下步骤进行: ① 在任意目录下新建一个文件夹,此处将以 webDemo 文件夹建立一个 Web 应用。 ② 在第 1 步所建的文件夹内建一个 WEB-INF 文件夹(注意大小写,这里区分大小写)。 ③ 进入 Tomcat 或任何其他 Web 容器内,找到任何一个 Web 应用,将 Web 应用的 WEB-INF 下的 web.xml 文件复制到第 2 步所建的 WEB-INF 文件夹下。 对于 Tomcat 而言,其 webapps 路径下有大量的示例 Web 应用。 ④ 修改复制后的 web.xml 文件,将该文件修改成只有一个根元素的 XML文件。修改后的 web.xml 文件代码如下。<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> </web-app> 在第 2 步所建的 WEB-INF 路径下,新建两个文件夹:classes 和 lib,这两个文件夹的作用完全相同:都是用于保存 Web 应用所需要的 Java 类文件,区别是 classes 保存单个*.class 文件;而 lib 保存打包后的 JAR 文件。 经过以上步骤,已经建立了一个空 Web 应用。将该 Web 应用复制到 Tomcat 的 webapps 路径下,该 Web 应用将可以自动部署在 Tomcat 中。 通常只需将 JSP 放在 Web 应用的根路径下(对本例而言,就是放在 webDemo 目录下),然后就可以通过浏览器来访问这些页面了。 根据上面介绍,不难发现 Web 应用应该有如下文件结构:<webDemo>——这是 Web 应用的名称,可以改变 |——WEB-INF | |——classes | |——lib | |——web.xm1l |——<a.jsp>——此处可存放任意多个 JSP 页面 上面的 webDemo 是 Web 应用所对应文件夹的名字,可以更改;a.jsp 是该 Web 应用下 JSP 页的名字,也可以修改(还可以增加更多的 JSP 页面)。其他文件夹、配置文件都不可以修改。 a.jsp页面的内容如下。<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %> <html> <head> <title>欢迎</title> </head> <body> 欢迎学习 Java Web 知识 </body> </html> 上面的页面实际上是一个静态 HTML 页面,在浏览器中浏览该页面将看到如右图所示的界面。 将上面的 webDemo 应用复制到 Tomcat 的 webapp 目录下(部署完成),然后启动 Tomcat 服务器,再使用浏览器访问 http://127.0.0.1:8888/webDemo/ajsp,即可看到如右图所示的页面,即表示 Web 应用构建成功,并已经将其成功地部署到 Tomcat 中了。配置描述符web.xml 上面介绍的位于每个 Web 应用的 WEB-INF 路下的 web.xml 文件被称为配置描述符,这个 web.xml 文件对于 Java Web 应用十分重要,在 Servlet 2.5 规范之前,每个 Java Web 应用都必须包含一个 web.xml 文件,且必须放在 WEB-INF 路径下。 从 Servlet 3.0 开始,WEB-INF 路径下的 web.xml 文件不再是必需的,但通常还是建议保留该配置文件。 对于 Java Web 应用而言,WEB-INF 是一个特殊的文件夹,Web 容器会包含该文件夹下的内容,客户端浏览器无法访问 WEB-INF 路径下的任何内容。 在 Servlet 2.5 规范之前,Java Web 应用的绝大部分组件都通过 web.xml 文件来配置管理,从 Servlet 3.0 开始,也可通过注解来配置管理 Web 组件,因此 web.xml 文件可以变得更加简洁,这也是 Servlet 3.0 的重要简化。接下来讲解的内容会同时介绍两种配置管理方式。 ➢ 配置 JSP。 ➢ 配置和管理 Servlet。 ➢ 配置和管理 Listener。 ➢ 配置和管理 Filter。 ➢ 配置标签库。 ➢ 配置 JSP 属性。 除此之外,web.xml 还负责配置、管理如下常用内容。 ➢ 配置和管理 JAAS 授权认证。 ➢ 配置和管理资源引用。 ➢ Web 应用首页。 web.xml文件的根元素是<web-app.../>元素,在 Servlet 3.0 规范中,该元素新增了如下属性。 ➢ metadata-complete: 该属性接受 true 或 false 两个属性值。当该属性值为 true 时,该 Web 应用将不会加载注解配置的 Web 组件(如Servlet、Filter、Listener 等)。 在 web.xml 文件中配置首页使用 welcome-file-list 元素,该元素能包含多个 welcome-file 子元素,其中每个 welcome-file 子元素配置一个首页。例如,如下配置片段:<!-- 配置 Web 应用的首页列表 --> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> 上面的配置信息指定该 Web 应用的首页依次是 index.html、index.htm 和 index.jsp,意思是说:当 Web 应用中包含 index.html 页面时,如果浏览者直接访问该 Web 应用,系统将会把该页面呈现给浏览者;当 index.html 页面不存在时,则由 index.htm 页面充当首页,依此类推。 每个 Web 容器都会提供一个系统的 web.xml 文件,用于描述所有 Web 应用共同的配置属性。例如,Tomcat 的系统 web.xml 放在 Tomcat 的 conf 路径下,而 Jetty 的系统 web.xml 文件放在 Jetty 的 etc 路径下,文件名为 webdefault.xml。
2022年12月25日
9 阅读
0 评论
3 点赞
1
2