铁手剑谱

上善若水
数据加载中……

老马的集成模式之概论篇

Martin的EIP之概论:使用模式解决集成问题:

posted @ 2006-03-08 14:16 铁手 阅读(1402) | 评论 (1)编辑 收藏
ESB 是什么东西?

ESB是企业服务总线:Enterprise Services Bus,其最早概念来自于 Predicts 2004: Enterprise Service Buses Are Taking Off
我们来看一下Bitpipe.com的
定义An enterprise integration architecture that allows incremental integration driven by business requirements, not technology limitations. Also called: Enterprise Service Bus and Enterprise Services Bus。
而 O'reiley的Enterprise Services Bus一书中说:
ESB中,应用和事件驱动服务以一种松散耦合的方式紧密地联系在SOA 中。
这使得它们能够彼此独立运行,并且仍然能够提供广泛的业务功能价值。
其核心特征是:
1. Web Services
2. 数据变换
3. 智能路由
4. MOM

两个主要特点:一是分布式集成,二是松散耦合的应用和集成逻辑的分离


posted @ 2006-02-23 14:59 铁手 阅读(3876) | 评论 (1)编辑 收藏
Oracle ADF Faces开源拉

Oracle 去年将ADF Faces免费之后,目前又将其捐献出来,给了Apache的Myfaces项目。前些天看到过一些风声,现在TSS也公布了这一消息。

这简直是一条很好的消息,这下JSF世界终于可以有丰富的控件使用了。Myfaces本来就非常优秀,整合了Smile之后,如今再得到ADF Faces的Code base,已经兵强马壮,个人认为可以勘作企业应用了。



posted @ 2006-01-25 10:20 铁手 阅读(2837) | 评论 (3)编辑 收藏
Struts Classic 的变迁(下),从1.1到1.2

Untitled Document

Struts1.2.4

新特征

主要修改:

不赞成特征
Struts1.1中已经有很多构造不再赞成使用。许多已经被删除了。所以在升级到1.2.4时,请clean-compile 你的应用,并且使deprecation warnings 被打开。在升级到1.2.4之前强烈建议解决所有decprecated 的用法。最可能应用开发人员的用法是:

    1. org.apache.struts.Action statics: 如今使用org.apache.struts.Global statics
    2. Action.perform: 如今使用Action.execute

虽然没有被删除也没有被标明为不赞成使用,最好还是将ActionErrors 替换为ActionMessages 以确保正确的操作。
TagUtils ModuleUtils
许多以前在org.apache.struts.utils.RequestUtils中找到的工具方法如今移动到了org.apache.struts.taglibs.TagUtils 或org.apache.struts.utils.ModuleUtils包中。
GenericDataSource / GenericConnection 实现被删除
datasources manager 仍然支持,但是我们自己的datasource implementationis 并不被支持。很欢迎你插入自己的DataSource 实现,但是我们没有资源来维护我们自己的实现。如果你的容器不支持DataSource实现,推荐使用Jakarta Commons的 DBCP package。
Validator 增强

  1. ValidWhen

Struts Validator 如今支持ValidWhen 规则,以便一个验证可以依赖于另一个验证。

  1. IntRange 现在可以检测select-one 和radio 字段。比如:这使得我们可以使用一些有效的选项加上一个具有诸如"Choose one" 标题并且值为"-1"的附加选项来组装一个组合框。那么当用户试图提交一个表单时,你可以检测值是否为-1,从而决定是否没有选择选项。
  2. 你现在可以强制进行客户端Javascript 验证来检测所有约束,而不是停留在第一个错误之处。方法是设置Validator PlugIn上的一个新的属性stopOnFirstError为false。
  3. "required" 验证现在可以检测checkboxes, radio,select-one, 和 select-multiple 字段类型。参见修改后的Validator 示例来看如何使用这些新的特征。
  4. 一个标准的validateUrl 规则可以让你能够检测某一个属性是否包含一个格式正确的URL。

DigestingPlugIn
一个新的标准PlugIn 可以帮助你在application范围内创建你自己的对象图(object graph)。这是创建供Action调用的业务对象的快捷方式。请参见最新的MailReader 示例来看如何使用DigestingPlugin。
ModuleConfigVerifier
虽然不是全新的,一个标准类,用来验证模块配置,位于PlugIn 包。ModuleConfigVerifier 主要确认Struts对象图的各中组件被载入。但是,开发人员可扩展此类来检查确保Struts 配置文件的内部一致性。
提供了支持Maven的项目文件.
新的配置DTD
推荐使用struts-config_1_2.dtd。新的DTD 添加了两个新的元素<display-name> 和 <description> 到struts-config 元素中。这些元素可用于struts配置文件工具和文档产生工具。在Struts 1.2.x 中,已有的Struts 配置文件可以使用两个版本的DTD 都可载入。
新的Taglib URIs
标签库的URI已经被修改已反映Struts从Jakarta 移到了Apache 的顶级项目。为了兼容,使用旧的URI的TLD仍然有效,但是鼓励使用新的URI。
Struts-Chain
试验性的,这个新的"contrib" package 使用了Jakarta Sandbox中的Responsibilty package 的Chainin 来创建一个新的RequestProcessor的Breed。未来版本可能会成为默认实现。.
MappingDispatchAction
一个新的标准Action,将控制转发到ActionMapping 参数命名的一个方法。
Cancel handlers
DispatchAction, LookupDispatchAction, 和 MappingDispatchAction ,如今提供了默认的可以覆写的cancel handler。也可以指定默认的handler name。
Session-scoped ActionMessages
现在你可以将ActionMessages 保存在session 中and have them cleaned up after the first use。现在除了Action.saveMessages() 将消息保存在session中还有了另外一种选择。在消息已经被访问过一次之后ActionMessages.isAccessed() 返回true。RequestProcessor.processCachedMessages() 查询isAccessed() 已决定是否应该将消息从session中删除。
JA Mailreader
Struts Mailreader Example 应用现在包含Japanese 资源文件。
Tiles EL
Tiles tags 如今可以通过Struts EL taglib使用EL,后者基于JSTL。
Wildcard Mappings
现在可以在actiponMapping中使用通配符。详细信息参见Struts Mailreader Example application。
Action attributes
html img tag 添加了Action 属性,以匹配html link tag。
Module attribute
Forward元素以及多个核心标签中新增一个"module" 属性。这个属性允许你通过名称(或者前缀)指定另一个模块来创建模块间的直接链接。新的module 属性优于contextRelative属性,并且可以常用于"SwitchAction"中。

Struts 1.2.7

主要修改

依赖性

Struts 对下列组件的依赖性发生了改变:


依赖性

新的版本

Commons BeanUtils

Version 1.7.0

Commons Digester

Version 1.6

Commons Validator

Version 1.1.4

Commons Collections

removed

Commons Lang

removed

Core Struts

Saving Messages in the Session

在action也新增了一个方法[saveErrors(HttpSession, ActionMessages)]来将errors 保存在Session 中,并且在其第一次被访问之后被自动从Session中删除。这是等同于1.2.4 中message上新增的功能。

Re-directing ActionForward

ActionRedirect 是ActionForward 的一个子类,其设计来用于重定向请求,支持在运行时添加参数。

Download Action

DownloadAction 是一个提供了下载文件的具体细节的抽象Action。

Dispatch Helper

ActionDispatcher 是一个提供DispatchAction 类型的行为但是不必继承自DispatchAction

Lazy Validator Form

DynaBean 风格的ActionForm,它不需要其属性被定义,并提供Lazy ListLazy Map 行为。

jars 中的配置文件

配置文件(如. Struts config, Validator config 和 Tiles 配置文件)现在可以被保存在jars。Struts 会像以前一样检查servlet context,但是如果没找到, Struts 会尝试classloader 去查找。

Tag Library 改变

Highlighting Errors

Struts现在可以使用HTML Input Tags上的 errorKey, errorStyle, errorStyleClasserrorStyleId 属性自动高亮错误字段。

Readonly / Disabled Forms

现在可以使用<html:form> tag的readonlydisabled属性来禁止或者使全部的字段只读。
N.B. readonly 属性只影响<html:text>, <html:textarea> 和 <html:password> as per the HTML 4 specification。

HTML Tag Refactoring

许多HTML标签都被重构了,以便更易使用。

  1. 添加了prepareOtherAttributes() 方法- 刚好在关闭元素之前调用,提供一个地方来渲染额外的属性。
  2. name 属性渲染如今在prepareName() 方法中,以便更易提供定制行为。
  3. value 属性如今在prepareValue() 方法中以便更易提供定制行为。
  4. 当渲染一个属性时,这些标签现在使用属性的getter 而不是直接使用实际的属性,这意味着如果你想,比如覆盖TextTag的 styleClass ,那么一个选择是覆盖getStyleClass()方法。
  5. 属性的渲染现在使用一个简单的 prepareAttribute() 方法来产生name="attribute" 格式,使多数属性渲染一个一行语句。

Bundle Attribute

bundle 属性被添加到了下列标签:ButtonTag, CancelTag, CheckboxTag, FileTag, FrameTag, HiddenTag, LinkTag, MultiboxTag, PasswordTag, RadioTag, ResetTag, SelectTag, SubmitTag, TextTag, TextareaTag。

ErrorTag

现在新增了header, footer, prefix, suffix属性。

Validator

Resource Bundle Support

Validator 配置文件中(e.g. validation.xml)的<msg> 和 <arg> 元素的bundle 属性现在随同<msg> 的resource 属性一起得到支持。
struts-examples webapp 中添加了新的页面来展示对Resource Bundle 的支持。

Struts1.2.8

主要改变

Struts 1.2.8 的主要改变是修正了Cross Site Scripting (XSS) 弱点。

 

posted @ 2005-12-28 15:41 铁手 阅读(4881) | 评论 (6)编辑 收藏
Struts Classic 的变迁(上),从1.0到1.1

最近在编写Struts教程的时候,把Struts1.1到1.2的个版本变化总结了一下,希望能够从整体上把握它的变迁脉络,在开发和维护的时候也可以参考参考



Struts1.1的修改

新特征

引入新的配置DTD

Struts 1.0 的配置DTD 已经不赞成使用,引入了新的struts-config_1_1.dtd。在Struts 1.1 中,已有的Struts 配置文件可以使用这两个版本的DTD载入。

新的Commons 包依赖性

在Struts中使用了多个Apache Jarkarta commons的组件,而Commons组件并不仅仅可以用来构建Struts应用。在Struts1.1中,所使用的Commons组件已经重构来外部依赖于Jarkarta Commons项目,而不是1.0中的内部版本。
下面的Commons包包括了对相应的Struts 1.0 中的类的替代:

  1. BeanUtils [org.apache.commons.beanutils]:
    1. org.apache.struts.utils.BeanUtils
    2. org.apache.struts.utils.ConvertUtils
    3. org.apache.struts.utils.PropertyUtils.
  2. Collections [org.apache.commons.collections]
    1. org.apache.struts.util.ArrayStack
    2. org.apache.struts.util.FastArrayList
    3. org.apache.struts.util.FastHashMap
    4. org.apache.struts.util.FastTreeMap.
  3. Digester [org.apache.commons.digester]
    1. org.apache.struts.digester.*.

下面这几个包现在仍然被Struts框架的各种组件使用:

  1. FileUpload [org.apache.commons.fileupload]
  2. Logging [org.apache.commons.logging]
  3. Validator [org.apache.commons.validator]

XML解析器

另外,Struts 1.1 需要符合JAXP/1.1 (而不是JAXP/1.0) API的XML解析器,比如JAXP/1.1 参考实现和Xerces 1.3.1+。

源代码

如果需要从源代码开始构建Struts,请使用Ant 1.4 以上版本。

集成Struts Validator

一个新的Commons Validator组件被集成到Struts 1.1中,包含在新的Validator包中。

Tiles

引入了一个新的JSP模板组装机制Tiles,通过标签库提供集成。

Nested

Nested taglib 绑定到了Struts1.1中,增强了现有Struts标签的功能。

新的示例应用

Struts1.1发布包中包括了针对Validator 和Tiles的新的示例。

新的可选组件

CVS源代码库中新增了一个目录contrib,包含了很有用的,但是没有集成到标准代码基中的扩展。

  1. Scaffold – 一个对Commons Scaffold 工具包扩展,旨在提供可重用的构建Web应用的类
  2. Struts-EL – 可选的Struts-EL taglib 使得在Struts 中使用JSTL更加容易。(需要Servlet 2.3 +容器支持)

Action 包的增加

基本的控制器框架 [org.apache.struts.action]新增了一下特征:

  1. ActionServlet 现在提供了对模块化应用的支持,并且新增了多个扩展点。
  2. 新增了一个ActionMessages 类,支持ActionErrors功能的一个超集,可以用于通用的消息收集传递,不仅仅针对errors。

Upload 包

文件上传类[org.apache.struts.upload]新增了一下特征:

  1. CommonsMultipartRequestHandler:这个新类使用Jakarta Commons FileUpload 包实现了文件上传。这也是Struts的默认文件上传实现。

Util 包

工具(utility)类 [org.apache.struts.util]新增了以下特征:

  1. LocalStrings: 修正了与可替换参数相关的消息,以便它不会添加一个外来的无关的字符。
  2. LabelValueBean: 一个新类,定义了一个名值对的集合,可以用在<html:options> 和<html:optionsCollection>标签,或者其它地方。
  3. MessageResources: 转移包含在特定消息字符串中的单引号。
  4. computeParameters: 允许事务令牌是唯一的参数。
  5. RequestUtils: 在构建一个查询字符串时,修改来编码一个&号。

Bean Taglib

struts-bean 标签库[org.apache.struts.taglib.bean]中新增了以下特征:

  1. <bean:write>:加入了format, locale 和 bundle 属性以支持根据用户当前场所进行格式化的功能,格式化来自属性或者来自字符串资源的字符串。
  2. <bean:cookie>, <bean:header>, 或<bean:parameter>:纠正了在标签使用"multiple"属性时,所产生的脚本变量类型。
  3. <bean:message>:加入了name, property, 和scope 属性,以便消息资源key 可以动态地从一个bean 或者bean 属性获得。

HTML Taglib

struts-html [org.apache.struts.taglib.html]加入了如下新特征:

  1. <html:link>: 添加了'action' 属性
  2. <html:options>: 如果'property' 属性制定的属性(property)返回null,现在标签将抛出一个错误消息指名实际问题而不是造成NPE。
  3. <html:option> 和 <html:options>:添加了'style' 和'styleClass' 属性。
  4. <html:optionsCollection>:新标签。提供了一个更清晰的方式来从集合组装HTML options。
  5. <bean:message>:添加了'name', 'property' 和'scope' 属性,以便消息资源key 可以动态地从bean获得。
  6. <html:messages>:新标签。可以通过新的ActionMessages 类中的一个消息集合进行迭代。
  7. ActionForm:现在,此标签在它初始化ActionForm Bean的时候会调用reset() 方法。它也要求被标签所实例化的bean 是ActionForm 的一个子类。
  8. <html:image>:添加了'align' attribute。
  9. <html:img>:添加了mouse 事件属性('onclick', 'ondblclick', 'onmousedown', 'onmouseup', 'onmouseover', 'onmousemove', 'onmouseout')。
  10. SubmitTag, SelectTag, LinkTag.java, CheckboxTag, ButtonTag, ImageTag, RadioTag, 和TextArea 标签: 添加了indexed 属性。

Logic Taglib

struts-logic 标签库[org.apache.struts.taglib.logic]加入了如下新特征:

  1. <logic:empty> 和<logic:notEmpty>:新标签。类似于<logic:present> 和<logic:notPresent>,但对空字符串的处理不同。

Template Taglib

无变化,但无赞成使用。推荐使用Tiles.

运性层面的改变

加入了Config Package

  1. ControllerConfig:添加了inputForward 属性以指示ActionMapping.input是一个forward 而不是URI。
  2. ControllerConfig:添加了forwardPattern 和inputPattern 到help 应用面模块的管理页面目录
  3. 添加了一个新的包以提供更多的灵活性来支持控制器配置和多模块应用的支持。

Action 包

基本框架(org.apache.struts.action)进行了如下修改或者修正:

  1. Action 类中的所有常数:不赞成使用。提取到新的Globals类中。
  2. ActionMapping:如果模块的ControllerConfig bean [org.apache.struts.config.ControllerConfig]的inputForward 设置为true,input 属性将引用一个ActionForward 而不是模块相对的路径。
  3. ActionServlet:添加了convertNull 参数以在组装Form时仿真Struts 1.0 行为。如果设置为true,数值numeric Java wrapper 类类型 (如java.lang.Integer) 将默认为null (而不是0)。
  4. ActionServlet:添加了"config/$foo" 参数,不赞成使用包中的其他参数。
  5. ActionForms 和相关类:为了保存资源,现在在响应toString请求的时候使用一个StringBuffer。
  6. LookupDispatchAction:添加的新的标准Action,以帮助在国际化的按钮之间进行选择。
  7. ActionForm 类:修改来使用ActionServletWrapper 而不是暴露ActionServlet。
  8. ActionServletWrapper 类:添加的新类,用于ActionForm,以防止ActionServlet 的公开字符串属性被通过查询字符串改写。
  9. Action.MAPPING_KEY的 request 属性: 如果没有指定form bean,无条件地将选择的mapping 传递为请求属性("org.apache.struts.action.mapping.instance")。
  10. ActionServlet:避免了在初始化Servlet失败的时候导致的NullPointerException。
  11. ActionForm 类:现在是真正的serializable,因为两个非serializable 的实例变量(servlet 和multipartRequestHandler) 已经成为transient。但是,如果你的确需要序列化和解序列化这个实例,你要自己负责重设这两个属性。
  12. ActionMessages 和ActionErrors:The initial order a property/key is added in is now retained.
  13. processActionForward(): 不赞成,推荐使用processForwardConfig

Upload包

文件上传 (package org.apache.struts.upload) [ Upload 应用的一部分]作了如下修改和修正:
  1. CommonsMultipartRequestHandler:基于Jakarta Commons FileUpload 包的文件上传的新实现。这个新实现如今是默认实现。
  2. BufferedMultipartInputStream:解决了丢失字节的问题。
  3. ArrayIndexOutOfBoundsException:解决了已知的错误。
  4. Multipart requests:Better reporting for premature closing of input streams while reading multipart requests.
  5. 新行字符(New line characters):解决了上传和新换行字符时导致的文件损坏问题。

Utility包

utilities (package org.apache.struts.util)发生如下修改和修正:

  1. RequestUtils:添加了对ControllerConfig 的forwardPattern, pagePattern, 和inputForward 属性的支持。
  2. GenericDataSource:不赞成。修改为作为[org.apache.commons.dbpc.BasicDataSource]的一个薄的Wrapper。建议直接使用BasicDataSource 或其它兼容组件。
  3. RequestUtils 类:修改为使用ActionServletWrapper而不是暴露 ActionServlet。
  4. 为getActionErrors 和 getActionMessages 方法添加了错误消息。
  5. getActionErrors 和 getActionMessages:添加了根据基于传入的消息关键字从Request范围获取的对象来产生正确的相应对象的方法。
  6. ActionErrors 或 ActionMessages:创建一个这种对象的逻辑被移到了RequestUtils中的一个工具方法。.
  7. JspException 消息:现在在RequestUtils中生成。
  8. ConvertUtils.convertCharacter():现在将检测空字符串并返回默认值。

Bean Taglib包

struts-bean c标签库 [org.apache.struts.taglib.bean]发生了如下修改和修正:
  1. <html:errors>:当指定了属性标签时,如果指定的属性没有发生错误,则不会输出错误。而前面的错误将总是会被输出。未来的增强版本将包括额外的属性来关闭header 或 footer。
  2. 将helper 方法从"private"改为 "protected" 。

HTML Taglib 包

struts-html 标签库(package org.apache.struts.taglib.html)发生了如下修改和修正:

  1. FormTag:修正为,当指定了action mapping的名称时,要排除查询字符串。
  2. ImgTag:如果只有一个参数,能正确地URLEncode 查询字符串参数。
  3. MultiboxTag.doAfterBody()::修正为返回SKIP_BODY 而不是SKIP_PAGE。
  4. Errortag:不赞成使用defaultLocale方法。

Documentation 示例应用

Struts Documentation 应用(对应Struts 网站的内容)发生了如下修改:

  1. 重新组织了资源到单独的页面中。
  2. 在Tag Developers Guide中,添加了更详细的文件上传要求。
  3. 在Building View Components,澄清了额外的i18n 支持可以由浏览器提供,并且超出了框架的范围。
  4. 在Building Controller Components一节,文档 'validating' init-param,添加了各种参数的默认值,澄清了某些web.xml 设置不是Struts特定的。
  5. Tag library 文档:移到User's Guide下。

MailReader 示例应用

Struts MailReader Example Application 发生如下修改和修正:

  1. 添加了应用资源的 Russian 和Japanese 翻译,并且设置JSP的字符集为"UTF-8"以便其可以显示English 或Japanese。
  2. 在Struts配置文件中交换了Edit mappings的"attribute" 属性的"name" 。
  3. 删除了对"tour"文档中的保存的数据库数据的引用,因为这个功能已经被删除。

Exercise Taglib 示例应用

Struts Exercise Taglib Example Application 发生了如下修改和修正:

  1. 添加了针对使用了"action"属性的<html:link> 的test case 。
  2. 添加了针对基于保存在page上下文中的集合使用<html:options> 和 <html:optionsCollection>的<html:select> 的test case。

不同之处

这里列出1.0到1.1中新增的类和已经不赞成使用的类:

1.0中不赞成使用,1.1中已经删除的类。

  1. 删除:org.apache.struts.utils.BeanUtils, org.apache.struts.utils.ConvertUtils, and org.apache.struts.utils.PropertyUtils – 替换为org.apache.commons.beanutils
  2. 删除:org.apache.struts.util.ArrayStack, org.apache.struts.util.FastArrayList, org.apache.struts.util.FastHashMap, org.apache.struts.util.FastTreeMap – 替换为org.apache.commons.collections
  3. 删除: org.apache.struts.digester.* - 替换为org.apache.commons.digester
  4. 删除:struts-config.dtd – 替换为struts-config_1_1.dtd.
  5. 删除:omnibus "struts" taglib 和其相应的TLD – 替换为bean, logic, 和html taglib。
  6. 删除:"form" taglib 和其相应的TLD – 替换为html taglib.

Struts 1.1新增的包

  1. config
  2. taglib.nested
  3. taglib.nested.bean
  4. taglib.nested.html
  5. taglib.nested.logic
  6. validator

Struts 1.1新增的类

action

  1. ActionMessage
  2. ActionMessages
  3. DynaActionForm
  4. DynaActionFormClass
  5. ExceptionHandler
  6. RequestProcessor

actions

  1. LookupDispatchAction

taglib.html

  1. FrameTag
  2. JavascriptValidatorTag
  3. MessagesTag
  4. OptionsCollectionTag

taglib.logic

  1. EmptTag
  2. MessagesNotPresentTag
  3. MessagesPresentTag
  4. NotEmptyTag

upload

  1. CommonsMultipartRequestHandler

util

  1. LabelValueBean

Struts 1.1中新增的类成员

action.Action

  1. ACTION_SERVLET_KEY
  2. APPLICATION_KEY
  3. MESSAGE_KEY
  4. PLUG_INS_KEY
  5. REQUEST_PROCESSOR_KEY
  6. execute
  7. getResources(javax.servlet.http.HttpServletRequest)
  8. saveMessages

action.ActionServlet

  1. configDigester
  2. convertHack
  3. log
  4. processor
  5. getInternal
  6. destroyApplications
  7. destroyConfigDigester
  8. getApplicationConfig
  9. getRequestProcessor
  10. initApplicationConfig
  11. initApplicationDataSources
  12. initApplicationPlugIns
  13. initApplicationMessageResources
  14. initConfigDigester
  15. methods created for backward-compatiblity only
    1. defaultControllerConfig
    2. defaultFormBeansConfig
    3. defaultForwardsConfig
    4. defaultMappingsConfig
    5. defaultMessageResourcesConfig

taglib.html.BaseHandlerTag

  1. indexed
  2. setIndexed
  3. getIndexed

Struts 1.0 到Struts 1.1不赞成的类

action

  1. ActionException
  2. ActionFormBeans
  3. ActionForwards
  4. ActionMappings

Struts 1.0 不赞成的类成员

action.Action

  1. FORM_BEANS_KEY
  2. FORWARDS_KEY
  3. MAPPINGS_KEY
  4. getResources()
  5. perform

ActionServlet

  1. findDataSource
  2. findFormBean
  3. findForward
  4. findMapping
  5. initDataSources
  6. methods created for backward-compatiblity only
    1. defaultControllerConfig
    2. defaultFormBeansConfig
    3. defaultForwardsConfig
    4. defaultMappingsConfig
    5. defaultMessageResourcesConfig

posted @ 2005-12-28 15:23 铁手 阅读(4592) | 评论 (0)编辑 收藏
仅列出标题
共26页: First 上一页 4 5 6 7 8 9 10 11 12 下一页 Last