servlet笔记.docx
《servlet笔记.docx》由会员分享,可在线阅读,更多相关《servlet笔记.docx(40页珍藏版)》请在冰豆网上搜索。
servlet笔记
Servlet笔记
一、servlet基础
1、什么是servlet?
sun公司制订的一种用来扩展web服务器功能的
组件规范。
1)扩展web服务器功能
早期的web服务器只能够处理静态资源的请求,
不能够依据用户的请求进行计算,生成动态资源。
解决方式有两种:
解决方式一:
使用CGI接口,编写相应的程序。
当请求到达
web服务器时,服务器可以调用CGI程序来处理。
使用CGI程序的问题是:
开发复杂、可移值差、
如果处理不当,性能也比较低。
解决方式二:
使用容器+组件的方式。
web服务器在收到请求后,可以调用容器来处理,
容器用于提供一些基础服务(比如参数的处理,
指的是分析二进制数据流,获得参数),
具体的请求,由容器来调用组件来处理。
2)组件规范
a,什么是组件?
符合规范,实现某种特定功能的,并且可以
部署在某种容器上运行的程序模块。
b,什么是容器?
符合规范,提供组件运行环境的程序。
该程序
还要管理组件的生命周期(即创建组件的实例、
分配相应的资源,调用组件的方法、并且在不再
需要组件时删除其实例的整个过程)。
2、如何开发一个servlet?
step1写一个java类,实现Servlet接口或者
继承HttpServlet类。
step2编译成.class文件。
step3打包(按照规范,定义一个目录结构)
appname
WEB-INF
classes(.class文件)
lib(jar文件,可选)
web.xml(描述文件)
该描述文件可以参考tomcat自带的一些
案例(tomcat主目录/webapps/servlet-examples)。
step4部署
指的是将step3生成的整个目录结构或者
将该结构使用jar命令打包之后生成的
.war文件拷贝到服务器特定的目录(对于
tomcat服务器,就是webapps)。
step5启动服务器,访问servlet。
访问格式:
http:
//ip:
port/appname/
servlet的路径
3、安装和使用tomcat
安装:
将/opt/apache-tomcat5.5...压缩文件
解压到/home/soft01/tomcat5
主目录(tomcat5)。
配置环境变量:
cd/home/soft01
vi.bash_profile
在该文件当中,添加以下几个环境变量
JAVA_HOME:
CATALINA_HOME:
/home/soft01/tomcat5
PATH:
/home/soft01/tomcat5/bin
启动tomcat:
cd/home/soft01/tomcat5/bin
shstartup.sh
或者
shcatalina.shrun
在浏览器地址栏输入:
http:
//localhost:
8080
关闭tomcat:
shshutdown.sh
1、servlet的运行过程
从浏览器输入http:
//ip:
port/helloweb/sayHello?
name=zs
开始分析:
step1浏览器依据ip,port连接服务器。
step2浏览器将请求数据打包(即按照http
协议,将请求数据打成一个数据包,里面包含
请求资源路径(/helloweb/sayHello...))。
step3浏览器发送请求(即将请求数据包发送给服务器)。
step4服务器解析请求数据包,将数据包中的数据
提取出来,生成一个request对象(请求对象,其作用
是方便servlet读取请求数据)。
另外,还要创建一个
response对象(其作用是,servlet将处理结果放置
到该对象上之后,服务器可以从该对象获取结果,生成
相应的响应数据包发送给浏览器)。
step5服务器依据"/helloweb"找到部署目录下的
文件夹,找到该文件夹下面的web.xml文件,通过该
文件,找到servlet类名,接下来通过反射机制创建
servlet对象。
step6服务器调用servlet对象的service()方法。
在调用该方法时,会将step4中创建的request,response
对象作为参数传递。
step7servlet处理请求,在处理请求时,可以通过
request获得请求数据,也可以将处理结果放到response
对象上。
step8服务器从response中获取数据,生成响应数据包,
发送给浏览器。
step9浏览器解析响应数据包,生成相应的界面。
从中可以看出:
1)、开发一个servlet,我们只需要关注如何处理请求,
不要关心网络通讯问题以及协议相关的问题,因为这些
操作都是由服务器来负责的。
2)、servlet不依赖于特定的某个容器(服务器)来运行。
练习:
写一个DateServlet,输出当前系统时间。
输出格式
"2011-12-23"。
访问方式:
http:
//localhost:
8080/web02_lab/time
2、http协议(了解)
1)什么是http协议?
由w3c定义的一套网络应用层协议,定义了浏览器
(或者其它客户端程序)与web服务器之间通讯的过程
与数据的格式。
2)通讯的过程
step1浏览器向服务器发送建立连接的请求。
step2浏览器将要发送的数据打包,发送给服务器。
step3服务器处理请求,将请求结果打包,发送给浏览器。
step4服务器关闭连接。
如果浏览器再次发送请求,需要再次建立连接。
3)数据格式
a,请求数据包(浏览器发送给服务器)
请求行:
请求方式(get/post)请求资源路径协议的类型与版本
若干消息头:
a1、消息头由w3c定义,通讯的各方都会遵守。
a2、浏览器与服务器在打包时,会自动生成一些
消息头。
也可以编程生成需要的消息头。
实体内容:
只有当请求方式是post时,请求
参数才会放在这儿。
b,响应数据包(服务器发送给浏览器)
状态行:
协议的类型与版本状态码状态描述
b1、状态码是一个数字,有特定的含义,比如
500:
系统出错,一般是由于程序运行出错引起。
404:
找不到对应的资源。
一般是由于路径写错。
200:
正确。
若干消息头:
实体内容:
服务器返回给浏览器的处理结果。
3、get请求与post请求
1)哪一些是get请求。
a,在浏览器地址栏直接输入某个地址。
b,表单默认提交的方式。
c,点击链接。
2)哪一些是post请求
a,表单method="post"。
3)比较两种方式:
a,get方式将请求参数放在请求行,放置的数据
大小有限制。
而post方式将请求参数放在了实体内容
里面,理论上大小没有限制。
b,get方式会将请求参数显示在浏览器地址栏,
不安全,而post不会显示,相对安全。
get方式适合向服务器请求资源或者提交少量的数据,
而post方式适合向服务器提交大量数据。
练习:
写一个BMIServlet,可以依据用户输入的
身高(height),体重(weigth),性别(gender)
计算该用户的bmi指数。
bmi指数反映了一个人
的身体体质。
比如,用户通过表单输入
体重70kg,身高是1.75,性别m(m表示男,f表示女)
则BMIServlet依据这三个参数,进行相应的计算,最
输出:
"你的bmi指数是22.86你的体质适中"。
bmi=weigth/height/height
EX:
70kg/1.75/1.75=22.86
成人的bmi数值
体重指数,男性,女性
过轻,低于20,低于19
适中,20<=bmi<25,19<=bmi<24
过重,25<=bmi<30,24<=bmi<29
肥胖,30<=bmi<35,29<=bmi<34
非常肥胖,高于35,高于34
专家指出最理想的体重指数是22
1、表单的处理
(1)获取表单参数值
//依据参数名,获取参数值。
Stringrequest.getParameter(StringparaName);
要注意:
a,paraName与实际的参数名不一致,则返回null。
b,如果有多个参数名相同,则要使用另外一个方法
//依据参数名,获取参数值(多个参数名相同)
String[]request.getParameterValues(StringparaName);
要注意:
a,paraName与实际的参数名不一致,则返回null。
此外,还要注意:
一般来说,客户端,需要添加表单验证(即使用
javascript对表单中的数据进行合法性验证,比如
,用户名没有填写,则不能提交)。
但是,客户
端有可能禁止javascript,此时,客户端验证会
失效,所以,服务器端最好也加上相应的验证。
(2)中文问题
step1html页面当中,添加
content="text/html;charset=utf-8">
另外,表单的提交方式要设置成post。
step2服务器端,在servlet类里面,添加
request.setCharacterEncoding("utf-8");
这儿解释一下:
浏览器会对表单中的中文参数值进行编码,
它会选择打开该表单所在的页面时的编码格式来
进行编码。
request.setCharacterEncoding方法其作用是,
设置解码格式,该解码格式应该与客户端一致。
混杂模式:
ie浏览器在打开一个html文件时,如果没有
文档类型声明(即Doctype...这句话),则打开
混杂模式,即让浏览器降级,目的是为了兼容
老的html页面。
混杂模式有一个问题,即对
css的支持不好,可能会出现一些界面混乱的问题。
所以,建议在写一个html文件时,最好加上
文档类型声明,即
DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:
//www.w3.org/TR/html4/loose.dtd">
2、mysql的简单使用
1)进入mysql控制台
mysql-uroot;
2)常用指令
查看当前所有数据库
showdatabases;
选择要使用的数据库
usetest;
查看当前数据库所有的表
showtables;
建新的数据库
createdatabasejd1110db
defaultcharactersetutf8;
建表
createtablet_employee(
idbigintprimarykeyauto_increment,
namevarchar(50),
salarydouble,
ageint);
createtablet_user(
idbigintprimarykeyauto_increment,
namevarchar(255),
usernamevarchar(50)unique,
infotext,
birthdaydate,
registTimedatetime,//timestamp
flagtinyint,//0~255-128~127
idCardchar(18),
salarydecimal(8,3)
);
auto_increment:
表示当前列是自增长列,插入记录
时,该列的值由数据库自动生成。
unique:
唯一性约束
text类型:
相当于clob,用于保存大量的字符。
3、访问数据库
step1将mysql的jdbc驱动程序相关的jar文件
copyWEB-INF/lib下。
step2在servlet类当中,使用jdbc访问数据库。
但是,要注意两点:
a,如果数据库当中,要处理中文数据,要保证
jdbc驱动程序能够获知当前数据库保存中文的编码是
什么。
mysql数据库的某些jdbc驱动程序不能够正确
获知数据库保存中文的编码,需要明确指定。
jdbc:
mysql:
//localhost:
3306/jd1110db?
useUnicode=true&characterEncoding=utf8
b,要正确处理异常。
step1对于系统异常,先记录日志,然后
抛给服务器。
throwsnewServletException(e);
step2配置一个错误处理页面,当服务器
捕获到错误之后,会调用该错误处理页面。
500
/error.html
以上配置的含义:
当服务器碰到系统异常,
会调用error.html页面。
写一个ListEmpServlet,该servlet以表格的形式返回
所有雇员的信息。
http:
//localhost:
8080/web03_2/list
写一个DelEmpServlet,删除指定id的雇员。
http:
//localhost:
8080/web03_2/del?
id=1;
1、重定向
1)什么是重定向?
服务器向浏览器发送一个状态码(302)及一个消息头
(location),浏览器收到以后,立即向location所指
向的地址发请求。
2)编程
response.sendRedirect(Stringurl);
需要注意的问题:
重定向之前,不要刷新response当中的数据,否则
会出错。
重定向之前,会清空response当中的数据。
3)特点
a,重定向的地址是任意的。
b,重定向之后,浏览器的地址栏的地址会变成
location所指定的地址。
2、servlet容器如何处理请求资源路径?
比如,输入http:
//ip:
port/web04/abc.html
请求资源路径是:
/web04/abc.html
step1容器依据appname,找到该应用对应的文件夹。
比如,对于tomcat,会查找到webapps文件夹下面对应的
web04文件夹。
step2将/abc.html与web.xml中的进行
匹配:
a,精确匹配:
b,通配符匹配:
即使用"*"来代替任意的字符串。
比如:
/abc/*
c,后缀匹配:
即使用"*.任意的字符串"来进行匹配。
比如:
*.do
表示任意的以.do结尾的请求均匹配。
step3如果均不匹配,则查找有没有一个abc.html文件。
有,则返回,没有,则返回404。
3、如何让一个servlet处理多个请求。
step1servlet使用后缀匹配的模式。
step2获得请求资源路径。
Stringrequest.getRequestURI();
step3分析请求资源路径,依据请求路径的不同,
执行不同的分支(if..else..)。
开发一个简单的web应用:
学生信息管理
可以实现学生信息的添加、
列表(只显示学号、姓名、性别,当点击查看时,
会显示该学员的所有信息)、
删除、查看、修改五项功能。
学生的信息包含:
学号姓名性别家庭住址
createtablet_student(
idbigintprimarykeyauto_increment,
stuNumvarchar(20)unique,
namevarchar(20),
gendarchar
(1),
addressvarchar(50));
1、DAO
1)什么是DAO?
DataAccessObject(数据访问对象)。
封装数据访问逻辑的一个模块,调用者在使用dao
时,不用了解底层的数据访问细节。
使用dao的好
处是:
当数据访问逻辑发生改变,只要接口不变,不会
影响到调用者。
2)怎样写一个DAO?
a,实体类
与数据库中的表对应的一个java类,dao实现者
需要将表中的记录转换成实体类的实例。
比如与t_employee表对应的一个实体类Employee
b,DAO接口
声明一系列与实现无关的方法。
比如EmployeeDAO接口提供下列方法:
publicvoidsave(Employeee)throwsSQLException;
//throwsSQLException不好,因为实现者只能
//使用jdbc技术来实现该方法。
publicvoidsave(Employeee)throwsException;
publicvoidsave(Employeee)throwsRuntimeException;
publicListfindAll()
c,DAO实现
使用具体的技术来实现DAO接口的一个具体类。
比如,使用jdbc技术实现EmployeeDAO接口。
EmployeeDAOImpl类。
d,DAO工厂
封装了DAO实例创建的过程,调用者通过工厂来
获得某个DAO实例。
2、servlet生命周期
1)什么是servlet生命周期?
servlet容器如何创建servlet对象、如何为该
对象分配相应的资源(初始化)、如何调用其方法
来处理请求、以及如何销毁servlet对象的整个
过程。
2)servlet的核心接口与类
a,Servlet接口
a1,init(ServletConfigconfig):
容器在
创建好servlet对象之后,必须调用该方法来
完成初始化。
容器在调用该方法时,必须创建好一个config
对象。
a2,service(ServletRequestreq,ServletResponseres)
容器在收到一个请求之后,会调用该方法来处理
请求。
容器在调用该方法时,必须创建好req,res两个
对象。
a3,destroy():
容器在删除servlet对象之前,会调用该方法,
用于释放资源。
b,GenericServlet抽象类
主要实现了Servlet接口中声明的init,destroy方法。
c,HttpServlet抽象类
继承了GenericServlet,主要实现了service方法。
该方法实现的逻辑如下:
依据请求的不同,调用不同的do***方法。
比如,get请求,调用doGet方法。
而doGet方法
实现是抛出异常,需要开发者去override
doGet方法。
d,ServletConfig接口
访问Servlet的初始化参数(web.xml文件中,为
servlet配置的一些参数)。
StringgetInitParameter(StringparaName);
3)生命周期的四个阶段
1、jsp
1)什么是jsp?
javaserverpage(java服务器端页面技术)
sun公司制订的一种服务器端动态页面生成技术的规范。
2)jsp的优点
直接使用servlet生成动态页面,过于烦琐,而且,
维护困难。
而使用jsp,只需要在html代码当中添加
少量的java代码,就可以实现动态页面,开发相对
简单,维护方便。
3)如何写一个jsp?
写一个以.jsp为后缀的文件,在文件里面,
可以添加html或者java代码。
a,html(包括css,javascript)
直接写就可以了。
b,java代码
方式一:
使用java代码片断
<%java代码%>
方式二:
使用jsp表达式
<%=java表达式%>
c,指令:
告诉容器,在将.jsp文件转换成.java
文件时,做一些额外的处理,比如导包。
语法:
<%@指令名属性名=属性值%>
c1、page指令
import属性:
导包。
比如<%@pageimport="java.util.*"%>
<%@pageimport="java.util.*,java.text.*"%>
contentType属性:
作用与以前编写Servlet代码时所写的
response.setContentType方法等价。
pageEncoding属性:
告诉容器,.jsp文件的编码是什么。
注意,
该编码必须与实际保存该文件的编码一致!
d,隐含对象:
在.jsp文件中,可以直接使用的对象。
因为容器在生成的.java文件中,会包含声明和创建
这些对象的代码。
d1,out
d2,request
d3,response
4)jsp是如何执行的?
step1、容器会将.jsp文件先转换成一个.java文件
(.java文件其实就是一个servlet)。
转换的规则:
html---->放到service()方法里,
使用out.write()输出。
write()方法会将null转
换成""输出。
java代码片断-->放到service()方法里,照搬。
jsp表达式-->放到service()方法里,
使用out.print()输出。
2、转发
1)什么是转发?
一个web组件(jsp/servlet)将未完成的处理交
给另外一个web组件继续完成。
一般情况下,一个servlet将获得的数据转发给
一个jsp,jsp会将数据以合适的方式展现给用户。
2)如何转发?
step1将数据绑订到request对象上。
request.setAttribute(Stringname,Objectobj);
//解除绑订
request.removeAttribute(Stringname);
//依据绑订名获得绑订值,如果name对应的值不存在,
//返回null。
Objectrequest.getAttribute(Stringname);
step2获得转发器对象。
RequestDispatcherrd=
request.getRequestDispatcher(Stringurl);
step3转发
rd.forward(request,response);
1、转发编程需要注意的问题
在转发之前,不要out.close(),out.flush(),否则会
出错。
转发之前,会将response中缓存的数据清空。
2、特点
1)转发的目的地只能是同一个应用内部的各个
组件。
2)转发发生之后,浏览器地址栏的地址不会发生
改变。
3、转发与重定向的区别
1)相同点:
都可以实现一个web组件间接地调用另外一个
web组件。
2)区别:
a,重定向:
浏览器地址栏地址会改变。
转发:
不变。
b,重定向:
不能够共享request,response对象。
转发:
可以共享request,response对象。
(response,request对象的生存时间是一次请求
与响应期间)。
c,重定向:
地址任意
转发:
同一个应用内部
4、路径问题
a、链接地址
b、表单提交
c、重定向response.sendRedirect("路径"