Java當(dāng)中的Servlet 開發(fā)

一巾腕、Servlet簡(jiǎn)介

Servlet是sun公司提供的一門用于開發(fā)動(dòng)態(tài)web資源的技術(shù)模庐。
  Sun公司在其API中提供了一個(gè)servlet接口痰滋,用戶若想用發(fā)一個(gè)動(dòng)態(tài)web資源(即開發(fā)一個(gè)Java程序向?yàn)g覽器輸出數(shù)據(jù))予权,需要完成以下2個(gè)步驟:
  1、編寫一個(gè)Java類脂凶,實(shí)現(xiàn)servlet接口宪睹。
  2、把開發(fā)好的Java類部署到web服務(wù)器中蚕钦。
  按照一種約定俗成的稱呼習(xí)慣亭病,通常我們也把實(shí)現(xiàn)了servlet接口的java程序,稱之為Servlet

二嘶居、Servlet的運(yùn)行過(guò)程

Servlet程序是由WEB服務(wù)器調(diào)用罪帖,web服務(wù)器收到客戶端的Servlet訪問(wèn)請(qǐng)求后:
  ①Web服務(wù)器首先檢查是否已經(jīng)裝載并創(chuàng)建了該Servlet的實(shí)例對(duì)象邮屁。如果是整袁,則直接執(zhí)行第④步,否則樱报,執(zhí)行第②步。
 ∨⒌薄②裝載并創(chuàng)建該Servlet的一個(gè)實(shí)例對(duì)象迹蛤。
  ③調(diào)用Servlet實(shí)例對(duì)象的init()方法。
 〉领④創(chuàng)建一個(gè)用于封裝HTTP請(qǐng)求消息的HttpServletRequest對(duì)象和一個(gè)代表HTTP響應(yīng)消息的HttpServletResponse對(duì)象嚷量,然后調(diào)用Servlet的service()方法并將請(qǐng)求和響應(yīng)對(duì)象作為參數(shù)傳遞進(jìn)去。
 ∧嫒ぁ⑤WEB應(yīng)用程序被停止或重新啟動(dòng)之前蝶溶,Servlet引擎將卸載Servlet,并在卸載之前調(diào)用Servlet的destroy()方法宣渗。

三抖所、Servlet調(diào)用圖

Servlet調(diào)用圖

四、在Eclipse中開發(fā)Servlet

在eclipse中新建一個(gè)web project工程痕囱,eclipse會(huì)自動(dòng)創(chuàng)建下圖所示目錄結(jié)構(gòu):
選中g(shù)acl.servlet.study包田轧,右鍵→New→Servlet,如下圖所示:


這樣鞍恢,我們就通過(guò)Eclipse幫我們創(chuàng)建好一個(gè)名字為ServletDemo1的Servlet傻粘,創(chuàng)建好的ServletDemo01里面會(huì)有如下代碼:

package gacl.servlet.study;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {

    /**
     * The doGet method of the servlet. <br>
     *
     * This method is called when a form has its tag value method equals to get.
     * 
     * @param request the request send by the client to the server
     * @param response the response send by the server to the client
     * @throws ServletException if an error occurred
     * @throws IOException if an error occurred
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.print("    This is ");
        out.print(this.getClass());
        out.println(", using the GET method");
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

    /**
     * The doPost method of the servlet. <br>
     *
     * This method is called when a form has its tag value method equals to post.
     * 
     * @param request the request send by the client to the server
     * @param response the response send by the server to the client
     * @throws ServletException if an error occurred
     * @throws IOException if an error occurred
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.print("    This is ");
        out.print(this.getClass());
        out.println(", using the POST method");
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}

這些代碼都是Eclipse自動(dòng)生成的,而web.xml文件中也多了<servlet></servlet>和<servlet-mapping></servlet-mapping>兩對(duì)標(biāo)簽帮掉,這兩對(duì)標(biāo)簽是配置ServletDemo1的弦悉,如下圖所示:



然后我們就可以通過(guò)瀏覽器訪問(wèn)ServletDemo1這個(gè)Servlet,如下圖所示:


五蟆炊、Servlet開發(fā)注意細(xì)節(jié)

5.1稽莉、Servlet訪問(wèn)URL映射配置

由于客戶端是通過(guò)URL地址訪問(wèn)web服務(wù)器中的資源,所以Servlet程序若想被外界訪問(wèn)盅称,必須把servlet程序映射到一個(gè)URL地址上肩祥,這個(gè)工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
  <servlet>元素用于注冊(cè)Servlet缩膝,它包含有兩個(gè)主要的子元素:<servlet-name>和<servlet-class>混狠,分別用于設(shè)置Servlet的注冊(cè)名稱和Servlet的完整類名。
一個(gè)<servlet-mapping>元素用于映射一個(gè)已注冊(cè)的Servlet的一個(gè)對(duì)外訪問(wèn)路徑疾层,它包含有兩個(gè)子元素:<servlet-name>和<url-pattern>将饺,分別用于指定Servlet的注冊(cè)名稱和Servlet的對(duì)外訪問(wèn)路徑。例如:

<servlet>
    <servlet-name>ServletDemo1</servlet-name>
    <servlet-class>gacl.servlet.study.ServletDemo1</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ServletDemo1</servlet-name>
    <url-pattern>/servlet/ServletDemo1</url-pattern>
  </servlet-mapping>

同一個(gè)Servlet可以被映射到多個(gè)URL上痛黎,即多個(gè)<servlet-mapping>元素的<servlet-name>子元素的設(shè)置值可以是同一個(gè)Servlet的注冊(cè)名予弧。 例如:

<servlet>
    <servlet-name>ServletDemo1</servlet-name>
    <servlet-class>gacl.servlet.study.ServletDemo1</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ServletDemo1</servlet-name>
    <url-pattern>/servlet/ServletDemo1</url-pattern>
  </servlet-mapping>
 <servlet-mapping>
    <servlet-name>ServletDemo1</servlet-name>
    <url-pattern>/1.htm</url-pattern>
  </servlet-mapping>
   <servlet-mapping>
    <servlet-name>ServletDemo1</servlet-name>
    <url-pattern>/2.jsp</url-pattern>
  </servlet-mapping>
   <servlet-mapping>
    <servlet-name>ServletDemo1</servlet-name>
    <url-pattern>/3.php</url-pattern>
  </servlet-mapping>
   <servlet-mapping>
    <servlet-name>ServletDemo1</servlet-name>
    <url-pattern>/4.ASPX</url-pattern>
  </servlet-mapping>

通過(guò)上面的配置,當(dāng)我們想訪問(wèn)名稱是ServletDemo1的Servlet湖饱,可以使用如下的幾個(gè)地址去訪問(wèn):

http://localhost:8080/JavaWeb_Servlet_Study_20140531/servlet/ServletDemo1

http://localhost:8080/JavaWeb_Servlet_Study_20140531/1.htm

http://localhost:8080/JavaWeb_Servlet_Study_20140531/2.jsp

http://localhost:8080/JavaWeb_Servlet_Study_20140531/3.php

http://localhost:8080/JavaWeb_Servlet_Study_20140531/4.ASPX

ServletDemo1被映射到了多個(gè)URL上掖蛤。

5.2、Servlet訪問(wèn)URL使用通配符*映射

在Servlet映射到的URL中也可以使用通配符井厌,但是只能有兩種固定的格式:一種格式是".擴(kuò)展名"蚓庭,另一種格式是以正斜杠(/)開頭并以"/"結(jié)尾*致讥。例如:
  

<servlet>
    <servlet-name>ServletDemo1</servlet-name>
    <servlet-class>gacl.servlet.study.ServletDemo1</servlet-class>
  </servlet>

   <servlet-mapping>
    <servlet-name>ServletDemo1</servlet-name>
   <url-pattern>/*</url-pattern>
</servlet>

*可以匹配任意的字符,所以此時(shí)可以用任意的URL去訪問(wèn)ServletDemo1這個(gè)Servlet器赞,如下圖所示:

  

對(duì)于如下的一些映射關(guān)系:
  Servlet1 映射到 /abc/*
  Servlet2 映射到 /*
  Servlet3 映射到 /abc
  Servlet4 映射到 *.do

問(wèn)題:
  當(dāng)請(qǐng)求URL為“/abc/a.html”垢袱,“/abc/”和“/”都匹配,哪個(gè)servlet響應(yīng)
  Servlet引擎將調(diào)用Servlet1港柜。
  當(dāng)請(qǐng)求URL為“/abc”時(shí)请契,“/abc/”和“/abc”都匹配,哪個(gè)servlet響應(yīng)
  Servlet引擎將調(diào)用Servlet3夏醉。
  當(dāng)請(qǐng)求URL為“/abc/a.do”時(shí)爽锥,“/abc/
”和“.do”都匹配,哪個(gè)servlet響應(yīng)
  Servlet引擎將調(diào)用Servlet1授舟。
  當(dāng)請(qǐng)求URL為“/a.do”時(shí)救恨,“/
”和“.do”都匹配,哪個(gè)servlet響應(yīng)
  Servlet引擎將調(diào)用Servlet2释树。
  當(dāng)請(qǐng)求URL為“/xxx/yyy/a.do”時(shí)肠槽,“/
”和“*.do”都匹配,哪個(gè)servlet響應(yīng)
  Servlet引擎將調(diào)用Servlet2奢啥。

匹配的原則就是"誰(shuí)長(zhǎng)得更像就找誰(shuí)"

5.3秸仙、Servlet與普通Java類的區(qū)別

Servlet是一個(gè)供其他Java程序(Servlet引擎)調(diào)用的Java類,它不能獨(dú)立運(yùn)行桩盲,它的運(yùn)行完全由Servlet引擎來(lái)控制和調(diào)度寂纪。
  針對(duì)客戶端的多次Servlet請(qǐng)求,通常情況下赌结,服務(wù)器只會(huì)創(chuàng)建一個(gè)Servlet實(shí)例對(duì)象捞蛋,也就是說(shuō)Servlet實(shí)例對(duì)象一旦創(chuàng)建,它就會(huì)駐留在內(nèi)存中柬姚,為后續(xù)的其它請(qǐng)求服務(wù)拟杉,直至web容器退出,servlet實(shí)例對(duì)象才會(huì)銷毀量承。
  在Servlet的整個(gè)生命周期內(nèi)搬设,Servlet的init方法只被調(diào)用一次。而對(duì)一個(gè)Servlet的每次訪問(wèn)請(qǐng)求都導(dǎo)致Servlet引擎調(diào)用一次servlet的service方法撕捍。對(duì)于每次訪問(wèn)請(qǐng)求拿穴,Servlet引擎都會(huì)創(chuàng)建一個(gè)新的HttpServletRequest請(qǐng)求對(duì)象和一個(gè)新的HttpServletResponse響應(yīng)對(duì)象,然后將這兩個(gè)對(duì)象作為參數(shù)傳遞給它調(diào)用的Servlet的service()方法忧风,service方法再根據(jù)請(qǐng)求方式分別調(diào)用doXXX方法默色。

如果在<servlet>元素中配置了一個(gè)<load-on-startup>元素,那么WEB應(yīng)用程序在啟動(dòng)時(shí)狮腿,就會(huì)裝載并創(chuàng)建Servlet的實(shí)例對(duì)象腿宰、以及調(diào)用Servlet實(shí)例對(duì)象的init()方法弟蚀。
舉例:

    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
            org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

用途:為web應(yīng)用寫一個(gè)InitServlet,這個(gè)servlet配置為啟動(dòng)時(shí)裝載酗失,為整個(gè)web應(yīng)用創(chuàng)建必要的數(shù)據(jù)庫(kù)表和數(shù)據(jù)。

5.4昧绣、缺省Servlet

如果某個(gè)Servlet的映射路徑僅僅為一個(gè)正斜杠(/)规肴,那么這個(gè)Servlet就成為當(dāng)前Web應(yīng)用程序的缺省Servlet。
  凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL夜畴,它們的訪問(wèn)請(qǐng)求都將交給缺省Servlet處理拖刃,也就是說(shuō),缺省Servlet用于處理所有其他Servlet都不處理的訪問(wèn)請(qǐng)求贪绘。 例如:

<servlet>
    <servlet-name>ServletDemo2</servlet-name>
    <servlet-class>gacl.servlet.study.ServletDemo2</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <!-- 將ServletDemo2配置成缺省Servlet -->
  <servlet-mapping>
    <servlet-name>ServletDemo2</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

當(dāng)訪問(wèn)不存在的Servlet時(shí)兑牡,就使用配置的默認(rèn)Servlet進(jìn)行處理,如下圖所示:

  

  在<tomcat的安裝目錄>\conf\web.xml文件中税灌,注冊(cè)了一個(gè)名稱為org.apache.catalina.servlets.DefaultServlet的Servlet均函,并將這個(gè)Servlet設(shè)置為了缺省Servlet。
<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

 <!-- The mapping for the default servlet -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

當(dāng)訪問(wèn)Tomcat服務(wù)器中的某個(gè)靜態(tài)HTML文件和圖片時(shí)菱涤,實(shí)際上是在訪問(wèn)這個(gè)缺省Servlet苞也。

5.5、Servlet的線程安全問(wèn)題

當(dāng)多個(gè)客戶端并發(fā)訪問(wèn)同一個(gè)Servlet時(shí)粘秆,web服務(wù)器會(huì)為每一個(gè)客戶端的訪問(wèn)請(qǐng)求創(chuàng)建一個(gè)線程如迟,并在這個(gè)線程上調(diào)用Servlet的service方法,因此service方法內(nèi)如果訪問(wèn)了同一個(gè)資源的話攻走,就有可能引發(fā)線程安全問(wèn)題殷勘。例如下面的代碼:

不存在線程安全問(wèn)題的代碼:

package gacl.servlet.study;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo3 extends HttpServlet {

    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        /**
         * 當(dāng)多線程并發(fā)訪問(wèn)這個(gè)方法里面的代碼時(shí),會(huì)存在線程安全問(wèn)題嗎
         * i變量被多個(gè)線程并發(fā)訪問(wèn)昔搂,但是沒(méi)有線程安全問(wèn)題玲销,因?yàn)閕是doGet方法里面的局部變量,
         * 當(dāng)有多個(gè)線程并發(fā)訪問(wèn)doGet方法時(shí)巩趁,每一個(gè)線程里面都有自己的i變量痒玩,
         * 各個(gè)線程操作的都是自己的i變量,所以不存在線程安全問(wèn)題
         * 多線程并發(fā)訪問(wèn)某一個(gè)方法的時(shí)候议慰,如果在方法內(nèi)部定義了一些資源(變量蠢古,集合等)
         * 那么每一個(gè)線程都有這些東西,所以就不存在線程安全問(wèn)題了
         */
        int i=1;
        i++;
        response.getWriter().write(i);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

存在線程安全問(wèn)題的代碼:

package gacl.servlet.study;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo3 extends HttpServlet {

    int i=1;
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        i++;
        try {
            Thread.sleep(1000*4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        response.getWriter().write(i+"");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

把i定義成全局變量别凹,當(dāng)多個(gè)線程并發(fā)訪問(wèn)變量i時(shí)草讶,就會(huì)存在線程安全問(wèn)題了,如下圖所示:同時(shí)開啟兩個(gè)瀏覽器模擬并發(fā)訪問(wèn)同一個(gè)Servlet炉菲,本來(lái)正常來(lái)說(shuō)堕战,第一個(gè)瀏覽器應(yīng)該看到2坤溃,而第二個(gè)瀏覽器應(yīng)該看到3的,結(jié)果兩個(gè)瀏覽器都看到了3嘱丢,這就不正常薪介。


  線程安全問(wèn)題只存在多個(gè)線程并發(fā)操作同一個(gè)資源的情況下,所以在編寫Servlet的時(shí)候越驻,如果并發(fā)訪問(wèn)某一個(gè)資源(變量汁政,集合等),就會(huì)存在線程安全問(wèn)題缀旁,那么該如何解決這個(gè)問(wèn)題呢记劈?
先看看下面的代碼:

package gacl.servlet.study;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ServletDemo3 extends HttpServlet {

    int i=1;
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 加了synchronized后,并發(fā)訪問(wèn)i時(shí)就不存在線程安全問(wèn)題了并巍,
         * 為什么加了synchronized后就沒(méi)有線程安全問(wèn)題了呢目木?
         * 假如現(xiàn)在有一個(gè)線程訪問(wèn)Servlet對(duì)象,那么它就先拿到了Servlet對(duì)象的那把鎖
         * 等到它執(zhí)行完之后才會(huì)把鎖還給Servlet對(duì)象懊渡,由于是它先拿到了Servlet對(duì)象的那把鎖刽射,
         * 所以當(dāng)有別的線程來(lái)訪問(wèn)這個(gè)Servlet對(duì)象時(shí),由于鎖已經(jīng)被之前的線程拿走了剃执,后面的線程只能排隊(duì)等候了
         * 
         */
        synchronized (this) {//在java中柄冲,每一個(gè)對(duì)象都有一把鎖,這里的this指的就是Servlet對(duì)象
            i++;
            try {
                Thread.sleep(1000*4);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            response.getWriter().write(i+"");
        }
        
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

現(xiàn)在這種做法是給Servlet對(duì)象加了一把鎖忠蝗,保證任何時(shí)候都只有一個(gè)線程在訪問(wèn)該Servlet對(duì)象里面的資源现横,這樣就不存在線程安全問(wèn)題了,如下圖所示:
  


  這種做法雖然解決了線程安全問(wèn)題阁最,但是編寫Servlet卻萬(wàn)萬(wàn)不能用這種方式處理線程安全問(wèn)題戒祠,假如有9999個(gè)人同時(shí)訪問(wèn)這個(gè)Servlet,那么這9999個(gè)人必須按先后順序排隊(duì)輪流訪問(wèn)速种。
  針對(duì)Servlet的線程安全問(wèn)題姜盈,Sun公司是提供有解決方案的:讓Servlet去實(shí)現(xiàn)一個(gè)SingleThreadModel接口,如果某個(gè)Servlet實(shí)現(xiàn)了SingleThreadModel接口配阵,那么Servlet引擎將以單線程模式來(lái)調(diào)用其service方法馏颂。  查看Sevlet的API可以看到,SingleThreadModel接口中沒(méi)有定義任何方法和常量棋傍,在Java中救拉,把沒(méi)有定義任何方法和常量的接口稱之為標(biāo)記接口,經(jīng)程奔穑看到的一個(gè)最典型的標(biāo)記接口就是"Serializable"亿絮,這個(gè)接口也是沒(méi)有定義任何方法和常量的,標(biāo)記接口在Java中有什么用呢?主要作用就是給某個(gè)對(duì)象打上一個(gè)標(biāo)志派昧,告訴JVM黔姜,這個(gè)對(duì)象可以做什么,比如實(shí)現(xiàn)了"Serializable"接口的類的對(duì)象就可以被序列化蒂萎,還有一個(gè)"Cloneable"接口秆吵,這個(gè)也是一個(gè)標(biāo)記接口,在默認(rèn)情況下五慈,Java中的對(duì)象是不允許被克隆的帮毁,就像現(xiàn)實(shí)生活中的人一樣,不允許克隆豺撑,但是只要實(shí)現(xiàn)了"Cloneable"接口,那么對(duì)象就可以被克隆了黔牵。
  讓Servlet實(shí)現(xiàn)了SingleThreadModel接口聪轿,只要在Servlet類的定義中增加實(shí)現(xiàn)SingleThreadModel接口的聲明即可。   對(duì)于實(shí)現(xiàn)了SingleThreadModel接口的Servlet猾浦,Servlet引擎仍然支持對(duì)該Servlet的多線程并發(fā)訪問(wèn)陆错,其采用的方式是產(chǎn)生多個(gè)Servlet實(shí)例對(duì)象,并發(fā)的每個(gè)線程分別調(diào)用一個(gè)獨(dú)立的Servlet實(shí)例對(duì)象金赦∫舸桑  實(shí)現(xiàn)SingleThreadModel接口并不能真正解決Servlet的線程安全問(wèn)題,因?yàn)镾ervlet引擎會(huì)創(chuàng)建多個(gè)Servlet實(shí)例對(duì)象夹抗,而真正意義上解決多線程安全問(wèn)題是指一個(gè)Servlet實(shí)例對(duì)象被多個(gè)線程同時(shí)調(diào)用的問(wèn)題绳慎。事實(shí)上,在Servlet API 2.4中漠烧,已經(jīng)將SingleThreadModel標(biāo)記為Deprecated(過(guò)時(shí)的)杏愤。

本文轉(zhuǎn)載自:反向代理服務(wù)器的工作原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市已脓,隨后出現(xiàn)的幾起案子珊楼,更是在濱河造成了極大的恐慌,老刑警劉巖度液,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厕宗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡堕担,警方通過(guò)查閱死者的電腦和手機(jī)已慢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)霹购,“玉大人蛇受,你說(shuō)我怎么就攤上這事。” “怎么了兢仰?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵乍丈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我把将,道長(zhǎng)轻专,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任察蹲,我火速辦了婚禮请垛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘洽议。我一直安慰自己宗收,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布亚兄。 她就那樣靜靜地躺著混稽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪审胚。 梳的紋絲不亂的頭發(fā)上匈勋,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音膳叨,去河邊找鬼洽洁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛菲嘴,可吹牛的內(nèi)容都是我干的饿自。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼龄坪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼璃俗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起悉默,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤城豁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后抄课,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唱星,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年跟磨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了间聊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抵拘,死狀恐怖哎榴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤尚蝌,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布迎变,位于F島的核電站,受9級(jí)特大地震影響飘言,放射性物質(zhì)發(fā)生泄漏衣形。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一姿鸿、第九天 我趴在偏房一處隱蔽的房頂上張望谆吴。 院中可真熱鬧,春花似錦苛预、人聲如沸句狼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腻菇。三九已至,卻和暖如春苫拍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旺隙。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工绒极, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔬捷。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓垄提,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親周拐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铡俐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法妥粟,內(nèi)部類的語(yǔ)法审丘,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法勾给,線程的語(yǔ)...
    子非魚_t_閱讀 31,598評(píng)論 18 399
  • 從三月份找實(shí)習(xí)到現(xiàn)在滩报,面了一些公司,掛了不少播急,但最終還是拿到小米脓钾、百度、阿里桩警、京東可训、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,209評(píng)論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理握截,服務(wù)發(fā)現(xiàn)飞崖,斷路器,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 0 系列目錄# WEB請(qǐng)求處理 WEB請(qǐng)求處理一:瀏覽器請(qǐng)求發(fā)起處理 WEB請(qǐng)求處理二:Nginx請(qǐng)求反向代理 本...
    七寸知架構(gòu)閱讀 13,919評(píng)論 22 190