Servlet课上笔记
这两天在学习servlet,课上自己动手记了了一些笔记,内容不是很详细,有些地方可能做的不是很明了,毕竟在课堂生还是以听和练为主,所以大家要是看就对付看吧。
Servlet:
1、什么是Servlet?
是一个java类,要按照servlet规范来编写,并且要部署在符合servlet规范的容器当中运行。其
作用是扩展web服务器的功能(生成动态资源,与CGI程序类似)。
请求a.html
——————————> |—— 动态————>CGI程序
browser 返回a.html apche
<——————————非动态————|
2、Servlet的优点:
(1)可以访问数据库
(2)方便地处理业务逻辑
(3)一个请求只会启动一个线程(CGI程序是一个请求启动一个进程),消耗的资源相对少
(4)多个请求可以共享同一个Servlet实例
(5)servlet可以在任何符合servlet规范的容器(tomcat/was/...)上运行,方便维护。
3、如何去写一个servlet?
step1:
写一个java类实并现Servlet接口或者继承HttpServlet。
step2:
编译(依赖servlet-api.jar)
step3:
打包
appName(应用名)
WEB-INF
classes(放servlet字节码)
lib(比如数据库驱动)
web.xml(部署描述文件:比如配置servlet-url)
step4:
部署 将第三步目录结构copy to 服务器特定的目录。
step5:
启动服务器
step6:
访问 http://ip:port/appName/servlet-url
4、安装服务器
(1)解压tomcat
(2)配置环境变量
JAVA_HOME
CATALINA_HOME:tomcat解压到的目录
PATH:CATALINA_HOME/bin
(3)启动tomcat
cd CATALINA_HOME/bin
linux:sh startup.sh
windows:startup.bat
(4)http://localhost:8080
5、服务端写servlet不用考虑网络问题
6、web服务器=servlet容器(符合servlet规范的web服务器)
1)、Servlet的运行的基本过程:
http协议是应用层协议 将请求中的数据先解析然后生成对象
(1)请求(通过http协议) servlet (2)
——————————————> ————————>HttpServletRequest(对象)
browser 引 (3)
————————>HttpServletResponse(对象)
(7)响应 (4)然后
<—————————————— 擎 ————————> Servlet
调用service (5)处理请求
(6)引擎读取HttpServletResponse
第五步时可以从request中获取数据(方便),
也可以将处理的结果放到response 第四步先看要调用的servlet是否有对应
的实例,若无,则创建实例,若有不再创建新的实例
第二步为什么引擎要将请求中的数据转化成一个request对象?
因为servlet不再需要考虑http协议。
step1 浏览器会将表单中的数据打包(http数据包)
step2 发送
(地址 http:ip:port/appName/pricing(action的值)
step3 服务器将请求地址去掉应用名之前的内容(包括应用名),保留应用名之后的地址
再将该地址与web.xml中的url-pattern作比较,找不到的话显示404
step4 找到
step5 如果servlet没有相应的实例则创建实例
step6 调service方法
2)、Http协议
什么是http协议?
超文本传输协议,用于制订浏览器与web服务器之间数据交互的方式与数据本身的格式。
A.数据交互的方式
浏览器发送连接请求
服务器接受
浏览器将数据打包,发送
服务器处理完毕,数据打包,发送
, 发送完毕,关闭连接。
B. 数据包的格式
请求数据包(请求消息)
请求行:
请求方式(get/post)
要访问的资源路径(如果是get,包含请求数据)
协议的版本号(1.0,1.1)
若干消息头(浏览器与服务器之间的一些约定):
比如在消息头中,可以携带cookie。
又比如,在消息头中,可以告诉服务器,
当前浏览器支持的语言。
实体内容:
如果请求方式是post,则表单中的数据会存放到这儿。
如果请求方式是get,则数据会放到请求行(资源路径之后)
响应数据包(响应消息)
状态行:
协议的版本号
状态码
404:找不到资源
500:系统内部错误
200:正常
状态码的描述
若干消息头:
比如,告诉浏览器,以什么样的编码来显示返回的内容。
实体内容:
返回的处理结果。
练习:
计价
规则 产品的最终价格 = 原始价格 * (1 + 税率)。
界面:
pricing2.html
表单
原始价格 basePrice
销售城市 city 先依据城市,找到对应的税率(if...else)。
3 )、get/post方式:
get方式:
A. 表单默认提交的方式,浏览器地址栏直接输入一个地址,使用链接访问。
B. 表单中的数据会添加到请求行,放置的数据有限,而且数据会直接在浏览器的地址栏显示,不安全。
C. get方式,一般不适合用于浏览器向服务器提交数据。适用于请求某个资源。
post方式:
A.对表单,设置了method="post"。
B.表单中的数据会添加到实体内容里,可以存放大量数据。相对于get方式,会安全一些。(不管哪种方式,都不是绝对安全的,因为浏览器不会对数据进行加密)
C.一般如果有大量的数据需要提交给服务器。
练习:
写一个ListEmpServlet,会返回一个
表格,表格中的内容是:
id name salary
1 zs 2000
4)、表单的处理
(1)如果获得表单中的数据
String request.getParameter(paramName);
//有多个同名的paramName
//比如 interest=fishing&interest=sleep
String[] request.getParameterValues(paramName);
(2)表单中的中文问题
step1:
对于html文件,添加<meta http-equiv="content-Type"
content="text/html;charset=utf-8">
要注意:该文件保存时所使用的编码一定也是utf-8
作用是:要求浏览器按照指定的编码来显示该文档。
step2:
在servlet中,使用request.setCharacterEncoding("utf-8");
要注意:此处的编码应该与meta中设置的一致
作用:设置request对象的解码所采用的编码。
默认情况下,request采用iso-8859-1编码来解码。
此外,还要使用response.setContentType("text/html;charset=utf-8");
作用有两个:
一、response中写入数据时,所使用的编码
二、生成一个消息头,要求浏览器按指定的编码来显示返回的数据。
(3) 数据库的中文问题(mysql)
对于某些版本的mysql jdbc驱动,需要告诉它,
数据库当前存放数据采用的编码是什么(把URL设置如下)
String url = "jdbc:mysql://localhost:3306/sd1005db2?" +
"useUnicode=true&characterEncoding=utf8";
create database name default character set utf8 指定数据库的编码 统一设定成utf8
5)、重定向
服务器向浏览器发送一个状态码302以及一个地址。
浏览器收到该状态码之后,会立即向这个地址发送请求。
特点:
重定向的地址是任意的(既可以是当前服务器上的某个地址,也可以是其它服务器上的某个地址)
浏览器的地址栏的地址会发生变化。
练习
按照servlet02工程的要求实现
学生信息的维护
id name age classname
create table t_student(
id bigint primary key auto_increment
name varchar(50),
age int(3),
classname varchar(50));
注意,中文问题