Servlet的任务

1、  读取客户端发送的显示的数据,包括HTML表单和一些客户端程序的表单

2、  读取客户端发送的隐式的数据,包括cookies、媒体类型等

3、  处理数据并产生结果

4、  向客户端返回显示的数据,比如HTML/XML等文本文件,二进制文件(gif图像),Excel

5、  向客户端返回隐式的Http响应,比如cookies,返回的文档类型

 

Servlet的生命周期

1、  init()方法进行初始化

只调用一次,会简单的加载或创建一些数据

2、  service()方法处理客户端的请求

service()方法有servlet容器调用,只需要根据需求重载doGet,doPost方法即可

3、  destroy()方法终止servlet

只调用一次,可以关闭数据库连接,结束后台线程,将servlet对象标记为垃圾回收

Ps:servlet容器中有很多servlet实例,一个线程执行一个servlet实例的service()方法

Servlet访问URL的配置

客户端都是通过URL来访问web服务器资源,类似于远程访问某一台计算机的文件系统(某一个文件夹下的资源)。要想访问servlet,就必须把servlet映射到某一个地址上。在web.xml中的配置如下

<servlet>

<servlet-name>servlet的命名</servlet-name>

<servlet-class>servlet类名</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>与上面的servlet命名对应</servlet-name>

<url-pattern>地址。。相对地址</url-pattern>

</servlet-mapping>

Ps:此处可以有很多<servlet-mapping>,而且可以是相同的servlet-name指向不同的URL,那样不同的URL都可以访问相同的servlet

缺省servletURL用斜杠(/)表示,只要是在web.xml中找不到对应的servlet-mapping都访问这个缺省的servlet

线程安全问题

多个客户端访问同一个servlet的时候,事实上是创建了多个线程,同时访问这个servlet,这样就存在多线程并发访问同一资源,可能会造成数据的错误。

网上给的解决办法:1、对对象加锁,但是改变了访问策略(相当于每一个客户端是排队访问);2、实现SingleThreadModel接口,事实上是实例化了多个对象,每一个线程相当于单线程访问,对资源的操作互不影响,但是这个方法过时(Dprecated)了

Servlet初始化参数

在web.xml中用<init-param>配置参数,格式如下

<servlet>

<servlet-name>name</servlet-name>

<servlet-class>Servlet.test.servletdemo</servlet-class>

<!-- 配置servletdemo的初始化参数 -->

<init-param>

<param-name>id</param-name>

<param-value>song</param-value>

</init-param>

<init-param>

<param-name>password</param-name>

<param-value>123456</param-value>

<init-param>

</servlet>

可以在程序中用ServletConfig获取参数:当servlet配置了初始化参数后,web容器在创建servlet实例的时候会自动将参数封装到ServletConfig对象中,然后通过SevletConfig的方法(get**)获取参数

ServletContext对象

Web容器在启动时会为每一个web应用创建一个ServletContext对象,ServletConfig中维护了ServletContext的引用,因此可以通过ServletConfig中的方法得到web应用的ServletContext。每一个servlet共用一个ServletContext,因此可以利用ServletContex在servlet之间进行通讯。

ServletContext可以通过web.xml配置初始化参数,格式如下:

<context-param>

<param-name>address</param-name>

<param-value>Beijing.haidian.xueyuan.Road</param-value>

</context-param>

请求转发:一个对servletA的请求转发至servletB,这样就可以达到本来对A的地址访问,结果转到对B的地址访问,操作如下:

A的类中:

ServletContext context = this.getServletContext();

RequestDispatcher rd = context.getRequestDispatcher(“B的访问地址”);

rd.forward(request, response);

B的类中,无变化

Servlet处理表单数据

1、  利用getParameter()方法可以很简单的获得传递的数据

2、  利用getParamtername()方法可以获得全部表单的数据

3、  利用getParameterValue(ParameterName)方法可以获得单值或多值的数据

Servlet可以通过方法获取HTTP请求的头部信息和设置HTTP响应的头部信息

HttpServletResponse对象可以调用senderror()方法,向客户端返回错误(状态码)

Servlet过滤器Filters(实现Filter接口)

配置和servlet类似,需要放在<filter>标签下,一个URL可以有多个过滤器,多个过滤器的顺序与web.xml中的顺序是一致的

调用的顺序:init----doFilter----destroy

Servlet异常处理

在web.xml中进行配置

首先定义一个servlet映射,将错误处理方法映射到错误页面

然后定义error-code的错误页面和exception-code的错误页面,配置如下

<error-page>

<error-code>状态码</error-code>

<location>错误处理页面的地址</location>

</error-page>

<error-page>

<exception-type>异常完整名(eg.  java.io.IOException)</exception-type>

<location>异常处理页面的地址</location>

</error-page>

(个人观点:事实上,就是一旦出现这种错误或者抛出了这种异常就跳到定义的页面,跳到定义的页面之后又会被servlet拦截,执行相应的servlet)

Servlet Cookie

存储在客户端计算机上的文本文件

识别用户:服务器脚本向浏览器发送cookies,比如姓名,识别号码等;浏览器将cookies存储在本地;下一次浏览器访问服务器时将发送cookies给服务器,服务器通过cookies来识别用户。

Cookies可以读取,查找,设置,删除(将生存时间置为0然后添加到响应头即可)

Servlet Session

主要是用来维持服务器与客户端的交流信息

每一个session都有一个sessionid,服务器可以通过调用request.getSession()方法获取HttpSession对象,然后通过一系列方法可以对其进行操作

网页重定向

通过设置response的status和header,将网页重定向到另外一个网页,具体方法如下:

response.setStatus(response.SC_MOVED_TEMPORARILY);

response.setHeader("location", site);

site是新站点

网站点击计数器

可以在servlet或者过滤器Filter中实现,实现方法如下:

设置一个全局变量,每次调用do*方法的时候计数器加1,;如果只想对session会话计数,只需要增加isNew()方法来进行判断;还可以将计数器的值存入数据库,每次在init()方法的时候读取这个值,在destroy()方法中将值写会数据库

页面自动刷新

利用HttpServletResponse对象的setHeader方法设置刷新时间,实现如下:

response.setheader(“refresh”, 5);//刷新时间间隔为5s

servlet基础学习总结的更多相关文章

  1. Servlet基础学习

    Servlet学习 Servlet是Server与Applet的缩写,是服务端小程序的意思.使用Java语言编写的服务器端程序,可以像生成动态的WEB页,Servlet主要运行在服务器端,并由服务器调 ...

  2. JSP/Servlet基础语法

    相关学习资料 http://my.oschina.net/chape/blog/170247 http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp ...

  3. Struts2基础学习2

    Struts2基础学习2 项目结构,测试页面与实体类 <%@ page language="java" contentType="text/html; charse ...

  4. Servlet还有学习的必要吗?(手工搭建Servlet)

    前言 在初学Java web的时候,就曾听到过这样一种说法: java Web的演变过程大概可以分为4个阶段: jsp + Servlet + jdbc spring + struts2+ hiber ...

  5. Spring Framework基础学习

    Spring Framework基础学习 Core support for dependency injection,transaction management,web applications,d ...

  6. MacOS下SpringBoot基础学习

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"springboot"获取视频和教程资料! b站在线视 ...

  7. maven基础学习-为什么要用maven,帮助解决了什么问题,怎么解决的,希望以后学习每个知识点都可以这样问下自己

    maven基础学习 第1章 Maven介绍 1.1 什么是Maven 1.1.1 什么是Maven Maven 的正确发音是[ˈmevən],而不是"马瘟"以及其他什么瘟.Mave ...

  8. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  9. 如何从零基础学习VR

    转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...

随机推荐

  1. rdlc报表随笔心得 ,基本结构和一些表达式。

    Dataset Form RDLC 主要放数据集的文件夹 存放窗体的文件夹 存放各种报表的文件夹 第一部,创建报表结构 首先添加数据集项 添加完成之后我们会看到这个页面 之后我们在上面添加一些数据集 ...

  2. CH1102 火车进出栈问题(高精/卡特兰数)

    描述 一列火车n节车厢,依次编号为1,2,3,-,n.每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种. 输入格式 一个数,n(n<=60000) 输出格式 一个数s表示 ...

  3. php生成带自定义logo和带二维码跳转自定义地址的二维码

    index.php<?phpheader('Content-type:text/html;charset=UTF-8');// 指定允许其他域名访问header('Access-Control- ...

  4. 七、Delphi10.3读取JSON数组

    一.Delphi读取JSON数组是非常方便的,首先我们网上找一段JSON数据 { "error": 0, "status": "success&quo ...

  5. 一、Delphi中Cxgrid表格滚动条粗细设置

    1.Delphi VCL新版本的Cxgrid滚动条默认是触屏模式(如下图),很细的滚动条,在电脑版显示非常不方便. 2.如果需要改成传统的滚动条模式,需要设置一下LookAndFeel里面的Scrol ...

  6. linux-2.6内核驱动学习——jz2440之输入子系统

    如果按照上一篇记录的那样,只有本公司的人或者自己才能使用驱动.想写出一个通用的驱动程序,让其他应用程序来无缝移植,需要使用现成的驱动——输入子系统. /drivers/input/input.c #d ...

  7. Golang设计模式—简单工厂模式(Simple Factory Pattern)

    Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...

  8. docker 设置映射端口 目录挂载

    docker run -p 3092:9092 -p 3093:9093 -p 3094:9094 -p 3181:2181 --name="kafka_map_port_3092_4_31 ...

  9. C语言 基础练习40

    一.题目 1.输入2个整数,求两数的平方和并输出. 2. 输入一个圆半径(r)当r>=0时,计算并输出圆的面积和周长,否则,输出提示信息. 3.函数y=f(x)可表示为: 4.编写一个程序,从4 ...

  10. 2016年JD工作遇到的问题:6-15,日常小问题

    6.eclipse通过类名,找到所在的jar包. 解决办法:选中class, 快捷键 Ctrl +Shift+ T!!然后-- 之前经常是,根据类名找到对应的源文件,大脑短路,忘了下面的jar包提示. ...