1. Servlet的结构
Java Servlet 开发包由 javax.servlet 和 javax.servlet.http 两个包组成。前者包括了所有的servlet 实现和扩展的通用接口和类;后者包括了创建Http特定的servlet时所需要的扩充类。核心是javax.servlet.Servlet接口,它提供了servlet的框架结构。所有的Servlet必须实现这个接口,通常通过对javax.servlet.GenericServlet或者javax.servlet.http.HttpServlet进行继承来实现这个接口。
如果开发与协议无关的Servlet,那么就对javax.servlet.GenericServlet进行继承,这时必须实现其中的service()方法。而javax.servlet.http.HttpServlet中已经实现了service()方法,通常不用对其进行覆盖,当service()方法被调用时,它会根据参数中用户请求时所用的类型(例如GET和POST)调用对应的方法,开发人员的主要任务是实现这些doXXX()方法,以便做出响应。
2. Servlet的生命周期
init()方法是Servlet生命周期的起点。加载某个Servlet时,服务器立即调用它的init()方法,在其中可创建和初始化在处理请求时需要用到的资源。
service()方法处理客户端发出的请求。前面说到了在javax.servlet.http.HttpServlet中已经实现了该方法,通常情况下无需覆盖。
destroy()方法释放在本Servlet中的init()方法中创建的资源。在服务需要关闭时(Java应用服务器关闭或者停止该Servlet所在的Web应用程序时),调用Servlet的destroy()方法释放在init()方法中创建的资源。可以在destroy()方法中处理以下清除任务:
①更新日志文件
②关闭数据库连接
③关闭任何套接字连接
3. ServletContext
容器会在Web应用程序启动时创建ServletContext。ServletContext接口定义Servlet用于与其Servlet容器通信的一组方法。每个Web应用程序有一个ServletContext。ServletContext中的信息通用于所有组件。
4. Struts中的ActionServlet
来自用户的所有需要通过框架的请求,统一由ActionServlet接收(ActionServlet Struts已经为我们写好了,只要应用没有什么特别的需求,它基本上都能满足要求),根据接收的请求参数和Struts配置(struts-config.xml)中ActionMapping,将请求送给合适的Action去处理,解决由谁做的问题,它们共同构成Struts的控制器。
Action则是Struts应用中真正干活的组件,它解决的是做什么的问题,它通过调用需要的业务组件(模型)来完成应用的业务,业务组件解决的是如何做的问题,并将执行的结果返回一个代表所需的描绘响应的JSP(或Action)的ActionForward对象给ActionServlet以将响应呈现给用户。
这里要特别说明一下的是Action这个类,它不应该包含过多的业务逻辑,而应该只是简单地收集业务方法所需要的数据并传递给业务对象。实际上,它的主要职责是:
①校验前提条件或者声明
②调用需要的业务逻辑方法
③检测或处理其他错误
④路由控制到相关视图
在Web应用启动时就会加载,初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中。
5. Struts中的ActionServlet流程
①检索和用户请求匹配的ActionMapping实例,如果不存在就返回请求路径无效信息
②如果ActionForm实例不存在,就创建一个ActionForm对象,把用户提交的表单数据保存到ActionForm对象中
③根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法
④如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象,就表示表单验证成功
⑤ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法
⑥Action的execute()方法返回一个ActionForward对象,ActionServlet在把用户请求转发给 ActionForward对象指向的JSP组件
⑦ActionForward对象指向JSP组件生成动态网页,返回给用户
6. Filter典型应用
①检测用户是否登录:编写一个用于检测用户是否登录的过滤器,如果用户未登录则重定向至指定页面
②限制用户浏览权限