SpringMVC

servlet代碼
SpringMVC代碼

1.Tomcat9安裝配置

  • step1.配置Java
    JAVA_HOME
    PATH=%JAVA_HOME%\bin;
    CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
  • step2.配置tomcat
    TOMCAT_HOME=D:\apache-tomcat-9.0.12
    CATALINA_HOME=D:\apache-tomcat-9.0.12
    PATH=%CATALINA_HOME%\bin
    CLASSPATH=%CATALINA_HOME%\lib\servlet-api.jar
  • step3.安裝
    cmd輸入service install Tomcat9
  • step4.測(cè)試
    控制面板—系統(tǒng)和安全—管理工具—服務(wù)猜丹,找到Apache Tomcat Tomcat9服務(wù)項(xiàng)沪伙,右擊該項(xiàng)僵闯,點(diǎn)“啟動(dòng)”缅刽,啟動(dòng)該服務(wù)。
    地址欄輸入http://localhost:8080或 http://127.0.0.1:8080
    如果出現(xiàn)tomcat示例主頁(yè)梗搅,則表示服務(wù)器安裝成功禾唁。

2.新建動(dòng)態(tài)web項(xiàng)目

  • step1.新建web項(xiàng)目


3.原生的servlet3.0測(cè)試

以前來(lái)寫(xiě)web的三大組件:以前寫(xiě)servlet filter listener都需要在web.xml進(jìn)行注冊(cè)效览,包括springmvc的前端控制器DispactherServlet也需要在web.xml注冊(cè),現(xiàn)在可以通過(guò)注解的方式快速搭建我們的web應(yīng)用荡短。

3.1 簡(jiǎn)單的測(cè)試

  • 新增請(qǐng)求地址丐枉,請(qǐng)求地址為order
    index.jsp
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <a href="order">order</a>
  </body>
</html>
  • 建立一個(gè)原生的servlet來(lái)處理 order的請(qǐng)求
    JamesServlet.java
@WebServlet("/order")
public class JamesServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("order success...");
    }
}
  • 啟動(dòng)tomcat后測(cè)試


3.2 ServletContainerInitializer初始化web容器

Shared libraries(共享庫(kù)) and runtimes pluggability(運(yùn)行時(shí)插件)的原理,在后面的框架整合里掘托,用得比較多瘦锹。
在web容器啟動(dòng)時(shí)為提供給第三方組件機(jī)會(huì)做一些初始化的工作,例如注冊(cè)servlet或者filters等闪盔,servlet規(guī)范(JSR356)中通過(guò)ServletContainerInitializer實(shí)現(xiàn)此功能弯院。
每個(gè)框架要使用ServletContainerInitializer就必須在對(duì)應(yīng)的jar包的META-INF/services 目錄創(chuàng)建一個(gè)名為javax.servlet.ServletContainerInitializer的文件,文件內(nèi)容指定具體的ServletContainerInitializer實(shí)現(xiàn)類(lèi)泪掀,那么听绳,當(dāng)web容器啟動(dòng)時(shí)就會(huì)運(yùn)行這個(gè)初始化器做一些組件內(nèi)的初始化工作。

com.wangzhen.servlet.JamesServletContainerInitializer
@HandlesTypes(value={JamesService.class})
public class JamesServletContainerInitializer implements ServletContainerInitializer {
    /**
     * tomcat啟動(dòng)時(shí)加載應(yīng)用的時(shí)候椅挣,會(huì)運(yùn)行onStartup方法;
     *
     * Set<Class<?>> arg0:感興趣的類(lèi)型的所有子類(lèi)型(對(duì)實(shí)現(xiàn)了JamesService接口相關(guān)的)塔拳;
     * ServletContext arg1:代表當(dāng)前Web應(yīng)用的ServletContext鼠证;一個(gè)Web應(yīng)用一個(gè)ServletContext;
     *
     * 1)蝙斜、使用ServletContext注冊(cè)Web組件(Servlet、Filter澎胡、Listener)
     * 2)孕荠、使用編碼的方式,在項(xiàng)目啟動(dòng)的時(shí)候給ServletContext里面添加組件攻谁;
     *      必須在項(xiàng)目啟動(dòng)的時(shí)候來(lái)添加;
     *      1)戚宦、ServletContainerInitializer得到的ServletContext个曙;
     *      2)艳汽、ServletContextListener得到的ServletContext猴贰;
     */
    @Override
    public void onStartup(Set<Class<?>> arg0, ServletContext arg1) throws ServletException {
        System.out.println("感興趣的類(lèi)型:");
        for (Class<?> claz : arg0) {
            System.out.println(claz);//當(dāng)傳進(jìn)來(lái)后,可以根據(jù)自己需要利用反射來(lái)創(chuàng)建對(duì)象等操作
        }
    }

}
  • 并新建JamesService接口的所有子類(lèi)型
    JamesServiceOther
    JamesServiceImpl
    AbstractJamesService

  • 測(cè)試結(jié)果

Connected to server
[2018-09-14 06:57:00,891] Artifact wangzhen-servlet3:war exploded: Artifact is being deployed, please wait...
感興趣的類(lèi)型:
interface com.wangzhen.service.JamesServiceOther
class com.wangzhen.service.AbstractJamesService
class com.wangzhen.service.JamesServiceImpl
  • 總結(jié)
    實(shí)質(zhì)是基于運(yùn)行時(shí)插件的機(jī)制河狐,啟動(dòng)并運(yùn)行這個(gè)ServletContainerInitializer米绕,在整合springmvc的時(shí)候會(huì)用到

3.3 使用ServletContext注冊(cè)web組件

其實(shí)就是Servlet,Filter,Listener三大組件瑟捣。
對(duì)于我們自己寫(xiě)的JamesServlet,我們可以使用@WebServlet注解來(lái)加入JamesServlet組件栅干,
但若是我們要導(dǎo)入第三方阿里的連接池或filter迈套,以前的web.xml方式就可通過(guò)配置加載就可以了,但現(xiàn)在我們使用ServletContext注入進(jìn)來(lái)碱鳞。

   @Override
    public void onStartup(Set<Class<?>> arg0, ServletContext arg1) throws ServletException {
        System.out.println("感興趣的類(lèi)型:");
        for (Class<?> claz : arg0) {
            System.out.println(claz);//當(dāng)傳進(jìn)來(lái)后桑李,可以根據(jù)自己需要利用反射來(lái)創(chuàng)建對(duì)象等操作
        }
        //注冊(cè)servlet組件
        javax.servlet.ServletRegistration.Dynamic servlet = arg1.addServlet("orderServlet", new OrderServlet());
        //配置servlet的映射信息(路徑請(qǐng)求)
        servlet.addMapping("/orderTest");

        //注冊(cè)監(jiān)聽(tīng)器Listener
        arg1.addListener(OrderListener.class);

        //注冊(cè)Filter
        javax.servlet.FilterRegistration.Dynamic filter = arg1.addFilter("orderFilter", OrderFilter.class);
        //添加Filter的映射信息,可以指定專(zhuān)門(mén)來(lái)攔截哪個(gè)servlet
        filter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");

    }

}
  • 新建三個(gè)組件
public class OrderFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        // 過(guò)濾請(qǐng)求
        System.out.println("UserFilter...doFilter...");
        //放行
        arg2.doFilter(arg0, arg1);

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
}
public class OrderListener implements ServletContextListener {


    //監(jiān)聽(tīng)ServletContext銷(xiāo)毀
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("UserListener...contextDestroyed...");
    }

    //監(jiān)聽(tīng)ServletContext啟動(dòng)初始化
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        ServletContext servletContext = arg0.getServletContext();
        System.out.println("UserListener...contextInitialized...");
    }

}
public class OrderServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        resp.getWriter().write("jamesServlet...");
    }

}
  • 測(cè)試結(jié)果


UserListener...contextInitialized...
[2018-09-14 07:38:34,459] Artifact wangzhen-servlet3:war exploded: Artifact is deployed successfully
[2018-09-14 07:38:34,459] Artifact wangzhen-servlet3:war exploded: Deploy took 567 milliseconds
UserFilter...doFilter...
UserFilter...doFilter...
UserFilter...doFilter...
UserFilter...doFilter...
14-Sep-2018 19:38:43.547 信息 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [D:\apache-tomcat-9.0.12\webapps\manager]
14-Sep-2018 19:38:43.587 信息 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [D:\apache-tomcat-9.0.12\webapps\manager] has finished in [40] ms
UserFilter...doFilter...

注意:在運(yùn)行的過(guò)程中劫笙,是不可以注冊(cè)組件芙扎, 和IOC道理一樣,出于安全考慮填大。

4.SpringMVC

4.1 簡(jiǎn)單的項(xiàng)目

  • 新建maven工程戒洼,配置pom.xml。
    <groupId>com.wangzhen</groupId>
    <artifactId>springmvc-learn</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>3.0-alpha-1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>

注意:tomcat也有servlet允华,maven打jar包的時(shí)候不要把它打進(jìn)去圈浇,不然會(huì)重復(fù)。

  • 查看maven的一個(gè)spring-web.jar包



    內(nèi)容是:

org.springframework.web.SpringServletContainerInitializer
  • JamesWebAppInitializer
public class JamesWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    //獲取根容器的配置類(lèi)靴寂;(Spring的配置文件)   父容器磷蜀;
    @Override
    protected Class<?>[] getRootConfigClasses() {
        //指定配置類(lèi)(配置文件)位置
        return new Class<?>[]{JamesRootConfig.class} ;
    }

    //獲取web容器的配置類(lèi)(SpringMVC配置文件)  子容器;
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{JamesAppConfig.class} ;
    }

    //獲取DispatcherServlet的映射信息
    //  /:攔截所有請(qǐng)求(包括靜態(tài)資源(xx.js,xx.png))百炬,但是不包括*.jsp褐隆;
    //  /*:攔截所有請(qǐng)求;連*.jsp頁(yè)面都攔截剖踊;jsp頁(yè)面是tomcat的jsp引擎解析的庶弃;
    @Override
    protected String[] getServletMappings() {
        // TODO Auto-generated method stub
        return new String[]{"/"};
    }

}
  • 新建兩個(gè)配置類(lèi)JamesRootConfig和JamesAppConfig,形成父子容器的效果
//Spring的容器不掃描controller;父容器
@ComponentScan(value="com.wangzhen",excludeFilters={
        @ComponentScan.Filter(type=FilterType.ANNOTATION,classes={Controller.class})
})
public class JamesRootConfig {

}
//SpringMVC只掃描Controller德澈;子容器
//useDefaultFilters=false 禁用默認(rèn)的過(guò)濾規(guī)則歇攻;
@ComponentScan(value="com.wangzhen",includeFilters={
        @ComponentScan.Filter(type=FilterType.ANNOTATION,classes={Controller.class})
},useDefaultFilters=false)
public class JamesAppConfig  {
}
  • 測(cè)試類(lèi)
Controller
public class OrderController   {
    @Autowired
    OrderService orderService;

    @ResponseBody
    @RequestMapping("/buy")
    public String buy(){
        return orderService.goBuy("12345678");
    }
}
@Service
public class OrderService   {
    public String goBuy(String orderId){
        return "orderId===="+orderId;
    }
}
  • Run/Debug Configurations




測(cè)試結(jié)果:


4.2 定制SpringMVC

現(xiàn)在使用配置注解,定制我們的springmvc,可看官網(wǎng)描述梆造,加入@EnableWebMvc,來(lái)定制配置功能缴守。

  • 直接在JamesAppConfig實(shí)現(xiàn)WebMvcConfigurer。
@ComponentScan(value="com.wangzhen",includeFilters={
        @ComponentScan.Filter(type=FilterType.ANNOTATION,classes={Controller.class})
},useDefaultFilters=false)
@EnableWebMvc
public class JamesAppConfig extends WebMvcConfigurerAdapter {

    //定制視圖解析器
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        //比如我們想用JSP解析器,默認(rèn)所有的頁(yè)面都從/WEB-INF/AAA.jsp
        registry.jsp("/WEB-INF/pages/",".jsp");
    }
}
  • 新建目錄src/main/webapp/WEB-INF/pages镇辉,添加ok.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>ok</title>
</head>
<body>
successful!
</body>
</html>
  • 在OrderController控制類(lèi)加一個(gè)解析器的定制頁(yè)面返回
    //相當(dāng)于找 /WEB-INF/pages/ok.jsp
    @RequestMapping("/ok")
    public String ok(){
        return "ok";
    }
  • 測(cè)試結(jié)果


  • 出現(xiàn)的問(wèn)題


    解決方法:配置springmvclearn.iml

4.同步和異步處理

4.1 同步處理

客戶端發(fā)出請(qǐng)求后屡穗,一直等待服務(wù)端響應(yīng)。



  • 修改JamesServlet忽肛,測(cè)試
@WebServlet("/order")
public class JamesServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(Thread.currentThread()+ "start...");
        try {
            buyCards();
        } catch (Exception e) {
            e.printStackTrace();
        }
        resp.getWriter().write("order successful...");
        System.out.println(Thread.currentThread() + "end...");
    }

    public void buyCards() throws InterruptedException{
        System.out.println(Thread.currentThread()+".............");
        Thread.sleep(5000);//模擬業(yè)務(wù)操作
    }
}

結(jié)果:

Thread[http-nio-8080-exec-2,5,main]start...
Thread[http-nio-8080-exec-2,5,main].............
Thread[http-nio-8080-exec-2,5,main]end...

從頭到尾都是由同一個(gè)線程2進(jìn)行處理的鸡捐,線程從頭執(zhí)行到尾,會(huì)造成資源占用不能釋放麻裁。

4.2 異步請(qǐng)求

@WebServlet(value="/asyncOrder", asyncSupported = true)
public class OrderAsyncServlet extends HttpServlet{
    //支持異步處理asyncSupported = true
    //重寫(xiě)doget方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //151個(gè)……
        System.out.println("主線程開(kāi)始……"+Thread.currentThread()+"start....."+System.currentTimeMillis());
        AsyncContext startAsync = req.startAsync();
        
        startAsync.start(new Runnable() {
            
            @Override
            public void run() {
                try {
                    System.out.println("副線程開(kāi)始……"+Thread.currentThread()+"start....."+System.currentTimeMillis());
                
                    buyCards();
                    startAsync.complete();
                    AsyncContext asyncContext = req.getAsyncContext();
                    ServletResponse response = asyncContext.getResponse();
                    response.getWriter().write("order sucesful....");
                    System.out.println("副線程結(jié)束……"+Thread.currentThread()+"end....."+System.currentTimeMillis());
                    
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        
        System.out.println("主線程結(jié)束……"+Thread.currentThread()+"end....."+System.currentTimeMillis());
        //主線程的資源斷開(kāi)……
    }

    public void buyCards() throws InterruptedException{
        System.out.println(Thread.currentThread()+".............");
        Thread.sleep(5000);//模擬業(yè)務(wù)操作
    }
}

報(bào)錯(cuò):

Exception in thread "http-nio-8080-exec-4" java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)
    at org.apache.catalina.connector.Request.getAsyncContext(Request.java:1758)
    at org.apache.catalina.connector.RequestFacade.getAsyncContext(RequestFacade.java:1068)
    at com.wangzhen.servlet.OrderAsyncServlet$1.run(OrderAsyncServlet.java:38)
    at org.apache.catalina.core.AsyncContextImpl$RunnableWrapper.run(AsyncContextImpl.java:515)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:844)

原因:AsyncContext.complete();方法的調(diào)用時(shí)機(jī)錯(cuò)誤箍镜,應(yīng)該在子線程完全處理完成業(yè)務(wù)邏輯的最后調(diào)用源祈。
修改:

                    System.out.println("副線程開(kāi)始……"+Thread.currentThread()+"start....."+System.currentTimeMillis());

                    buyCards();
                    AsyncContext asyncContext = req.getAsyncContext();
                    ServletResponse response = asyncContext.getResponse();
                    response.getWriter().write("order sucesful....");
                    startAsync.complete();
                    System.out.println("副線程結(jié)束……"+Thread.currentThread()+"end....."+System.currentTimeMillis());

結(jié)果:

主線程開(kāi)始……Thread[http-nio-8080-exec-6,5,main]start.....1536967088156
主線程結(jié)束……Thread[http-nio-8080-exec-6,5,main]end.....1536967088172
副線程開(kāi)始……Thread[http-nio-8080-exec-6,5,main]start.....1536967088173
Thread[http-nio-8080-exec-6,5,main].............
副線程結(jié)束……Thread[http-nio-8080-exec-6,5,main]end.....1536967093173

4.3 SpringMVC的異步請(qǐng)求

4.3.1 異步order01

@Controller
public class AsyncOrderController {

    @ResponseBody
    @RequestMapping("/order01")
    public Callable<String> order01(){
        System.out.println("主線程開(kāi)始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());

        Callable<String> callable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println("副線程開(kāi)始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());
                Thread.sleep(2000);
                System.out.println("副線程開(kāi)始..."+Thread.currentThread()+"==>"+System.currentTimeMillis());
                return "order buy successful........";
            }
        };

        System.out.println("主線程結(jié)束..."+Thread.currentThread()+"==>"+System.currentTimeMillis());
        return callable;
    }

}

結(jié)果:

Thread[http-nio-8080-exec-4,5,main]----preHandle-------------/springmvclearn/order01
主線程開(kāi)始...Thread[http-nio-8080-exec-4,5,main]==>1536970626335
主線程結(jié)束...Thread[http-nio-8080-exec-4,5,main]==>1536970626341
副線程開(kāi)始...Thread[MvcAsync1,5,main]==>1536970626352
副線程開(kāi)始...Thread[MvcAsync1,5,main]==>1536970628353
Thread[http-nio-8080-exec-5,5,main]----preHandle-------------/springmvclearn/order01
Thread[http-nio-8080-exec-5,5,main]----postHandle-------------
Thread[http-nio-8080-exec-5,5,main]----afterCompletion-------------

4.3.2 訂單示例

需求描述:以創(chuàng)建訂單為例,tomcat啟動(dòng)線程1來(lái)完成一個(gè)請(qǐng)求色迂,但實(shí)際上是訂單服務(wù)才能創(chuàng)建訂單香缺,那么tomcat線程應(yīng)該把請(qǐng)求轉(zhuǎn)發(fā)給訂單服務(wù),使用消息中間件來(lái)處理歇僧,訂單服務(wù)把處理結(jié)果也放到消息中間件图张,由tomcat的線程N(yùn)拿到結(jié)果后,響應(yīng)給客戶端诈悍。


  • 創(chuàng)建隊(duì)列
public class JamesDeferredQueue {

    private static Queue<DeferredResult<Object>> queue = new ConcurrentLinkedQueue<DeferredResult<Object>>();

    public static void save(DeferredResult<Object> deferredResult){
        queue.add(deferredResult);
    }

    public static DeferredResult<Object> get( ){
        return queue.poll();
    }

}
  • 模擬兩個(gè)線程/createOrder和/get
@Controller
public class AsyncOrderController {

    //其實(shí)相當(dāng)于我們說(shuō)的tomcat的線程1祸轮,來(lái)處理用戶請(qǐng)求,并將請(qǐng)求的操作放到Queue隊(duì)列里
    @ResponseBody
    @RequestMapping("/createOrder")
    public DeferredResult<Object> createOrder(){
        DeferredResult<Object> deferredResult = new DeferredResult<>((long)5000, "create fail...");
        JamesDeferredQueue.save(deferredResult);
        return deferredResult;
    }

    @ResponseBody
    @RequestMapping("/get")
    public String get(){
        String order = UUID.randomUUID().toString();
        DeferredResult<Object> deferredResult = JamesDeferredQueue.get();
        deferredResult.setResult(order);
        JamesDeferredQueue.save(deferredResult);
        return "get method order = " + order;
    }
}

測(cè)試結(jié)果:
超過(guò)5s沒(méi)有g(shù)et


正常情況



參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侥钳,一起剝皮案震驚了整個(gè)濱河市适袜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舷夺,老刑警劉巖苦酱,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異给猾,居然都是意外死亡疫萤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)敢伸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扯饶,“玉大人,你說(shuō)我怎么就攤上這事池颈∥残颍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵饶辙,是天一觀的道長(zhǎng)蹲诀。 經(jīng)常有香客問(wèn)我斑粱,道長(zhǎng)弃揽,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任则北,我火速辦了婚禮矿微,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尚揣。我一直安慰自己涌矢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布快骗。 她就那樣靜靜地躺著娜庇,像睡著了一般塔次。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上名秀,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天励负,我揣著相機(jī)與錄音,去河邊找鬼匕得。 笑死继榆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汁掠。 我是一名探鬼主播略吨,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼考阱!你這毒婦竟也來(lái)了翠忠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤羔砾,失蹤者是張志新(化名)和其女友劉穎负间,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體姜凄,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡政溃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了态秧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片董虱。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖申鱼,靈堂內(nèi)的尸體忽然破棺而出愤诱,到底是詐尸還是另有隱情,我是刑警寧澤捐友,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布淫半,位于F島的核電站,受9級(jí)特大地震影響匣砖,放射性物質(zhì)發(fā)生泄漏科吭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一猴鲫、第九天 我趴在偏房一處隱蔽的房頂上張望对人。 院中可真熱鬧,春花似錦拂共、人聲如沸牺弄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)势告。三九已至蛇捌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咱台,已是汗流浹背豁陆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吵护,地道東北人盒音。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像馅而,于是被迫代替她去往敵國(guó)和親祥诽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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

  • Based on Java? Servlet Specification v3.1 [TOC] Servlet和S...
    0x70e8閱讀 1,319評(píng)論 0 7
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理瓮恭,服務(wù)發(fā)現(xiàn)雄坪,斷路器,智...
    卡卡羅2017閱讀 134,667評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,823評(píng)論 6 342
  • SpringMVC原理分析 Spring Boot學(xué)習(xí) 5屯蹦、Hello World探究 1维哈、POM文件 1、父項(xiàng)目...
    jack_jerry閱讀 1,296評(píng)論 0 1
  • 我記得街邊那間牛肉面館 也記得步行街那臺(tái)跳舞機(jī) 和路邊少了兩瓣的四葉草 吃面時(shí)的微笑 跳舞時(shí)的俊逸 拈花時(shí)的溫情 ...
    小樓聽(tīng)風(fēng)花語(yǔ)遲閱讀 47評(píng)論 0 0