servlet
1.什么是servlet
处理请求和发送响应的过程是一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西
(1) Servlet
(
Server Applet
),全称
Java Servlet
。是用
Java
编写的服务器端程序,其主要功能在于交互式地浏览和
修改数据,生成动态
Web
内容。狭义的
Servlet
是指
Java
语言实现的一个接口,广义的
Servlet
是指任何实现了这个
Servlet
接口的类,一般情况下,人们将
Servlet
理解为后者。
(2) Servlet
运行于支持
Java
的应用服务器中。从实现上讲,
Servlet
可以响应任何类型的请求,但绝大多数情况下
Servlet
只用来扩展基于
HTTP
协议的
Web
服务器。
(3) Servlet
工作模式:
① 客户端发送请求至服务器
② 服务器启动并调用
Servlet
,
Servlet
根据客户端请求生成响应内容并将其传给服务器
③ 服务器将响应返回客户端
2.tomcat和servlet的关系
Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件. Servlet最常见的用途是扩展Java Web服务器功能,提供非常安全的,可移植的,易于使用的CGI替代品.
从http协议中的请求和响应可以得知,浏览器发出的请求是一个请求文本,而浏览器接收到的也应该是一个响应文本。
①:Tomcat将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读可以通过request对象调用对应的方法查询到。
②:Tomcat同时会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器
3、servlet的运行过程
- ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步;
- ②装载并创建该Servlet的一个实例对象;
- ③调用Servlet实例对象的init()方法;
- ④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去;
- ⑤Web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
4.servlet的生命周期
服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf)
该servlet对象去处理所有客户端请求,在service(ServletRequest req,ServletResponse res)方法中执行
最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。
5.请求
HttpServletRequest
表示
Http
环境中的
Servlet
请求。它扩展于
javax.servlet.ServletRequest
接口
)
常用方法
:
1)String getParameter(String name)
根据表单组件名称获取提交数据,返回值是
String
注:服务器在接收数据时使用字符串统一接收
2)String[ ] getParameterValues(String name)
获取表单组件对应多个值时的请求数据
3)void setCharacterEncoding(String charset)
指定每个请求的编码
(
针对
post
请求才起作用
)
4)RequestDispatcher getRequestDispatcher(String path) --
跳转页面
返回一个
RequestDispatcher
对象,该对象的
forward( )
方法用于转发请求
5)
存值
request.setAttribute("key",value);
6)
取值
request.getAttribute("key");//
取值后需要向下转型
示例: String a1=(String)request.getAttribute("uname");
补充
:get
和
post
的区别
1
、
GET
请求,请求的数据会附加在
URL
之后,以
?
分割
URL
和传输数据,多个参数用
&
连接。
URL
的编码格式采用的
是
ASCII
编码,而不是
uniclde
,即是说所有的非
ASCII
字符都要编码之后再传输。
POST
请求:
POST
请求会把请求的数据放置在
HTTP
请求包的包体中。上面的
item=bandsaw
就是实际的传输数
据。
因此,
GET
请求的数据会暴露在地址栏中,而
POST
请求则不会。
2
、传输数据的大小
在
HTTP
规范中,没有对
URL
的长度和传输的数据大小进行限制。但是在实际开发过程中,对于
GET
,特定的浏览器
和服务器对
URL
的长度有限制。因此,在使用
GET
请求时,传输数据会受到
URL
长度的限制
对于
POST
,由于不是
URL
传值,理论上是不会受限制的,但是实际上各个服务器会规定对
POST
提交数据大小进行
限制,
Apache
、
IIS
都有各自的配置。
3
、安全性
POST
的安全性比
GET
的高。这里的安全是指真正的安全,而不同于上面
GET
提到的安全方法中的安全,上面提到的
安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过
GET
请求,用户名和密码都会暴露再
URL
上,因为
登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到
了。除此之外,
GET
请求提交的数据还可能会造成
Cross-site request frogery
攻击
6.响应
在
Service API
中,定义了一个
HttpServletResponse
接口,它继承自
ServletResponse
接口,专门用来封装
HTTP
响
应消息。 在
HttpServletResponse
接口中定义了向客户端发送响应状态码,响应消息头,响应消息体的方法。
常用方法
:
void addCookie(Cookie var1);//
给这个响应添加一个
cookie
void sendRedirect(String var1) ;//
发送一条响应码,将浏览器跳转到指定的位置
PrintWriter getWriter()
获得字符流,通过字符流的
write(String s)
方法可以将字符串设置到
response
缓冲区中,
随后
Tomcat
会将
response
缓冲区中的内容组装成
Http
响应返回给浏览器端。
setContentType()
设置响应内容的类型
重定向和转发的对比
重定向
:response.sendRedirect()
转发
:request.getRequestDispatcher("../success.jsp").forward(request,response);
相同点
:
都用来跳转页面
不同点
:
a.
重定向时地址栏会改变
,request
中存储的数据会丢失
.
转发时地址栏显示的是请求页面的地址
,request
数据可以保
存。
b.
转发属于一次请求一次响应
,
重定向属于两次请求
(
地址栏修改了两次
)
两次响应。
补充
:
使用
out
对象往页面中输出
js
或
html,css
注
:
使用
js
跳转页面,也会丢失
request
中的数据
7.会话
request
存的值只能在单次请求中保存,保存的数据不能跨页面
,
当重定向时
,request
存的值会丢失
session
的数据可以在多个页面中共享
,
即使重定向页面
,
数据不会丢失
session
中可以包含
n
个
request
。
会话的概念
:
从打开浏览器到关闭浏览器
,
期间访问服务器就称为一次会话
常用方法
:
void setAttribute(String key,Object value)
以
key/value
的形式保存对象值
,
将数据存储在服务器端
Object getAttribute(String key)
通过
key
获取对象值
void invalidate()
设置
session
对象失效
String getId()
获取
sessionid,
当第一次登录成功后,
session
会产生一个唯一的
id
,浏览器之后访问时如果发现
id
值
还是之前
id
,那么说明 当前访问的属于同一个会话
void setMaxInactiveInterval(int interval)
设定
session
的非活动时间
示例
:
方式
1: session.setMaxInactiveInterval(10*60);//
设置有效时间为
10
分钟
方式
2:
修改
web.xml
int getMaxInactiveInterval()
获取
session
的有效非活动时间
(
以秒为单位
)
,默认的有效时间
:30
分钟
void removeAttribute(String key)
从
session
中删除指定名称
(key)
所对应的对象
out.print("<script type='text/javascript'>alert('
登录失败
');location='../login.jsp'</script>");
<session-config>
<session-timeout>10</session-timeout>//
单位
:
分钟
</session-config>
小结
:
让
session
失效的方式
(
1
)
invalidate()
(
2
)
removeAttribute("key")
(
3
)直接关闭浏览器。
示例
:
使用
session
验证用户是否登录
补充
:
自动刷新到某页面
:
注
:
在
head
标签中添加该标签,单位
:
秒