随笔 -1(毕业前)

web.xml中配置过滤器处理中文乱码问题:

    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</parm-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>

拦截器使用场景:

  1. 解决乱码问题
  2. 解决权限验证问题

HTTP 消息结构

1. 客户端请求信息:请求行,请求头,空行,请求数据

请求方法 URL 协议版本 --请求行
头部字段名... --请求头部
--空行
--请求数据

2. 服务器端响应信息:状态行,消息报头,空行,响应正文

HTTP/1.1 200 OK --状态行
Date:...
Content-Type:...
Content-Length:... ---消息报头
--空行
<html>
...
</html> --响应正文

HTTP状态码分类

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

css中url的相对路径

  • / 表示根目录(最原始开头的那个目录);
  • ~/ 表示虚拟站点根目录;
  • ../ 表示上级目录(当前目录的上一级),相当于在当前目录按了一次后退键;
  • ../../ 表示上上级目录;
  • ./ 当前目录(当前目录下)。

背景图片平铺:

background-size:cover;

css常用块级元素:

div
form 
h1 
hr 
p 
table 
ul 

css常用内联元素

a
b
br
font 
i
img 
input 
select 
label 
span 
strong 
textarea 

垂直居中

line-height:80px;

水平居中(div中设置)

text-align:center;

去除列表前面小点

list-style:none;

Core标签库

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

JSP中page、request、session、 application的作用域

  • application:作用是保存公共信息

范围:从服务器开始执行服务,到服务器关闭为止
服务器启动到停止这段时间

  • session:主要用于保存用户的各种信息

范围:用户持续和服务器连接的时间
HTTP会话开始到结束这段时间

  • request:

范围:一个HTTP请求开始到结束这段时间

  • page:

范围:当前页面从打开到关闭这段时间
只在同一个页面中有效

* request和page的区别:

一个request可以包含多个page页

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%
    String basePath = request.getContextPath();//根路径/ssm01
%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page isELIgnored="false" %>

tcl运行命令

source ../test/test.tcl

bootstrap样式的引用

    <link rel="stylesheet" href="http://www.bootcss.com/p/layoutit/css/bootstrap-combined.min.css">
    <script src="http://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/twitter-bootstrap/3.0.3/js/bootstrap.min.js"></script>

z-index指定堆叠顺序

placeholder="默认值,占位符"

background:-webkit-gradient()背景渐变属性

clearTimeout(time);

time = setTimeout(function() {
    box.find(".cont").hide();
    box_hide();
}, 50);

session.removeAttribute("goodkind");

request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");

Date birthday=new SimpleDateFormat("yyyy-MM-dd").parse(request.getParameter("date"));

HttpSession session = request.getSession();
                session.setAttribute("user", user);

request.getParameter("username");request.getAttribute("username");的区别:

setAttribute()
getParameter()
getAttribute()

当两个web组件(比如说jsp页面)为链接关系时(比如表单提交),用request.getParameter()方法

当两个Web组件之间为转发关系时,转发目标组件通过
getAttribute()方法来和转发源组件共享request范围内的数据,此时需先在1.jsp中setAttibute(),然后在2.jsp中getAttribute()

request.setAttribute() 和 getAttribute() 方法传递的数据只会存在于Web容器内部

request.getParameter() 方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。request.getParameter()方法返回String类型的数据

转发和重定向区别:

  • 前后两个页面有数据传递 : 请求转发
  • 无数据传递 : 重定向。

分页计算总页数算法:

int totalPageNum = (totalRecord + pageSize - 1) / pageSize;

得到路径: request.getRequestURI():

得到参数: request.getQueryString() :

加载数据库配置信息

    loadConfig(){
        InputStream in = JdbcUtil.class.getResourceAsStream("/jdbc.properties");
        Properties prop = new Properties();
        prop.load(in);
        USERNAME = prop.getProperty("jdbc.username");
        PASSWORD...
    }

catch(SQLException e){
    throw new RuntIMEexception("查询数据异常",e);
}

获取url="a/aa?param1=1&param2=5..."后参数:

controller中,request.getParameter("param1");

<a href=""><img src=""></a>

文件上传下载

    <form>
        请选择图片:<input type="file" id="myfile" name="myfile"/>
    </form>

截取字符串

    String str = "e\adb\wda\wd\test.jsp"wda";
    int beginIndex = str.lastIndexOf("\\");
    int endIndex = str.lastIndexOf("\"");
    String str2 = str.substring(beginIndex,endIndex);
request.getSession().setAttribute("","");
response.sendRedirect("index.jsp");

drop table if exists a;

单例模式:

  • 饿汉模式:
        public class Singleton{
            private Singleton(){

            }
            private static Singleton instance = new Singleton();
            public static Singleton getInstance(){
                return instance;
            }

        }
  • 懒汉模式:
        public class Singleton2{
            private Singleton2(){

            }
            private static Singleton2 instance;
            public static synchronized Singleton2 getInstance(){
                if(instance==null){
                    instance = new Singleton2();
                }else{
                    return instance;
                }
                return instance;
            }
        }

懒汉模式和饿汉模式区别:

  • 懒汉模式特点是加载类时比较快,但是运行时获取对象的速度比较慢,线程不安全(加上synchronized就是线程安全的)
  • 饿汉模式的特点是加载类时比较慢,但是运行时获取对象的速度比较快,线程安全

java反射:

1.java中两种不是对象:静态成员,基本数据类型类
类是java.lang.Class的实例对象
2.Foo foo1 = new Foo();//foo1即Foo的实例对象
3.Foo又是Class的实例对象,Class的实例的表示方法:
    1)Class c1 = Foo.class;//隐含的静态成员变量class
    2)Class c2 = foo1.getClass();//已知该类对象时
    3)Class c3 = Class.forName("com.asiainfo.Foo");//全类名
    通过c1 c2 c3创建Foo的实例对象
    Foo foo = (Foo)c1.newInstance();
4.Class.forName("com.asiainfo.Foo")
    是一个动态加载类,编译时加载类是静态加载类,运行时刻加载的类是动态加载类
    new创建对象,是静态加载类,在编译的时候就需要加载所有可能使用到的类

记得设置表单method方法,默认get,后台获取不到参数,设成post即可获取参数

  • TODO
  • 注册表单验证ajax
  • 弹出层
  • 侧边栏
  • 数据库乱码
  • 文件上传
  • 图片显示

html行内元素(inline),块级元素(block)

inline:相邻行内元素排成一行,宽度随元素内容变化
       宽高无效
       margin padding水平方向有效(边距效果),竖直方向无效
block:独占一行,宽度默认填充父元素宽度
      width,height有效
      margin,padding有效
常见行内,块级元素:
    inline:a br img input label span button
    block:div form h1 hr menu p table ul

去掉下划线:

text-decoration:none;

去掉无序列表前面圆点:

list-style:none;

无序列表由纵向变为横向:

float:left;

VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是65535个字节

mysql中文乱码问题:

    1.查看默认的编码格式:
        mysql>show variables like "%char%";  
            | character_set_client | gbk |  
            | character_set_connection | gbk |  
            | character_set_database | utf8 |  
            | character_set_filesystem | binary |  
            | character_set_results | gbk |  
            | character_set_server | utf8 |  
            | character_set_system | utf8 |  
        mysql>set names utf8;
            作用:SET character_set_client='utf8';  
                 SET character_set_connection='utf8';  
                 SET character_set_results='utf8';  

    2.查看数据库的编码格式:
        mysql>show create database test;

    3.修改数据库编码格式:
        mysql>ALTER DATABASE test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;  

    4.查看创建表语句及其编码格式:
    mysql>show create table student;   

    5.修改表的编码格式:
    mysql>ALTER TABLE admin DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;   

CLIENT SECTION
        [mysql]
        default-character-set=utf8(作用跟set names utf8;一样,都是将client,connection,results字符集由Latin1转为utf8,不同的是set names utf8;仅仅对当前操作有效,重启mysql服务器恢复默认字符集Latin1)
    
    为避免乱码,建库建表时设置字符集为utf8:
        建库:
            CREATE DATABASE `test` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
        建表:
            CREATE TABLE `database_user` () ENGINE=InnoDB DEFAULT CHARSET=utf8;

    mysql>\s    mysql>status  都可以显示数据库字符集信息
    set character_set_connection = 'utf8';改变编码集

    注:*****创建数据库,表均已设置编码集为utf8时,如果还不能在cmd窗口写入中文,则检查一下cmd默认编码集,若为gbk,则应:mysql>set names gbk;此时写入的中文数据可以被cmd正确解释

判断数据库中是否存在对应用户:select count(*)...根据返回记录数确定是否存在

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%
    String basePath = request.getContextPath();//根路径
%>
<!DOCTYPE html 
PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">

mybatis 数据库利用like进行模糊查询时,要使用concat合并查询条件

select * from user where name like concat('%',#{name},'%')

注意::::**************

  • 当jsp页面向后台传递参数时可能出现乱码错误,是由于页面编码为ISO-8859-1,而后台需要接收编码为UTF-8的参数,此时直接接收就会出现乱码
  • 解决方法如下:
    String str1 = 传来的参数;
    String str2 = new String(str1.getBytes("ISO-8859-1"),"utf-8"); //转码UTF8

提示窗:alert("确认");

确认窗:confirm("确认,取消");

JSONArray obj=JSONArray.fromObject(industrys);
String jsonStr = json.toString();
return jsonStr;

$.each():

$("#myTb").remove();
$("#myTb").append(tbBody);

ServerSocket  ss = new ServerSocket(8888);
Socket s = ss.accept();
InputStream is = new InputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String info = null;
while((info=br.readLine())!=null){
    System.out.println(info);
}

window.location.reload();
window.location.href = "<%=basePath%>/user/login";

TODO:

  • 安全性:登录验证,密码加密√
  • 表格局部刷新√
  • 修改个人信息
  • 管理系统
  • 批量删除√
  • 快捷键
  • 多线程
  • XML解析
  • Json√
  • 文件上传下载√
  • 框架原理
  • JVM
  • 分页√
  • http协议
  • ajax表单验证√
  • 序列化
  • 哈希
  • 算法
  • 数据结构
  • 监听器√
  • 过滤器√
  • 拦截器√
  • 异常机制
  • 网络爬虫
  • 网络支付
  • java反射机制
  • TCP/IP

默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚。

spring aop 异常捕获原理:

  • 被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过配置来捕获特定的异常并回滚
    换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚

解决方案:

方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理

方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常(现在项目的做法)

/* select :获取下拉框选项值
 * option为获取到的点击下拉框的值
 */
var option = $("#option option:selected").val();

text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果

块阴影效果:
-webkit-box-shadow:0 0 10px #0CC;
-moz-box-shadow:0 0 10px #0CC;
box-shadow:0 0 10px #0CC;

文本阴影效果:
text-shadow: 0px 0px 5px blue;

$("#tbody").children().remove();
$("#tbody").empty();这两种方式效果相同,都可以把table清空,remove()方法直接将table的孩子节点删除,empty()方法是将table置空,并未删除节点

ajax写入表格页面拼接方法:

    success:function(data){
        /* $("#tbody").children().remove(); */
        $("#tbody").empty();/*两种方式一样*/
        $.each(data,function(i,value){
            var status = value.status== 0 ? "未支付" : "已支付";
            var element = "<tr><td>"+value.id+"</td><td>"+"![](+value.imgUrl+)"+"</td><td>"
            +value.pro_name+"</td><td>"+value.price+"</td><td>"
            +value.count+"</td><td>"+value.sum+"</td><td>"
            +value.order_time+"</td><td>"+status+"</td><td>"
            +"<a href='javascript:void(0)' onclick='deleteOneOrder("+value.id+")'>删除</a>"+"</td></tr>";
            $("#tbody").append(element);
        });
    },

css样式字体加粗:

font-weight: bold

blockUI插件

<script src="../js/jquery.js"></script>
<script src="../js/jquery.blockUI.js"></script>//插件
    $.blockUI();
    $.unblockUI();
<input type="submit" value="搜索" style="width: 50px;height: 33px;color: white;background-color: red;border:0 white solid;"/>

ModelAndView默认使用forward方式

public ModelAndView index(){
    ModelMap model = new ModelMap();
    model.addAttribute("test", "test");
    ModelAndView mv = new ModelAndView("index", model);
    mv.addObject("test2", "test2");
    return mv;
}//addAttribute()和addObject()方法都是设定model对象

<input type="hidden" value="${abc}">

HttpServletRequest request = ServletActionContext.getRequest();

js禁用鼠标滚轮滑动:

function disabledMouseWheel() {  
  if (document.addEventListener) {  
    document.addEventListener('DOMMouseScroll', scrollFunc, false);  
  }//W3C  
  window.onmousewheel = document.onmousewheel = scrollFunc;//IE/Opera/Chrome  
}  
function scrollFunc(evt) {  
  return false;  
}
  • js禁止滚动条移动:

参考博文

  • 隐藏纵向滚动条

document.body.parentNode.style.overflowY ="hidden";

  • 开启纵向滚动条

document.body.parentNode.style.overflowY ="auto";

如何向弹出层传值:

通过js事件(如点击onclik="a(x,y)")给方法传递页面参数,然后通过html()或attr()等方法向弹出窗口写入数据

cookie session学习网址:

参考博文

jQuery获取图片路径:

$("#img2").attr("src");

java中length,length(),size()区别

  • java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性.
  • java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法.
  • java中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!d

display visibility区别:

  • display:none -->元素跟着浮动,不会占据原有位置
  • visibility:hidden -->隐藏元素,但仍占据原有位置,不会浮动

加载数据库配置信息:

    InputStream is = JdbcUtil.class.getResourceAsStream("/jdbc.properties");
    Properties prop = new Properties();
    prop.load(is);
    USERNAME = prop.getProperty("jdbc.username");
    ...

input: style="width: 50px;height: 33px;color: white;background-color: red;border:0 white solid;"

show create table;

js正则表达式:

参考博文

web.xml
<?xml version="1.0" encoding="utf-8">
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee"
http://java.sum.com/xml/ns/j2ee/web-app_2_4.xsd>

灰色:#f5f5f5
蓝色:#007fff

JOptionPane类提示框的一些常用的方法:

参考博文

  • / 服务器的根目录
  • path 项目的根目录
  • url-pattern 处必须以/开头,表示项目的根目录

jQuery模态窗口!!!

过滤器(Filter)、拦截器(Interceptor)、监听器(Listener):

  • 过滤器:字符编码过滤,权限访问控制(用户登录与否),过滤敏感词汇等,主要是对HttpServletRequest,HttpServletResponse进行拦截检查
  • 监听器:application,session,request对象监听器监听客户端,服务器端请求,操作等
  • 拦截器:

session的销毁有3种情况:

  • session超时,web.xml配置:
    <session-config>
    <session-timeout>120</session-timeout>
    </session-config>
  • 手工使session失效
    public void invalidate();//使session失效方法。session.invalidate();
  • 服务器重新部署

重写equals方法:

    @Override
    public boolean equals(Object obj){
        if(obj==this){
            return true;
        }
        if(obj==null){
            return false;
        }
        if(!(obj instanceof Course)){
            return false;
        }
        Course course = (Course)obj;
        if(this.name==null){
            if(course.name==null){
                return true;
            }else{
                return false;
            }
        }else{
            if(this.name.equals(course.name)){
                return true;
            }else{
                return false;
            }
        }
    }

set需要重写hashcode方法

Bootstrap CDN
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- 新 Bootstrap 核心 CSS 文件 -->
<link href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

列偏移

col-md-offset-4

注意页面传值类型!!!

xml配置错误:

The entity name must immediately follow the '&' in the entity reference.
解决办法:将&替换成and

attempted to return null from a method with a primitive return type (int).

解决办法:解决这个问题,是当查出来为NULL时,结一个默认值,如:0。

  • mysql:
    SELECT IFNULL(MAX(SORT),0)AS sort FROM web_d_info
  • oracle:
    SELECT nvl(MAX(SORT),0) as sort FROM web_d_info

sqlJAVA
Cannot load excludes configuration file "/WEB-INF/decorators.xml" as specified in "sitemesh.xml" or "sitemesh-defaul : decorators.xml名称和位置不能放错

WEB-INF目录下jsp不能直接被外部访问,所以应使用方法访问路径

  1. 把页面资源文件只能放在webroot或WebContent下面,如 CSS,JS,image等.放在WEB-INF下直接引用不了,可以通过统一的拦截器拦截静态资源,当有请求过来时,forward至静态源。。
  2. 只能用转发方式来访问WEB-INF目录下的JSP,不用采用重定向的方式请求该目录里面的任何资源。
  3. WEB-INF目录下文件访问资源文件时,可以忽略WEB-INF这一层目录.如index.jsp 要用css目录里的一个css文件. <link rel="StyleSheet" href="../css/index.css" type="text/css" />这样就行了。
  4. WEB-INF目录下的文件之间如何访问呢.可以通过action和servlet转发跳转
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,510评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,513评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,143评论 11 349
  • (一)Struts、Spring、Hibernate、Mybatis框技术 1.Struts2.0有几种标签库 【...
    独云阅读 3,208评论 0 62
  • 01 硬汉派侦探小说 里面的情节非常紧凑,又接宕起伏,保险那块的设置巧妙得很,是最出挑的环节。 比起《双重赔偿》,...
    傅真人阅读 282评论 0 2