ServletWord格式.docx
《ServletWord格式.docx》由会员分享,可在线阅读,更多相关《ServletWord格式.docx(34页珍藏版)》请在冰豆网上搜索。
3、tomcat的安装与使用
(1)安装
可以从www.apache.org下载tomcat的安装文件,或者
将/opt/apache-tomcat.zip文件解压到/home/soft01。
(2)启动
cd/home/soft01/apache-tomcat/bin
shstartup.sh(window:
startup)
启动有问题的同学:
shcatalina.shrun
在浏览器地址栏输入:
http:
//localhost:
8080
(3)关闭
shshutdown.sh
(4)各个目录的作用:
bin:
可执行文件,比如启动和关闭服务器的命令文件。
common:
存放共享的文件。
conf:
服务器的配置文件。
webapps:
部署目录。
work:
服务器运行时产生的一些临时文件。
4、使用myeclipse来开发Servlet?
step1,启动myeclipse,配置myeclipse,使myeclipse
可以启动和关闭tomcat。
step2,创建一个web工程。
5、servlet是如何运行的?
在浏览器地址栏输入http:
8080/web01
/sayHello
step1,浏览器依据ip,port建立与服务器之间的连接。
step2,浏览器将请求数据(请求资源路径,请求参数)按照http协议
打包(http请求数据包),发送给服务器。
step3,服务器解析请求数据包,将请求数据封装到request
对象里面(封装的目的,是为了方便servlet获得请求数据包中的
数据,如果没有request对象,就需要在servlet类里面编写
解析请求数据包的代码)。
另外,服务器还会创建一个对象response
对象(用来存放servlet处理的结果)。
step4,服务器依据请求资源路径(web01/sayHello)找到对应的
servlet的配置,创建servlet对象。
step5,服务器会调用servlet对象的service方法(在调用该方法时,
会将事先创建好的request,response对象作为参数传递进来)。
可以在service方法里面,通过request获得请求数据,也可以
将处理之后的结果存放到response对象上。
step6,服务器从response对象上取出处理结果,生成响应数据包。
发送给浏览器。
step7,浏览器解析响应数据包,取出处理结果,生成相应的界面。
Day02
1、http协议(了解)
(1)什么是http协议?
超文本传输控制协议(w3c定义),它定义了浏览器与
web服务器之间数据传输的过程以及数据的格式。
(2)数据传输的过程:
step1,浏览器建立与服务器之间的连接。
step2,浏览器打包,发送请求。
step3,服务器处理请求之后,将处理结果打包,发送响应。
step4,服务器立即关闭连接。
特点:
一次请求,一次连接。
优势:
“效率高”,服务器可以在一段时间内,尽可能为更多
的客户服务。
(3)数据的格式
a,请求数据包
请求行:
请求方式请求资源路径协议类型及版本
若干消息头:
消息头是一般情况下是由浏览器或者服务器自动生成的
,在特定情况下,也可以通过编程的方式来生成一些
消息头。
比如,浏览器在向服务器发请求时,会生成
user-agent消息头,告诉服务器浏览器的类型和版本。
实体内容:
只有当请求方式是post方式时,请求参数才会放到
实体内容里面。
当请求方式是get时,请求参数会添加
到请求资源路径里面。
b,响应数据包
状态行:
协议的类型与版本状态码描述
状态码:
一个三位数字,表示不同含义,状态码
由w3c定义。
404:
依据请求资源路径,找不到对应的资源。
200:
服务器处理正常
500:
系统错误,一般是程序在执行过程当中,发生了
异常。
405:
找不到service方法。
服务器也可以发送一些消息头给浏览器,比如,发送
content-type消息头,告诉浏览器服务器返回的数据的
类型。
实体内容:
处理结果。
2、get与post请求
(1)哪一些情况下,浏览器以get方式向服务器发请求:
a,在浏览器地址栏输入某个地址
b,点击链接
c,表单默认提交方式
(2)哪一些情况下,浏览器以post方式向服务器发请求:
a,设置表单的method="
post"
。
(3)get与post方式的区别:
get方式会将请求参数添加到请求资源路径的后面,
因为请求行能够存放的数据量有限(2k左右),所以get方式
只能提交少量的数据给服务器。
get方式会将请求参数显示在浏览器地址栏,不安全。
post方式会将请求参数添加到实体内容里面,理伦上讲,
提供的数量大小没有限制。
另外,不会将请求参数显示在
浏览器地址栏,相对安全。
要注意,http协议不会对数据
做加密处理。
3、常见的错误及处理方式
(1)404:
错误原因:
请求资源路径写错。
解决方式:
检查请求资源路径,
按照http:
port/appname/servlet-url标准检查。
(2)500:
程序运行出错。
检查程序代码。
比如检查程序代码是否
添加了数据验证代码(比如,程序没有添加数据验证代码,
用户就有可能提交一些非法的参数值)。
此外,还要检查和代码相关的配置文件是否正确。
另外,程序如果在运行过程当中,依赖一些其它的资源,
比如要访问数据库,那么要看数据库是否正常运行。
(3)405
服务器找不到service方法。
检查service方法的签名。
4,处理中文
(1)servlet如果要输出中文
解决方式:
response.
setContentType("
text/html;
charset=支持中文的编码"
);
java语言在内存里面,保存的所有字符采用unicode编码格式。
当将内存当中的字符输出到硬盘上的文件时,
需要做编码(unicode-->
某种本地编码格式,比如gbk,utf-8)
反过来,将文件里的内容读取到内存,
需要解码(某种本地编码格式,比如gbk,utf-8-->
unicode)。
(2)表单当中有中文参数值,如何处理?
出现乱码问题的原因:
当点击表单提交按钮时,浏览器会对表单中的中文参数值
按照打开表单所在的页面时的编码格式进行编码。
服务器在默认情况下,会使用iso-8859-1这种编码格式
进行解码。
方式一:
request.setCharacterEncoding("
utf-8"
方式二:
str=newString(str.getBytes("
iso-8859-1"
),"
注意:
方式一只能处理post请求。
练习:
写一个add_emp.html,该html文件提供一个表单,包含
员工姓名,薪水,年龄三个表单域。
当点击提交,提交给
AddEmpServlet来处理,该Servlet读取三个请求参数值,
然后输出员工的所有信息。
5、使用mysql数据库
(1)登录
mysql-uroot;
(2)显示所有的数据库实例
showdatabases;
(3)创建一个新的数据库实例(并且设置缺省的字符集是utf8)
createdatabasejd1208dbdefaultcharactersetutf8;
(4)使用某个数据库实例
usejd1208db;
(5)查看当前数据库有哪些表
showtables;
(6)建表
createtablet_emp(
idintprimarykeyauto_increment,
namevarchar(32),
salarydouble,
ageint
);
auto_increment:
自增长列,每当插入一条新的记录,
数据库会自动生成一个值。
insertintot_emp(name,salary,age)values('
zs'
10000,24);
ww'
20000,34);
6、在Servlet类里面,使用jdbc访问数据库。
step1,将jdbc驱动程序所对应的.jar文件拷贝到WEB-INF\lib
下。
step2,在servlet类里面,使用jdbc访问数据库,要注意
异常的处理。
写一个ListEmpServlet,该servlet查询t_emp表,将所有
记录查询出来,然后生成一个表格显示给用户。
http:
port/web02/list
Day03
1、重定向
(1)什么是重定向?
服务器向浏览器发送一个状态码302及一个消息头
Location(包含有一个地址,该地址称为重定向地址);
浏览器会立即向重定向地址发送请求。
(2)如何重定向?
//url:
重定向的地址,可以是任意的一个地址
response.sendRedirect(Stringurl);
(3)编程需要注意的问题
a,在重定向之前,服务器会先清空response中
存放的数据。
b,在重定向之前,不能够调用out.flush(),out.close()。
(4)特点
a,重定向的地址是任意的。
b,重定向之后,浏览器的地址会变成重定向地址。
2、dao(dataaccessobject)
(1)dao是什么?
封装了数据访问逻辑的模块。
(2)如何写一个dao?
step1,实体类
用来封装记录,方便程序操作。
比如,在数据库里面有一张表t_emp,可以设计一个
实体类Employee。
step2,dao接口
比如,为了方便对t_emp表进行操作,可以设计一个
接口EmployeeDAO
//接口设计,不应该涉及具体的实现技术。
publicList<
Employee>
findAll()throwsException;
step3,实现dao接口
比如,写一个EmployeeDAOImpl类
step4,工厂类
能不能做到dao的实现发生了改变,比如从jdbc
的实现改为hibernate的实现,不影响调用者?
可以通过引入"
工厂设计模式"
来解决:
什么是“工厂”,工厂负责为调用者提供一个符合接口
要求的对象,调用者不用了解对象的创建细节。
这样
做的好处是,当对象的创建细节发生了改变,不会
影响到调用者。
Day04
2、servlet容器如何处理请求资源路径?
比如,在浏览器地址栏输入http:
port/web04/abc.html
其中"
/web04/abc.html"
称为请求资源路径,会放到请求数据包
里面,发送给servlet容器(web服务器)。
step1,依据应用名("
/web04"
)找到应用所在的文件夹,然后
找到web.xml文件,去匹配"
/abc.html"
:
step2:
匹配过程:
精确匹配:
通配符匹配:
使用"
*"
来代替任意的字符。
比如:
<
url-pattern>
/*<
/url-pattern>
/abc/*<
后缀匹配:
*."
加上后缀。
*.do<
匹配所有以.do结尾的请求。
step3:
如果没有匹配成功,此时会认为是一个文件,
去查找该文件,如果找到,返回;
找不到,返回404。
3、让一个servlet处理多种不同请求。
step1, 使用后缀匹配模式。
step2, 在servlet的service方法里面,分析
请求资源路径。
4、servlet的生命周期
(1)生命周期的含义?
servlet容器创建servlet对象,分配资源进行初始化操作,
然后调用相应方法处理请求以及销毁servlet对象的过程。
(2)生命周期包括四个阶段:
a,实例化(创建servlet对象)
a1,实例化在什么时候进行?
第一种情况:
当请求到达容器时,容器查找对应的
servlet对象是否已经存在,如果不存在,则创建;
如果已经存在,则不再创建。
第二种情况:
容器事先创建好servlet对象。
只需要
在web.xml文件中,添加<
load-on-startup>
配置即可。
a2,如何实例化?
调用servlet的构造器。
b,初始化(分配资源)
b1,如何初始化?
调用servlet的init(ServletConfigconfig)方法,
容器在调用该方法时,会事先创建好一个config对象,
该对象的作用是提供了访问servlet的初始化参数的方法。
b2,初始化参数
step1,在web.xml文件里,使用<
init-param>
配置
初始化参数。
step2,使用ServletConfig提供的
getInitParameter(StringparaName)获得参数值。
b3,如何实现自己的初始化处理逻辑?
overrideinit(ServletConfigconfig)方法。
overrideinit()方法(推荐)
b4,init方法只会执行一次。
c,就绪(调用相应方法处理请求)
容器调用service方法来处理请求。
d,销毁(销毁servlet对象)
容器在销毁servlet对象之前,会调用destroy方法。
只会执行一次该方法。
(3)生命周期相关的接口与类
a,Servlet接口
init(ServletConfigconfig)
service(ServletRequestreq,ServletResponseres)
destroy()
b,GenericServlet抽象类
实现了init,destroy方法。
c,HttpServlet抽象类
实现了service方法,该方法会依据请求类型分别调用
doGet,doPost方法。
所以我们在写一个servlet时,
可以选择两种方案来编写处理逻辑:
第一种方式:
overrideservice方法
第二种方式:
overridedoGet,doPost方法
d,ServletConfig接口
StringgetInitParameter(StringparaName);
e,ServletRequest接口/HttpServletRequest接口
f,ServletResponse接口/HttpServletResponse接口
给产品计税:
产品的价格(price)=原始价格*(1+税率)。
税率与销售城市的对应关系可以写在web.xml文件里面,
比如:
<
<
param-name>
taxRate<
/param-name>
param-value>
bj,0.13;
sh,0.14;
cs,0.08<
/param-value>
/init-param>
Day05
1,jsp是什么?
javaserverpage(java服务器端页面技术)
sun公司制订的一种服务器端动态页面生成技术的规范,在jsp
技术当中,只需要在html标记当中,添加少量的java代码,就可
以实现动态页面。
因为直接使用servlet输出动态页面非常麻烦(需要使用
out.println),并且难以维护(如果页面发生改变,需要修改
java代码)。
所以,sun才会制订jsp规范。
2,如何写一个jsp文件?
step1,写一个以.jsp为后缀的文件。
step2,在该文件里面,可以添加如下的内容:
1)html(css,javascript):
直接写。
2)java代码:
a,java代码片断
%java代码%>
b,jsp表达式
%=java表达式%>
3)隐含对象:
a,隐含对象是什么?
是在.jsp文件里面,可以直接使用的一些对象,
比如out,request,response。
b,为什么可以直接使用?
因为容器会自动添加创建这些隐含对象的代码。
4)指令:
a,指令是什么?
通知容器,在将.jsp文件转换成.java文件时做一些
额外的处理,比如导包。
b,指令的基本语法?
%@指令名称 属性%>
c,page指令
import属性:
导包
比如:
<
%@pageimport="
java.util.*"
%>
java.util.*,java.text.*"
contentType属性:
设置response.setContentType的内容。
pageEncoding属性:
告诉容器,.jsp文件的编码是什么,
这样,容器在读取.jsp文件的内容时,就不会发生乱
码问题。
3,jsp是如何执行的?
step1,容器先将.jsp文件转换成一个.java文件(其实,就是将
jsp转换成一个对应的servlet)。
a,html------>
service方法里,使用out.write输出(
write方法会将"
null"
转换成"
"
输出)。
b,<
%%>
------>
service方法里,照搬。
c,<
%=%>
service方法里,使用out.print输出。
out.print();
step2,执行servlet的service方法。
4、转发
(1)什么是转发?
一个web组件(servlet,jsp)将未完成的处理通过容器
转交给另外一个web组件继续完成。
常见的情况是:
一个servlet获得数据之后,转发给
一个jsp来生成相应的页面。
(2)如何转发?
step1,绑订
//绑订数据到request
request.setAttribute(Stringname,Objectobj);
//解除绑订
request.removeAttribute(Stringname);
//依据绑订名称获得绑订值,如果找不到,返回null。
Objectrequest.getAttribute(Stringname);
step2,获得转发器
转发的目的地。
RequestDispatcherrd=
request.getRequestDispatcher(Stringurl);
//step3,转发
rd.forward(request,response);
(3)转发需要注意的问题
a,在转发之前,服务器会清空response中的所有数据。
b,在转发之前,不能够调用out.flush(),out.close()。
a,转发的目的