Servlet的任务
1、 读取客户端发送的显示的数据,包括HTML表单和一些客户端程序的表单
2、 读取客户端发送的隐式的数据,包括cookies、媒体类型等
3、 处理数据并产生结果
4、 向客户端返回显示的数据,比如HTML/XML等文本文件,二进制文件(gif图像),Excel
5、 向客户端返回隐式的Http响应,比如cookies,返回的文档类型
Servlet的生命周期
1、 init()方法进行初始化
只调用一次,会简单的加载或创建一些数据
2、 service()方法处理客户端的请求
service()方法有servlet容器调用,只需要根据需求重载doGet,doPost方法即可
3、 destroy()方法终止servlet
只调用一次,可以关闭数据库连接,结束后台线程,将servlet对象标记为垃圾回收
Ps:servlet容器中有很多servlet实例,一个线程执行一个servlet实例的service()方法
Servlet访问URL的配置
客户端都是通过URL来访问web服务器资源,类似于远程访问某一台计算机的文件系统(某一个文件夹下的资源)。要想访问servlet,就必须把servlet映射到某一个地址上。在web.xml中的配置如下
<servlet>
<servlet-name>servlet的命名</servlet-name>
<servlet-class>servlet类名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>与上面的servlet命名对应</servlet-name>
<url-pattern>地址。。相对地址</url-pattern>
</servlet-mapping>
Ps:此处可以有很多<servlet-mapping>,而且可以是相同的servlet-name指向不同的URL,那样不同的URL都可以访问相同的servlet
缺省servlet:URL用斜杠(/)表示,只要是在web.xml中找不到对应的servlet-mapping都访问这个缺省的servlet
线程安全问题
多个客户端访问同一个servlet的时候,事实上是创建了多个线程,同时访问这个servlet,这样就存在多线程并发访问同一资源,可能会造成数据的错误。
网上给的解决办法:1、对对象加锁,但是改变了访问策略(相当于每一个客户端是排队访问);2、实现SingleThreadModel接口,事实上是实例化了多个对象,每一个线程相当于单线程访问,对资源的操作互不影响,但是这个方法过时(Dprecated)了
Servlet初始化参数
在web.xml中用<init-param>配置参数,格式如下
<servlet>
<servlet-name>name</servlet-name>
<servlet-class>Servlet.test.servletdemo</servlet-class>
<!-- 配置servletdemo的初始化参数 -->
<init-param>
<param-name>id</param-name>
<param-value>song</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
<init-param>
</servlet>
可以在程序中用ServletConfig获取参数:当servlet配置了初始化参数后,web容器在创建servlet实例的时候会自动将参数封装到ServletConfig对象中,然后通过SevletConfig的方法(get**)获取参数
ServletContext对象
Web容器在启动时会为每一个web应用创建一个ServletContext对象,ServletConfig中维护了ServletContext的引用,因此可以通过ServletConfig中的方法得到web应用的ServletContext。每一个servlet共用一个ServletContext,因此可以利用ServletContex在servlet之间进行通讯。
ServletContext可以通过web.xml配置初始化参数,格式如下:
<context-param>
<param-name>address</param-name>
<param-value>Beijing.haidian.xueyuan.Road</param-value>
</context-param>
请求转发:一个对servletA的请求转发至servletB,这样就可以达到本来对A的地址访问,结果转到对B的地址访问,操作如下:
A的类中:
ServletContext context = this.getServletContext();
RequestDispatcher rd = context.getRequestDispatcher(“B的访问地址”);
rd.forward(request, response);
B的类中,无变化
Servlet处理表单数据
1、 利用getParameter()方法可以很简单的获得传递的数据
2、 利用getParamtername()方法可以获得全部表单的数据
3、 利用getParameterValue(ParameterName)方法可以获得单值或多值的数据
Servlet可以通过方法获取HTTP请求的头部信息和设置HTTP响应的头部信息
HttpServletResponse对象可以调用senderror()方法,向客户端返回错误(状态码)
Servlet过滤器Filters(实现Filter接口)
配置和servlet类似,需要放在<filter>标签下,一个URL可以有多个过滤器,多个过滤器的顺序与web.xml中的顺序是一致的
调用的顺序:init----doFilter----destroy
Servlet异常处理
在web.xml中进行配置
首先定义一个servlet映射,将错误处理方法映射到错误页面
然后定义error-code的错误页面和exception-code的错误页面,配置如下
<error-page>
<error-code>状态码</error-code>
<location>错误处理页面的地址</location>
</error-page>
<error-page>
<exception-type>异常完整名(eg. java.io.IOException)</exception-type>
<location>异常处理页面的地址</location>
</error-page>
(个人观点:事实上,就是一旦出现这种错误或者抛出了这种异常就跳到定义的页面,跳到定义的页面之后又会被servlet拦截,执行相应的servlet)
Servlet Cookie
存储在客户端计算机上的文本文件
识别用户:服务器脚本向浏览器发送cookies,比如姓名,识别号码等;浏览器将cookies存储在本地;下一次浏览器访问服务器时将发送cookies给服务器,服务器通过cookies来识别用户。
Cookies可以读取,查找,设置,删除(将生存时间置为0然后添加到响应头即可)
Servlet Session
主要是用来维持服务器与客户端的交流信息
每一个session都有一个sessionid,服务器可以通过调用request.getSession()方法获取HttpSession对象,然后通过一系列方法可以对其进行操作
网页重定向
通过设置response的status和header,将网页重定向到另外一个网页,具体方法如下:
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("location", site);
site是新站点
网站点击计数器
可以在servlet或者过滤器Filter中实现,实现方法如下:
设置一个全局变量,每次调用do*方法的时候计数器加1,;如果只想对session会话计数,只需要增加isNew()方法来进行判断;还可以将计数器的值存入数据库,每次在init()方法的时候读取这个值,在destroy()方法中将值写会数据库
页面自动刷新
利用HttpServletResponse对象的setHeader方法设置刷新时间,实现如下:
response.setheader(“refresh”, 5);//刷新时间间隔为5s