Servlet学习笔记
一.关于Servlet
Servlet是sun公司提供的用于开发动态web资源的技术.
Sun公司在其API中提供了一个Servlet接口,用户若想开发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
·编写一个Java类,实现Servlet接口.
·把开发好的Java类部署到web服务器中.
为调用方便,sun提供了实现Servlet接口的两个默认实现类GenericServlet和HttpServlet,写程序时只需要继承这两个类,复写service方法即可.
类GenericServlet和HttpServlet在包javax.servlet中.
二.第一个Servlet案例
1.在tomcat服务器中新建一个web应用helloservlet,然后在web应用中新建一个WEB-INF/classes目录.
2.在classes目录中新建一个java程序firstservlet.
package cn.mytest;
import java.io.*;
import javax.servlet.*;
public class firstservlet extends GenericServlet{
public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{
OutputStream out = res.getOutputStream();
out.write("hello servlet".getBytes());
}
}
3.指定servlet的java支持包,设置全局变量classpath,编译servlet程序.
set classpath=%classpath%;C:\Tomcat 7.0\lib\servlet-api.jar
javac -d . firstservlet.java
4.在WEB-INF目录中新建一个web.xml文件,配置servlet对外访问路径.
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<servlet>
<servlet-name>firstservlet</servlet-name>
<servlet-class>cn.mytest.firstservlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>firstservlet</servlet-name>
<url-pattern>/firstservlet</url-pattern>
</servlet-mapping>
</web-app>
5.启动tomcat,通过浏览器输入http://localhost:8080/helloservlet/firstservlet访问servlet.
三.访问Servlet的请求响应步骤
·客户端浏览器连接web服务器,发送http请求
·Web服务器解析出想访问的主机名、web应用和web资源
·Web服务器第一次创建Servlet实例对象
·Web服务器调用servlet的init方法完成对象初始化
·Web服务器创建代表请求request和代表响应的response对象,然后调用servlet的service方法响应客户端的请求
·编写的service方法执行,向代表客户端响应的response对象中写入向客户端输出数据.
·service方法返回,Web服务器从response中取出数据,构建出一个http响应,回写给客户机.
·浏览器解析http响应,提取数据显示.
四.Web服务器调用Servlet时传递的对象
Web服务器调用servlet时传递的对象有Request,Response,ServletConfig,ServletContext,Session,Cookie等等.
ServletConfig对象
·用于封装Servlet的配置信息.
·在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数.
·当Servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet,进而,程序员通过ServletConfig对象就可以得到当前Servlet的初始化参数信息.
·初始化参数配置文件适用于指定servlet来自哪个码表,读哪个配置文件,指定连接数据库的信息等等.
ServletContext对象
·Web容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext对象,它代表当前Web应用.
·ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写Servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象.
·ServletContext方法的应用
·由于一个Web应用中的所有Servlet共享同一个ServletContext对象,所以多个Servlet通过ServletContext对象实现数据共享.
ServletContext对象通常也被称之为Context域对象.
·获取Web应用的初始化参数
·实现Servlet的转发
·利用ServletContext对象读取资源文件(得到文件路径,读取资源文件的三种方式,.properties文件(属性文件))
Request和Response对象
·Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象.
·Request和Response对象既然代表请求和响应,要获取客户机提交过来的数据,只需要找request对象,要向客户机输出数据,只需要找response对象.
·HttpServletResponse对象服务器的响应,这个对象中封装了向客户端发送数据、发送响应头、发送响应状态码的方法.
·Response常见应用
·向客户端输出中文数据
·文件下载和中文文件的下载
·输出随机图片(JDK的BufferedImage对象生成随机图片)
·发送http头,控制浏览器定时刷新网页
·发送http头,控制浏览器禁止缓存当前文档内容(控制Expires头)
·实现请求重定向(Response.sendRedirect(),实现原理302状态码和Location头实现重定向)
·HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中.
·Request常用方法
·getRequestURL方法返回客户端发出请求时的完整URL.
·getRequestURI方法返回请求行中的资源名部分.
·getQueryString方法返回请求行中的参数部分.
·getRemoteAddr方法返回发出请求的客户机的IP地址
·getRemoteHost方法返回发出请求的客户机的完整主机名
·getRemotePort方法返回客户机所使用的网络端口号
·getLocalAddr方法返回Web服务器的IP地址.
·getLocalName方法返回Web服务器的主机名.
·getMethod得到客户机请求方式
·Request常见应用
·获取请求头和请求数据(getHeader,getHeaderNames,getParameter,getParameterNames)
·通过表单收集客户机数据(getParameter,getParameterValues)
·Request对象实现请求转发,请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理.
·防盗链(request.getHeader("referer");)
·关于Request实现请求转发
·请求转发的应用场景:MVC设计模式
·request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发
·request对象同时也是一个域对象,通过request对象在实现转发时,把数据通过request对象带给其它web资源处理
(setAttribute,getAttribute,removeAttribute,getAttributeNames)
·forward方法用于将请求转发到RequestDispatcher对象封装的资源
·如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出IIIegalStateException异常.
·如果在调用forward方法之前向Servlet引擎的缓冲区(response)中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效.
·include方法实现页面包含
五.会话管理
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话.
会话过程中要解决的问题:每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据.
保存会话数据的两种技术(Cookie与Session)
·Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器,当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去,这样,web资源处理的就是用户各自的数据了.
·Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务.
Cookie API
javax.servlet.http.Cookie类用于创建一个Cookie,
response接口中也定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段,
同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie
Cookie类的方法:
public Cookie(String name,String value)
setValue与getValue方法
setMaxAge与getMaxAge方法
setPath与getPath方法
setDomain与getDomain方法
getName方法
关于Cookie的细节
·一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(Name)和设置值(Value).
·一个Web站点可以给一个Web浏览器发送多个Cookie,一个Web浏览器也可以存储多个Web站点提供的Cookie.
·浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB.
·如果创建了一个cookie,并将它发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器后即被删除。
·若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie.
·注意,删除cookie时,path必须一致,否则不会删除.
Session
·在Web开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意,一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据.
·Session和Cookie的主要区别在于:
Cookie是把用户的数据写给用户浏览器
Session技术把用户的数据写到用户独站的session中
·Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象.
·Session的实质: 由于Web是无状态的,Session实质是借助Cookie来实现的,客户端浏览器在发出请求后,web服务器会给客户端浏览器一个唯一标识的Cookie,客户端浏览器下次再请求时,会带上这个唯一标识的Cookie.如果在浏览器把Cookie清除,这个Session就没有了。所以实质是借助Cookie来实现Session.
Session应用案例
·使用Session完成用户登录
·利用Session防止表单重复提交
·利用Session实现一次性验证码