摘要: 1. 没有索引或者没有用到索引 数据库索引就像书籍中目录一样,使用户在访问数据库数据时,不必遍历所有数据就可以找到需要的数据。创建索引后,可以保证每行数据的唯一性,极大地提高数据检索效率,这是一中牺牲空间换取性能的方法。没有索引或者没有用到索引是数据访问速度慢最常见的因素,也是程序设计的一个缺陷所在。2. I/O吞吐量小,形成了瓶颈效应 I/O吞吐量是影响数据访问速度的客观因素(硬件因素)。在一定的硬件环境下,利用优化的部署方案可适当提高I/O吞吐量。3. 没有创建计算列导致查询不优化 计算列是一个比较特殊的列,不填写任何设计类型,用户不可以改变该列的值。计算列的值是通过一定的函数公式等以另一 阅读全文
posted @ 2011-11-18 15:42 chenchun 阅读(10212) 评论(0) 推荐(3) 编辑
摘要: 实体更新 Transactiontrans=session.beginTransaction(); Stringhql=”updateUserusersetuser.age=20whereuser.age=18”; Queryqueryupdate=session.createQuery(hql); intret=queryupdate.executeUpdate(); trans.commit();实体删除 Transactiontrans=session.beginTransaction(); Stringhql=”deletefromUseruserwhereuser.age=... 阅读全文
posted @ 2011-11-06 21:47 chenchun 阅读(1853) 评论(0) 推荐(1) 编辑
摘要: Java是一个面向对象的语言,java面向对象一般有三大特征:封装、继承、多态。封装:就是把一些属性和方法封装到一个类里。继承:就如子类继承父类的一些属性和方法。多态:就如一个父类有多个不同特色的子类。这里我就不多讲解,下面我主要说明一个继承。继承是OOP(面向对象)的一个特色,java只支持单继承(如果继承两个有同样方法的父类,那么就不知道继承到那个父类的,所以java只支持单继承)。继承是java的一个特色,我们用的所以类都继承Objict类,所以就要Object类的方法,如toString()、getClass()、wait()……所以我们建立的类都有父类。Java中一般有三种类:基本类 阅读全文
posted @ 2011-12-04 23:08 chenchun 阅读(9502) 评论(0) 推荐(0) 编辑
摘要: public class BubbleSort implements SortUtil.Sort{ public void sort(int[] data) { int temp; for(int i=0;i<data.length;i++){ for(int j=data.length-1;j>i;j--){ if(data[j]<data[j-1]){ SortUtil.swap(data,j,j-1); } } } } 阅读全文
posted @ 2011-12-04 22:58 chenchun 阅读(779) 评论(0) 推荐(0) 编辑
摘要: public class InsertSort implements SortUtil.Sort{ public void sort(int[] data) { int temp; for(int i=1;i<data.length;i++){ for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){ SortUtil.swap(data,j,j-1); } } }} 阅读全文
posted @ 2011-12-04 22:57 chenchun 阅读(456) 评论(0) 推荐(0) 编辑
摘要: 什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。常见的SQL注入式攻击过程类如: ⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码。 ⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数。下面是ASP.NET应用构造查询的一个例子: System.Text.Stri 阅读全文
posted @ 2011-12-03 00:06 chenchun 阅读(851) 评论(0) 推荐(0) 编辑
摘要: 实体查询 例子1: Hql代码 Stringhql=”fromUseruser”; Listlist=session.CreateQuery(hql).list();String hql=”from User user ”; List list=session.CreateQuery(hql).list(); 因为HQL语句与标准SQL语句相似,所以我们也可以在HQL语句中使用where字句,并且可以在where字句中使用各种表达式,比较操作符以及使用“and”,”or”连接不同的查询条件的组合。看下面的一些简单的例子: Hql代码 fromUseruserwhereuser.age=... 阅读全文
posted @ 2011-12-03 00:05 chenchun 阅读(2283) 评论(0) 推荐(1) 编辑
摘要: 继承的优缺点 优点 新的实现很容易,因为大部分是继承而来的 很容易修改和扩展已有的实现 缺点 打破了封装,因为基类向子类暴露了实现细节 白盒重用,因为基类的内部细节通常对子类是可见的 当父类的实现改变时可能要相应的对子类做出改变 不能在运行时改变由父类继承来的实现 由此可见,组合比继承具有更大的灵活性和更稳定的结构,一般情况下应该优先考虑组合。只 有当下列条件满足时才考虑使用继承: 子类是一种特殊的类型,而不只是父类的一个角色 子类的实例不需要变成另一个类的对象 子类扩展,而不是覆盖或者使父类的功能失效 阅读全文
posted @ 2011-11-29 09:37 chenchun 阅读(7618) 评论(0) 推荐(0) 编辑
摘要: 临时表 临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。 临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。 例如,如果创建了 employees 表,则任何在数据库中有使用该表的安全权限的用户都可以使用该表,除非已将其删除。如果数据库会话创建了本地临时表 #employe... 阅读全文
posted @ 2011-11-24 09:19 chenchun 阅读(677) 评论(0) 推荐(0) 编辑
摘要: 1. 数据抽象:物理抽象、概念抽象、视图级抽象,内模式、模式、外模式 2. SQL语言包括数据定义、数据操纵(Data Manipulation),数据控制(Data Control) 数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等 数据操纵:Select ,insert,update,delete, 数据控制:grant,revoke 3. SQL常用命令: CREATE TABLE Student( ID NUMBER PRIMARY KEY, NAME VARCHAR2(50) NOT NULL);//建表 CRE 阅读全文
posted @ 2011-11-24 09:17 chenchun 阅读(1941) 评论(1) 推荐(1) 编辑
摘要: 1. 创建Maven的普通java项目: mvn archetype:create -DgroupId=packageName -DartifactId=projectName 2. 创建Maven的Web项目: mvn archetype:create -DgroupId=packageName -DartifactId=webappName -DarchetypeArtifactId=maven-archetype-webapp 3. 编译源代码: mvn compile 4. 编译测试代码:mvn test-compile 5. 运行测试:mvn test 6. 产生sit... 阅读全文
posted @ 2011-11-23 09:30 chenchun 阅读(494) 评论(0) 推荐(0) 编辑
摘要: 实体更新 Transaction trans=session.beginTransaction(); String hql=”update User user set user.age=20 where user.age=18”; Query queryupdate=session.createQuery(hql); int ret=queryupdate.executeUpdate(); trans.commit(); 实体删除 Transaction trans=session.beginTransaction(); String hql=”delete fr... 阅读全文
posted @ 2011-11-22 09:24 chenchun 阅读(8138) 评论(0) 推荐(0) 编辑
摘要: 用拦截器实现登录验证功能AuthorizationInterceptor :packagecom.interceptor;importcom.opensymphony.xwork2.ActionInvocation;importcom.opensymphony.xwork2.interceptor.*;importcom.opensymphony.xwork2.*;importjava.util.*;/***@authorhttp://xp9802.iteye.com/*/publicclassAuthorizationInterceptorextendsAbstractInterceptor 阅读全文
posted @ 2011-11-22 09:23 chenchun 阅读(4061) 评论(0) 推荐(0) 编辑
摘要: 国际化(internationalization,i18n)和本地化(localization,l10n)指让产品(出版物,软件,硬件等)能够适应非本地环境,特别是其他的语言和文化。程序在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。 国际化主要体现在:页面、action的信息、类型转换信息、校验信息。 Struts2的国际化分为:页面的国际化,Action的国际化、xml的国际化。 struts2的国际化三种级别:针对某个Action的action级别,针对package的package级别,针对webapp的webapp级别。优先级:类资源文件 > 包资源文件 > 阅读全文
posted @ 2011-11-21 09:36 chenchun 阅读(452) 评论(0) 推荐(0) 编辑
摘要: 1. BIRT Project BIRT报表是一款非常流行的开源报表开发工具。拥有和Dreamweaver一般的操作界面,可以像画table一样画报表,生成图片,导出Excel,html分页样样齐全,样式和script设置简单。 2. Pentaho Pentaho Report Designer是一款所见即所得的开源报表设计工具。在设计报表的时候,用户可以随意拖放和设置各种报表的控件,还可以快速方便地设置报表的数据来源。在报表的设计过程中,用户可以随时预览报表的结果。 3. OpenRPT OpenRPT支持各种平台PostgreSQL的最佳化的图形化界面的SQL报表撰写。 4. OpenR 阅读全文
posted @ 2011-11-21 09:34 chenchun 阅读(40937) 评论(5) 推荐(1) 编辑
摘要: Lucene是一个全文搜索框架,而不是应用产品,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为 阅读全文
posted @ 2011-11-19 11:54 chenchun 阅读(518) 评论(0) 推荐(0) 编辑
摘要: 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。 一些原则: 1. 所有的开发人员需要在本地机器上做本地构建,然后再提交的版本控制库中,从而确保他们的变更不会导致持续集成失败。 2. 开发人员每天至少向版本控制库中提交一次代码。 3. 开发人员每天至少需要从版本控制库中更新一次代码到本地机器。 4. 需要有专门的集成服务器来执行集成构建,每天要执行多次构. 阅读全文
posted @ 2011-11-17 09:14 chenchun 阅读(518) 评论(0) 推荐(0) 编辑
摘要: (1)JNDI:Java Naming & Directory Interface,JAVA命名目录服务.主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能. (2)JMS:Java Message Service,JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播. (3)JTA:Java Transaction API,JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可. (4)JAF: Java Action FrameWork,JAVA安全认证框架.提供一些安全控制方 阅读全文
posted @ 2011-11-16 16:03 chenchun 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 一、Collections类和Collection接口 Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。JavaSDK不提供直接继承自Collection的 类,JavaSDK提供的类都是继承自Collection的“子接口”如List和Set。二、现在来谈谈Java集合的一些实现类。Collection├List │ 阅读全文
posted @ 2011-11-16 09:04 chenchun 阅读(1193) 评论(1) 推荐(1) 编辑
摘要: 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。常见的SQL注入式攻击过程类如: ⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码。 ⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数。下面是ASP.NET应用构造查询的一个例子: System.Text.StringBuilder que 阅读全文
posted @ 2011-11-15 09:24 chenchun 阅读(512) 评论(0) 推荐(1) 编辑
摘要: Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键=值)。 log4j 是一个开放源码项目,是广泛使用的以Java编写的日志记录包。由于log4j出色的表现,当时在log4j完成时,log4j开发组织曾建议sun在jdk1.4中用log4j取代jdk1.4 的日志工具类,但当时jdk1.4已接近完成,所以sun拒绝使用log4j,当在java开发中实际使用最多的还是log4j,人们遗忘了sun的日志工具类。它的一个独有特性包括在类别中继承的概念。通过使用类别层次结构,这样就减少了日志记录输出量,并将日志记录的开销降到最低。 关于l 阅读全文
posted @ 2011-11-14 09:04 chenchun 阅读(1355) 评论(0) 推荐(0) 编辑
摘要: 全面解释StringBuilder、StringBuffer和String的关系1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。 String a = "a"; //假设a指向地址0x0001 a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向了其它地址。 因此String的操作都是改变赋值地址而不是改变值操作。2. StringBuffer是可变 阅读全文
posted @ 2011-11-13 08:54 chenchun 阅读(3381) 评论(0) 推荐(2) 编辑
摘要: 谈谈我对abstract class和interface的理解 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多 阅读全文
posted @ 2011-11-12 15:12 chenchun 阅读(751) 评论(0) 推荐(0) 编辑
摘要: 内连接:INNER JOIN或者JOIN,把两个表中数据对应的数据查出来。 外连接:OUTER JOIN,以某个表为基础把对应数据查出来,分为左外连接和右外连接。 左外连接:LEFT JOIN或者LEFT OUTER JOIN,以某个表为基础把对应数据查出来。 右外连接:RIGHT JOIN或者RIGHT OUTER JOIN,以某个表为基础把对应数据查出来。 全连接:FULL JOIN,以多个表为基础 student表 NO Name 1 a 2 b 3 c 4 d grade表 NO Grade 1 90 2 98 3 95 5 90 内连接:查找条件中对应的数据,no4没有数据不列出来 阅读全文
posted @ 2011-11-11 09:00 chenchun 阅读(808) 评论(1) 推荐(1) 编辑
摘要: Ajax的原理就是:通过javascript的方式,将前台数据通过xmlhttp对象传递到后台,后台在接收到请求后,将需要的结果,再传回到前台,这样就可以实现不需要页面的回发,页是数据实现来回传递,从页实现无刷新。 Ajax的原理简单来说,实际上就是通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。 这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对 XMLHttpRequest有所了解。我们可以看出,XMLHttpRequest对象完全用来向服务器发出一个请求的,它的作用也局限于此,但它.. 阅读全文
posted @ 2011-11-10 09:47 chenchun 阅读(8227) 评论(0) 推荐(1) 编辑
摘要: SQL Server的日期计算a. 一个月的第一天 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) b. 本周的星期一 SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) c. 一年的第一天 SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) d. 季度的第一天 SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) e. 上个月的最后一天 SELECT dateadd(ms,-3,DATEADD(mm, DATEDIF 阅读全文
posted @ 2011-11-09 09:23 chenchun 阅读(2699) 评论(0) 推荐(0) 编辑
摘要: 一、手动加载 如:Hibernate.initialize(obj.getUser());//加载用户对象 二、使用OpenSessionInViewFilter 配置解决延迟加载 如:<!--OpenSessionInViewFilter解决延迟加载问题--><filter><filter-name>OpenSessionInViewFilter</filter-name><filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter& 阅读全文
posted @ 2011-11-08 10:03 chenchun 阅读(380) 评论(0) 推荐(0) 编辑
摘要: 随着Web应用的商业逻辑包含逐渐复杂的公式分析计算、决策支持等,使客户机越 来越不堪重负,因此将系统的商业分离出来。单独形成一部分,这样三层结构产生了。 其中‘层’是逻辑上的划分。 三层体系结构是将整个系统划分为如图2.1所示的结构[3] (1)表现层(Presentation layer):包含表示代码、用户交互GUI、数据验证。 该层用于向客户端用户提供GUI交互,它允许用户在显示系统中输入和编辑数据,同时 系统提供数据验证功能。 (2)业务逻辑层(Business layer):包含业务规则处理代码,即程序中与业务 相关专业算法、业务政策等等。该层用于执行业务流程和制订数据的业务规则。业 阅读全文
posted @ 2011-11-08 09:52 chenchun 阅读(40801) 评论(1) 推荐(3) 编辑
摘要: 1. get是从服务器上获取数据,post是向服务器传送数据。 2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。 3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。 4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上, 阅读全文
posted @ 2011-11-07 13:31 chenchun 阅读(884) 评论(0) 推荐(3) 编辑
摘要: 线框是一个非常有用的网页开发工具,正确使用有助于帮助Web开发者节省时间和精力!下面介绍一些常见的线框工具,希望对Web设计师有帮助。 1. 960.gs Templates for Inkscape 960个Inkscape模板集合。 2. Android Patterns 一组帮你设计Android应用的交互模式。交互模式是应用程序设计中的经典模式。但开发者无需墨守成规,要能够灵活运用。 3. Free Photoshop browser templates 展示设计的时候需要一个简洁的浏览器效果截图吧?别再找了,这款免费插件就可以做到。提供1024*768和800*600两种尺寸,适应各 阅读全文
posted @ 2011-11-07 09:54 chenchun 阅读(407) 评论(0) 推荐(0) 编辑
摘要: 浅谈Hibernate的四种种数据加载方式1、即时加载(Immediate Loading) 当实体加载完成后,立即加载与实体相关联的数据。即当实体加载完成后,Hibernate自动立即读取与实体相关联的数据,并且填充到实体对应的属性中。这种加载通常有多条select语句,即select实体数据后,同时select实体相关联的数据。 2、延迟加载(Lazy Loading) 实体加载时,其关联数据并不是立即读取,而是当关联数据第一次被访问时再进行读取,这种加载方式在第一次访问关联数据时,必须在同一个session中,否则会报session已关闭错误。 延迟加载通过在实体的hbm文件中的对... 阅读全文
posted @ 2011-11-07 09:46 chenchun 阅读(4267) 评论(0) 推荐(1) 编辑
摘要: 前段时间在项目中曾经用Struts的拦截器实现登录验证功能,AuthorizationInterceptor.java,现在分享下,哈packagecom.interceptor;importcom.opensymphony.xwork2.ActionInvocation;importcom.opensymphony.xwork2.interceptor.*;importcom.opensymphony.xwork2.*;importjava.util.*;/***@authorhttp://www.cnblogs.com/jobscn/*/publicclassAuthorizationIn 阅读全文
posted @ 2011-11-06 20:51 chenchun 阅读(1929) 评论(0) 推荐(1) 编辑
摘要: 1. 数据抽象:物理抽象、概念抽象、视图级抽象,内模式、模式、外模式2. SQL语言包括数据定义、数据操纵(Data Manipulation),数据控制(Data Control)数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等数据操纵:Select ,insert,update,delete,数据控制:grant,revoke3. SQL常用命令:CREATETABLEStudent(IDNUMBERPRIMARYKEY,NAMEVARCHAR2(50)NOTNULL);//建表CREATEVIEWview_nameA 阅读全文
posted @ 2011-11-06 15:16 chenchun 阅读(2350) 评论(5) 推荐(2) 编辑
摘要: CEO、CTO、CIO……等的含义【想做执行官的童鞋收藏啦】CEO Chief Executive Officer 首席执行官 COO Chief Operating Officer 首席运营官 CFO Chief Financial Officer 首席财务官 CTO Chief Technology Officer 首席技术官 CIO Chief Information Officer 首席信息官 CSO Chief Security Officer 首席安全官 CKO Chief Knowledge Officer 首席知识官 CMO Chief Marketing Officer 首席 阅读全文
posted @ 2011-11-06 00:20 chenchun 阅读(726) 评论(0) 推荐(2) 编辑
摘要: 摘要: 1 加Salt散列 2 ASP.NET 2.0 Membership中与密码散列有关的代码 声明:本文所罗列之源代码均通过Reflector取自.NET Framework类库,引用这些代码仅出于学习和研究的目的。 其实,对密码进行散列存储不是一个新鲜话题了,解决起来也不是很难,但很多人还是不大了解。这个小文只是强调一下“加Salt散列”这个简单的技术,并给出ASP.NET Membership所使用的代码。 本来打算写一篇介绍如何实现用户登录功能的文章的,但因为时间有限,所以先介绍一下密码的散列,下一篇再介绍用户登录。 ---- 1 密码必须散列存储 (内容略) 2 加Salt散列 阅读全文
posted @ 2011-11-05 17:47 chenchun 阅读(9435) 评论(7) 推荐(1) 编辑
摘要: 临时表 临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。 临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。 例如,如果创建了 employees 表,则任何在数据库中有使用该表的安全权限的用户都可以使用该表,除非已将其删除。如果数据库会话创建了本地临时表 #employe... 阅读全文
posted @ 2011-11-05 14:06 chenchun 阅读(15522) 评论(4) 推荐(1) 编辑