JavaEE_servlet

1.Servlet 是什么?

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

2.Servlet 任务

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
    Servlet架构

3.Servlet中post请求与get请求之间的区别。

  • 数据传递方式:get长度较小,post没有限制。
  • 数据传递方式:get使用URL传递参数值,post直接将参数值放入request body。
  • 数据传递安全性:get不安全,post安全
  • 发送的数据包数量:get发送1个TCP数据包,post发送2个TCP数据包;首先发送一个request head(1个TCP数据包),服务器接收后返回100状态码,再发送request body 数据包。

4.重定向和请求转发的区别。

  • 重定向是客户端浏览器执行跳转,请求转发是服务器直接跳转。
  • 重定向之后,客户端浏览器地址栏显示新的请求地址。请求转发之后,客户端浏览器地址栏显示旧的请求地址。
  • 重定向代表依次新的请求,请求转发没有发起新请求

重定向:通知客户端浏览器,重新定向请求新的页面。

response.sendRedirect("index.jsp");

请求转发:服务器直接转发请求,跳转并执行新页面

request.getRequestDispatcher("update.jsp").forward(request, response);

5.JSP的内置对象。

JSP中有九大内置对象可以分为4个作用域对象和其他5个内置对象

  • 4个作用域对象
    1. 内置对象pageContext,将KV键值对,存入"pageContext"页面"范围内。

    pageContext.setAttribute("key", "value");
    pageContext.getAttribute("key");
    

    2.内置对象request,将KV键值对,存入"request请求"范围内

    //    获取当前服务器的IP地址
    String local = request.getLocalAddr();
    System.out.println("服务器IP地址:" + local);
    //    获取请求客户端的IP地址
    String remote = request.getRemoteAddr();
    System.out.println("客户端IP地址:" + remote);
    //    获取请求方式
    String method = request.getMethod();
    System.out.println("当前客户端的请求方式: " + method);
    //    项目运行时访问路径
    String path = request.getServletPath();
    System.out.println("项目运行时访问路径" + path);
    

    3.内置对象session,将KV键值对,存入"session会话"范围内一次会话包含若干次“请求”
    会话的生命周期:
    会话开始:客户端的第一次“请求”
    会话结束:1.客户端浏览器关闭;2.客户端超时(Tomcat默认为30分钟);3.服务器关闭;

    //    获取当前Session会话对象
    HttpSession session = request.getSession();
    System.out.println("Session ID:" + session.getId());      
    //    将当前kv键值对,存入Session会话(服务端)
    session.setAttribute("key", "value");
    //    从当前Session会话中,根据key获取value
    session.getAttribute("key");
    Date creationDate = new Date(session.getCreationTime());
    System.out.println("session 的创建时间:" + creationDate);
    Date lastDate = new Date(session.getLastAccessedTime());
    System.out.println("本次会话最后一次访问时间:" + lastDate);
    

    4.内置对象application,将KV键值对,存入"application应用"范围内
    application的生命周期
    开始:随着服务器的启动而开始
    死亡:随着服务器的关闭而结束

    ServletContext application = request.getServletContext();     
    int count = 0;
    if(application.getAttribute("key")!=null) {
      count=Integer.parseInt(application.getAttribute("key").toString());
      application.setAttribute("key", ++count);
    }else {
      application.setAttribute("key", ++count);
    }
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out =  response.getWriter();
    out.write("这个数字是:" + count);
    
  • 5个其它内置对象
    1.内置对象config :配置信息
    2.内置对象out : 输出
    3.内置对象response : 响应
    4.内置对象page:代表当前页面(当前JSP页面所对应的Servlet实例)
    5.内置对象exception:异常对象,只有当前页面的page指令中isErrorpage=true,方可使用

6.Servlet生命周期

  • Servlet 生命周期可被定义为从创建直到毁灭的整个过程,以下是 Servlet 遵循的过程:
    1.servlet 通过构造方法进行实例化。
    2.Servlet 通过调用 init () 方法进行初始化。
    3.Servlet 调用 service() 方法来处理客户端的请求。
    4.Servlet 通过调用 destroy() 方法终止(结束)。
  • Servlet生命周期,相对于一个servlet来说当这个文件第一次被用户访问则需要创建实例,初始化,服务,当第二个用户访问时则直接接受服务,不用创建实例和初始化,因为servlet内部使用了单例设计模式,所以任何用户共享一个对象。
    Servlet生命周期
  • 代码测试:
@WebServlet("/life")
public class LifeServlet extends HttpServlet{
    /**
     * 
     */
    private static final long serialVersionUID = -3312024715203893693L;
    // 1.实例化:执行当前Servlet的构造方法,完成当前Servlet实例的创建
    public LifeServlet() {
        System.out.println("1.LifeServlet实例被创建!");
    }
    
    // 2.初始化:执行当前Servlet实例的init()初始化方法(重写父类)
    @Override
    public void init() throws ServletException {
        System.out.println("2.LifeServlet实例完成初始化!");
    }
    // 3.服务:调用父类HttpServlet的service()方法 => 根据请求方式不同,调用不同的doXXX方法处理请求
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("3.LifeServlet实例调用服务");
    }
    // 4.销毁
    @Override
    public void destroy() {
        System.out.println("4.LifeServlet实例被销毁");
    }
}

7.servlet中的监听器和过滤器

  • 常用监听器分为6种。
    1. ServletContextListener监听器:
      作用:监听服务器(应用)的启动与关闭。
      方法:1.contextInitialized()方法监听服务器的启动;2.contextDestroyed()方法监听服务器销毁。
      2.HttpSessionListener监听器:
      作用:监听Session会话的创建与销毁
      方法:1.sessionCreated()方法监听会话的创建;2.sessionDestroyed()方法监听会话的销毁。
      3.ServletRequestListener监听器:
      作用:监听request请求的创建与销毁
      方法:1.requestInitialized()方法监听请求的创建;2.requestDestroyed()方法监听请求的销毁。
      4.ServletContextAttributeListener监听器:
      作用:监听application应用范围内的值attribute发生变化;
      方法:1.attributeAdded()方法监听application会话中的添加新的attribute KV键值对;2.attributeReplaced()方法监听application会话中的替换已有的attribute KV键值对;3.attributeRemoved()方法监听application会话中的删除已有的attribute KV键值对。
      5.HttpSessionAttributeListener监听器:
      作用:监听session应用范围内的值attribute发生变化;
      方法:同ServletContextAttributeListener监听器。
      6.ServletRequestAttributeListener监听器:
      作用:监听request应用范围内的值attribute发生变化;
      方法:同ServletContextAttributeListener监听器。

任何Servlet监听器都需要注解@WebListener

  • 常用的过滤器
    通过实现Filter接口来实现过滤器。
/**
 * Filter过滤器 
 * 作用:拦截过滤请求
 */
//@WebFilter(urlPatterns = "/*") //拦截所有请求
//@WebFilter(urlPatterns="*.jsp") //拦截所有jsp请求
  @WebFilter(urlPatterns="*.do") //拦截所有的Servlet请求
public class DemoFilter implements Filter {
    
    /**
     * 执行过滤
     * @param request:请求
     * @param response:响应
     * @param chain:过滤器链,负责管理过滤器的执行与调度
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("【Filter】请求被拦截【前】.....");
        //执行下一个过滤器或目标Servlet(JSP)
        chain.doFilter(request, response); 
        System.out.println("【Filter】请求被拦截【后】.....");
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,188评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,464评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,562评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,893评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,917评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,708评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,430评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,342评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,801评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,976评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,115评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,804评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,458评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,008评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,135评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,365评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,055评论 2 355