Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

时间:2022-04-19 01:20:18

servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历。

下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神们可以自动过滤掉。下面的步骤有这样的前提:你的eclipse嵌入了TomCat插件(我们会在Eclipse上操作servlet)或者本地主机已经有安装好某一个版本的TomCat,我这里用的是Tomcat7.0.69.

第一步:创建Dynamic Web Project

Eclipse下->new->other->web->Dynamic Web Project,名称我们就叫TestServlet2

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

TargetRuntime这个选项,如果你是第一次使用Tomcat的话应该还没有配置,选择右边的New Runtime会出现下面的页面:

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

我选择的是v7.0,因为我电脑上装的就是v7.0.69;

Configuration右面的选项Modify:我们暂时只需要Dynamic和Java两项就可以,把那个JavaScript前面的勾去掉,点击Ok;

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

点击next:

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

src是我们源代码的目录位置,下面的Default output folder是我们源代码编译之后的.class文件的输出位置,我们这里改成WEB-INF/classes(为了与我们把应用发布到TomCat的webapps下的目录一致,方便理解,此时我们的build目录就没啥用了,等下它自动生成的时候就可以删除了);

继续点击next:Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

直接默认就可以了,Context root是我们web应用的主目录,Context directory是我们存放JSP文件其他文件的,里面包括两个文件夹META-INF和WEB-INF,最后勾选自动配置web.xml文件;

现在的项目目录如下图所示:

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

第二步:写我们的servlet

在src目录下新建一个class,类名就叫做HelloWorldServlet,添加一个包:com.ysw.servlet

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

在HelloWorldServlet中添加如下代码:我们这里用extends HttpServlet的方式来编写,其他两种方式大家可以自己Google一下;

 package com.ysw.servlet;

 import java.io.IOException;

 import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class HelloWorldServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet");
}
}

实现的简单功能是在我们Eclipse的控制台打印"doGet"字符串;
第三步:配置文件web.xml

 <web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"> <servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>HW</servlet-name>
<servlet-class>com.ysw.servlet.HelloWorldServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HW</servlet-name>
<url-pattern>/abc</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>20</session-timeout>
</session-config>
</web-app>

在我们的WEB-INF目录下有一个web.xml文件,我们在其中添加如下内容:每一个标签代表啥意思大家自己查一下,学习的过程是痛并快乐着;

我还是说一下吧:<servlet-name>是给我们的servlet起一个名字,可以是任意的;<servlet-class>指向我们要注册的servlet的类地址,这里一定要注意:如果你的程序使用了包,比如我的程序中的包名是com.ysw.servlet

<servlet-mapping>中的servlet-name与我们上面定义的<servlet>中的那个<servelt-name>一定要一致;<url-pattern>意思是我们在浏览器中输入/abc这种形式就能访问到Tomcat上相应的资源

第四步:修改Project下的.class文件

在我的电脑上是这样的:

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

编辑.classpath文件,将<classpathentry kind="output" path="build/classes"/>这一项中的path改成我们前面已经说过的WEB-INF/classes目录,即:<classpathentry kind="output" path="WEB-INF/classes"/>保存退出;

【重要的一步】:右键工程(TestServlet2)->Build Project,eclipse一般默认都是自动编译代码,只要你的代码修改后保存,eclipse是会自动编译成class文件的。但如果你修改过配置,eclipse不是自动编译方式,那么就要点击这个build project选项手动把代码编译成class文件了。

第五步:在Tomcat上运行我们的servlet

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

点击以后出现下面的界面:选择我们先前配置的相应版本的Tomcat7.0.69,你的机器因人而异

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

点击->next,会让我们选择要运行的servlet,将要运行的servley移动到右面区域,点击->finashed这是就可以从控制台开到Tomcat的启动,

你看到的是这样的情况:

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

【没有消息就是最好的消息】:最下面切换到console这一视图,刷新一下我们上图的那个浏览器,我们可以看到:

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

可以看到我们的打印输出信息;

第六步:将我们的web应用部署到Tomcat服务器

在Tomcat的webapps目录下新建一个名称为myWebSite的文件夹,这个文件夹就是我们web应用的根目录。在myWebSite内新建一个名称叫做WEB-INF(这个名称是固定的,不能用其他名称),然后在WEB-INF文件夹内新建一个名称为classes的文件夹,用于存放我们编译好的.class文件,在WEB-INF文件夹内还有一个文件,就是我们前面提到的web.xml文件,直接放在这个位置就可以了.

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

在class文件夹下放我们编译好的class文件,其实只要把我们在的工程TestServlet2下的WEB-INF下的class文件夹拷贝过来就行(这个时候我们在前面的操作:<classpathentry kind="output" path="WEB-INF/classes"/>),

在这里就方便我们的应用发布了,因为我程序中用到了包com.ysw.servlet,因此class文件下也包括了各级目录;

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

接下来就是要用浏览器访问我们的servlet:首先要关闭掉Eclipse中我们之前一直运行的TomCat服务,否则我们在cmd下无法启动TomCat;

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

启动服务以后可以清楚的看到我们的应用得到了配置和部署:

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

在浏览器下我们输入:http://localhost:8080/myWebSite/abc

可以看到:Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期doGet得以输出,至此我的第一个Servlet完成!

cookie,session,application的区别:这部分转载自:http://blog.csdn.net/u010214269/article/details/44801567

Cookie: 

  ①存在于客户端(可被阻止)

  ②只能是文本文档
③如果设置了期限值,则写入客户端的文件;
如果没有,它只对本窗口或其子窗口有效,其它窗口不能访问该Cookie
④在Servlet/JSP中设置的Cookie可以被同路径下或其子路径的Servlet/JSP访问,父路径不可以
○注:这里的路径是指URL,而不是Web文件的目录
Session: ①存在于服务器端 ②每个Session对应一个窗口,用SessionID标识,这个Session为该窗口及其子窗口共享
③有两种实现方式:a.使用Cookie(在Cookie可用时)b.URL重写(在Cookie被禁用时)
④没有访问路径的问题。同一个WebApplication下的Servlet/JSP设置的Session可以被互相访问
前提是:同一个浏览器窗口或其子窗口
Application: 与一个Web应用程序相对应,该应用程序下所有的Servlet/JSP共用该Application中的信息(ServletContext) 1、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。 2、session中保存的是对象,cookie中保存的是字符串。 3、session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,
那么同一个网站中不同路径下的cookie互相是访问不到的。 4、session需要借助cookie才能正常工作。如果客户端完全禁止cookie,session将失效。 但是如果服务器端启用了url编码,也就是用
URLEncoder.encode()把所有的url编码了,则会在url后面出现如下类似的东西
index.jsp:jsessionid=fdsaffjdlks;jaf;lkdjsf 服务器通过这个进行session的判断 5 session在用户会话结束后就会关闭了,但cookie因为保存在客户端,可以长期保存 Cookie存储的信息是放到客户端的,用户在访问服务器端页面时,必然在客户端和服务器端之间频繁交换信息,影响了程序的性能。而Session由于存储在服务器内存中,因此不存在这个问题。不过,Session存储的信息是临时的,用户一旦关闭浏览器,状态即失去。而Cookie则相反。COOKIE 是本地文件,是 40 大盗在阿里巴巴家做的记号,或者是送牛奶的人在你家门口钉的箱子。 Application状态为应用程序提供了一个全局的状态。所有客户都可以使用该状态。从设计的角度来说,我们通常用Application来存储一些标准的数据。同时,我们在使用它时要注意避免性能的降低,存储的数据尽可能提供给客户只读的功能。 APPLICATION 是公共浴池。在这里能看见所有人,包括 ppmm 哦:)。 Session和客户端的Cookie是有关的,当客户关掉Cookie时,Session就失效了,SESSION 是服务器端内存,是你洗澡时浴池发给你的钥匙。自己专用,可以开自己的好多箱子。 Application: application是应用级别的,同一个应用中的所有用户将共享此对象。因此,我们利用application对象来存储一些坏境信息。 Request: Request也可以像Session那样使用,但是它第二次请求服务器页面时就失去存储功能了 request的范围只在一jsp页发出请求到另一页之间,随后这个属性失效;
session范围是用户和服务器连接的那段时间,用户与服务器断开属性就失效;
application作用范围最大,慎用,在服务器一开始执行服务到服务器关闭为止。可能造成服务器负载过重。

Servlet的生命周期
  * API中的生命周期:一个servlet只有一个对象(实例)
  * 1.加载(classLoader)将类加载进来
  * 2.实例化,new一个对象
  * 3.初始化:调用init(ServletConfig)方法
  * 4.处理请求:service doGet  doPost(http协议)
  * 5.退出服务:destory()
  * init():只执行一次
  * destory():
  * doGet():
  * service():

验证servlet的生命周期的代码:

 package com.ysw.servlet;

 import java.io.IOException;

 import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
*
* @author Administrator
*
*/
public class TestLifeCycleServlet extends HttpServlet { /**
* API中的生命周期:一个servlet只有一个对象(实例)
* 1.加载(classLoader)将类加载进来
* 2.实例化,new一个对象
* 3.初始化:调用init(ServletConfig)方法
* 4.处理请求:service doGet doPost(http协议)
* 5.退出服务:destory()
* init():只执行一次
* destory():
* doGet():
* service():
*/
private static final long serialVersionUID = 1L;
@Override
public void destroy() { System.out.println("destory");
} @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { System.out.println("doGet");
} @Override
public void init(ServletConfig config) throws ServletException { System.out.println("init");
} public TestLifeCycleServlet() {
System.out.println("constructor!");
} }

Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期的更多相关文章

  1. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  2. &lbrack;cocos2dx笔记015&rsqb;关于cocos2dx Button三种状态说明

    经过几天的填坑,最终将现有的项目由cocos2dx 2.2.2移到cocos2dx 3.2,差点放弃3.2了,但在最后一刻,又把坑填平了. cocos2dx 2.x到3.x是一个巨大的变化,能够算是全 ...

  3. 结对编程学习fault、error、failure三种状态

    点滴成就 学习时间 新编写代码行数 博客量(篇) 学习知识点 第一周 10小时 0 0 了解软件工程 第二周 10小时 0 1 项目开题 第三周 15小时 0 1 开通博客.开展项目调查 第四周 20 ...

  4. Struts2中的数据处理的三种方式对比(Action中三种作用域request,session&comma;application对象)

    1:在Action中如何获得作用域(request,session,application)对象: 取得Map(键值对映射集)类型的requet,session,application; 对数据操作的 ...

  5. 转:三种状态对象的使用及区别&lpar;Application&comma;Session&comma;Cookie&rpar;

    Application状态对象 Application 对象是HttpApplication 类的实例,将在客户端第一期从某个特定的ASP.NET应用程序虚拟目录中请求任何URL 资源时创建.对于We ...

  6. OpenTK学习笔记&lpar;2&rpar;-工作窗口的三种方法创建方法(winfrom窗体控件形式创建)

    参考资料: https://social.msdn.microsoft.com/Forums/zh-TW/1b781685-c670-4338-953d-1957a8f24a66/opentkglco ...

  7. OpenTK学习笔记&lpar;2&rpar;-工作窗口的三种方法创建方法(winfrom下类的形式创建)

    参考资料: https://www.codeproject.com/Articles/1167212/OpenGL-with-OpenTK-in-Csharp-Part-Initialize-the- ...

  8. OpenTK学习笔记&lpar;2&rpar;-工作窗口的三种方法创建方法(控制台)

    参考资料: 控制台下类的形式创建:http://www.cnblogs.com/podolski/p/7406628.html 总结: 一.控制台下类的形式创建 1.新建控制台应用 2.连网执行Nug ...

  9. &num; jsp及servlet学习笔记

    目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...

随机推荐

  1. 0517 Scrum 项目4&period;0

    Sprint 1看板: 任务认领(一种标签颜色代表一个人的任务): 许佳仪:紫色 柯晓君:红色 赖文亮:蓝色 卓宇靖:黑色 每日例会的时间:16:00     地点:课室 成员 团队贡献分 许佳仪 1 ...

  2. ArcGIS中文件共享锁定数据溢出 这个方法不行,建议用gdb,不要用mdb

    ArcGIS中文件共享锁定数据溢出 (2011-11-24 15:52:41) 转载▼ 标签: 杂谈 分类: GIS 文件共享锁定数溢出.(Error 3052)1. Access数据库,同时操作大量 ...

  3. Android 网络框架--Retrofit

    1.导入Jar包 compile 'com.google.code.gson:gson:2.8.0' compile 'com.squareup.retrofit2:retrofit:2.1.0' c ...

  4. jfinal框架教程-学习笔记

    jfinal框架教程-学习笔记 JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restfu ...

  5. 【原创】leetCodeOj --- Merge k Sorted Lists 解题报告

    题目地址: https://oj.leetcode.com/problems/merge-k-sorted-lists/ 题目内容: /** * Definition for singly-linke ...

  6. hdu 3045 Picnic Cows&lpar;斜率优化DP&rpar;

    题目链接:hdu 3045 Picnic Cows 题意: 有n个奶牛分别有对应的兴趣值,现在对奶牛分组,每组成员不少于t, 在每组中所有的成员兴趣值要减少到一致,问总共最少需要减少的兴趣值是多少. ...

  7. hadoop环境搭建之关于NAT模式静态IP的设置 ---VMware12&plus;CentOs7

    很久没有更新了,主要是没有时间,今天挤出时间验证了一下,果然还是有些问题的,不过已经解决了,就发上来吧. PS:小豆腐看仔细了哦~ 关于hadoop环境搭建,从单机模式,到伪分布式,再到完全分布式,我 ...

  8. TCP&sol;IP 第二章

    1, 以太网的封装格式.其中MTU的最小值为46字节,所以,ARP和RARP需要添加18字节的PAD.CRC是检验和.(循环冗余检验) 2,SLIP:(串行线路ip) 首尾一个end字符加以区分数据. ...

  9. HALCON学习笔记

    2019-2-2: 硬件选型--->镜头光源相机选型第一讲.avi: 高斯公式:1/u+1/v=1/f  u:物距  v:像距 f:焦距 线放大倍率:像高/物高  或者 像距/物距 镜头需要掌握 ...

  10. CodeForces5E 环转链&comma;dp思想

    http://codeforces.com/problemset/problem/5/E 众所周知,在很久以前,在今天的 Berland 地区,居住着 Bindian 部落.他们的首都被 n 座山所环 ...