springboot入門及整合web開發(fā)----F01

Spring Boot入門與簡介

image.png

與時(shí)俱進(jìn)是每一個(gè)程序員都應(yīng)該有的意識雪侥,當(dāng)一個(gè)Java程序員在當(dāng)代步遍布的時(shí)候瓷炮,你就行該想到我能多學(xué)點(diǎn)什么咧七。可觀的是后端的框架是穩(wěn)定的歪泳,它們能夠維持更久的時(shí)間在應(yīng)用中萝勤,而不用擔(dān)心技術(shù)的更新?lián)Q代。但是類似SSH,SSM這些框架已經(jīng)太久了呐伞,人們迫不及待地想使用更為優(yōu)雅而又簡便的框架來代替敌卓,所以SpringBoot運(yùn)應(yīng)而生。

Spring Boot是Spring家族中的一個(gè)全新的框架伶氢,它用來簡化Spring應(yīng)用程序的創(chuàng)建和開發(fā)過程趟径。采用SpringBoot可以非常容易和快速的構(gòu)建基于Spring框架的應(yīng)用程序,它讓編碼變簡單癣防,配置變簡單舵抹,部署變簡單,監(jiān)控變簡單劣砍。正因?yàn)镾pring Boot能夠化繁為簡惧蛹,讓開發(fā)變得極其快捷,所以在業(yè)界備受關(guān)注刑枝。目前Spring Boot在國內(nèi)的關(guān)注趨勢也日漸超過Spring香嗓。

學(xué)習(xí)條件

SpringBoot框架是應(yīng)用在Spring Framework框架的基礎(chǔ)上,對Spring Framework框架的進(jìn)行優(yōu)化和升級成為了新的框架装畅。既SpringBoot是構(gòu)建在SpringFramework框架的基礎(chǔ)之上靠娱,所以想要學(xué)好SpringBoot-那么你肯定要掌SpringFramework。

介紹

1.Spring Boot****概述

Spring框架功能很強(qiáng)大掠兄,但是就算是一個(gè)很簡單的項(xiàng)目像云,我們也要配置很多東西。因此就有了Spring Boot框架蚂夕,它的作用很簡單迅诬,就是幫我們自動配置。Spring Boot框架的核心就是自動配置婿牍,只要存在相應(yīng)的jar包侈贷, Spring就幫我們自動配置。如果默認(rèn)配置不能滿足需求等脂,我們還可以替換掉自動配置類俏蛮,使用我們自己的配置撑蚌。

Spring Boot不是對Spring的增強(qiáng),而是一個(gè)快速使用Spring進(jìn)行開發(fā)的框架搏屑。Spring Boot 旨在幫助開發(fā)者快速搭建 Spring 框架

image.png

使用Spring Boot可以很容易創(chuàng)建一個(gè)獨(dú)立運(yùn)行(運(yùn)行jar争涌,內(nèi)嵌servlet容器)、準(zhǔn)生產(chǎn)級的基于Spring框架的項(xiàng)目辣恋,使用Spring Boot我們可以不用甚至只需要很少的Spring配置亮垫。另外,Spring Boot還集成了嵌入式的Web服務(wù)器抑党,系統(tǒng)監(jiān)控等很多有用的功能,讓我們快速構(gòu)建企業(yè)級應(yīng)用程序撵摆。

image.png

微服務(wù)是未來發(fā)展的趨勢底靠,Spring Boot 是項(xiàng)目微服務(wù)化發(fā)展的基石。

image.png

以上觀點(diǎn)也是我們?yōu)槭裁匆獙W(xué)習(xí)SpringBoot的關(guān)鍵點(diǎn)特铝。

2.Spring Boot****核心功能

2.1獨(dú)立運(yùn)行的Spring項(xiàng)目

spring Boot可以以jar包形式直接運(yùn)行暑中,如 java -jar xxx.jar 優(yōu)點(diǎn)是:節(jié)省服務(wù)器資源

2.2內(nèi)嵌Tomcat和Jetty容器

Spring Boot可以選擇內(nèi)嵌Tomcat,Jetty鲫剿,這樣我們無須以war包形式部署項(xiàng)目鳄逾。

2.3提供一個(gè)starter POMs來簡化Maven配置

例如引入spring-boot-starter-web時(shí)會自動引入

image.png

spring-boot-starter-parent是一個(gè)特殊Start,它用來提供相關(guān)的Maven依賴項(xiàng)灵莲,使用它之后雕凹,常用的包依賴可以省去version標(biāo)簽。

2.4自動配置****Spring

Spring Boot會根據(jù)在類路徑中的jar包政冻,類枚抵,為jar包里的類自動配置Bean,這樣會極大減少我們要使用的配置明场。當(dāng)然SpringBoot只考慮了大部分開發(fā)場景汽摹,并不是所有的場景,如果在實(shí)際的開發(fā)中我們需要自動配置Bean苦锨,而Spring Boot不能滿足逼泣,則可以自定義自動配置。

2.5準(zhǔn)生產(chǎn)的應(yīng)用監(jiān)控

Spring Boot提供基于http舟舒,ssh拉庶,telnet對運(yùn)行時(shí)的項(xiàng)目進(jìn)行監(jiān)控。

2.6無代碼生成和****xml****配置

Spring Boot大量使用spring4.x提供的注解新特性來實(shí)現(xiàn)無代碼生成和xml配置秃励。 spring4.x提倡使用Java配置和注解配置組合砍的,而Spring Boot不需要任何xml配置即可實(shí)現(xiàn)spring的所有配置。

綜上我們可以得出:Spring Boot讓開發(fā)變得簡單莺治,讓部署變得簡單廓鞠,讓監(jiān)控變得簡單帚稠,讓配置變得更簡單。

3.快速入門

Spring Boot 2.1.6.RELEASE需要Java 8床佳,并且與Java 11兼容(包括在內(nèi))滋早。

還需要Spring Framework 5.1.8.RELEASE或更高版本。

3.1第一個(gè) Spring Boot 項(xiàng)目

創(chuàng)建項(xiàng)目

image.png
image.png

編寫 pom.xml

根據(jù)官網(wǎng) Spring Boot 文檔提示從 spring-boot-starter-parent 項(xiàng)目繼承并向一個(gè)或多個(gè) Starters 聲明依賴項(xiàng)砌们。Spring starter 是 Spring Boot 的核心杆麸,可以理解為一個(gè)可拔插式的插件,例如浪感,你想使用Reids插件昔头,那么可以使用 spring-boot-starter-redis;如果想使用MongoDB影兽,可以使用 spring-boot-starter-data-mongodb揭斧。

<!--引入springboot的父類依賴-->
 <!-- 繼承 springboot parent -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.7.RELEASE</version>
  </parent>
  <!-- web 組件 -->
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>

HelloWorld

編寫HelloWorldController.java

/**
 * 第一個(gè)springboot項(xiàng)目
 */
//該注解表示,該類下每個(gè)方法返回JSON數(shù)據(jù)
@RestController
// 表示所掃描到的服務(wù)
@EnableAutoConfiguration
public class HelloWorldController {

    @RequestMapping("/hello")
    public String hello(){
        return "Hello World!";
    }

    @RequestMapping("/getMap")
    public  Map<String,String> getMap(){
        Map<String,String> map =new HashMap<>();
        map.put("code","200");
        map.put("message","success");
        return  map;
    }

    public static void main(String[] args) {
        SpringApplication.run(HelloWorldController.class,args);
    }

}


結(jié)果如下

image.png

3.2Spring Boot 第二種啟動方式

項(xiàng)目中肯定不止一個(gè) Controller,我們當(dāng)然希望項(xiàng)目啟動時(shí)將所有的 Controller 全部加載進(jìn)來峻堰,這種情況又該如何配置呢讹开?比如此時(shí)有兩個(gè) Controller,都需要被執(zhí)行捐名。

HelloWorldController.java

/**
 * 第一個(gè)springboot項(xiàng)目
 */
//該注解表示,該類下每個(gè)方法返回JSON數(shù)據(jù)
@RestController
public class HelloWorldController {

    @RequestMapping("/hello")
    public String hello(){
        return "Hello World!";
    }

    @RequestMapping("/getMap")
    public  Map<String,String> getMap(){
        Map<String,String> map =new HashMap<>();
        map.put("code","200");
        map.put("message","success");
        return  map;
    }


}

另外一個(gè)IndexController.java

/**
 * 有兩個(gè)controller
 */
@RestController
public class IndexController {
    @RequestMapping("/index")
    public String index(){
        return "index";
    }
}

App.java配置掃描指定包下的服務(wù)

**
 * 啟動類
 * 通過掃描指定包下的服務(wù)來同時(shí)啟動多個(gè)服務(wù)
 */
// 掃描指定包下的服務(wù)
@ComponentScan("com.shsxt.controller")
// 表示所掃描到的服務(wù)
@EnableAutoConfiguration
public class App {
    // 項(xiàng)目中不需要有多個(gè) main 方法只需要有一個(gè)入口就可以了
    public static void main(String[] args) {
// 主函數(shù)運(yùn)行 springboot 項(xiàng)目
        SpringApplication.run(App.class, args);
    }
}

刪除其他服務(wù)的主函數(shù) main()旦万,只保留一個(gè)即可 并且刪除其他服務(wù)的 @EnableAutoConfiguration 注解,只在主函數(shù)服務(wù)中添加镶蹋。

通過 @ComponentScan 注解掃描你需要的服務(wù)成艘。

弊端:當(dāng)包越來越多時(shí),注解上需要添加的配置也越來越多.

啟動 App.java,其他兩個(gè)服務(wù)也可以訪問到了贺归。

3.3Spring Boot 第三種啟動方式

開發(fā)中狰腌,我們經(jīng)常使用以下3個(gè)注解注解 main 類。

分別是 @Configuration 牧氮, @EnableAutoConfiguration 琼腔, @ComponentScan 。由于這些注解一般都是一起使用踱葛,Spring Boot 便提供了一個(gè)統(tǒng)一的注解 @SpringBootApplication 丹莲。

需要注意的是: @SpringBootApplication 只能掃描同級包下

不同包下的可以使用 @SpringBootApplication 結(jié)合 @EnableAutoConfiguration 尸诽, @ComponentScan 掃描注入甥材。

其中 @ComponentScan 很有用,可以通過該注解指定掃描某些包下包含如下注解的 Beans:

@Component 性含, @Service 洲赵, @Repository , @Controller , @Entity 等等均自動注冊為 SpringBeans叠萍。


App.java

/**
 * 啟動類
 * Spring Boot 便提供了一個(gè)統(tǒng)一的注解 @SpringBootApplication
 */
//該注解只掃描同包下的服務(wù)
@SpringBootApplication
public class App {
    // 項(xiàng)目中不需要有多個(gè) main 方法只需要有一個(gè)入口就可以了
    public static void main(String[] args) {
// 主函數(shù)運(yùn)行 springboot 項(xiàng)目
        SpringApplication.run(App.class, args);
    }
}

Spring Boot整合Web開發(fā)

這一節(jié)我們主要學(xué)習(xí)如何整合Web相關(guān)技術(shù):

  • Servlet
  • Filter
  • Listener
  • 靜態(tài)資源
  • 文件上傳

創(chuàng)建jar項(xiàng)目芝发,編寫pom.xml

<!-- 引入springboot父類依賴 -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.7.RELEASE</version>
  </parent>

  <dependencies>
    <!-- springboot-web 組件 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>
1.整合****Servlet

方法一

通過注解掃描完成 Servlet 組件的注冊

編寫FirstServlet.java

/**
 * springboot整合web
 */
@WebServlet(name="FirstServlet",urlPatterns = "/first")
public class FirstServlet extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("FirstServlet...");

    }
}

啟動類App.java

/**
 * 啟動類
 */
@SpringBootApplication
// 在 SpringBoot 啟動時(shí)會掃描 @WebServlet,并將該類實(shí)例化
@ServletComponentScan
public class App {
    public static void main(String[] args) {

        SpringApplication.run(App.class);
    }

}

測試結(jié)果:

image.png

方法二

通過方法完成 Servlet 組件的注冊

編寫SecondServlet.java

**
 * 通過方法完成 Servlet 組件的注冊
 * bean注解
 */
@WebServlet(name = "SecondServlet", urlPatterns = {"/second"})
public class SecondServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("secondservlet----");
    }
}

啟動類App.java

/**
 * 啟動類
 * 通過bean注解注冊web
 */
@SpringBootApplication
public class App {
    public static void main(String[] args) {

        SpringApplication.run(App.class);
    }


    // 通過方法完成 Servlet 組件的注冊
    @Bean
    public ServletRegistrationBean getServletRegistrationBean() {

        ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet());

        bean.addUrlMappings("/second");

        return bean;

    }

}
2.整合****Filter

Filter 過濾器能夠?qū)δ繕?biāo)資源的請求和響應(yīng)進(jìn)行截取苛谷。在服務(wù)器作出響應(yīng)前辅鲸,可以在攔截后修改 request 和response。

方法一

通過注解掃描完成 Filter 組件的注冊

編寫FirstFilter.java

/**
 *通過注解掃描完成 Filter 組件的注冊
 * 攔截web的第一個(gè)請求,
 */
@WebFilter(filterName = "FirstFilter",urlPatterns = "/first")
public class FirstFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
       System.out.println("First Fileter begin----");
       filterChain.doFilter(servletRequest,servletResponse);
       System.out.println("First Fileter end----");
    }

    @Override
    public void destroy() {

    }
}

啟動類App.java

/**
 * 啟動類
 * 通過bean注解注冊web
 */
@SpringBootApplication
@ServletComponentScan
public class App {
    public static void main(String[] args) {

        SpringApplication.run(App.class);
    }

測試結(jié)果

image.png

方法二

通過方法完成 Filter 組件的注冊

編寫SecondFilter.java

/**
 * 通過方法完成 Filter 組件的注冊
 */
@WebFilter(filterName = "SecondFilter",urlPatterns = "/second")
public class SecondFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Second Fileter begin----");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("Second Fileter end----");
    }

    @Override
    public void destroy() {

    }
}

啟動類App.java

/**
 * 啟動類
 * 通過bean注解注冊filter
 */
@SpringBootApplication
public class App {
    public static void main(String[] args) {

        SpringApplication.run(App.class);
    }

    // 通過方法完成 Servlet 組件的注冊
    @Bean
    public ServletRegistrationBean getServletRegistrationBean() {

        ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet());

        bean.addUrlMappings("/second");

        return bean;
    }
    
    // 通過方法完成 Filter 組件的注冊
    @Bean
    public FilterRegistrationBean getFilterRegistrationBean() {
        FilterRegistrationBean bean = new FilterRegistrationBean(new SecondFilter());
        bean.addUrlPatterns("/second");
        return bean;
    }

}
3整合****Listener

Servlet 的監(jiān)聽器 Listener腹殿,它是實(shí)現(xiàn)了 javax.servlet.ServletContextListener 接口的服務(wù)器端程序独悴,它也是隨web應(yīng)用的啟動而啟動,只初始化一次锣尉,隨web應(yīng)用的停止而銷毀刻炒。主要作用是: 做一些初始化的內(nèi)容添加工作、設(shè)置一些基本的內(nèi)容自沧、比如一些參數(shù)或者是一些固定的對象等等坟奥。

方法一

通過注解掃描完成 Listener 組件的注冊

編寫FirstListener.java

@WebListener
public class FirstListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("FirstListener Init");
    }

}

啟動類App.java

@SpringBootApplication
@ServletComponentScan
public class App {
    public static void main(String[] args) {

        SpringApplication.run(App.class);
    }

方法二

通過方法完成 Listener 組件注冊

編寫SecondListener.java

@WebListener
public class SecondListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("SecondListener Init");
    }

}

啟動類App.java

/**
 * 啟動類
 * 通過bean注解注冊listener
 */
@SpringBootApplication
@ServletComponentScan
public class App {
    public static void main(String[] args) {

        SpringApplication.run(App.class);
    }


    // 通過方法完成 Listener 組件注冊
    @Bean
    public ServletListenerRegistrationBean<SecondListener>
    getServletListenerRegistrationBean() {
        return new ServletListenerRegistrationBean(new SecondListener());
    }

4訪問靜態(tài)資源

static****目錄

在我們開發(fā)web應(yīng)用的時(shí)候,需要引用大量的js暂幼、css筏勒、圖片等靜態(tài)資源移迫。

Spring Boot 默認(rèn)提供靜態(tài)資源目錄位置需要置于 classpath 下旺嬉,目錄名需符合如下規(guī)則:

/static

/public

/resources

/META-INF/resources

比如:

啟動項(xiàng)目后,位于 static 下的資源直接訪問厨埋,路徑里無需添加 /static 如果 /static 下還有文件夾需要添加對應(yīng)路徑訪問

image.png

訪問:http://localhost:8080/spring-boot.svg

image.png

demo.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>資源訪問</title>
</head>
<body>
    <p>資源訪問</p>
    <img src="images/abc.png">
</body>
</html>

訪問:http://localhost:8080/demo.html

即可查看圖片資源

ServletContext****目錄

在 src/main/webapp 下邪媳,目錄名稱必須是 webapp

[圖片上傳失敗...(image-1bc372-1566496472491)]

demo.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>資源訪問</title>
</head>
<body>
<p>資源訪問</p>
<img src="../images/spring-boot.svg">
</body>
</html>

訪問:http://localhost:8080/html/demo.html

5.文件上傳
image.png

編寫文件上傳controller層FileUploadController.java

/**
 * 文件上傳
 */
@RestController
public class FileUploadController {
    @RequestMapping("/fileUpload")
    public Map<String,String> fileUpload(MultipartFile fileName) throws IOException {
       System.out.println("文件名:"+fileName.getOriginalFilename());
       //轉(zhuǎn)存至本地
        fileName.transferTo(new File("E://"+fileName.getOriginalFilename()));
        Map<String,String> map =new HashMap<>();
        map.put("code","200");
        map.put("message","success");
        return  map;

    }
}

前臺頁面webapp/fileUpload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上傳</title>
</head>
<body>
    <form action="fileUpload" method="post" enctype="multipart/form-data">
        文件:<input type="file" name="fileName"/>
        <input value="上傳" type="submit"/>
    </form>
</body>
</html>

啟動類App.java,檢測前臺上傳圖片,能否上傳至指定路徑.

@SpringBootApplication
@ServletComponentScan
public class App {
    public static void main(String[] args) {

        SpringApplication.run(App.class);
    }

image.png

設(shè)置上傳文件大小的默認(rèn)值

Spring 限制了文件上傳的大小值,默認(rèn)是10MB荡陷,需要通過配置文件設(shè)置雨效,

在 resources 根目錄下添加一個(gè) Spring Boot 的配置文件 application.properties。

image.png

配置resources/application.properties

1   # 設(shè)置單個(gè)上傳文件的大小

2   spring.servlet.multipart.max-file-size=200MB

3   # 設(shè)置一次請求上傳文件的總?cè)萘?
4   spring.servlet.multipart.max-request-size=200MB

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末废赞,一起剝皮案震驚了整個(gè)濱河市徽龟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唉地,老刑警劉巖据悔,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耘沼,居然都是意外死亡极颓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門群嗤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菠隆,“玉大人,你說我怎么就攤上這事『Ь叮” “怎么了躯肌?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長既峡。 經(jīng)常有香客問我羡榴,道長,這世上最難降的妖魔是什么运敢? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任校仑,我火速辦了婚禮,結(jié)果婚禮上传惠,老公的妹妹穿的比我還像新娘迄沫。我一直安慰自己,他們只是感情好卦方,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布羊瘩。 她就那樣靜靜地躺著,像睡著了一般盼砍。 火紅的嫁衣襯著肌膚如雪尘吗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天浇坐,我揣著相機(jī)與錄音睬捶,去河邊找鬼。 笑死近刘,一個(gè)胖子當(dāng)著我的面吹牛擒贸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播觉渴,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼介劫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了案淋?” 一聲冷哼從身側(cè)響起座韵,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踢京,沒想到半個(gè)月后誉碴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漱挚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年翔烁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旨涝。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹬屹,死狀恐怖侣背,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慨默,我是刑警寧澤贩耐,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站厦取,受9級特大地震影響潮太,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虾攻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一铡买、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霎箍,春花似錦奇钞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顶别,卻和暖如春谷徙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背驯绎。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工完慧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人条篷。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓骗随,卻偏偏與公主長得像蛤织,于是被迫代替她去往敵國和親赴叹。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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