全靠这套大厂Java面试题目指南,让我成功斩获 25*16 薪资的offer

Hello,今天给各位童鞋们分享JavaWeb,赶紧拿出小本子记下来吧!

Java web

web编程基础

服务器

请问JAVA应用服务器都有哪些?

从功能上看分为两种:web应用服务器和java EE服务器

web服务器

Tomcat、Jetty、Orion、Resin、 Bejy Tiger、Geronimo、Jonas、Jrun

java EE 服务器

TongWeb 、BES Application Server 、 Apusic Application Server 、 IBM Websphere 、Sun Application Server 、Oracle 的 Oracle9i/AS 、Sun Java System Application Server 、Bea Weblogic 、JBoss、开源GlassFish。

JAVA 调试

请问在什么情况下会使用assert?

作用:用于检查一个boolean表达式是否正确

如果一个程序要保证其正确性,就必须使此表达式的返回值为true,返回false,则此程序有误

应用场景:通过在开发和测试中开启,在软件发布后是关闭的

tomcat

限流的几种方法:计数器,滑动窗口、漏桶法、令牌桶

请问如何在链接里不输入项目名称的情况下启动项目?

配置虚拟路径

此处的WEB-INF可以直接粘贴tomcat中的webapps/root/WEB-INF

配置完以后重启tomcat即可访问到

JSP

请说明一下JSP中的静态包含和动态包含的有哪些区别?

请求方式不同

   静态包含页面:<%@include file="static.jsp" %>

   动态包含页面 <jsp:include page="dynamic.jsp"/>

编译过程不同

静态包含:包含页面以及被(静态)包含的页面只能拥有一个head,body等,且遵循先包含再编译,即只会生成一个class文件

动态包含:被(动态)包含的页面遵循先编译后包含,则会生成不同的.java文件

对于JSP文件首先会通过WEB服务器生成index_jsp.java(servlet文件)再经过编译生成index.class文件

request

静态包含:包含页面不能向被包含的页面传参,因为两个页面会合成一个页面进行编译,就没有了我们所谓再传参的页面,使用的是同一个request对象

动态包含:包含页面能向被包含的页面传参,因为被包含的页面是是执行到这个语句时才会加载的,且会生成不同的class文件,既然包含页面可以向被包含的页面传参,那么两个页面的参数个数是不一样的的,所以它们有各自的request对象,因此使用的是不同的request对象

注意事项

静态包含:因为是先包含再编译,因此页面的 <%@page contentType=“text/html;charset=utf-8”%> 应该保持一致,否则包含整合以后的页面会报错,尽量不用出现一样的语句否则会进行覆盖

请谈一谈JSP有哪些内置对象?以及这些对象的作用分别是什么?

request:用户对服务器的请求,通过post/get请求并传递参数

response:封装服务器对客户端的响应

session:会话对象,从第一个请求开始,到页面的关闭结束,当刷新浏览器时,此对象不会发生变化,可以看作是一次全局的,不管哪个页面都可访问,多页面共享

page:当前jsp页面自身,相当于this,即对应的servlet类的对象

pageContext:当前页面的上下文,可以获取此页面的内容

application:可以存放全局共享的变量,从服务器开启一直到服务器关闭结束,可以看作是多客户端共享的

exception:当前页面发生异常时,会有此对象,<%@page isErrorPage=“true” %>,JSP中的exception对象才有效。

config:web的配置对象,取得再web.xml中的初始化参数

out:向客户端输出信息的流对象

请说明一下jsp有哪些动作? 这些动作的作用又分别是什么?

jsp:include:动态包含页面

jsp:useBean:创建一个Bean对象

jsp:setproperty:给Bean对象中的属性赋值

jsp:getProperty:获取Bean对象属性中的值

jsp:forward:请求转发

jsp:plugin:根据浏览器的类型为Java插件生成OBJECT或EMBED标记

请简要说明一下四种会话跟踪技术分别是什么?

为什么要使用会话跟踪技术?因为服务端和客户端是通过http传输的,http是“无状态”的,一次响应完之后会断开,需要再次请求,因此需要判断是否为同一用户

重写URL:其原理是将session的id信息重写到url中

表单隐藏域:会话会将id添加到表单中,用户不会看到,存在于源码中

cookie:客户请求时可以将信息发送给服务器

  cookie存在于客户端,不是很安全,会被解析

  每个cookie限制4kb,且数量为200之内

session:每个用户都有各自的session

session存在于服务端,当创建一个session时,其id会随着cookie传送到用户端,当每次用户请求的时候会将sessionId传送到服务端识别不同的用户

当访问量多的时候,使用session服务器的性能会下降

请简要说明一下JSP和Servlet有哪些相同点和不同点?另外他们之间的联系又是什么呢?

JSP

本质还是Servlet

可以实现html和Java相结合

JSP会被编译成Servlet,Servlet再负责用户的请求

Servlet

由web容器加载和管理

是Java应用程序

用于生成动态web内容

负责处理客户端请求

其实Jsp本质上还是Servlet(index_jsp.java),只是相比较Servlet更加视图化,而Servlet更偏向逻辑控制,其实显示用户请求以及响应的业务本质还是有Servlet实现的

EL

请说一下表达式语言(EL)的隐式对象以及该对象的作用

用于读取jsp内置对象的(pageScope、requestScope、sessionScope、applicationScope)分别对应page、request、session、application对象

${requestScope.username}获取request中的username

与输入有关的(param、paramValues),可以获得用户请求的参数

${param.name}

与cookie有关的

${cookie.username.value}获取cookie中username的值

读取请求头的数据header和headerValues

${header[“User-Agent”]}

读取web.xml中的参数值initParam

用于获取与其他用户有关的页面或者要求pageContext

${pageContext.request.contextPath} 获取web application名称

Request

请详细说明一下Request对象的主要方法是什么?

getParameter():获取前端传来的参数

getAttribute(String name):返回name指定的属性值

serAttribute(String name,Object o):设置name指定的属性值

getCookies():获取cookie

getSession():获取session

getInputStream():获取输入流

JAVA对象

请说明一下JSP的内置对象以及该对象的使用方法。

page

request

getParameter():获取前端传来的参数

getAttribute(String name):返回name指定的属性值

serAttribute(String name,Object o):设置name指定的属性值

getCookies():获取cookie

getSession():获取session

getInputStream():获取输入流

foward:请求转发

  3.response

sendRedirect():重定向

addCookies():添加cookie

  4.session

  5.application

  6.pageContext

  7.config

  8.exception

  9.out

xml文件

请说明一下web.xml文件中可以配置哪些内容?

配置DispatcherServlet

<servlet>

   <servlet-name>dispatcher</servlet-name>

   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

       <init-param>

           <param-name>contextConfigLocation</param-name>        

           <param-value>classpath:applicationContext.xml</param-value>    

       </init-param>    

       <load-on-startup>1</load-on-startup>

   </servlet>

   <servlet-mapping>

       <servlet-name>dispatcher</servlet-name>

       <url-pattern>/</url-pattern>

   </servlet-mapping><!--不过滤静态资源  相当于 <mvc:default-servlet-handler/> -->

   <servlet-mapping>

       <servlet-name>default</servlet-name>    

       <url-pattern>*.png</url-pattern>

   </servlet-mapping>

  2.过滤器

<!--    过滤乱码-->    

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>        

<init-param>

<param-name>encoding</param-name>

<param-value>utf-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

  3.session超时时间

<!--    session超时30分钟-->    

<session-config>

        <session-timeout>30</session-timeout>

</session-config>

监听器

请谈谈你对Javaweb开发中的监听器的理解?

Javaweb中的监听器主要针对于application、session、request三个对象

application

ServletContextListener:对Servlet上下文的创建和销毁进行监听

ServletContextAttributeListener:对Servlet上下文中的属性的添加,删除和修改进行监听

session

HttpSessionListener:对Session的创建和销毁进行监听

HttpSessionAttributeListener:对Session中的属性的添加,删除和修改进行监听

request

ServletRequestListener:对Request的创建和销毁进行监听

ServletRequestAttributeListener:对Request中的属性的添加,删除和修改进行监听

过滤器

请问过滤器有哪些作用?以及过滤器的用法又是什么呢?

对请求和响应进行拦截,并且按照要求进行过滤,在发送给下一个过滤器或者servlet

过滤乱码

对位登录的请求进行过滤(控制访问权限)

敏感字符过滤

补充

过滤器和拦截器的区别

过滤器依赖于servlet,拦截器不依赖于servlet

过滤器是回调函数,拦截器是通过Java的反射机制

过滤器只在容器初始化的时候init一次【几乎对所有请求起作用】,而拦截器可以在action请求的生命周期中多次初始化【只对action请求起作用】

拦截器可以通过IOC容器获取各个Bean,而过滤器不行,还可以将service注入,调用业务逻辑

触发时机

过滤器是请求进入容器之后在请求进入servlet之前进行预处理,请求结束也是在servlet处理完之后在容器处理完之前

所以过滤器过滤的请求参数是doFilter(ServletRequest request, ServletResponse response, FilterChain chain),而不是HttpServletRequest,因为是在HttpServlet之前请求的

chain.doFilter(request, response);此方法是分水岭在Servlet的doService()中

(prehandler()和afterCompletion()是拦截器中的方法)

prehandler()—>do.chain()—>afterCompletion() prehandler()–[可以操控Controller的ModelAndView内容]–>return ModelAndView

SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的

拦截器是spring容器的,是spring支持的

总结:拦截器功在对请求权限鉴定方面确实很有用处,在我所参与的这个项目之中,第三方的远程调用每个请求都需要参与鉴定,所以这样做非常方便,而且他是很独立的逻辑,这样做让业务逻辑代码很干净。和框架的其他功能一样,原理很简单,使用起来也很简单,大致看了下SpringMVC这一部分的源码,其实还是比较容易理解的。

我们项目中仅仅用到了preHandle这个方法,而未用其他的,框架提供了一个已经实现了拦截器接口的适配器类HandlerInterceptorAdapter,继承这个类然后重写一下需要用到的方法就行了,可以少几行代码,这种方式Java中很多地方都有体现。

web编程进阶(一)

初始化

请问使用Servlet如何获取用户配置的初始化参数以及服务器上下文参数?

重写Servlet中的init(),getInitParameter()获取初始化参数

getServletContext()获取上下文对象,getInitParameter()获取上下文参数

servlet

请问使用Servlet如何获取用户提交的查询参数以及表单数据?

getParameter()

getParameterValues()

getParameterMap()

服务器收到用户提交的表单数据,请问调用了以下方法中的哪一个方法?第一个是Servlet中的doGet()方法,第二个Servlet中的是doPost()方法

根据我们提交表单的method,如果是post,则会调用doPost(),如果是get,则会调用doGet()

请说明一下Servlet 3中的异步处理指的是什么?

因为在没有异步处理的时候,当用户端发送请求时,由servlet接受请求,经过对一些信息的预处理,开始调用接口执行业务逻辑,但此时的servlet是处于阻塞状态的,导致在高并发的情况下,性能低下,如果此时有了异步请求,在servlet阻塞的时候,会有一个子线程去执行其他任务,会将结果信息返回或者发送给其他servlet,此时不会降低性能

说说Servlet接口中有哪些方法?

void init(ServletConfig var1) throws ServletException;

Servlet初始化

ServletConfig getServletConfig();

获取Servlet的配置

void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

service(),会调用doGet()和doPost()

String getServletInfo();

void destroy();

销毁

补充

什么时候实例化Servlet:

Servlet只初始化一次,即所谓的单例模式

如果设置loan-on-startup为1,则是在web容器加载的时候实例化

如果没有设置,则是在第一次请求servlet的时候实例化

阐述一下阐述Servlet和CGI的区别?

Servlet创建之后就不会销毁,每次使用会调用Servlet的一个线程,且不会销毁;但是CGI(公共网关接口)每次调用的是一个进程,而且调用完毕后会销毁,导致开销很大

在Servlet执行的过程中,一般实现哪几个方法?

首先在容器加载时可能会创建Servlet对象或者第一次请求时,调用init();每次的请求【doPost、doGet】都会调用service(),当容器关闭时会销毁servlet,调用destroy()。对于getServletConfig()会获取Servlet的上下文或者返回ServletConfig对象;对于getServletInfo()会获取一些信息,比如作者、版权…

请说出Servlet的生命周期是什么样的?并且请分析一下Servlet和CGI的区别。

在第一次请求的时候调用init(),会将初始化的Servlet对象保存在内存中,在以后的每次请求中(doPost()、doGet())都会调用service(),当容器关闭时,会调用destroy(),当Servlet对象实例化时,其有关配置的初始化参数会保存在容器中,可以通过getServletConfig()获取,对于getServletInfo()可以获取有关作者,出版社等信息

对于Servlet而言,其只有创建一次,以后都会直接调用,但是对于CGI而言,每次请求都会创建一个,会不停的创建销毁,开销比较大

补充

为什么需要Servlet,因为传统的方式web容器和客户端之间只能以静态页面进行交互,因为两者是通过Http协议进行信息的传输,想要使用动态页面进行交互就要通过Servlet的支持,什么是Servlet,可以简单的理解为是一种运行于服务端的程序,狭义的理解为是Servlet接口,广义的理解为是实现Servlet接口的任何实现类,下面以图的形式展现Servlet的作用

请回答一下servlet的生命周期是什么。servlet是否为单例以及原因是什么?

在第一次请求的时候调用init(),会将初始化的Servlet对象保存在内存中,在以后的每次请求中(doPost()、doGet())都会调用service(),当容器关闭时,会调用destroy(),当Servlet对象实例化时,其有关配置的初始化参数会保存在容器中,可以通过getServletConfig()获取,对于getServletInfo()可以获取有关作者,出版社等信息

是单例模式

因为servlet是在容器加载或者第一次请求的时候初始化,直到容器关闭时才会销毁

请简要说明一下forward与redirect区别,并且说一下你知道的状态码都有哪些?以及redirect的状态码又是多少?

forward:请求转发,此时的地址栏不会改变,可以共享request里面的数据,效率高

redirect:重定向,此时的地址栏会发生改变,不能共享request里面的数据,效率低

200:正确

302:重定向

404:找不到资源

500:代码错误

文件传输

请问如何在基于Java的Web项目中实现文件上传和下载?

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html>  

<head>   

<title>$Title$</title>  

</head>  

<body>  

 <form method="post" action="uploadServlet" enctype="multipart/form-data">   

选择文件: <input type="file" name="fileUp">    

<input type="submit" value="上传">  

</form>  ${hint} 

</body>

</html>

@MultipartConfig@WebServlet("/uploadServlet")public class uploadServlet extends HttpServlet {    

@Override    

protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {        

Part picture = request.getPart("picture");        

if (picture != null && picture.getSubmittedFileName().length() > 0) {            

String realPath = request.getServletContext().getRealPath("/upload");           

picture.write(realPath + "/" + picture.getSubmittedFileName());           

request.setAttribute("hint", "success");        

}else {           

request.setAttribute("hint", "failure");            }       

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

}

}

web编程进阶(二)

对象

谈一下,什么是DAO模式?

dao模式可以理解为底层模式,是持久层,是与数据库进行交互的,可以通过sql语句对数据库中的数据进行增删查改

MVC

说一说,MVC的各个部分都有那些技术来实现?如何实现?

Model

是模型层,可以用来创建与数据库有关的实体

View

视图层,用来作为给客户端显示的页面,同时也可以将从前端获取的数据传送到后端,进行处理

Controller

控制层,是用来作为与视图层交互的,可以获取前端传来的数据交给service处理逻辑业务,同时也可以将要显示在前端的数据传输给页面

JSP标签

谈一谈,使用标签库有什么好处?如何自定义JSP标签?

可以在jsp页面中使用Java语言

可以自定义jsp标签

具有较好的可移植性,可重用性和可维护性

自定义JSP标签

继承TagSupport类,重写doStartTag(),然后再编写.tld对自定义标签进行部署

JSTL

请说说你做过的项目中,使用过哪些JSTL标签?

jsp <c:foreach> <c:if> <c:choose> <c:when> <c:otherwise>

web编程原理

HTTP请求

说说你对get和post请求,并且说说它们之间的区别?

post和get都可以向服务器提交数据,get是获取数数据,post是提交数据

约定俗成:

get是将提交的数据通过追加在url中提交数据;post是通过body提交数据【只是约定说get通过url提交,post放在body中提交,并没有硬性要求】

get的数据是暴露的,不安全;post的数据是安全的

get的提交数据大小有限制;post没有限制

get提交数据只能是ASCII编码;post可以是任何编码类型

get可以缓存;post不会缓存

get速度快;post速度慢

补充

因为get是将自己提交的数据,追加在url中因此不需要使用content-type,但是对于post请求是将提交的数据放在了body中,因此需要通过请求头content-type来通知服务器以什么语言来解析post中的body

常用的提交方式(content-type的值):

application/x-www-form-urlencoded

multipart/form-data

application/json

text/xml

请谈一谈,get和post的区别?

约定俗成:

get是将提交的数据通过追加在url中提交数据;post是通过body提交数据【只是约定说get通过url提交,post放在body中提交,并没有硬性要求】

get的数据是暴露的,不安全;post的数据是安全的

get的提交数据大小有限制;post没有限制

get提交数据只能是ASCII编码;post可以是任何编码类型

get可以缓存;post不会缓存

get速度快;post速度慢

重定向

请谈谈,转发和重定向之间的区别?

次数

转发:请求一次

重定向:请求两次,通过发送状态码

url

转发:不会发生变化

重定向:会发生变化

request有效

转发:有效

重定向:无效

效率

转发:高效

重定向:低效

web service

请你解释一下,什么是Web Service?

就是一个可以提供一个接口给多个程序之间相互调用,实现其之间的通信,而且web Service并不关注你是使用何种语言的

请求类型

请你说明一下,如何设置请求的编码以及响应内容的类型?

request.setCharacterEncoding(“utf-8”);

response.setContentType(“application/json”);

response.setHeader(String,String);

客户端/服务器模式

请说明 BS与CS 的联系,还有区别。

区别

1.硬件环境不同

C/S 一般建立在专用的网络上

B/S 建立在广域网之上的,一般只要有操作系统和浏览器就行

2.对安全要求不同

C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜.

可以通过B/S发布部分可公开信息。B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。

3.对程序架构不同

C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.

B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使B/S更加成熟.

4.软件重用不同

C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.

B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子

5.系统维护不同

C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统

B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.

6.处理问题不同

C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统

B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.

7.用户接口不同

C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高

B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.

8.信息流不同

C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低

B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。

资源请求方式

请你说明,forward 和redirect的区别?

url

forward :不发生变化

redirect:发生变化

次数

forward :请求一次

redirect:请求两次

效率

forward :较高

redirect:较低

request

forward :有效

redirect:失效

web访问

请你说说,cookie 和 session的区别?

cookie是从服务端发出,保存在客户端的;session是保存在服务端的

cookie是不安全的可以被解析

cookie不能超过4M,并且不能多于200个

session放在服务端,当数量过多会影响服务器的性能

好啦,今天的文章就到这里,希望能帮助到屏幕前迷茫的你们!

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

推荐阅读更多精彩内容