Java EE学习笔记(1:Servlet & JSP)

2023-11-07

Servlet简介

Servlet技术规范是JavaEE技术规范中的一个重要组成部分,Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面(实际上,Servlet不仅仅是用于返回HTML的页面的,比如,Servlet还可以返回Xml,JSON等格式的字符串,当然了,也可以返回视频流,等等)。
Servlet要运行于Servlet容器上,目前,IBM的WebSphere,BEA的WebLogic,Apache的tomcat,SUN的GlassFish,这些JavaEE的服务器,都含有Servlet容器,我想这么说,Servlet的容器和JavaEE的服务器之间的关系就区别开了吧? 其中以tomcat为例,它是一个著名的开源的JavaEE服务器,它包含有一个Servlet容器,(但是并不包含EJB的容器),也就是说,tomcat是一个不能完整支持JavaEE技术规范的容器(不支持EJB),但是这对构建一个Web Site是够用了。如果想使用tomcat,并使用EJB,通常是采用JBoss作为服务器的,因为JBoss本身是一个EJB的容器,并且把tomcat集成进来,来完成Servlet容器的角色。tomcat除了要提供Servlet容器外,显然还要承担起HTTP Server的角色,但是也有人用Apache服务器+Tomcat的Servlet容器,来构成一个完整的服务器,也就是说,不使用tomcat所提供HTTP服务,而是用Apache的。
Sun的GlassFish,是一个比较完整支持JavaEE规范的Server。刚才看到了一条新闻,Oracle完成收购SUN后,依然会支持GlassFish。原文如下:

( GlassFish
甲骨文表示将会调整Oracle WebLogic server和GlassFish的投资组合,他们计划继续让GlassFish Enterprise Server作为遵循Java EE规范的开源RI。同时,甲骨文表示也会继续支持GlassFish社区。
编者注:除了以上开发者们关注的两个产品之外(是的,还有Java FX。对于Java,Oracle自从收购开始之日就一直态度明确;然而Java FX,在这份FAQ中仍然没有提及),下面还提到了Sun的虚拟化产品和Open Office的处理策略。)

我觉得Servlet技术,和CGI技术有着相当的相似度。如果把Servlet放到传统的CGI程序,和当下的JSP,JSF,ASP.net中间,我觉得它更加地接近前者,没有一个本质的跃迁。

详解servlet实例

上面这个链接,写得不错,OK:
假设我写了一个HelloServlet,它返回一个欢迎页面。
HelloServlet是如何被创建的呢? 首先可以肯定的说,不是new出来的,容器根本不知道我们会写出叫什么名字的Servlet classes。这就像MFC,谁知道我们的Document class叫什么名字,于是动态创建就有用武之地了。当然了,在Java里面,反射是更加强大的武器。(而且记住,容器不会new HelloServlet,而就是我们企图调用这个Servlet,也不要new!)
服务器会侦听某一个端口,比如说8080,现在浏览器要访问我们的Server了,http://127.0.0.1:8080/hello
OK,Server会accept浏览器的链接,当然了,这是个TCP层的问题,而在HTTP层面上,我们会看到Request的HTTP请求信息,里面就含有URL,于是我们自然就得到了hello这个字符串。这个时候,HTTP Server就要把处理逻辑转到Servlet容器上了。
根据JavaEE的规范,Servlet容器会读一个web.xml。里面大致有这样的配置内容:

 

<servlet>
        <servlet-name>Hello</servlet-name>
        <servlet-class>org.bizcuit.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

注意那关键的四行,其中servlet-name是Hello,成为上面和下面两个部分的桥梁,上面的部分说明了调用这个名字的Servlet,会实例化哪个Java class。而下面的部分则说明了,URL的pattern如果是/hello,那么就会调用名为Hello的Servlet。其中,还要注意url-pattern项,这里可是有些名目的。
OK,这样,Servlet容器就知道要加载哪个Servlet的class了,那么这个加载是通过反射来完成的。

Class cls = Class.forName(servletClassName);
Object servlet = cls.newInstance(); 

当然了,这个比伪码还简单了,因为一个Servlet class,通常只在容器内产生一个实例(也有办法生成多个实例,但是可能会产生效率的问题,后面讲),因此,要注意线程安全的问题(后面讲)。
但是现在,我们有了Servlet的实例了,于是,我们可以调用它的方法了,根据Servlet规范,容器根据浏览器的请求(GET/POST/...),会调用service,或者是doGet,doPost方法。以doGet方法为例:

public class HelloServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        resp.setContentType("text/html");
        resp.getWriter().println("<div>Hello</div>");
    }
}

注意doGet方法的两个参数,很重要,这里就不赘述了,还是要在具体的实践中掌握的。
关于Session,可以通过这个方法得到。req.getSession();

 

 


 

JSP简介
我个人认为JSP是一种比PHP更加灵活,强大的服务器端脚本,无奈PHP确实简单很多啊。

JSP(Java Server Pages)是由Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP,PHP等技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。
运行JSP,也是需要Servlet容器的,原因就是JSP在第一次被访问的时候,会被翻译为一个Servlet,当然了,这个Servlet最终也是要被编译为.class文件的,所以,JSP是在Servlet的技术上构建出来的,而且JSP的运行速度很快,毕竟是被编译成字节码在运行,相比传统的ASP脚本的解释方式,快了许多。
关于JSP,还有JSP的tag可以作为单独的课题来研究一下。

<JSP试验部分>

1. DOWNLOAD tomcat first:  tomcat 6.x zip format
    下载后,解压缩。
2. 启动tomcat
    找到目录$TOMCAT_INSTALL_PATH\apache-tomcat-6.0.20\bin,Windows上,双击startup.bat即可。
    http://localhost:8080/
    好歹试一试tomcat是不是真的起来了。GO~
3. 创建一个JSP文件。
    目录,$TOMCAT_INSTALL_PATH\apache-tomcat-6.0.20\webapps\ROOT
    创建一个文件,hello.jsp。里面输入下列内容。

<%@page language="java" %>
<%@page import="java.util.*" %>
<html>
<head>
<title>Hello World!</title>
</head>
<body bgcolor="#FFFFFF">
<%
String msg= new Date().toString();
out.println("Hello World!<br>");
%>
<div style="color:red">
<%=msg%>
</div>
</body>
</html>

 保存,然后启动服务器(当然了,服务器起来后,再创建、修改JSP也可以,不需要重启服务器。),试一试,http://127.0.0.1:8080/hello.jsp
4. 随便再改改,体验一下JSP,<%%>内,可以接受Java code(当然了,不是全部)。

<Servlet试验部分>
写简单的JSP,我觉得不用IDE也OK,但是Servlet,我们还是借助IDE吧,大段的Java代码,我喜欢用Eclipse。
1. 下载eclipse-jee-galileo-SR1-win32,Click here to download

2. 启动Eclipse。注意,Eclipse一定要指定一个workspace才行的。

3. 从菜单里面找File->New->Project,选择后弹出一个可以创建工程的对话框。在里面找到Web |_ Dynamic Web Project。
    不负责任的说,自己一路Next下去吧。应该没有什么问题。工程的名字可以选择为Hello。

4. 再创建一个服务器。
    
    不负责任的说,找到对话框,自己一路Next下去吧。应该没有什么问题。

5. 这样就差不多了,可以写代码了,也可以调试了。具体的问题应该不难解决。在Hello工程里面创建一个Servlet。
    在左侧的Package Explorer中,展开Hello,在src目录那里,右键,准备创建一个Servlet,找到对话框,

     
    在Class Name那里写HelloServlet即可,Java Package那里写org.bizcuit。其他的不用修改。OK,这样,IDE就帮我们创建好一个Servlet的java文件了。
    在doGet方法内,可以试着写入这样的code:
    

PrintWriter pw  =  response.getWriter();
pw.print( " <html><body><div style='color:red'>Hello</div></body></html> " );

    当然了,Servlet里面返回HTML往往属于比较土的做法,因为还不如写JSP呢(当然了,Servlet返回HTML也可能有更好的理由。)
6. 开始调试了。
    在Project Hello上右键,找到Debug As菜单项,选择Debug on server。
    选择一个已有的Server这一项(Choose an exsiting server.)。因为我们已经建立过一个Server tomcat了。
    然后一路Next到Finish~。试一下 http://127.0.0.1:8080/Hello/HelloServlet
    URL中,第一个Hello是由于你创建的工程名是Hello,接下来HelloServlet,是你的servlet class的名字。

7. 试一下改写你的Servlet,是不需要重启服务器的。

 

转载于:https://www.cnblogs.com/akira90/archive/2012/11/05/2755904.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java EE学习笔记(1:Servlet & JSP) 的相关文章

  • 为什么 jar 执行的通配符在 docker CMD 中不起作用?

    我有一个Dockerfile与以下CMD启动我的 Spring Boot 应用程序 FROM java 8 jre CMD java jar app file jar 当我尝试从创建的图像启动容器时 我得到 Error Unable to
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • 在 PHP 中添加分数会产生不同的结果[重复]

    这个问题在这里已经有答案了 可能的重复 PHP float 到 int 类型转换的意外结果 https stackoverflow com questions 3385685 php unexpected result of float t
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 如果一个多维数组中的子数组与另一个多维数组不同,则覆盖该子数组

    我坚持这个问题 真的不知道如何解决 我有两个多维数组 需要将第二个数组中的每个 entry id 与第一个数组进行匹配 然后需要检查第二个数组中的每个 file no 是否在数据库 第一个数组 中 并且 status 是否与第一个数组匹配
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • MVC和依赖注入,被迫使用单例Controller?

    我正在致力于构建一个根据 MVC 原则运行并利用依赖注入的 PHP 框架 我想我已经把前端控制器部分放下了 有一个工作路由器实例化控制器实例并根据请求的 URI 调用适当的操作 接下来是依赖注入 我想实现一个使用反射解决依赖关系的容器 这样
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • jquery ajax加载后丢失CSS

    大家知道如何解决 load Ajax 请求后的 css 问题吗 例如 如果我想从网页加载 DIV 在我的 Ajax 请求之后 container load path to div div id 我丢失了与该 div 关联的所有 css 和脚
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • PHP strtotime() 未返回正确的月份

    由于当前月份 年份是 2012 年 1 月 为什么以下代码返回 2011 年 12 月而不是 2011 年 11 月 echo date F Y strtotime 2 months 如果有影响的话 这是在 PHP 5 3 0 上 要获得您
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样
  • 在 PHP 中设置 HTTP 响应代码(在 Apache 下)

    给出以下两种在 PHP 中设置 HTTP 响应代码的方法 具体来说 在 Apache 下 方法一 http response code 404 方法二 header HTTP 1 0 404 Not Found 我的问题是 除了这个事实之外
  • 在会话即将到期之前调用方法

    我的网络应用程序有登录的用户 有一个超时 在会话过期之前 我想执行一个方法来清理一些锁 我已经实现了sessionListener但一旦我到达public void sessionDestroyed HttpSessionEvent eve
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • 如何使用 PHP 查找字符串中字符的序列模式?

    假设我有随机的文本块 EAMoAAQAABwEBAAAAAAAAAAAAAAABAgMFBgcIBAkBAQABBQEBAAAAAAAAAAAAAAAGAgMEBQcBCBAAAQMDAgMEBQcIBQgGCwEAAQACAxEEBSEG
  • GAE 无法部署到 App Engine

    我正在尝试从 Eclipse 发布 Web 应用程序 我在 GAE 上创建了四个项目 可以通过登录我的帐户并查看控制台来查看它们 我已经改变了appengine web xml到项目的应用程序 ID 如果我将其更改为 GAE 上第一个创建的

随机推荐

  • 【Spring】Spring依赖注入与控制反转理解

    Spring是一个庞大的框架 封装了很多成熟的功能 能够让我们无需重复造轮子 其次 它使用IOC进行依赖管理 利用JAVA的反射机制 将实例的初始化交给Spring Spring可以通过配置文件管理实例 我们就不用自己初始化实例啦 有人会问
  • 2021-01-13

    Jacinto 7处理器设备和子系统概述 上 本文概述TI下一代汽车处理器系列的主要架构特征和优势 这张幻灯片列出了Jacinto 7 SoC的不同方面 我将在后续章节中介绍这些内容 这里讨论的特性一般适用于Jacinto 7系列中的所有派
  • [学习日志]伤害生效由谁来决定?

    伤害生效由谁来决定 普通攻击 使用动画事件 用动画事件是最普遍的一种方式 假如我的伤害生效是在动画结束之后呢 攻击动画片段只有2秒时长 要在3秒才对敌方造成伤害 那么动画事件就做不到了 计时器 把伤害生效是点交给计时器去操作 攻击的时候开始
  • 网络拓扑的分类

    一 按网络所覆盖的地理范围分类 1 局域网 LAN 局域网Local Area Network 简称 LAN 是一种私有网络 一般在一座建筑物内或建筑物附近 比如家庭 办公室或工厂 局域网络被广泛用来连接个人计算机和消费类电子设备 通过网络
  • swift 之AVFoundation自定义相机界面拍照、录像、保存到相册、合成视频

    1 自定义相机拍照 自定义相机 1 前置和后置摄像头 typedef NS ENUM NSInteger AVCaptureDevicePosition AVCaptureDevicePositionUnspecified 0 AVCapt
  • CVPR 2020

    Editing in Style Uncovering the Local Semantics of GANs 作者 Edo Collins Sabine S sstrunk School of Computer and Communica
  • 笔试题目1

    腾讯笔试 2 假设函数f1的时间复杂度O n 那么f1 f1的时间复杂度为 A O n B O n n C O n log n D 以上都不对 这个题目我的思路是A 讨论后答案应该是D 因为f1的返回值不确定 如果是个数组当然复杂度就不同了
  • linux基础——vim及bash的使用

    vim vim介绍 vim是linux里的文本编辑工具 是vi的升级版的软件 是程序员文本编辑器 用来写程序的工具 安装 yum install vim y 用法 命令模式 yy 复制当前行 5yy 向下复制5行 copy dd 删除 剪切
  • 使用vue里面el-upload,照片反显后,然后再上传照片,发现上传的照片只要最新上传的,之前反显的照片没有了,解决办法如下

    第一步 首先先将照片反显存到两个数组里面如图 第二步 照片上传成功回调里面就在查看添加照片这个数组接着push 就可以了 切记先反显的时候把之前数据添加到里面
  • R Plot添加中文及其他字体【showtext】

    文章目录 前言 R Packages showtext 安装 简单示例 加载字体 更多详见 前言 之前 一个群里的群友 想要在它画的图上加入中文 保存为PDF之后 中文字符也不变成乱码 当时随手推荐了一个R package showtext
  • Linux的shell编程(四)

    六 bash程序的调试 在编程过程中难免会出错 有的时候 调试程序比编写程序花费的时间还要多 shell程序同样如此 shell程序的调试主要是利用bash命令解释程序的选择项 调用bash的形式是 bash 选择项shell程序文件名 几
  • Conda安装失败:Solving environment: failed with initial frozen solve. Retrying with flexible solve.

    Conda安装包安装包出现错误 比如 conda install imutils 出现如下错误 Collecting package metadata current repodata json done Solving environme
  • linux qt通过ps获取进程

    在linux 当中 通过qt 程序获取进程的名称 来对后续进行操作 QProcess m process m process start ps ef if m process waitForFinished const QByteArray
  • 按钮卡片特效代码集锦

    css最好看最全的按钮卡片样式 动画效果大全 纯css样式打造的20款按钮特效和11款卡片合集 喜欢的可以收藏 备开发时使用 按钮代码
  • 机器学习模型评估指标

    在机器学习建模过程中 针对不同的问题 需采用不同的模型评估指标 主要分为两大类 分类 回归 一 分类 1 混淆矩阵 2 准确率 Accuracy 3 错误率 Error rate 4 精确率 Precision 5 召回率 Recall 6
  • 【6】测试用例设计-输入域+输出域+异常分析+错误出错法

    目录 输入域测试 输出域测试 异常分析 错误猜测 输入域测试 极端测试如学生成绩0分 1分 2分 情况很少这种 特殊值如 99 0 99 长时间输入内存溢出 内存泄露 输出域测试 异常分析 异常操作验证系统容错性 出现错误时 故障恢复的能力
  • 泛型和包装类

    1 泛型 1 1泛型的定义 泛型是程序设计语言的一种特性 允许程序员在强类型程序设计语言中编写代码时定义一些可变部分 那些部分在使用前必须作出指明 各种程序设计语言和其编译器 运行环境对泛型的支持均不一样 将类型参数化以达到代码复用提高软件
  • 构建seq2seq模型的常见问题

    1 seq2seq模型 输入是一个词向量 而不是词向量列表 对吧 是的 对于seq2seq模型 输入和输出都需要被转换成词向量形式 对于输入来说 通常会将一个句子转换成一个词向量序列 具体地 对于每个单词或者字符 都会将其对应成一个词向量
  • 广联达C++一面(坐等感谢信)

    括号中是我的回答 自我介绍 介绍一个最近做过的项目 不需要非得是C 相关的 回答了节点属性标注系统 在里面负责哪一部分 介绍了三个部分 说了自己负责的是统计和二阶段预测 主要是用主动探测的方法扩展节点信息 随机性检测是怎么做的 用的什么信息
  • Java EE学习笔记(1:Servlet & JSP)

    Servlet简介 Servlet技术规范是JavaEE技术规范中的一个重要组成部分 Servlet是一种独立于平台和协议的服务器端的Java应用程序 可以生成动态的Web页面 实际上 Servlet不仅仅是用于返回HTML的页面的 比如