Servlet

介绍

Servlet 是运行在 Web 服务器端的 Java 应用程序,它使用 Java 语言编写,具有 Java 语言的优点。与 Java 程序的区别是,Servlet 对象主要封装了对 HTTP 请求的处理,并且它的运行需要 Servlet 容器(tomcat)的支持。

Servlet与Jsp

Servlet 是使用 Java Servlet 接口运行在 Web 应用服务器上的 Java 程序,其功能十分强大,它不但可以处理 HTTP 请求中的业务逻辑,而且还可以输出 HTML 代码来显示指定页面。而 JSP 是一 种在 Servlet 规范之上的动态网页技术,在 JSP 页面中,同样可以编写业务逻辑处理 HTTP 请求,也可以通过 HTML 代码来编辑页面。

1,Servlet 的配置

包含在 web.xml文件中,主要通过以下两步进行设置。

<!--声明Servlet-->
<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>cn.hx.MyServlet</servlet-class>
</servlet>
<!--映射Servlet-->
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/my</url-pattern>
</servlet-mapping>

2,乱码处理

在响应过程中如果出现中文乱码,需要设置 response.setCharacterEncoding("UTF-8");和 response.setContentType("text/html;charset=UTF-8");关于请求的方法,点击 a 标签跳转,或直接在浏览器地址栏输入地址并回车,这样的请求方式是 get 请求。post 请求一般有表单提交且表单指定请求方式为 post 或者 ajax 请求。

3,重定向与转发

(1)重定向表示当前访问的资源没有权限获取操作成功后需要浏览器跳转到指定的 jsp 或 servlet,这种跳转是由于,并且在响应头中告知浏览器跳转地址。浏览器主动跳转。

(2)转发是描述 jsp 与 servlet 之间的关系,该转发的逻辑如下,当我们访问 jsp页面时,页面没有相关的数据展示,于是我们的请求便指向 servlet 的地址,servlet 调用相关组件获取数据,然后将数据存入 request 中,jsp 页面再将 request 中的数据渲染出一张有数据的 html 页面。这样各司其职也正是 java 提出的高内聚、低耦合的编程思想。

4,生命周期与创建时机

  1. Servlet 初始化后调用 init() 方法。 
  2. Servlet 调用 doGet() 或 doPost() 方法来处理客户端的请求,Service可提供两种两种处理。 
  3. Servlet 销毁前调用 destroy() 方法。 
  4. 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。(部分理论不包含)
  5.  @Override//初始化调用
        public void init() throws ServletException {
            super.init();
        }
    }
     @Override//处理get请求
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doGet(req, resp);
        }
    
        @Override//处理post请求
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
      @Override//可处理get/post请求
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.service(req, resp);
        }
    
      @Override//销毁调用
        public void destroy() {
            super.destroy();
        }

创建时机:

load-on-startup:可以指定 Serlvet 被创建的时机。若为负数,则在第一次请求时被创建。若为 0 或正数,则在当前 WEB 应用被 Serlvet 容器加载时创建实例,且数值越小越早被创建。在Web进行配置或者也可以在注解@WebServlet中进行配置。

<servlet>
    <servlet-name>secondServlet</servlet-name>
    <servlet-class>com.hw.javaweb.SecondServlet</servlet-class>
    <!-- 可以指定 Servlet 被创建的时机 -->
    <load-on-startup>2</load-on-startup>
</servlet>

5,模糊映射

1.servlet 的路径映射必须以 / 开头或者 * 开头。例如直接写 login服务器会报错。

2.servlet 的路径映射中,不能同时存在两种"模糊匹配"的规则。例如/test/*.do会报错。 

3.当浏览器的路径同时匹配多个 servlet 的时候 

a)精确度越高的 URL(最像url的)优先被匹配。如上面的 /user/* 大于 /* 

b)以后缀名结尾的 URl 优先级最低。

4./* 会使所有请求 jsp 的请求都会匹配并转向 Servlet,如果想要匹配除精确匹配外的的其他请求,可以使用 / 匹配。

6,过滤器

Servlet 过滤器与 Servlet 十分相似,对于程序开发人员而言,过滤器实质上就是在 Web 应用服务器上的一个 Web 应用组件,用于拦截客户端(浏览器)与目标资源(Servlet)的请求,并对这些请求进行一定过滤处理再发送给目标资源。Servlet 过滤器可以改变请求中的内容,来满足实际开发中的需要。

过滤器(Filter)核心对象放置在 javax.servlet 包中,其名称为 Filter,它是一个接口。除这个接口外,与过滤器相关的对象还有 FilterConfig(过滤器的配置对象)对象与 FilterChain(过滤器传递对象),在实际开发中,定义过滤器对象只需要直接或间接地实现 Filter 接口即可。

每一个过滤器对象都要直接或间接地实现 Filter接口,在 Fiter 接口中定义了 3 方法,分别为 init(过滤器初始化方法,该方法在过滤器初始化时调用)、doFilter(对请求进行过滤处理)和 destroy(销毁方法,以便释放资源)。

在 doFilter 方法中调用 filterChain.doFilter(servletRequest, servletResponse); 方法即可完成放行操作,若没有放行操作。客户端浏览器本次请求将接收不到任何数据,浏览器一般表现为白屏。

7,session 超时

Session 超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(默认 30 分钟)没有与服务器交互,服务器将此 Session 销毁,客户端再一次与服务器交互时之前的 Session 就不存在了。在正常使用 session 过程中调用 invalidate() [ɪnˈvælɪdeɪt] 也可以将当前的客户端浏览器的会话清除。在实际开发中,需要监听 session 的创建和销毁,以及往 session 中存入的值等。这些功能都只能通过监听来完成。

1.若访问服务器 session 超时(本次访问与上次访问时间间隔大于 session 最大的不活动的间隔时间)了,即上次会话结束服务端会清除 session,在客户端会又发生请求时,服务端会产生一个新的会话,将之前的 sessionId 替换掉。从而保证数据安全。

2.记录 session 的 cookie 使用周期一般为浏览器关闭前,若用户关闭客户端浏览器,则上次登录的 cookie 将失效,从而无法获取 session,此时服务端的 session 还是存在的,只是客户端浏览器无法访问该空间。所以 session 常见销毁方法有:在某个请求周期内调用了 session.invalidate()方法,此请求周期结束后,session 被销毁;或者是 session 超时后自动销毁;或者关闭客户端浏览器;重启 tomcat 所有 session 都会清空。

8,监听器

监听器的作用是监听 Web 容器的有效期事件,因此它是由容器管理的。利用 Listener 接口监听在容器中的某个执行程序,并且根据其应用程序的需求做出适当的响应。

监听通常有下面三类 8 种监听,分别监听 ServletContext(jsp 里面的 application)变化、session 变化和 request 变化。

1.ServletContextListener:完成 Servlet 上下文整体监听,主要有以下方法:

  • contextInitialized(ServletContextEvent event)监听 application 上下文初始化。
  • contextDestroyed(ServletContextEvent event)监听 application 上下文被载出,即关闭。

2.ServletContextAttributeListener:完成 Servlet 上下文内容监听,主要有以下方法:

  • attibuteAdded(ServletContettributeEevent event)监听对象加入 application 的范围时。
  • atributeReplaced(ServetContexttributeEvent event)监听在 application 的范围有对象取代另一个对象时。
  • atributeRemoved(erleCotettributcEvent event)监听对象从 application 的范围移除时。

3.HttpSessionListener:完成 Session 整体监听,主要有以下方法:

  • sessionCreated(HttpSessionEvent event)监听 session 初始化。
  • sessionDetoyed(HtpSessionEvent event)监听 session 销毁。

4.HttpSessionActivationListener:完成 Session 状态监听,主要有以下方法:

  • sessionDidActivate(HtpSessionEvent event)监听 session 变为有效状态。
  • sessionWillPassivae(HttpSessionEvent event)监听 session 变为无效状态。

5.HttpSessionAttributeListener:完成 Session 内容监听,主要有以下方法:

  • attributeAdded(HttpSessionBindingEvent event)监听对象加入 session 中。
  • attributeReplaced(HttpSessionBindingEvent event)监听 session 中有对象取代另一个对象时。
  • attributeRemoved(HttpSessionBindingEvent event)监听对象从 session 中移除时。

6.HttpSessionBindingListener:完成 Session 绑定监听,主要有以下方法:

  • valueBound(HttpSessionBindingEvent event)监听对象加入 session 中。
  • valueUnBound(HttpSessionBindingEvent event)监听对象从 session 中移除。

7.ServletRequestListener:完成 ServletRequest 监听,主要有以下方法:

  • requestInitalized(ServletRequestEvent event)监听 ServletRequest 已经被初始化。
  • requestDestroyed(ServletRequestEvent event)监听 ServletRequest 已经被销毁。

8.ServletRequestAttributeListener:完成 ServletRequest 内容监听,主要有以下方法:

  • attributeAdded(ServletRequestAttributeEvent event)监听对象加入 request 中。
  • attributeReplaced(ServletRequestAttributeEvent event)监听 request 中有对象取代另一个对象。
  • attributeRemoved(ServletRequestAttributeEvent event)监听对象从 request 中移除时。

监听能够有效的向我们展示各个对象的创建与销毁,内容的变化等。使用时也和 Servlet 一样需要在 web.xml 中配置。

10,注解

新增注解是 Servlet3.0 中的重大革新之一。通过使用注释就无须在 web.xml 文件中对 Servlet 或者过滤器进行配置。Servlet3.0 新增的注释有 @WebServlet、@WebFilter、@WebListener 和 @WebInitParam 等

在注解中可以配置属性,WebServlet为例有以下属性。

name(String)             等价于<servlet-name>,如果没有显式指定,则为类的全限定名
value(String[])          该属性等价于urlPatterm属性。两个属性不能同时使用
urlPatterns(String[])    等价于<urlpattern>标签
loadOnStartup(int)       指定Servlet的加载顺序,等价于<load-on-startup>标签
initParams(WebInitParam[])指定一组Servlet初始化参数,等价于<init-param>标签
asyncSupported(boolean)  声明Servlet是否支持异步操作模式,等价于<async suppored>标签
description(String)      该Servlet的描述信息,等价于<description>标签<br/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值