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当中,配置:
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对象。
值越小,优先级越高(先被创建)。
b,初始化
容器调用servlet对象的init方法。容器
会先创建一个ServletConfig对象,将这个
对象作为参数传给init方法。
如果要override init方法,最好override
init()方法,即不带参的那个。
init方法只会执行一次。
c,就绪
容器调用servlet对象的service方法来
处理请求。
d,销毁
容器先调用servlet对象的destroy方法,
然后,销毁servlet对象。
练习:
计算某种产品的销售价格。
客户端:
输入产品的原始价格,销售地点
服务端:
计算产品的销售价格并输出。
计算规则:
销售价格= 原始价格* (1 + 税率)
税率在web.xml配置文件中配置。
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、路径问题
b,表单提交