一、Servlet简介
1.Server+Applet,特殊的Java类(没有main方法,运行于服务端),Servlet处理HTTP协议。
编写类继承自HttpServlet类,重写带参和不带参的init方法、service方法(实现向浏览器中输出的代码)、destroy方法。web.xml文件中添加servlet和servlet-mapping元素。
2.Servlet处理流程
(1)客户端发送HTTP请求到Tomcat内置的Web服务器;
(2)Web服务器将请求转发给Tomcat的Servlet容器;
(3)Servlet容器加载Servlet并产生实例,向其传递表示请求和响应的对象HttpServletRequest/HttpServletResponse,Servlet实例通过请求对象得到客户端请求信息,并进行相应的处理;
(4)转发给其它的Servlet处理;
(5)全部处理完毕后通过响应对象返回给客户端。
Servlet执行流程:
Servlet被装载并实例化后,容器调用init()初始化Servlet,使其处于服务状态→service()方法处理客户端请求,会调用多次→Servlet不再使用,容器销毁Servlet调用destroy(),用于资源释放和日志记录。
3.Servlet包介绍
javax.servlet包含Servlet最基本的接口和类;
javax.servlet.http基于HTTP协议的Servlet接口和类;javax.servlet.annotation是Servlet的注解;
javax.servlet.descriptor用于获取JSP或标签库的配置信息。
二、Servlet编程实例
1.HTTP方法主要有option、post、get、put、delete和head;主要使用get和post方法,其中后者可以重复提交、没有字符长度限制、不限制数据类型url中不可见而且安全性高;get方法提交的内容直接显示在地址栏中,仅能处理2048字符以内的ASCII字符。
*在jsp文件的表单method中指定post/get方法来决定执行doGet()或者doPost()方法。
*一般在doGet()中调用doPost()方法,在后者中添加处理逻辑。
2.Servlet请求重定向:
resp.sendRedirect(req.getContextPath)= jsp地址,完成页面的重定向。在重定向过程中发生两次请求和响应,没有参数传递。可以重定向到其它应用的地址。
Servlet请求转发,只有一次请求和响应,共用一组请求和响应对象,只能转到同一应用的地址,可传递参数。
RequestDispatcher rd=req.getRequestDispather(转发地址);
rd.forward(req,resp);
3.JSP+Servlet+JDBC编程:Service类中执行调入校验逻辑,调用DAO层的数据库访问逻辑,是否查询到用户信息→跳转页面。在HttpServlet子类的doPost()方法获取参数,调用service中的调入检验逻辑,添加Servlet配置信息。在JSP中添加check函数检查输入是否为空,并用CSS美化页面。
三、Servlet过滤器Filter
1.Filter在Servlet被调用之前和之后截获该调用,以修改实际请求或实际响应中的的参数,用于权限控制、日志记录、图像转换、数据压缩等。Servlet的init()在servlet对象第一次被访问的时候启动,Filter的init()方法在Servlet容器启动时执行。Filter的doFilter()方法执行过滤器逻辑,需要在web.xml中添加filter配置信息,包含name/class/init-param等属性;并添加filter-mapping配置信息,包含url-pattern。Filter的生命周期与Servlet类似。
2.过滤器链:在一个Web应用中的多个过滤器,执行顺序依据在部署描述符中注册的顺序。这是一种职责链模式:多个对象都有机会处理请求,沿着链条传送请求直至有一个对象最终处理它为止,避免请求的发送者和接收者之间的耦合关系。
3.Filter应用实例:字符编码过滤器防止乱码。
权限过滤器:
(1)用session记录登陆状态;
(2)将过滤器中的ServletReqest强制转换为HttpServletRequest,ServletResponse强制转换为HttpServletResponse;
(3)不需要校验权限或满足校验权限则将请求转发给下一个组件处理:chain.doFilter(request,response);
否则添加没有权限时的处理逻辑。