serlvet

serlvet
serlvet

Servlet 1、什么是Servlet?

sun公司制订的一种用来扩展web服务器功能的

组件规范。

a,扩展web服务器功能

早期的web服务器(比如iis,apache的apache

web server)不能够处理动态资源的请求(

指的是,需要进行计算,生成新的页面)。

可以有两种方式扩展web服务器功能:

第一种方式:使用cgi程序去扩展

缺点是编程困难,移值性差。

第二种方式:使用组件加容器的方式去

扩展。

组件:符合特定规范、具有特定的功能的

软件模块。一般在组件当中编写业务逻辑。

容器:为组件提供运行环境,并且管理

组件的生命周期。容器会为组件提供一些

基础服务(比如,容器会将请求中的参数解析

出来,发送给组件,这样一来,组件就

没有必须解析请求中的参数了)。

优点是:编程相对简单,可移值性好。

b,规范:

2、如何写一个Servlet?

step1 写一个java类,实现Servlet接口或者

继承HttpServlet类。

step2 编译(servlet-api.jar)

step3 打包

建立一个如下结构的文件夹:

appname

WEB-INF

classes(.class文件)

lib(可选,放.jar文件)

web.xml(部署描述文件)

该文件夹也可以使用jar命令压缩成.war文件。

step4 部署

将step3生成的文件夹或者.war文件拷贝到web服务器(servlet容器)特定的文件夹下面。

step5 启动web服务器,访问

http://ip:port/appname/servlet-url

3、tomcat的安装与使用

1)安装

将tomcat解压到/home/soft01/下面。

配置环境变量

cd /home/soft01

vi .bash_profile

JA V A_HOME:

CATALINA_HOME: /home/soft01/tomcat5

PATH:/home/soft01/tomcat5/bin

2)启动tomcat

cd /home/soft01/tomcat5/bin

sh startup.sh

或者sh catalina.sh run

然后,在浏览器地址栏输入:

http://localhost:8080

3)关闭tomcat

cd /home/soft01/tomcat5/bin

sh shutdown.sh

4)tomcat服务器各个文件夹的作用:

bin:一些可执行文件,比如启动和关闭服务器。

common:一些通用的jar包,即部署在tomcat上

面的应用程序都可以访问这些jar包。

conf:一些配置文件,比如server.xml,可以配置

服务器启动的端口号。

webapps:部署文件夹,即我们开发的servlet,需要

拷贝到该文件夹底下。默认情况下,包含了一些

tomcat自带的应用。

work:服务器运行时,生成的一些临时文件。

4、Servlet是如何运行的。

比如,在浏览器地址栏输入

http://ip:port/firstweb/sayHello

1)浏览器依据ip,port建立与服务器之间的连接。

将请求数据按照http协议打包(该包称为

请求数据包,里面包含了请求资源路径),然后

发送给服务器。

2)服务器负责通讯的模块(一般称为servlet引擎)

创建两个对象:request,response。

request对象称为请求对象,服务器会将请求数据

包中的数据解析出来之后,存放到该对象里面,方便servlet从中获取数据。

response对象称为响应对象,servlet将处理结果

存放到该对象里面,由servlet引擎从该对象中取出数据后,生成响应数据包,发送给浏览器。

3)servlet引擎依据请求资源路径,找到对应的

servlet配置,并且创建相应的实例。接下来,会

调用该实例的service方法。该方法中,会包含

request,response两个对象。可以在service方法里

调用两个对象进行处理。

4)servlet引擎中response对象中获取处理结果,然后

生成响应数据包,发送给浏览器。

5、使用myeclipse开发servlet。

step1 myeclipse管理tomcat。

step2 创建一个web工程

6、常见的错误

1)404错误:

原因:访问路径写错,服务器依据访问路径

找不到对应的servlet,会报404错误。

404是一个http状态码,表示找不到对应的资源。

解决:检查访问路径以及web.xml配置文件。

2)500错误:

原因:程序出错。

解决:仔细检查servlet类的源代码。

3)405错误:

原因:服务器找不到service方法。

解决:仔细检查service方法签名。

练习:

写一个DateServlet,输出当前系统日期:

比如,输出"2012-2-10"

要求按如下方式访问: http://192.168.172.21:8080/

web01_lab/date

7、http协议(了解)

1)http协议是一个应用层协议,定义了浏览器(

或者是其它的程序)与web服务器通讯的过程及

数据格式。

2)通讯的过程:

step1 浏览器与服务器之间建立连接。

step2 浏览器将要发送的数据打包,发送

给服务器。

step3 服务器处理请求,将处理结果打包,发

送给浏览器。

step4 服务器关闭连接。

3)数据的格式:

a,请求数据包

请求行: 请求方式(get/post),

请求资源路径,协议的类型与版本。

若干消息头:

消息头由w3c定义,浏览器与服务器都

能理解的一些通讯规则。比如,浏览器

可以发送user-agent消息头,告诉服务器,

浏览器的类型与版本。

实体内容:

只有当请求方式是post时,请求参数才会

放在这儿,否则,会将请求参数放到

请求资源路径后面。

b,响应数据包

状态行: 协议的类型与版本状态码描述

若干消息头:

比如,服务器可以通过content-type

消息头,告诉浏览器返回的数据类型。

实体内容:

服务器返回的数据。

jvm 在内存当中保存的所有字符,都是以unicode

编码格式保存的。

编码:将以unicode编码格式保存的字节数组转换

成某个本地编码(比如gbk)格式保存的字节数组。

解码:将某个本地编码(比如gbk)格式保存的字节

数组转换成unicode编码格式保存的字节数组。

8、get/post请求:

1)哪一些是get请求。

a,在浏览器地址栏直接输入某个地址

b,点击链接

c,表单默认的提交方式

练习:

写一个bmi应用程序。

体质指数(BMI)=体重(kg)/身高(m)/ 身高(m)

EX:70kg/1.75/1.75=22.86

成人的BMI数值

体重指数, 男性, 女性

过轻, 低于20, 低于19

适中, 20-25, 19-24

过重, 25-30, 24-29

肥胖, 30-35, 29-34

非常肥胖, 高于35, 高于34

专家指出最理想的体重指数是22

1、get/post请求:

1)哪一些是get请求。

a,在浏览器地址栏直接输入某个地址

b,点击链接

c,表单默认的提交方式

2)哪一些是post请求

a,设置表单method="post"

3)get与post方式的区别

a,get方式发送请求时,请求参数会显示在浏览器地址栏,不安全。请求参数会添加到请求

资源路径后面,所以,只适合提交少量数据给

服务器。

b,post方式发送请求时,请求参数不会显示在浏览器地址栏,相对安全。请求参数会存放在

请求数据包的实体内容里面。适合提交大量的数据。2、表单中文问题

当表单采用post方式提交时,如何正确地获得

中文参数值:

1)产生问题原因:

浏览器会对表单中的中文参数按照打开该页面时的编码格式来编码。比如,在页面当中,使用了

content="text/html;charset=utf-8">,则浏览器

一定会按照utf-8这种编码格式对请求参数进行编码。

而服务器端,默认情况下,会按照iso-8859-1 这种编码格式进行解码,所以会出现乱码。

2)如何解决:

step1:在html文件当中,添加

content="text/html;charset=utf-8">

step2:服务器端

request.setCharacterEncoding("utf-8");

其作用是:告诉服务器,对请求参数按照

utf-8这种编码格式进行解码。

3、访问数据库

1)需要将数据库的驱动程序(.jar)文件拷贝到

WEB-INF\lib。

2)处理异常

a,如果异常能够恢复,则一定要恢复。一般来说,

应用异常(用户的操作引起的)都是可以恢复的异常。

b,如果异常是系统异常(比如数据库没有启动,

导致应用程序连接不上,又比如网络问题),此时,

程序无法恢复,必须提示用户。

在写一个servlet时,如果发生系统异常,按照如下两个步骤来处理。

step1 throw e; //将异常扔给服务器。

step2 告诉服务器如何处理系统异常。

写一个异常处理页面error.html

在web.xml当中,配置:

500

/error.html

c,记日志。

4、mysql数据库的使用

1)登录数据库

mysql -uroot;

2)查看数据库实例

show databases;

3)创建一个数据库

create database jd1111db

default character set utf8;

4)使用数据库

use jd1111db;

5)查询当前数据库有哪些表

show tables;

6)建表

create table t_employee(

id bigint primary key auto_increment,

name varchar(20),

salary double,

age int

);

create table t_user(

id bigint primary key auto_increment,

username varchar(20) unique,

name varchar(50),

pwd varchar(20),

birthday date,

registTime datetime,

info text,

gender char(1)

);

7)对表中数据的增删改查

insert into t_employee(name,salary,age)

values('zs',2000,22);

select * from t_employee;

update t_employee set name='ww' where id=1;

delete from t_employee where id=1;

练习:

写一个ListEmpServlet,以表格的形式返回所有

雇员信息。

http://ip:port/web02_2/list

1、重定向

1)什么是重定向?

服务器向浏览器发送一个302状态码及一个Location消息头(该消息头的值是一个地址)。

浏览器在收到之后,会立即向这个地址发送

请求。

2)编程

response.sendRedirect(String url);

需要注意的问题:

重定向之前,不能够有任何的输出,否则会发生错误。

重定向之前,会先清空response中缓存的数据。

3)特点

a,重定向的地址是任意的。

b,重定向之后,浏览器地址栏的地址会变成

Location所指定的地址。

2、dao

1)什么是dao?

data access object(数据访问对象)

封装了数据访问逻辑的一个模块。这样做的好处是:当数据访问逻辑发生了改变,不会影响到

调用模块。

2)如何写一个dao?

a,写一个实体类:

所谓实体类,其实就是一个java类,与要访问

表对应。

比如:

Employee类(id,name,salary,age)

b,写一个接口,在接口当中,声明相应的

数据访问方法。

需要注意的是:声明的方法不应该与具体的

技术相关。

比如:

EmployeeDAO接口

public void save(Employee e)

throws Exception;

c,使用某种具体技术实现接口。

比如:

EmployeeDAOImpl类,采用jdbc技术实现save操作。

d,写一个工厂类,方便调用者调用该dao。

工厂类:封装了对象的创建过程,调用者不需要了解对象的具体创建细节,就可以通过

工厂类来获得相应的实例。

练习:

写一个“学员信息管理系统”。

功能:

1)列出所有学员的基本信息(包括

id,姓名,性别,年龄),当点击"查看",

则还要显示电话。

2)添加新学员

3)删除学员

4)查看学员信息

5)修改某个学员的信息

实现:

step1 建一个t_student表

create table t_student(

id bigint primary key auto_increment,

name varchar(20),

gender char(1),

age int,

phone varchar(20)

);

1、容器(web服务器)如何处理请求资源路径?

比如,在浏览器地址栏输入:

http://ip:port/appname/abc.html

端口号之后的内容就是请求资源路径。

step1 依据appname找到应用所在的文件夹。

step2 使用web.xml中的

配置与/abc.html去匹配。

精确匹配: 要求配置必须是/abc.html。

通配符匹配:

使用"*"来代替任意的字符串。

比如: /*,/abc/*

后缀匹配:

*.任意的字符串。

比如: *.do, *.action

*.do表示任意的以.do结尾的字符串。

step3 如果前面匹配都不成功,则认为是一个

静态资源(比如是一个html文件),会查找相应的

静态资源,如果找到,则返回,找不到,返回

404。

2、一个servlet处理多个请求。

step1 web.xml,使用后缀匹配。

step2 在servlet类的service方法里,分析请求

资源路径,然后分别处理。

String request.getRequestURI();

3、servlet的核心类与接口以及生命周期

1)核心类与接口

a, Servlet接口

init(ServletConfig config):用于初始化

destory():在销毁servlet对象之前被调用,

用于释放资源。

service(ServletRequest req,

ServletResponse res):用于处理请求。

b,ServletConfig接口

String getInitParameter(String name):

用来获得servlet的初始化参数。

比如:getInitParameter("company");

c,ServletRequest接口

是HttpServletRequest的父接口

d,ServletResponse接口

是HttpServletResponse的父接口

e,GenericServlet抽象类

实现了Servlet接口中的两个方法

init,destroy。

f,HttpServlet抽象类

继承了GenericServlet抽象类

实现了Servlet接口中的service方法。

该service方法会依据请求方式调用相应的

do***方法。比如,以get请求方式访问,则

该service方法会调用doGet方法。

如果要写一个servlet,有两种选择:

第一种选择: override service方法。

第二种选择: override doGet,doPost方法。

2)生命周期

servlet容器创建servlet对象、分配其资源、调用其方法来处理请求、以及销毁servlet

对象的整个过程。

四个阶段:

a,实例化阶段:

即容器创建servlet对象。

两种情况下,容器会创建对象:

情况1:当请求到达容器时,容器会查看

对应的servlet对象是否存在,如果不存在,

则创建,否则,不会创建。

情况2:容器在启动的时候,会检查

web.xml当中的servlet的配置信息,如果

某个servlet有配置,则

会创建该servlet对象。

参数必须是>=0的一个整数,

值越小,优先级越高(先被创建)。

b,初始化

容器调用servlet对象的init方法。容器

会先创建一个ServletConfig对象,将这个

对象作为参数传给init方法。

如果要override init方法,最好override

init()方法,即不带参的那个。

init方法只会执行一次。

c,就绪

容器调用servlet对象的service方法来

处理请求。

d,销毁

容器先调用servlet对象的destroy方法,

然后,销毁servlet对象。

练习:

计算某种产品的销售价格。

客户端:

输入产品的原始价格,销售地点

服务端:

计算产品的销售价格并输出。

计算规则:

销售价格= 原始价格* (1 + 税率)

税率在web.xml配置文件中配置。

taxRate

bj,0.08;sh,0.09;cs,0.06

1、什么是jsp?

java server page(java服务器端页面技术)。

sun公司制订的一种服务器端动态页面生成技术规范。

因为采用servlet生成动态页面过于繁琐,并且代码

很难维护,所以,需要一种比较简单的方式来生成

动态页面。jsp正是这样一种技术。

2、如何写一个jsp文件?

step1 写一个.jsp为后缀的文件。

step2 在这个文件当中,添加如下内容:

1) html标签及内容

直接写即可。

2)java代码

a, java代码片断:

<% java代码%>

b,jsp表达式

<%=java表达式%>

3)隐含对象

在jsp文件当中,不用声明和创建,即可

直接使用的对象。因为容器会生成声明和创建

这些对象的代码。

out

request

response

4)指令

让容器在将.jsp文件转换成.java文件时,

做一些额外的处理,比如添加相应的包等等。

<%@指令名属性名=属性值%>

a,page指令

import属性:作用是导包,即在.java文件中,

添加相应的包。

pageEncoding属性: 告诉容器,.jsp文件保存

时所使用的编码。

contentType属性: 在.java源文件中,添加

response.setContentType语句。

3、jsp是如何运行的?

step1 容器将.jsp文件转换成.java文件(其实就是

一个servlet)。

a, html内容(包括html标签,

内容,css,javascript)

---> 放到service方法里,使用out.write输出。

b, java代码片断<% %>

---> 放到service方法里,照搬。

c, jsp表达式<%= %>

---> 放到service方法里,使用

out.print输出。

step2 容器调用该servlet的service方法。

4、转发

1)什么是转发?

一个web组件(servlet/jsp) 将未完成的处理交给另外一个web组件继续完成。

一般应用的场合:一个servlet处理请求之后,将处理结果交给一个jsp,让jsp依据处理结果生成

相应的界面。

2)如何转发?

step1 将处理结果绑订定到request对象上。

request.setAttribute(String name,

Object obj);

//如果name对应的值不存在,则返回null。

Object request.getAttribute(String name);

request.removeAttribute(String name);

step2 获得转发器

//uri:是要转发的目的地,目的地只能是

//同一个应用的内部。

RequestDispatcher rd =

request.getRequestDispatcher(String uri);

step3 转发

rd.forward(request,response);

3)转发编程需要注意的事项

转发之前,不要有任何的刷新操作,否则会出错。

转发之前,如果response当中缓存有数据,会

先清空。

4)转发的特点

a,转发的目的地只能是同一个应用内部的各个

组件之间。

b,转发之后,浏览器地址栏的地址不会变。

include指令

<%@include file=""%>

作用是:指示容器,在将.jsp文件转换成

.java文件时,在指令所在的位置插入file

所指定的文件的内容。

1、路径问题

a,链接地址

b,表单提交

c,重定向response.sendRedirect("路径");

d,转发request.getRequestDispatcher("路径");

1)相对路径与绝对路径

相对路径: 不以"/"开头的路径

绝对路径:以“/"开头的路径

2)如何写绝对路径

a,b,c这三种情况下,以"/"开头,从应用名

开始;d,以"/"开头,从应用名之后开始。

String request.getContextPath();

该方法会返回"/appname"。

2、注册与登录

sql注入

练习:

完成注册与登录模块

要求:

要求保存到数据库中的密码为密文。

create table t_user2(

id bigint primary key auto_increment,

username varchar(20) unique,

name varchar(32),

pwd varchar(100),

gender char(1));

1、状态管理

1)什么是状态管理?

浏览器与服务器之间,每建立一次连接,

只能发送一次请求,服务器没有办法知道

发送请求的浏览器是谁。但是,有些应用,

需要浏览器与服务器之间进行多次请求与

响应(比如购物),此时,需要对这些请求

与响应所涉及的数据进行管理:即将浏览器

每一次与服务器之间交互的数据保存下来。

2)如何进行状态管理?

a,将数据保存在客户端(浏览器):cookie

b,将数据保存在服务器端:session

3)cookie

a,什么是cookie?

浏览器在访问服务器时,服务器会将少量的数据以set-cookie消息头的方式发送给浏览器。浏览器

会将这些数据保存下来,当浏览器下次再次访问

服务器时,会将这些数据以cookie消息头的方式

发送给服务器。

b,如何创建cookie?

Cookie cookie = new Cookie(String name,

String value);

response.addCookie(cookie);

c,如何查询cookie ?

//有可能返回null。

Cookie[] cookies = request.getCookies();

String cookie.getName();

String cookie.getValue();

d,如何保存中文?

因为cookie的值只允许是ascii字符,中文

需要编码之后才能保存,以就是说,将中文

转换成ascii字符来表示。

//将字符串进行某种编码,然后将编码

//之后生成的字节数组转换成字符串。

String URLEncoder.encode(String,String);

//将编码之后的字符串转换成原字符串。

String URLDecoder.decode(String,String);

e,cookie的生存时间

cookie.setMaxAge(int seconds);

seconds > 0: 浏览器会将cookie以文件的方式

保存在硬盘上,当指点的时间到达后,会删除

该文件。

seconds = 0: 删除cookie。

Cookie cookie =

new Cookie("username","");

cookie.setMaxAge(0);

response.addCookie(cookie);

seconds < 0: 缺省值,浏览器将cookie

保存在内存里面。浏览器关闭,cookie会

被删除。

f, cookie的路径问题

浏览器在向服务器上的某个地址发送请求时,

会先比较cookie的路径与要访问的地址,只有

满足条件的cookie,才会发送。

只有以下条件满足时,浏览器才会向服务器

发送cookie:

要访问的地址是cookie的路径或者是其子

路径。

默认情况下,cookie的路径是创建该cookie

的组件的路径。一般需要修改。

cookie.setPath(String);

比如:

cookie.setPath("/appname");

g、cookie的限制

用户可以禁止cookie。

cookie只能保存字符串,并且需要考虑编码问题。

cookie保存的数据大小有限制(4k左右,与浏览器

有关系)

cookie的个数也有限制:浏览器在本地大约

能保存300个左右的cookie(与浏览器

有关系)。

cookie将数据保存在客户端,不安全。

练习:

写一个Find_AddCookieServlet,先查询有没有一个名叫"userId"的cookie,如果有,则输出

该cookie的值,如果没有,则创建。

Cookie c = new Cookie("userId","123")。

4)session

a,什么是session?

浏览器访问服务器时,服务器会创建一个

session对象,该对象有一个唯一的标识,称为

sessionId。服务器在默认情况下,会将该

sessionId以set-cookie消息头的方式发送给

浏览器。浏览器在下一次访问服务器时,会将

该sessionId以cookie消息头的形式发送过来。

服务器依据sessionId 找到对应的session对象。

b,如何创建session?

方式一:

HttpSession session =

request.getSession();

方式二:

HttpSession session =

request.getSession(boolean flag);

当flag = true时:

当请求到达服务器时,服务器会检查

请求中是否包含sessionId,如果没有session

Id,则服务器创建一个session对象。

如果有sessionId,则服务器要依据sessionId,

查找对应的session对象,如果找到,则

返回;如果找不到(比如session超时),

则服务器会创建一个新的session对象。

当flag为false时:

当请求到达服务器时,服务器会检查

请求中是否包含sessionId,如果没有session

Id,则返回null。

如果有sessionId,则服务器要依据sessionId, 查找对应的session对象,如果找到,则

返回,如果找不到,返回null。

getSession()与getSession(true)完全相同。

c,常用的方法

//返回sessionId。

String session.getId();

//绑订数据

session.setAttribute(String name,

Object obj);

//获得绑订值,有可能返回null。

Object session.getAttribute(String name);

//解除绑订

session.removeAttribute(String name);

d,session的超时

服务器会将超过指定时间间隔的session

对象删除掉(前提条件是,该session对象

在这个间隔的时间内没有被调用)。

方式一:

session.setMaxInactiveInterval(int seconds);

方式二:也可以通过修改配置文件的方式

来指定超时限制:比如tomcat,默认的超时

限制是30分钟。可以通过修改conf\web.xml

配置文件来修改(会影响到部署在该服务器上的

所有应用)。

30

也可以将这个配置信息添加到某个具体的应用的

web.xml文件中。

e,删除session。

session.invalidate();

案例:

session验证

对于需要受保护的资源(指的是,只有登录成功,

才能访问的资源),添加

Object obj =

session.getAttribute(String name);

如果obj值为null,则重定向到登录页面,

否则,允许访问。

写一个“留言板"。

a,当用户没有填写任何的数量,点击“修改”

,提示用户必须填写数量。

b,数量必须是数字,否则提示用户。

c,用户填写的数量如何包含空格,要将空格除掉。

1、如果用户禁止cookie,如何继续使用session机制?

解决办法:

可以使用url重写机制。

所谓url重写机制,指的是,不直接在浏览器地址

栏填写要访问的web组件(servlet/jsp)的地址,而是

由服务器生成相应的web组件的地址(服务器会在

要访问的web组件的地址后面添加sessionId)。

2、如何进行url重写?

a,response.encodeURL(String url);//该方法会在url

后面添加sessionId。在链接地址,表单提交时使用。

response.encodeUrl(String url);//与上面方式等价。

b, response.encodeRedirectURL(String url);//

在重定向的地址后面添加sessionId。在重定向时使用。

response.encodeRedirectUrl(String url);

访问count

3、过滤器

1)什么是过滤器?

servlet规范中定义的一种特殊的类,可以

拦截容器的调用过程。

2)如何写一个过滤器?

step1 写一个java类,实现Filter接口。

step2 在doFilter方法里面,实现过滤处理。

step3 在web.xml文件当中,配置过滤器。

3)配置初始化参数

step1 web.xml文件中,使用

为过滤器添加一个或者多个

初始化参数。

step2 在过滤器类里,使用

String FilterConfig.getInitParameter(String paraName);

访问初始化参数。

4)过滤器的优先级

配置的先后顺序决定了

过滤器执行的先后顺序。

5)过滤器的优点

a, 将多个模块相同的逻辑写在过滤器里面,

方便代码的维护。

b,可以实现“代码的可插拔性"。增加或者减少一个过滤器,不会影响到原有的代码。

练习:

写一个过滤器CommentFilter2,

该过滤器检查用户所发表的评论的字符的个数,

如果个数超过限制(个数限制要在

web.xml中配置),则不允许发表,否则,调用

CommentServlet输出评论。

4、上传文件(扩展)

step1 在表单当中,添加

enctype="multipart/form-data"

即:

enctype="multipart/form-data">

设置表单的编码方式,如果

enctype="multipart/form-data",

浏览器不会对表单中的数据进行url

编码,而是直接以二进制流的方式将

数据发送给服务器。此时,在服务器

端,不能够使用request.getParameter

方法来获得参数值。只能够使用

InputStream ips = request.getInputStream();

获得输入流,然后分析该流来获得相应的数据。

step2 在服务器端,使用servlet来处理上传文件。

在service方法当中,一般使用工具来分析

InputStream。比如apache提供的

commons-fileupload.jar。

1、监听器

1)什么是监听器?

servlet规范当中定义的一种特殊的类,可以监听

容器产生的两大类事件并进行相应的处理。

第一类事件(生命周期相关事件):当容器创建

或者销毁ServletRequest,HttpSession,

ServletContext三个对象时产生的事件。

第二类事件(绑订事件):当容器调用了

ServletRequest,HttpSession,ServletContext

三个对象的setAttribute,removeAttribute

时产生的事件。

2)如何写一个监听器?

step1 写一个java类,实现相应的监听器接口。

step2 在监听器接口的相应方法中,实现

监听的逻辑。

step3 在web.xml文件中,配置监听器。

3)ServletContext接口

容器在启动的时候,会为每一个应用创建唯一的一个符合ServletContext接口的实例。该实例称之

为Servlet上下文。该实例(也就是对象)会一直存在,

除非容器关闭。

可以通过如下方式来获得该实例:

GenericServlet提供的getServletContext()方法。

HttpSession提供的getServletContext()方法。

ServletConfig提供的getServletContext()方法。

该接口提供了如下的一些方法:

//绑订相关的方法

setAttribute(String name,Object obj);

Object getAttribute(name);

removeAttribute(name);

//获得实际部署的物理的路径。

String getRealPath(String path);

//获得全局的初始化参数

String getInitParameter(String name);

统计在线人数:

重复提交问题:

产生的原因:

当用户点击提交之后,系统正在处理,用户没有等待系统返回的处理结果,又重新点击提交,

或者,点击后退页面之后,再点击提交。此时,

系统会收到多个提交请求,产生重复提交问题。

解决方法:

step1,使用一个监听器,当容器在创建一个

session对象之后,绑订一个随机数flag = 1。

step2,在表单里面,添加一个隐藏域,值

也是flag的值,即1。

step3,用户点击提交,后台比较提交的值与

session当中绑订的值,如果相等,说明是第

一次提交,此时,需要将session中的随机数

重置。当用户不等系统回应,又点击提交,此

时,提交的flag与session中的flag是不相等的,

不允许再次提交。

2、servlet的线程安全问题

1)产生的原因?

默认情况下,容器只会为某个servlet创建

唯一的一个实例。这样,如果有多个请求同时

去访问该实例,就会有多个线程同时调用该

实例的方法。

2)解决方法:

a,使用synchronized加锁。

b,让servlet实现SingleThreadModel接口。

容器一旦收到请求,就会创建一个新的实例。

不建议使用此种方式,因为会创建大量的重复的

实例。

c,尽量不去修改servlet属性值。

Servlet小结

一、servlet基础

1、什么是servlet?

2、什么是servlet容器?

3、如何开发一个servlet?

4、http协议(了解)

5、tomcat的基本使用(了解)

二、servlet核心

1、servlet核心类与接口

a,Servlet接口

b,GenericServlet抽象类

c,HttpServlet抽象类

d,ServletRequest,ServletResponse接口

e,HttpServletRequest接口

String getParameter(String name);

//当有多个请求参数名称相同,使用该方法

//比如?city=bj&city=wh&city=cs

String[] getParameterValues(String name);

setCharacterEncoding(String code);

String getRequestURI();

RequestDispatcher getRequestDispatcher(String uri);

setAttribute(String name,Object obj);

Object getAttribute(String name);

removeAttribute(String name);

Cookie[] getCookies();

HttpSession getSession(),getSession(boolean flag);

String getContextPath();

f,HttpServletResponse接口

setContentType(String type);

PrintWriter getWriter();

sendRedirect(String url);

addCookie(Cookie c);

相关主题
相关文档
最新文档