Java Web学习笔记——Servlet程序开发

Servlet程序开发

       Servlet是使用Java语言编写的服务器端程序,生成动态的Web页。Servlet主要运行在服务器端,并由服务器调用执行,是一种按照Servlet标准开发的类。Servlet程序是Java对CGI程序的实现,采用了多线程的处理方式。可以处理客户端传来的HTTP请求,并返回一个响应。

   Servlet程序处理的步骤如下:

    (1)客户端(如Web浏览器)通过HTTP提出请求。

    (2)Web服务器接收该请求并将其发送给Servlet。如果这个Servlet未被加载,则Web服务器将它加载到Java虚拟机并执行它。

    (3)Servlet程序将接收该HTTP请求并执行某种处理。

    (4)Servlet会将处理后的结果向Web服务器返回应答。

    (5)Web服务器将从Servlet收到的应答发回客户端。  

  HttpServletRequest和HttpServletResponse,用来接收和回应用户的请求。

  一个Servlet程序编译后,无法立即访问,因为此时所有的Servlet程序都是以class为结尾的形式存在,所以还需要在WEB-INF\web.xml文件中进行Servlet程序的映射配置。而且在每次修改web.xml都要重新启动服务器。另外,对于每一个Servlet实际上都可以配置多个名称,只需增加对应的<servlet-mapping>元素即可。

  在Servlet程序中,有两种处理用户请求的方式doPost()和doGet()。其中直接在浏览器中输入地址访问Servlet,会调用doGet()方式进行处理,即用户输入地址对于Servlet而言就属于一种get请求。实际上,Servlet还可以处理其他请求,如doTrace()和doDelete()方法等。

  在Servlet中经常会出现路径问题,可以按照如下方式设置:

    

    注意:使用request.getContextPath()获取上下文地址。

    Servlet的生命周期收到Web容器的控制,其生命周期包括加载程序、初始化、服务、销毁、卸载5个部分。

    1.加载Servlet:Web容器负责加载Servlet,当Web容器启动时或者是第一次使用这个Servlet时,容器会负责创建Servlet实例,但是用户必须通过部署描述符web.xml指定Servlet的位置(Servlet所在的包.类名称),成功加载后,Web容器会通过反射的方式对Servlet进行实例化。

    2.初始化:当一个Servlet被实例化后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库连接,读取文件信息等。如果初始化失败,则此Servlet将被直接卸载。

    3.处理服务:当有请求时,Servlet将调用service()(常用的有doGet()和doPost())方法进行处理。在service()方法中,Servlet可以通过ServletRequest接收客户的请求,也可以利用ServletResponse设置响应信息。

    4.销毁:当Web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destory()方法,以便让该实例释放掉所占用的资源。

    5.卸载:当一个Servlet调用完destory()方法后,此实例将等待被垃圾收集器所回收,如果需要再次使用此Servlet时,会重新调用init()方法初始化。

   如果一个Servlet长时间不使用的话,也会被容器自动销毁。

   每一个Servlet可以同时配置多个初始化参数,配置参数时直接使用<init-param>元素即可,其中的<param-name>表示参数名称,<param-value>表示参数的内容,Servlet读取时通过参数名称即可取得参数的内容。

   在Servlet中初始化方法一共有init()和init(ServletConfig config)两个,后者优先。

   在Servlet程序中要想取得一个session对象,则可以通过HttpServletRequest接口完成。

   application内置对象是ServletContext接口的实例,表示的是Servlet上下文,如果要在一个Servlet中使用此对象,直接通过GenericServlet类提供的方法即可。

   在Servlet中如果想要进行客户端跳转,直接使用HttpServletResponse接口的sendRedirect()方法即可,但是此跳转只能传递session及application范围的属性,而无法传递request范围的属性。request属性范围只有在服务器端跳转才可以使用。

   如果要执行服务器端跳转,就必须依靠RequestDispatcher接口完成。使用forward()方法即可完成跳转功能的实现。

   在Web开发中,有两种主要的开发架构,称为Model I 和Model II:

    Model I;在开发中将显示层、控制层、数据层的操作统一交给JSP或JavaBean来进行处理。有两种情况,一种是完全使用JSP进行开发,另外一种是使用JSP+JavaBean的模式进行开发。

        (1)用户发出的请求(request)交给JSP页面进行处理。如果是开发小型的Web程序,通常会将显示层和逻辑运算层都写在JSP页面中。

        (2)若将显示操作都写入JSP页面中,而业务层都写成JavaBean形式,将程序代码封装成组件。这样,JavaBean将负责大部分的数据处理,如执行数据库操作等,再将数据处理后的结果返回至JSP页面上显示。

    Model II:以Servlet为主体展开,有Servlet接收所有的客户端请求,然后根据请求调用相应的JavaBean,并将所有的显示结果交给JSP完成,即MVC设计模式。

    MVC是一个设计模式,强制性地使应用程序的输入、处理和输出分开。分成模型层、显示层和控制层。具体描述如下:

    显示层:主要负责接收Servlet传递的内容,并且调用JavaBean,将内容显示给用户。

    控制层:主要负责所有的用户请求参数,判断请求参数是否合法,根据请求的类型调用JavaBean执行操作并将最终的结果交由显示层进行显示。

    模型层:完成一个独立的业务操作组件,一般都是以JavaBean或者EJB的形式进行定义的。

    EJB属于SUN的分布式开发技术,主要负责业务中心的编写,分为会话Bean、实体Bean和消息驱动Bean3种。

    在MVC设计模式中,最关键的部分是使用RequestDispatcher接口,因为内容都是通过此接口保存到JSP页面上进行显示的。所有的属性传递都将使用request属性范围传递。保存的范围越大占用的内存就越多,request在一次服务器跳转后有效,选择新连接后失效,所保存的时间最少,保存时间少内存占用量就少,所以性能是最高的。


过滤器:当需要限制用户访问某些资源或者在处理请求时提前处理某些资源时,即可使用过滤器完成。过滤器是以一种组件的形式绑定到Web应用程序当中的,与其他的Web应用程序组件不同的是,过滤器是此阿勇“链”的方式进行处理的。

在Servlet中,如果要定义一个过滤器,则直接让一个类实现javax.servlet.Filter借口即可。有init()、doFilter()、destory()方法。其中doFilter()方法中,定义了ServletRequest、ServletResponse和FilterChain3个参数,从前两个参数中可以实现,过滤器可以完成对任何协议的过滤操作。FilterChain接口的主要作用是将用户的请求向下传递给其他的过滤器或者Servlet。实现传递的方式是在FilterChain接口中定义一个同样的doFilter()方法。

过滤器中的初始化方法是在容器启动时自动加载的,并且通过FilterConfig和getInitParameter()方法取出了配置的初始化参数,只初始化一次。但是对于过滤器中的doFilter()方法实际上会调用两次,一次是在FilterChain操作之前,一次是在FilterChain操作之后。

过滤器本身是属于一个组件的形式加入到应用程序之中的。例如编码过滤或用户登录验证。

session本身是属于HTTP协议的范畴,但是doFilter()方法中定义的是ServletRequest类型的对象,那么要想取得session,则必须进行向下转型,将ServletRequest变为HttpServletRequest接口对象,才能通过getSession()方法取得session对象。

当需要自动执行某些操作时可以通过过滤器完成。


监听器:主要负责监听Web的各种操作,当相关的事件触发后将产生事件,并对此事件进行处理。

    对于application监听,实际上就是对SerletContext监听,主要使用ServletContextListener和ServletContentAttributeListener两个接口。

    所有的Servlet程序都必须在web.xml文件中进行配置,如果一个web.xml文件要同时配置简单Servlet、过滤器和监听器的话,按照如下步骤:

    (1)先配置过滤器:<filter>、<filter-mapping>

    (2)在配置监听器:<listener>

    (3)最后配置简单Servlet;<servlet>、<servlet-mapping>

    对于session的监听操作主要使用HttpSessionListener、HttpSessionAttributeListener和HttpSessionBindingListener接口

    当一个新用户打开一个动态页时,服务器会为新用户分配session,并且配置HttpSessionListener接口中的sessionCreated()事件,但是在用户销毁时却有两种不同的方式来触发sessionDestoryed()事件:

    方式一:调用HttpSession接口的invalidate()方法,让一个session失效

    方式二;超过了配置的session超时事件,session超时时间可以直接在项目的web.xml中配置。

    类似地,对于request的监听主要使用ServletRequestListener和ServletRequestAttributeListener两个接口。

猜你喜欢

转载自blog.csdn.net/arpospf/article/details/80300553