四、requet&response

一.request和response的介绍

1. request和response的作用

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了.


request和response.png

2. request和response的体系结构

javax.servlet.Servlet接口中的service方法
public abstract void service(ServletRequest req, ServletResponse res)
javax.servlet.GenericServlet类中的service方法
public abstract void service(ServletRequest req, ServletResponse res)
javax.servlet.http.HttpServlet类中的service方法
在这个类中对service方法进行了重载
public void service(ServletRequest req, ServletResponse res)
protected void service(HttpServletRequest req, HttpServletResponse resp)

request和response的体系结构.png

二.response

1. response常用api简单介绍

response常用api简单介绍.png

2. response操作响应行

在http响应行中,包括协议,版本号,以及有一个很重要的值,它叫做响应状态码.响应行中我们主要就是操作这些状态码,它可以有五种类型取值:


response操作响应行.png
  • 常用状态码
    200请求成功(其后是对GET和POST请求的应答文档。)
    302所请求的页面已经临时转移至新的url。
    304未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
    404没有找到文件或目录。
    405请求中指定的方法不被允许
    500请求未完成。服务器遇到不可预知的情况

  • HttpServletResponse操作状态码API
    void setStatus(int sc,String sm) 设置状态代码
    void sendError(int sc) throws IOException设置错误状态码
    void sendError(int sc,String msg) throws IOException设置错误状态码及信息

3. response操作响应头

http响应头的格式是 name:value的格式,如果有多个value值,以”,”分开,
例如:
Content-Encoding: gzip
Content-Length: 123
Content-Language: zh-cn
Content-Type: text/html; charset=GB2312
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT

  • HttpServletResponse操作响应头 API

    public void setHeader(String name,String value)
    用给定名称和值设置响应头。如果已经设置了头,则新值将重写以前的值

    public void addHeader(String name, String value)
    用给定名称和值添加响应头。此方法允许响应头有多个值

    public void setIntHeader(String name, int value)
    用给定名称和整数值设置响应头。如果已经设置了头,则新值将重写以前的值。

    public void addIntHeader(String name, int value)
    用给定名称和整数值添加响应头。此方法允许响应头有多个值。

    public void setDateHeader(String name, long date)
    用给定名称和日期值设置响应头。该日期根据距历元时间的毫秒数指定。如果已经设置了头,则新值将重写以前的值。

    public void addDateHeader(String name, long date)
    用给定名称和日期值添加响应头。该日期根据距历元时间的毫秒数指定。此方法允许响应头有多个值。

案例1:重定向

重定向.png

实现:
//1.设置状态码
response.setStatus(302);
//2.设置相应头--跳转目录
response.setHeader(“location”,”http://localhost/day09/second”);
//response.setHeader(“location”,”day09/second”);

开发中我们使用sendRedirect(url);
例如:response.sendRedirect(“day09/second”);

案例2:定时跳转
在servlet中,我们通过response.setHeader(“refresh”,”3,url=http://localhost/day09/demo2.html”);
response.setHeader("refresh", "3;url=/day09/demo2.html");
在页面中,我们可以通过
<meta http-equiv="refresh" content="5;url=http://localhost/day09/responseDemo3">
页面中通过<meta http-equiv=””>方式操作时,也会将标签内容写入到http响应中。

4. response操作响应体

http响应正文是我们最终在浏览器上看到的结果。
对于HttpServletResponse如果想要操作响应正文,需要通过response对象获取到输出流,将信息写回到浏览器端.

获得向客户端进行数据输出的流对象
OutputStream out = response.getOutputStream();字节流数据输出
PrintWriter pw = response.getWriter();字符流数据输出

设置输出数据的编码格式
默认情况下,编码格式是ISO-8859-1
public void setCharacterEncoding(String charset)
设置发送到客户端的响应的字符编码
public void setContentType(String type)
设置将发送到客户端的响应的内容类型,如果该响应尚未提交。给定内容类型可能包含字符编码规范,例如 text/html;charset=UTF-8

操作响应正文注意事项

getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。

getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。

Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。

Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎tomcat将调用close方法关闭该输出流对象。调用close的时候,会调用flushBuffer方法.

5. 生成动态验证码

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/验证码
public class ImageCodeServlet extends HttpServlet {

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

        / 使用java图形界面技术绘制一张图片

        int charNum = 4;
        int width = 30 * 4;
        int height = 30;

        / 1. 创建一张内存图片
        BufferedImage bufferedImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);

        / 2.获得绘图对象
        Graphics graphics = bufferedImage.getGraphics();

        / 3、绘制背景颜色
        graphics.setColor(Color.YELLOW);
        graphics.fillRect(0, 0, width, height);

        / 4、绘制图片边框
        graphics.setColor(Color.BLUE);
        graphics.drawRect(0, 0, width - 1, height - 1);

        / 5、输出验证码内容
        graphics.setColor(Color.RED);
        graphics.setFont(new Font("宋体", Font.BOLD, 20));

        / 随机输出4个字符
        Graphics2D graphics2d = (Graphics2D) graphics;
         String s = "ABCDEFGHGKLMNPQRSTUVWXYZ23456789";
        Random random = new Random();
        /session中要用到
        String msg="";
        int x = 5;
        for (int i = 0; i < 4; i++) {
            int index = random.nextInt(32);
            String content = String.valueOf(s.charAt(index));
            msg+=content;
            double theta = random.nextInt(45) * Math.PI / 180;
            /让字体扭曲
            graphics2d.rotate(theta, x, 18);
            graphics2d.drawString(content, x, 18);
            graphics2d.rotate(-theta, x, 18);
            x += 30;
        }

        / 6、绘制干扰线
        graphics.setColor(Color.GRAY);
        for (int i = 0; i < 5; i++) {
            int x1 = random.nextInt(width);
            int x2 = random.nextInt(width);

            int y1 = random.nextInt(height);
            int y2 = random.nextInt(height);
            graphics.drawLine(x1, y1, x2, y2);
        }

        / 释放资源
        graphics.dispose();

        / 图片输出 ImageIO
        ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
    

    }

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

}

常见的汉字:
String s = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";

三.request

1. request常用api简单介绍

HttpServletRequest对象用于封装http请求,对于http请求它有三部分组成,http请求行,http请求行及请求正文,下图描述了关于封装请求信息方法


request常用api简单介绍.png

2. request操作请求行

public String getMethod()
返回用于发出此请求的 HTTP 方法的名称,例如 GET、POST
public String getRequestURI()
返回此请求的 URL 的一部分,从协议名称一直到 HTTP 请求的第一行中的查询字符串。
public String getProtocol()
以 protocol/majorVersion.minorVersion 的形式(例如 HTTP/1.1)返回请求使用的协议的名称和版本。
public String getQueryString()
返回包含在请求 URL 中路径后面的查询字符串。如果 URL 没有查询字符串,则此方法返回 null。

3. request获取客户信息

public String getContextPath()
返回请求 URI 指示请求上下文的那一部分。
public StringBuffer getRequestURL()
重新构造客户端用于发出请求的 URL。返回的 URL 包含一个协议、服务器名称、端口号、服务器路径,但是不包含查询字符串参数。
public String getRemoteAddr()
返回发送请求的客户端或最后一个代理的 Internet Protocol (IP) 地址

4. request操作请求头

public String getHeader(String name)
以 String 的形式返回指定请求头的值。
public java.util.Enumeration<E> getHeaders(String name)
以 String 对象的 Enumeration 的形式返回指定请求头的所有值。
public java.util.Enumeration<E> getHeaderNames()
返回此请求包含的所有头名称的枚举。如果该请求没有头,则此方法返回一个空枚举。
public int getIntHeader(String name)
以 int 的形式返回指定请求头的值。如果该请求没有指定名称的头,则此方法返回 -1。如果无法将头转换为整数,则此方法抛出 NumberFormatException。
public long getDateHeader(String name)
以表示 Date 对象的 long 值的形式返回指定请求头的值

5. request获取请求参数

请求参数是浏览器发送请求时携带的信息。
对于请求方式GET与POST,请求参数存在位置不同。
GET:请求参数存在于请求的资源路径中。
POST:请求参数存在于正文中

public String getParameter(String name)
以 String 形式返回请求参数的值,如果该参数不存在,则返回 null
public String[] getParameterValues(String name)
返回包含给定请求参数拥有的所有值的 String 对象数组,如果该参数不存在,则返回 null。
public java.util.Map<K, V> getParameterMap()
返回此请求的参数的 java.util.Map。请求参数是与请求一起发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发送的表单数据中。
public java.util.Enumeration<E> getParameterNames()
返回包含此请求中所包含参数的名称的 String 对象的 Enumeration。如果该请求没有参数,则此方法返回一个空的 Enumeration。

6. request获取参数中文出现乱码

原因:
汉字在不同的编码表中的码值不一样,那么在使用不同的编码表进行解码与编码操作时,就会出现乱码问题.
请求参数中如果有中文,它是以utf-8码进行了编码。
Tomcat得到请求参数是使用iso8859-1进行了解码,封装到了request中。
在通过request获取请求信息就是乱码。
解决:
使用iso8859-1进行编码
在使用utf-8进行解码
new String(username.getBytes(“iso8859-1”),”utf-8”);

如果请求方式是POST,可以直接使用request.setCharacterEncoding(“utf-8”);就可以解决。

7. request域对象的介绍

request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理.
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeNames方法

request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发,从而共享请求中的数据

8. 请求转发

请求转发可以实现路径的跳转操作.
ReqeustDispatcher dispatcher=request.getRequestDispatcher("路径")
dispatcher.forward(request,response)
请求转发和重定向的区别:
1.请求转发是服务器内部跳转,地址栏不会发生改变
重定向地址栏会发生改变。

2.请求转发,只有一次请求,一次响应.
重定向,有两次请求,两次响应。

3.请求转发存在request域,可以共享数据.
重定向不存在request域。

4.请求转发只能在服务器的内部跳转,简单说,只能访问本站内资源。
重定向可以访问站外资源,也可以访问站内资源.

5.请求转发是由request 发起的 . request.getRequestDispatcher().forward()
重定向是由response 发起的 response.sendRedirect();

6.请求转发与重定向时路径写法不一样.
重定向要跳转的路径是从浏览器在次发起的,是浏览器端路径,写法: /工程名/资源
请求转发是服务器内部跳转,这时它与浏览器无关 写法:/资源

9. 请求包含

RequestDispatcher.include()方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能
被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略.include在程序执行上效果类似forward,但是使用forward只有一个程序可以生成响应,include可以由多个程序一同生成响应 ----- 常用来页面布局

include()和forward()区别:
都表示要跳转到其他资源,不同的是,如果使用forward跳转则后面的response输出则不会执行,而用include
来跳转,则include的servlet执行完后,再返回到原来的servlet执行response的输出(如果有)。如:

servlet A
RequestDispatcher disp = request.getRequestDispatcher("B");
disp.forward(request, response);
System.out.println("servlet A completed");
PrintWriter pw = response.getWriter();
pw.println("servlet A");
servlet B
PrintWriter pw = response.getWriter();
pw.println("servlet B");

输出结果:
控制台:servlet A completed
页面:servlet B
如果将forward换成include的话,则结果为:
控制台:servlet A completed
页面:servlet B servlet A
PS:如果在servlet B里吧pw给close掉了的话,那servlet A 这里就无法输出了,则结果就和第一个一样。

四、完成用户下载功能

技术分析:

  • response处理中文乱码
    字节流:
    设置浏览器默认打开编码
    response.setHeader("Content-Type", "text/html;charset=UTF-8");
    中文转成字节数组编码
    response.getOutputStream().write("王守义".getBytes("UTF-8"));
    字符流:
    设置response的缓冲区的编码
    response.setCharacterEncoding("UTF-8");
    设置浏览器默认打开的编码.
    response.setHeader("Content-Type", "text/html;charset=UTF-8");
    response.setContentType("text/html;charset=UTF-8");相当于上面两句
  • 文件下载
    一种:超链接方式.(不推荐)
    <a href=”aa.zip”>下载</a>
    <a href=”1.jpg”>下载</a>
    二种:手动编码方式完成文件下载.
    设置两个头和一个流:
    Content-Type:文件MIME的类型.
    Content-Disposition:
    文件的输入流:

DownloadServlet核心代码:

public class DownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取下载文件的名称
        String filename = req.getParameter("name");

        //注意中文乱码:
        filename=new String(filename.getBytes("iso8859-1"),"utf-8");

        ServletContext context = this.getServletContext();
        //文件下载
        //1.设置文件的mimeType
        String mimeType = context.getMimeType(filename);
       resp.setContentType(mimeType);

        //2.设置下载的头信息
        //上午的
        //response.setHeader("content-disposition", "attchment;filename="+filename);

        //常见的浏览器将文件名称使用utf-8 不推荐 不兼容火狐
        //response.setHeader("content-disposition", "attchment;filename="+URLEncoder.encode(filename, "utf-8"));

        //方式1:通过的方式 通过工具类编码
        //String _filename=DownLoadUtils.getName(request.getHeader("user-agent"), filename);
        //response.setHeader("content-disposition", "attachment;filename="+_filename);

        //方式2:网络上的方式 (8成好使)
       resp.setHeader("content-disposition", "attachment;filename="+new String(filename.getBytes("gbk"),"iso8859-1"));
        //3.对拷流
        //获取输入流
        InputStream is = context.getResourceAsStream("/download/"+filename);

        //获取输出流
        ServletOutputStream os =resp.getOutputStream();

        /*int len=-1;
        byte[] b=new byte[1024];

        while((len=is.read(b))!=-1){
            os.write(b, 0, len);
        }*/

        IOUtils.copy(is, os);

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

推荐阅读更多精彩内容