2023年8月1日发(作者:)

Portal是什么?

在了解portlet之前有必要先了解portal。在Portlet规范里是这样讲的:“portal是一种web应用,通常用来提供个性化、单次登录、聚集各个信息源的内容,并作为信息系统表现层的宿主。聚集是指将来自各个信息源的内容集成到一个web页面里的活动”。

Portal的功能可以分为三个主要方面:

1. Portlet容器:Portlet容器与servlet容器非常类似,所有的portlet都部署在portlet容器里,portlet容器控制portlet的生命周期并为其提供必要的资源和环境信息。Portlet容器负责初始化和销毁portlets,向portlets传送用户请求并合成响应。

2. 内容聚集:Portlet规范中规定portal的主要工作之一是聚集由各种portlet应用生成的内容,我们将在“如何创建Portal页面”部分对此做进一步讨论。

3. 公共服务:portlet服务器的一个强项是它所提供的一套公共服务。这些服务并不是portlet规范所要求的,但portal的商业实现版本提供了丰富的公共服务以有别于它们的竞争者。在大部分实现中都有望找到的几个公共服务有:

o 单次登录:只需登录portal服务器一次就可以访问所有其它的应用,这意味着你无需再分别登录每一个应用。例如一旦我登录了我的intranet网站,我就能访问mail应用、IM消息应用和其它的intranet应用,不必再分别登录这些应用。

Portal服务器会为你分配一个通行证库。你只需要在mail应用里设定一次用户名和密码,这些信息将以加密的方式存储在通行证库中。在你已登录到intranet网站并要访问mail应用的时候,portal服务器会从通行证库中读取你的通行证替你登录到mail服务器上。你对其它应用的访问也将照此处理。

o个性化:个性化服务的基本实现使用户能从两方面个性化她的页面:第一,用户可以根据她的自身喜好决定标题条的颜色和控制图标。第二,用户可以决定在她的页面上有哪些portlets。例如,如果我是个体育迷,我可能会用一个能提供我钟爱球队最新信息的portlet来取代股票和新闻portlets。

一些在个性化服务方面领先的商业实现版本允许你建立为用户显示什么样的应用所依据的标准(如收入和兴趣)。在这种情况下,可以设定一些像“对任何收入为X的用户显示馈赠商品的portlet”和“对任何收入为X的用户显示打折商品的portlet”这样的商业规则。

此外还有一些公共服务,比如机器翻译,是由portal服务器将portlet生成的内容翻译为用户要求的语言。大部分的商业portal服务器都支持手持设备访问并具有针对不同的浏览终端生成不同内容的能力。

Portlets是什么?

与servlets类似,portlets是部署在容器内用来生成动态内容的web组件。从技术角度讲portlet是一个实现了t接口的类,它被打包成war文件格式部署到portlet容器里。

Portlets在以下方面与servlets相似:

1. portlets由特定的容器管理。

2. portlets生成动态内容。 3. portlet的生命周期由容器管理。

4. portlets通过请求/响应模式与web客户端交互。

Portlets在以下方面与servlets相异:

1. portlets只能生成标记段,而不是整个文档。

2. portlets没有可供直接访问的URL地址。不过你还是能够让别人通过URL访问到portlet,你可以把包含该portlet的页面的URL发给他。

3. portlets不能随意地生成内容,这是因为portlet生成的内容最终要成为portal页面的一部分。如果portal服务器要求的是html/text类型,那么所有的portlets都应生成html/text类型的内容。再比方说,如果portal服务器要求的是WML类型,那么所有的portlets都应生成WML类型的内容。

portlets还提供了一些附加的功能:

1. 设置参数的持久化存储:portlets提供了一个PortletPreferences对象用来保存用户的设置参数。这些参数被存入一个持久化数据库,这样服务器重启后数据依然有效。开发者不必关心这些数据存储的具体实现机制。

2. 请求处理:portlets提供了更为细粒度的请求处理。对于用户在portlet上动作时向该portlet发出的请求(一种称为活跃期的状态),或者因用户在其它portlet上动作而引发的刷新页面请求,Portal服务器提供了两种不同的回调方法来处理。

3. Portlet模式:portlets用模式的概念来表示用户在做什么。在使用mail应用的时候,你可能会用它来读信、写信或检查信件――这些都是mail应用的预定功能,Portlets通常以VIEW模式提供这些功能。但还有一些活动,像指定刷新时间或(重新)设置用户名和密码,这些活动允许用户定制应用的行为,因此它们用的是EDIT模式。Mail应用的帮助功能用的是HELP模式。

如果仔细想想其实这里面并没有什么新东西,它们反而大部分都是普通的业务需求。Portlet规范的作用在于它提供了一个抽象层,这才是它对所有与之相关的人-最终用户、开发者和管理员-的价值所在。

作为一个开发者,我会将所有与VIEW模式有关的业务逻辑放入doView()方法,将与应用配置有关的业务逻辑放入doEdit()方法,将与帮助有关的逻辑放入doHelp()方法

这就简化了管理员对portlet应用的访问控制管理,因为他只需改变portlet的访问权限就能决定用户能做什么。例如,如果mail应用的一个用户能够在EDIT模式下设定用户名和密码,那么就可以断定他具有EDIT模式访问权限。

不妨考虑这样一种情形:我是一个intranet网站的管理员,我的公司买了一个能显示新闻信息的第三方portlet应用,该应用允许用户指定跟踪新闻更新的URL地址,我想借助它为用户显示公司的内部新闻。另一个需求是我不想让用户通过该应用来跟踪任何其它的新闻信息来源。作为管理员,我可以为所有的用户指定一个用于内部新闻更新的URL地址,同时通过改变portlet应用的部署描述符来取消其它人修改该地址的权限。

由于所有的portlet应用都具有相似的UI界面,因此采用portlets可使网站对最终用户更具吸引力。如果她想阅读任何一个应用的帮助信息,她可以点击帮助按钮;她也知道点击编辑按钮能让她进入应用的配置屏。标准化的用户界面使你的portlet应用更引人。

4. 窗口状态:窗口状态决定了portal页面上留给portlet生成内容的空间。如果点击最大化按钮,portlet将占据整个屏幕,成为用户唯一可用的portlet;而在最小化状态,portlet只显示为标题条。作为开发者应当根据可用空间的大小来定做内容。

5. 用户信息:通常portlets向发出请求的用户提供个性化的内容,为了能更加行之有效,portlets需要访问用户的属性信息,如姓名、email、电话等。Portlet API为此提供了用户属性的概念,开发者能够用标准的方式访问这些属性,并由管理员负责在这些属性与真实的用户信息数据库(通常是LDAP服务器)之间建立映射关系。

我们将在本文的第二部分深入讨论这些特点-请求处理、用户信息和portlet模式。

开发"Hello World" Portlet

现在我们就来开发一个简单的HelloWorld portlet。

1. 创建一个名为HelloWorld的web项目,它与通常的servlet项目类似,

有一个/WEB-INF/文件作为项目的部署描述符。

2. 在build path里加入文件,该jar文件是Pluto发行包的一部分。

3. 在Source文件夹中按如下内容创建文件:

public class HelloWorld extends GenericPortlet{

protected void doView(RenderRequest request, RenderResponse response)

throws PortletException, IOException

{ tentType("text/html");

ter().println("Hello Portlet"); }}

每个portlet都要实现Portlet接口,该接口为portlet定义了生命周期方法。

由于不想覆盖所有这些方法,我们只对GenericPortlet类进行扩展,

它是一个实现了Portlet接口的适配器类。GenericPortlet类提供了所有生命周期方法的默认实现,

所以我们只需实现我们所需要的方法。

我们在 HelloWorld portlet里要做的只是显示“Hello Portlet”,

所以我们将覆盖GenericPortlet类的doView()方法,该方法以PortletRequest 和

PortletResponse作为参数。

在doView()方法中首先调用tentType()以通知portlet容器该portlet将要生成何种

类型的内容-如果不这样做就会导致IllegalStateException异常。

一旦设置了内容的类型,就可以从response对象中获得PrintWriter并开始写入。

4. 每个portlet应用在/WEB-INF文件夹中都有一个文件, 它是portlet应用的部署描述符。按以下内容创建文件:

HelloWorldDescription

HelloWorld Hello

World orld

-1

text/html

VIEW

en

Hello World Hello World

Hello,pluto

元素声明了portlet的名字,

元素指定了portlet的全限定类名,

元素以秒为单位指定了内容超期的时间。这里面有一点需要注意:

你在portlet上的某些动作可能会导致内容刷新,这与缓存时间无关。

元素指定对于给定的有哪些模式可供支持。

在示例中我们假定HelloWorld只能生成text/html类型的内容,且只有view模式可支持该内容类型。

如果要增加对其它内容类型的支持,需要添加新的元素并指定支持该MIME类型的模式有哪些。

通常portlet对于text/html类型有VIEW、EDIT和HELP模式可供支持,而对于WML

MIME类型则只有VIEW模式。

还可以用元素来指定portlet支持哪些本地化。

元素用来指定portlet的标题。如果要对标题做国际化处理, </p><p>可以用元素<resource-bundle>指定资源(比例properties文件)的文件名。 </p><p>在这种情况下,容器将根据用户所在的地区从适当的properties文件中选择标题。 </p><p> </p><p>5. 每个portlet应用都是一个web应用,因此除了文件之外还需要有文件。 </p><p> </p><p><web-app> <display-name>Hello World Portlet </display-name> </p><p><welcome-file-list <welcome-file> </welcome-file> </p><p></welcome-file-list></web-app> </p><p> </p><p> </p><p>6.接下来将这些文件进行编译并打包为war文件。你可以自己完成这些工作,或者下载带有 的示例代码(参见“资源”部分)来创建war文件。 </p><p>在Pluto上部署HelloWorld Portlet </p><p> </p><p> Pluto尚处于开发阶段的早期,因此还没有一套易于使用的管理工具。为了能使用Pluto服务器, 需要将编译和源代码两个版本都下载。需要注意的是以下说明是针对Windows平台的, </p><p>Unix用户通过修改斜杠符号和执行sh shell脚本(不是bat批命令文件)会得到类似的结果。 </p><p> </p><p>1. 创建一个文件夹,比如C:PlutoInstallation。 </p><p>2. 从Pluto的网站下载和。 </p><p>3. 将解压到C:PlutoInstallation.文件夹, </p><p>它应被解压到C:PlutoInstallationpluto-1.0.1-rc1文件夹下。 </p><p>4. 执行C:启动Pluto, </p><p>现在可以通过地址localhost:8080/pluto/portal访问Pluto服务器。 </p><p>5. 将解压到C:PlutoInstallationPlutoSrc文件夹。 </p><p>6. 进入C:PlutoInstallationPlutoSrc文件夹,执行maven distribute:all., </p><p>编译并下载运行常规管理任务所必需的相关资源文件。现在可以将作为portlet进行安装了。 </p><p>7. 首先将文件拷贝到C:PlutoInstallationportlets目录,如果没这个目录就创建它。 </p><p>8. 将C:更名为ties。 </p><p>9. 编辑ties,将指向Pluto编译版的安装位置, </p><p>在本例中应改为=C:/PlutoInstallation/pluto-1.0.1-rc1。 </p><p>10. 为了安装portlet,进入C:plutoInstallationplutosrcdeploy文件夹, </p><p>执行maven deploy </p><p>-Ddeploy=c:, </p><p>应能看到“build successful”信息。 </p><p>11. 在C:PlutoInstallationpluto-1.0.1-rc1webapps文件夹下,应该有一个HelloWorldPortlet文件夹。 </p><p>12. 现在进入C:PlutoInstallationpluto-1.0.1-rc1webappsHelloWorldWEB-INF folder文件夹, </p><p>打开portlet的文件,你会发现里面自动多了几行,如下所示: </p><p> </p><p><servlet> </p><p><servlet-name>HelloWorld</servlet-name> </p><p><display-name>HelloWorld Wrapper</display-name> </p><p><description>Automated generated Portlet Wrapper</description> </p><p><servlet-class>tServlet </servlet-class> </p><p><init-param> </p><p><param-name>portlet-class</param-name> </p><p><param-value>orld </param-value> </p><p></init-param> </p><p><init-param> </p><p><param-name>portlet-guid</param-name> </p><p><param-value>orld </param-value> </init-param> </p><p></servlet> </p><p> </p><p>13. 接下来我们将该portlet加到页面里。 </p><p>进入C:PlutoInstallationpluto-1.0.1-rc1webappsplutoWEB-INFdata文件夹, </p><p>可以看到有两个XML文件:和。 </p><p>14. 包含了portlet的定义,在该文件中加入以下几行: </p><p> </p><p> <application id="5"> </p><p><definition-id>HelloWorld</definition-id> </p><p> <portlet id="1"> </p><p><definition-id>orld</definition-id> </p><p></portlet> </p><p></application> </p><p> </p><p> 应用的<definition-id>应为web应用所在文件夹的名字, </p><p>portlet的<definition-id>应与中生成的portlet-guid相一致。 </p><p>15. 定义了页面中包含了哪些portlets,对该文件做如下改动: </p><p> </p><p><fragment name="p2" type="portlet"> </p><p><property name="portlet" value="/blog/5.1"/> </p><p></fragment> </p><p> </p><p>16. 执行shutdown命令和startup命令重启Pluto服务器, </p><p>返回到地址localhost:8080/pluto/portal并点击“Test Link”-此时页面中将出现我们的 </p><p> </p><p>HelloWorld portlet。 </p><p> </p><p>图3的右侧显示了HelloWorld portlet看上去的样子。 </p><p> </p><p> </p><p>图3 portlet的屏幕截图 </p><p> </p><p>如何创建Portal页面 </p><p> </p><p>图4显示了portal容器如何将分离的portlets组装为页面。 </p><p> </p><p> </p><p>图4 创建Portal页面 </p><p> </p><p> 大部分的portal服务器基本上都是部署于应用服务器上的web应用,通过servlet来处理访问portal服务器的请求。查看一下Pluto的安装目录就会发现Pluto不过是一个部署于Tomcat服务器上的一个普通web应用,再看看C:会发现所有发往Pluto服务器的请求都被映射到t上。 </p><p> </p><p> 在本文开始部分“Portal页面的元素”中,我们提到portal页面由两部分组成。一部分是由页面中的portlets生成的内容,另一部分是由portal服务器生成的内容。 </p><p> </p><p> 在Pluto里,只要用户发出请求,就会由servlet进行控制,根据用户所请求的页面来确定需要显示的portlets的列表。一旦生成了列表,servlet就将控制转给这些portlets线程并收集由它们生成的内容。 </p><p> </p><p> 对于由portal服务器生成的内容(像portal网站的观感及每个portlet的外观和控制之类)则取决于C:PlutoInstallationpluto-1.0.1-rc1webappsplutoWEB-INFaggregation文件夹下的JSP文件。是主JSP文件,它决定了整体的观感和对齐方式;它还包含了Heads以定义在生成的页面中的<HEAD>标签里的内容。用来选择在banner中该显示什么(默认情况下在banner显示列表中也包扩了图片)。用来确定portal网站的导航方案。这意味着只需改动该文件夹下少量的几个JSP文件,就能改变整个portal网站的观感。 </p><p> </p><p> Pluto根据中的设置确定页面中有多少行,并用去填充。用来填充每个栏目。用来填充每个portlet的页头,像标题条及最大化和最小化控制。用来填充JSP的页脚。如果去看一下portal页面的HTML代码就会发现每个portlet窗口无非都是嵌入<TD>标签的内容块。 </p><p> </p><p>结束语 </p><p> </p><p> 任何一种新技术要想获得成功都应具备以下条件:首先,它能提升现有技术;其次,它能解决现有技术遇到的普遍问题;再次,它能提供多于一个的抽象层(有人说,每抽象出一层,问题就解决一半)。 </p><p> </p><p> 由于portlet与现有的应用服务器架构兼容,这对Portlet API来说是一次发展servlet技术的好机会。你可以从portlet里调用EJB,或者用它启动和参与由应用服务器控制的全局性事务。换句话说,在以商业逻辑为核心的领域里,portlet完全可以做得和servlet一样好。 </p><p> </p><p> Portlets提供了一个抽象层,现在你不必再担心客户端使用了什么样的HTTP方法,也不必自己编写程序去捕获像点击按钮这样的客户端事件。最后但绝不是最次要的一点是,portlets以提供像单次登录、个性化等服务的方式解决了servlets不能解决的大部分问题。 </p><p> </p><p> </p><p>本文来自CSDN博客,转载请标明出处:file:///E:/Learn/网页/Portal是什么?%20-%20Java技术交流%20-%20CSDN博客.htm </p><p><p></p></img></p><p>2023年8月1日发(作者:)</p><p></p><p></img></p><p>Portal是什么? </p><p> </p><p> 在了解portlet之前有必要先了解portal。在Portlet规范里是这样讲的:“portal是一种web应用,通常用来提供个性化、单次登录、聚集各个信息源的内容,并作为信息系统表现层的宿主。聚集是指将来自各个信息源的内容集成到一个web页面里的活动”。 </p><p> </p><p> Portal的功能可以分为三个主要方面: </p><p>1. Portlet容器:Portlet容器与servlet容器非常类似,所有的portlet都部署在portlet容器里,portlet容器控制portlet的生命周期并为其提供必要的资源和环境信息。Portlet容器负责初始化和销毁portlets,向portlets传送用户请求并合成响应。 </p><p>2. 内容聚集:Portlet规范中规定portal的主要工作之一是聚集由各种portlet应用生成的内容,我们将在“如何创建Portal页面”部分对此做进一步讨论。 </p><p>3. 公共服务:portlet服务器的一个强项是它所提供的一套公共服务。这些服务并不是portlet规范所要求的,但portal的商业实现版本提供了丰富的公共服务以有别于它们的竞争者。在大部分实现中都有望找到的几个公共服务有: </p><p> o 单次登录:只需登录portal服务器一次就可以访问所有其它的应用,这意味着你无需再分别登录每一个应用。例如一旦我登录了我的intranet网站,我就能访问mail应用、IM消息应用和其它的intranet应用,不必再分别登录这些应用。 </p><p> Portal服务器会为你分配一个通行证库。你只需要在mail应用里设定一次用户名和密码,这些信息将以加密的方式存储在通行证库中。在你已登录到intranet网站并要访问mail应用的时候,portal服务器会从通行证库中读取你的通行证替你登录到mail服务器上。你对其它应用的访问也将照此处理。 </p><p> o个性化:个性化服务的基本实现使用户能从两方面个性化她的页面:第一,用户可以根据她的自身喜好决定标题条的颜色和控制图标。第二,用户可以决定在她的页面上有哪些portlets。例如,如果我是个体育迷,我可能会用一个能提供我钟爱球队最新信息的portlet来取代股票和新闻portlets。 </p><p> 一些在个性化服务方面领先的商业实现版本允许你建立为用户显示什么样的应用所依据的标准(如收入和兴趣)。在这种情况下,可以设定一些像“对任何收入为X的用户显示馈赠商品的portlet”和“对任何收入为X的用户显示打折商品的portlet”这样的商业规则。 </p><p> </p><p> 此外还有一些公共服务,比如机器翻译,是由portal服务器将portlet生成的内容翻译为用户要求的语言。大部分的商业portal服务器都支持手持设备访问并具有针对不同的浏览终端生成不同内容的能力。 </p><p> </p><p>Portlets是什么? </p><p> </p><p> 与servlets类似,portlets是部署在容器内用来生成动态内容的web组件。从技术角度讲portlet是一个实现了t接口的类,它被打包成war文件格式部署到portlet容器里。 </p><p> </p><p> Portlets在以下方面与servlets相似: </p><p>1. portlets由特定的容器管理。 </p><p>2. portlets生成动态内容。 3. portlet的生命周期由容器管理。 </p><p>4. portlets通过请求/响应模式与web客户端交互。 </p><p> </p><p> Portlets在以下方面与servlets相异: </p><p>1. portlets只能生成标记段,而不是整个文档。 </p><p>2. portlets没有可供直接访问的URL地址。不过你还是能够让别人通过URL访问到portlet,你可以把包含该portlet的页面的URL发给他。 </p><p>3. portlets不能随意地生成内容,这是因为portlet生成的内容最终要成为portal页面的一部分。如果portal服务器要求的是html/text类型,那么所有的portlets都应生成html/text类型的内容。再比方说,如果portal服务器要求的是WML类型,那么所有的portlets都应生成WML类型的内容。 </p><p> </p><p> portlets还提供了一些附加的功能: </p><p>1. 设置参数的持久化存储:portlets提供了一个PortletPreferences对象用来保存用户的设置参数。这些参数被存入一个持久化数据库,这样服务器重启后数据依然有效。开发者不必关心这些数据存储的具体实现机制。 </p><p>2. 请求处理:portlets提供了更为细粒度的请求处理。对于用户在portlet上动作时向该portlet发出的请求(一种称为活跃期的状态),或者因用户在其它portlet上动作而引发的刷新页面请求,Portal服务器提供了两种不同的回调方法来处理。 </p><p>3. Portlet模式:portlets用模式的概念来表示用户在做什么。在使用mail应用的时候,你可能会用它来读信、写信或检查信件――这些都是mail应用的预定功能,Portlets通常以VIEW模式提供这些功能。但还有一些活动,像指定刷新时间或(重新)设置用户名和密码,这些活动允许用户定制应用的行为,因此它们用的是EDIT模式。Mail应用的帮助功能用的是HELP模式。 </p><p> </p><p> 如果仔细想想其实这里面并没有什么新东西,它们反而大部分都是普通的业务需求。Portlet规范的作用在于它提供了一个抽象层,这才是它对所有与之相关的人-最终用户、开发者和管理员-的价值所在。 </p><p> </p><p> 作为一个开发者,我会将所有与VIEW模式有关的业务逻辑放入doView()方法,将与应用配置有关的业务逻辑放入doEdit()方法,将与帮助有关的逻辑放入doHelp()方法 </p><p> </p><p> 这就简化了管理员对portlet应用的访问控制管理,因为他只需改变portlet的访问权限就能决定用户能做什么。例如,如果mail应用的一个用户能够在EDIT模式下设定用户名和密码,那么就可以断定他具有EDIT模式访问权限。 </p><p> </p><p> 不妨考虑这样一种情形:我是一个intranet网站的管理员,我的公司买了一个能显示新闻信息的第三方portlet应用,该应用允许用户指定跟踪新闻更新的URL地址,我想借助它为用户显示公司的内部新闻。另一个需求是我不想让用户通过该应用来跟踪任何其它的新闻信息来源。作为管理员,我可以为所有的用户指定一个用于内部新闻更新的URL地址,同时通过改变portlet应用的部署描述符来取消其它人修改该地址的权限。 </p><p> </p><p> 由于所有的portlet应用都具有相似的UI界面,因此采用portlets可使网站对最终用户更具吸引力。如果她想阅读任何一个应用的帮助信息,她可以点击帮助按钮;她也知道点击编辑按钮能让她进入应用的配置屏。标准化的用户界面使你的portlet应用更引人。 </p><p> </p><p>4. 窗口状态:窗口状态决定了portal页面上留给portlet生成内容的空间。如果点击最大化按钮,portlet将占据整个屏幕,成为用户唯一可用的portlet;而在最小化状态,portlet只显示为标题条。作为开发者应当根据可用空间的大小来定做内容。 </p><p> </p><p>5. 用户信息:通常portlets向发出请求的用户提供个性化的内容,为了能更加行之有效,portlets需要访问用户的属性信息,如姓名、email、电话等。Portlet API为此提供了用户属性的概念,开发者能够用标准的方式访问这些属性,并由管理员负责在这些属性与真实的用户信息数据库(通常是LDAP服务器)之间建立映射关系。 </p><p> </p><p> 我们将在本文的第二部分深入讨论这些特点-请求处理、用户信息和portlet模式。 </p><p> </p><p>开发"Hello World" Portlet </p><p> </p><p> 现在我们就来开发一个简单的HelloWorld portlet。 </p><p>1. 创建一个名为HelloWorld的web项目,它与通常的servlet项目类似, </p><p>有一个/WEB-INF/文件作为项目的部署描述符。 </p><p> </p><p>2. 在build path里加入文件,该jar文件是Pluto发行包的一部分。 </p><p> </p><p>3. 在Source文件夹中按如下内容创建文件: </p><p> </p><p>public class HelloWorld extends GenericPortlet{ </p><p> protected void doView(RenderRequest request, RenderResponse response) </p><p>throws PortletException, IOException </p><p>{ tentType("text/html"); </p><p>ter().println("Hello Portlet"); }} </p><p> </p><p>每个portlet都要实现Portlet接口,该接口为portlet定义了生命周期方法。 </p><p>由于不想覆盖所有这些方法,我们只对GenericPortlet类进行扩展, </p><p>它是一个实现了Portlet接口的适配器类。GenericPortlet类提供了所有生命周期方法的默认实现, </p><p>所以我们只需实现我们所需要的方法。 </p><p> </p><p>我们在 HelloWorld portlet里要做的只是显示“Hello Portlet”, </p><p>所以我们将覆盖GenericPortlet类的doView()方法,该方法以PortletRequest 和 </p><p>PortletResponse作为参数。 </p><p>在doView()方法中首先调用tentType()以通知portlet容器该portlet将要生成何种 </p><p>类型的内容-如果不这样做就会导致IllegalStateException异常。 </p><p>一旦设置了内容的类型,就可以从response对象中获得PrintWriter并开始写入。 </p><p> </p><p>4. 每个portlet应用在/WEB-INF文件夹中都有一个文件, 它是portlet应用的部署描述符。按以下内容创建文件: </p><p> </p><p><portlet> <description>HelloWorldDescription </description> </p><p><portlet-name>HelloWorld </portlet-name> <display-name>Hello </p><p>World </display-name> <portlet-class>orld </p><p></portlet-class> <expiration-cache>-1 </expiration-cache> </p><p><supports> <mime-type>text/html</mime-type> </p><p><portlet-mode>VIEW </portlet-mode> </supports> </p><p><supported-locale>en </supported-locale> <portlet-info> </p><p><title>Hello World Hello World

Hello,pluto

元素声明了portlet的名字,

元素指定了portlet的全限定类名,

元素以秒为单位指定了内容超期的时间。这里面有一点需要注意:

你在portlet上的某些动作可能会导致内容刷新,这与缓存时间无关。

元素指定对于给定的有哪些模式可供支持。

在示例中我们假定HelloWorld只能生成text/html类型的内容,且只有view模式可支持该内容类型。

如果要增加对其它内容类型的支持,需要添加新的元素并指定支持该MIME类型的模式有哪些。

通常portlet对于text/html类型有VIEW、EDIT和HELP模式可供支持,而对于WML

MIME类型则只有VIEW模式。

还可以用元素来指定portlet支持哪些本地化。

元素用来指定portlet的标题。如果要对标题做国际化处理, </p><p>可以用元素<resource-bundle>指定资源(比例properties文件)的文件名。 </p><p>在这种情况下,容器将根据用户所在的地区从适当的properties文件中选择标题。 </p><p> </p><p>5. 每个portlet应用都是一个web应用,因此除了文件之外还需要有文件。 </p><p> </p><p><web-app> <display-name>Hello World Portlet </display-name> </p><p><welcome-file-list <welcome-file> </welcome-file> </p><p></welcome-file-list></web-app> </p><p> </p><p> </p><p>6.接下来将这些文件进行编译并打包为war文件。你可以自己完成这些工作,或者下载带有 的示例代码(参见“资源”部分)来创建war文件。 </p><p>在Pluto上部署HelloWorld Portlet </p><p> </p><p> Pluto尚处于开发阶段的早期,因此还没有一套易于使用的管理工具。为了能使用Pluto服务器, 需要将编译和源代码两个版本都下载。需要注意的是以下说明是针对Windows平台的, </p><p>Unix用户通过修改斜杠符号和执行sh shell脚本(不是bat批命令文件)会得到类似的结果。 </p><p> </p><p>1. 创建一个文件夹,比如C:PlutoInstallation。 </p><p>2. 从Pluto的网站下载和。 </p><p>3. 将解压到C:PlutoInstallation.文件夹, </p><p>它应被解压到C:PlutoInstallationpluto-1.0.1-rc1文件夹下。 </p><p>4. 执行C:启动Pluto, </p><p>现在可以通过地址localhost:8080/pluto/portal访问Pluto服务器。 </p><p>5. 将解压到C:PlutoInstallationPlutoSrc文件夹。 </p><p>6. 进入C:PlutoInstallationPlutoSrc文件夹,执行maven distribute:all., </p><p>编译并下载运行常规管理任务所必需的相关资源文件。现在可以将作为portlet进行安装了。 </p><p>7. 首先将文件拷贝到C:PlutoInstallationportlets目录,如果没这个目录就创建它。 </p><p>8. 将C:更名为ties。 </p><p>9. 编辑ties,将指向Pluto编译版的安装位置, </p><p>在本例中应改为=C:/PlutoInstallation/pluto-1.0.1-rc1。 </p><p>10. 为了安装portlet,进入C:plutoInstallationplutosrcdeploy文件夹, </p><p>执行maven deploy </p><p>-Ddeploy=c:, </p><p>应能看到“build successful”信息。 </p><p>11. 在C:PlutoInstallationpluto-1.0.1-rc1webapps文件夹下,应该有一个HelloWorldPortlet文件夹。 </p><p>12. 现在进入C:PlutoInstallationpluto-1.0.1-rc1webappsHelloWorldWEB-INF folder文件夹, </p><p>打开portlet的文件,你会发现里面自动多了几行,如下所示: </p><p> </p><p><servlet> </p><p><servlet-name>HelloWorld</servlet-name> </p><p><display-name>HelloWorld Wrapper</display-name> </p><p><description>Automated generated Portlet Wrapper</description> </p><p><servlet-class>tServlet </servlet-class> </p><p><init-param> </p><p><param-name>portlet-class</param-name> </p><p><param-value>orld </param-value> </p><p></init-param> </p><p><init-param> </p><p><param-name>portlet-guid</param-name> </p><p><param-value>orld </param-value> </init-param> </p><p></servlet> </p><p> </p><p>13. 接下来我们将该portlet加到页面里。 </p><p>进入C:PlutoInstallationpluto-1.0.1-rc1webappsplutoWEB-INFdata文件夹, </p><p>可以看到有两个XML文件:和。 </p><p>14. 包含了portlet的定义,在该文件中加入以下几行: </p><p> </p><p> <application id="5"> </p><p><definition-id>HelloWorld</definition-id> </p><p> <portlet id="1"> </p><p><definition-id>orld</definition-id> </p><p></portlet> </p><p></application> </p><p> </p><p> 应用的<definition-id>应为web应用所在文件夹的名字, </p><p>portlet的<definition-id>应与中生成的portlet-guid相一致。 </p><p>15. 定义了页面中包含了哪些portlets,对该文件做如下改动: </p><p> </p><p><fragment name="p2" type="portlet"> </p><p><property name="portlet" value="/blog/5.1"/> </p><p></fragment> </p><p> </p><p>16. 执行shutdown命令和startup命令重启Pluto服务器, </p><p>返回到地址localhost:8080/pluto/portal并点击“Test Link”-此时页面中将出现我们的 </p><p> </p><p>HelloWorld portlet。 </p><p> </p><p>图3的右侧显示了HelloWorld portlet看上去的样子。 </p><p> </p><p> </p><p>图3 portlet的屏幕截图 </p><p> </p><p>如何创建Portal页面 </p><p> </p><p>图4显示了portal容器如何将分离的portlets组装为页面。 </p><p> </p><p> </p><p>图4 创建Portal页面 </p><p> </p><p> 大部分的portal服务器基本上都是部署于应用服务器上的web应用,通过servlet来处理访问portal服务器的请求。查看一下Pluto的安装目录就会发现Pluto不过是一个部署于Tomcat服务器上的一个普通web应用,再看看C:会发现所有发往Pluto服务器的请求都被映射到t上。 </p><p> </p><p> 在本文开始部分“Portal页面的元素”中,我们提到portal页面由两部分组成。一部分是由页面中的portlets生成的内容,另一部分是由portal服务器生成的内容。 </p><p> </p><p> 在Pluto里,只要用户发出请求,就会由servlet进行控制,根据用户所请求的页面来确定需要显示的portlets的列表。一旦生成了列表,servlet就将控制转给这些portlets线程并收集由它们生成的内容。 </p><p> </p><p> 对于由portal服务器生成的内容(像portal网站的观感及每个portlet的外观和控制之类)则取决于C:PlutoInstallationpluto-1.0.1-rc1webappsplutoWEB-INFaggregation文件夹下的JSP文件。是主JSP文件,它决定了整体的观感和对齐方式;它还包含了Heads以定义在生成的页面中的<HEAD>标签里的内容。用来选择在banner中该显示什么(默认情况下在banner显示列表中也包扩了图片)。用来确定portal网站的导航方案。这意味着只需改动该文件夹下少量的几个JSP文件,就能改变整个portal网站的观感。 </p><p> </p><p> Pluto根据中的设置确定页面中有多少行,并用去填充。用来填充每个栏目。用来填充每个portlet的页头,像标题条及最大化和最小化控制。用来填充JSP的页脚。如果去看一下portal页面的HTML代码就会发现每个portlet窗口无非都是嵌入<TD>标签的内容块。 </p><p> </p><p>结束语 </p><p> </p><p> 任何一种新技术要想获得成功都应具备以下条件:首先,它能提升现有技术;其次,它能解决现有技术遇到的普遍问题;再次,它能提供多于一个的抽象层(有人说,每抽象出一层,问题就解决一半)。 </p><p> </p><p> 由于portlet与现有的应用服务器架构兼容,这对Portlet API来说是一次发展servlet技术的好机会。你可以从portlet里调用EJB,或者用它启动和参与由应用服务器控制的全局性事务。换句话说,在以商业逻辑为核心的领域里,portlet完全可以做得和servlet一样好。 </p><p> </p><p> Portlets提供了一个抽象层,现在你不必再担心客户端使用了什么样的HTTP方法,也不必自己编写程序去捕获像点击按钮这样的客户端事件。最后但绝不是最次要的一点是,portlets以提供像单次登录、个性化等服务的方式解决了servlets不能解决的大部分问题。 </p><p> </p><p> </p><p>本文来自CSDN博客,转载请标明出处:file:///E:/Learn/网页/Portal是什么?%20-%20Java技术交流%20-%20CSDN博客.htm </p><p><p></p></img></p></div></article></div><div class="torson info"><div><span>本文发布于:2023-08-01,感谢您对本站的认可!</span></div><div><span>本文链接:</span><a href="http://torson.com.cn/chengxu/1690838037a442105.html" title="Portal是什么">http://torson.com.cn/chengxu/1690838037a442105.html</a></div><div><span>版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。</span></div></div><span class="tag"><i class="iconfont icon-discount" style="font-size:12px;font-weight:bold;opacity:.7;">本文标签:</i><a href="/tag/163719.html" target="_blank">什么是url</a></span></div><div class="torson post_comments" id="comments"><div id="comt-respond" class="commentpost"><h4>发布评论 <span><a rel="nofollow" id="cancel-reply" href="#comment" style="display:none;"><small>取消回复</small></a></span></h4><form action="/comment/create/442105.html?safe_token=j7ADe3htebzUhJAtHhor7gjYSkZUTVD92zAvjub_2BM4PuEaCNK9K9dUbJoBCbfj75TQSNQLxDpt9BHqVQ6jhVng_3D_3D" method="post" name="saypl" id="frmSumbit"><input type="hidden" name="doctype" value="1" /><input type="hidden" name="quotepid" value="0" /><div id="comment-tools"><div class="torson tools_text"><textarea placeholder="请在这里留言..." name="message" id="txaArticle" class="text input-block-level comt-area" cols="50" rows="4" tabindex="5"></textarea></div></div><div class="torson psumbit"><input name="sumbit" type="submit" tabindex="6" value="发布" class="button" /></div></form></div><div class="torson commentlist"><div class="torson comment-tab"><div class="torson come-comt">评论列表<span id="comment_count">(有<span id="infocommentnumarea" style="color:#c81111">0</span>条评论)</span></div></div><ul class="diy-comment"></ul></div></div></div><div class="torson mainr"><div class="widget widget_previous"><h4 class="bar">最近发表</h4><ul><li><a href="/chengxu/1687250300a44.html"title='.Net配置Swagger包含中文注释与Header参数传递' aria-label='.Net配置Swagger包含中文注释与Header参数传递'>.Net配置Swagger包含中文注释与Header参数传递</a></li><li><a href="/chengxu/1687256692a240.html"title='Html5移动端div固定到底部实现底部导航条的几种方式' aria-label='Html5移动端div固定到底部实现底部导航条的几种方式'>Html5移动端div固定到底部实现底部导航条的几种方式</a></li><li><a href="/chengxu/1687262861a461.html"title='CSS定位DIV(一)一列样式' aria-label='CSS定位DIV(一)一列样式'>CSS定位DIV(一)一列样式</a></li><li><a href="/chengxu/1687269474a659.html"title='SunJava程序员模拟题2' aria-label='SunJava程序员模拟题2'>SunJava程序员模拟题2</a></li><li><a href="/chengxu/1687289148a1148.html"title='安卓手机死机怎么办 无需拆卸电池解决办法' aria-label='安卓手机死机怎么办 无需拆卸电池解决办法'>安卓手机死机怎么办 无需拆卸电池解决办法</a></li><li><a href="/chengxu/1687290263a1188.html"title='手机打不开怎么办?' aria-label='手机打不开怎么办?'>手机打不开怎么办?</a></li><li><a href="/chengxu/1687293136a1280.html"title='Me526_525_无法开机或假砖拯救' aria-label='Me526_525_无法开机或假砖拯救'>Me526_525_无法开机或假砖拯救</a></li><li><a href="/chengxu/1687297011a1338.html"title='SpringBoot实战(六)之使用LDAP验证用户' aria-label='SpringBoot实战(六)之使用LDAP验证用户'>SpringBoot实战(六)之使用LDAP验证用户</a></li><li><a href="/chengxu/1687309058a1530.html"title='2020年四级人力资源考点总结:绩效考评权重计算' aria-label='2020年四级人力资源考点总结:绩效考评权重计算'>2020年四级人力资源考点总结:绩效考评权重计算</a></li><li><a href="/chengxu/1687311533a1602.html"title='绩效工资绩效系数怎么算' aria-label='绩效工资绩效系数怎么算'>绩效工资绩效系数怎么算</a></li><li><a href="/chengxu/1687327050a2112.html"title='如何编写兼容多浏览器的CSS代码' aria-label='如何编写兼容多浏览器的CSS代码'>如何编写兼容多浏览器的CSS代码</a></li><li><a href="/chengxu/1687333981a2311.html"title='VS2008+Windows Mobile 6开发环境配置' aria-label='VS2008+Windows Mobile 6开发环境配置'>VS2008+Windows Mobile 6开发环境配置</a></li><li><a href="/chengxu/1687339930a2621.html"title='SQL基础入门' aria-label='SQL基础入门'>SQL基础入门</a></li><li><a href="/chengxu/1687341893a2764.html"title='SQL实验报告总结' aria-label='SQL实验报告总结'>SQL实验报告总结</a></li><li><a href="/chengxu/1687344828a2975.html"title='sql实验体会' aria-label='sql实验体会'>sql实验体会</a></li><li><a href="/chengxu/1687345660a3034.html"title='数据库原理与应用教程-SQL_Server考试复习题' aria-label='数据库原理与应用教程-SQL_Server考试复习题'>数据库原理与应用教程-SQL_Server考试复习题</a></li><li><a href="/chengxu/1687351307a3455.html"title='写参数化查询语句防止SQL注入' aria-label='写参数化查询语句防止SQL注入'>写参数化查询语句防止SQL注入</a></li><li><a href="/chengxu/1687353631a3664.html"title='ado-NET-复习题' aria-label='ado-NET-复习题'>ado-NET-复习题</a></li><li><a href="/chengxu/1687353680a3669.html"title='C#数据库并发的解决方案(通用版、EF版)' aria-label='C#数据库并发的解决方案(通用版、EF版)'>C#数据库并发的解决方案(通用版、EF版)</a></li><li><a href="/chengxu/1687354857a3771.html"title='C#工具类SqlServerHelper,基于System.Data.SqlClient封装' aria-label='C#工具类SqlServerHelper,基于System.Data.SqlClient封装'>C#工具类SqlServerHelper,基于System.Data.SqlClient封装</a></li></ul></div><section id="aside_about" class="widget widget_aside_about sb br mb"><div class="avatar"><img class="img" src="/view/template/mitiqin/img/tx.jpg" alt="拓祥电子编程网"/></div><div class="wrap pd"><p class="title">拓祥电子编程网</p><p class="info">拓祥电子编程提供编程程序员技术分享技术,经验代码。</p><ul class="ul clearfix"></ul></div></section><div class="torson clear"></div><div class="torson widgets"><h4 class="bar">相关推荐</h4><div class="torson hot-post"><ul class="clearfix"><li><a href="/news/1690838446a442243.html"title='什么是页面脚本错误解决方法有哪些' aria-label='什么是页面脚本错误解决方法有哪些'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0304.jpg" alt="什么是页面脚本错误解决方法有哪些"/></span><span class="sptit">什么是页面脚本错误解决方法有哪些</span></a></li><li><a href="/news/1690838555a442279.html"title='Python入妖4---Request库的基本使用' aria-label='Python入妖4---Request库的基本使用'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0119.jpg" alt="Python入妖4---Request库的基本使用"/></span><span class="sptit">Python入妖4---Request库的基本使用</span></a></li><li><a href="/news/1690838735a442336.html"title='什么是swagger,一篇带你入门' aria-label='什么是swagger,一篇带你入门'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0652.jpg" alt="什么是swagger,一篇带你入门"/></span><span class="sptit">什么是swagger,一篇带你入门</span></a></li><li><a href="/chengxu/1690838953a442404.html"title='JavaWeb答辩问题' aria-label='JavaWeb答辩问题'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0042.jpg" alt="JavaWeb答辩问题"/></span><span class="sptit">JavaWeb答辩问题</span></a></li><li><a href="/chengxu/1690839039a442431.html"title='教你学维语' aria-label='教你学维语'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0132.jpg" alt="教你学维语"/></span><span class="sptit">教你学维语</span></a></li><li><a href="/news/1690839379a442532.html"title='什么是接口测试,以及如何开展接口测试' aria-label='什么是接口测试,以及如何开展接口测试'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0999.jpg" alt="什么是接口测试,以及如何开展接口测试"/></span><span class="sptit">什么是接口测试,以及如何开展接口测试</span></a></li><li><a href="/news/1690839456a442558.html"title='Web前端测试题(多套)' aria-label='Web前端测试题(多套)'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0022.jpg" alt="Web前端测试题(多套)"/></span><span class="sptit">Web前端测试题(多套)</span></a></li><li><a href="/news/1690839706a442639.html"title='什么是Iframe' aria-label='什么是Iframe'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0805.jpg" alt="什么是Iframe"/></span><span class="sptit">什么是Iframe</span></a></li><li><a href="/wangzhan/1690839728a442648.html"title='什么是Cookie?Cookie有什么作用?' aria-label='什么是Cookie?Cookie有什么作用?'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0337.jpg" alt="什么是Cookie?Cookie有什么作用?"/></span><span class="sptit">什么是Cookie?Cookie有什么作用?</span></a></li><li><a href="/news/1690839957a442728.html"title='什么是button标签' aria-label='什么是button标签'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0268.jpg" alt="什么是button标签"/></span><span class="sptit">什么是button标签</span></a></li><li><a href="/chengxu/1690840313a442839.html"title='什么是CRAAP测试?CRAAP测试范文' aria-label='什么是CRAAP测试?CRAAP测试范文'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0639.jpg" alt="什么是CRAAP测试?CRAAP测试范文"/></span><span class="sptit">什么是CRAAP测试?CRAAP测试范文</span></a></li><li><a href="/chengxu/1690840359a442852.html"title='Axios的基本介绍' aria-label='Axios的基本介绍'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0568.jpg" alt="Axios的基本介绍"/></span><span class="sptit">Axios的基本介绍</span></a></li><li><a href="/chengxu/1690840428a442877.html"title='什么是应用服务器应用服务器的分类' aria-label='什么是应用服务器应用服务器的分类'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0667.jpg" alt="什么是应用服务器应用服务器的分类"/></span><span class="sptit">什么是应用服务器应用服务器的分类</span></a></li><li><a href="/chengxu/1690840542a442910.html"title='为什么汉字会显示为?号?' aria-label='为什么汉字会显示为?号?'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0538.jpg" alt="为什么汉字会显示为?号?"/></span><span class="sptit">为什么汉字会显示为?号?</span></a></li><li><a href="/news/1690840676a442954.html"title='什么是单点登陆系统(SSO)?' aria-label='什么是单点登陆系统(SSO)?'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0829.jpg" alt="什么是单点登陆系统(SSO)?"/></span><span class="sptit">什么是单点登陆系统(SSO)?</span></a></li><li><a href="/news/1690840959a443042.html"title='什么是税负率' aria-label='什么是税负率'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0791.jpg" alt="什么是税负率"/></span><span class="sptit">什么是税负率</span></a></li><li><a href="/news/1690840982a443050.html"title='什么是过滤器?什么时候使用过滤器?如何使用过滤器?过滤器的原理?_百 ...' aria-label='什么是过滤器?什么时候使用过滤器?如何使用过滤器?过滤器的原理?_百 ...'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0400.jpg" alt="什么是过滤器?什么时候使用过滤器?如何使用过滤器?过滤器的原理?_百 ..."/></span><span class="sptit">什么是过滤器?什么时候使用过滤器?如何使用过滤器?过滤器的原理?_百 ...</span></a></li><li><a href="/news/1690841005a443058.html"title='hibernate类生成表的实现源码' aria-label='hibernate类生成表的实现源码'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0171.jpg" alt="hibernate类生成表的实现源码"/></span><span class="sptit">hibernate类生成表的实现源码</span></a></li><li><a href="/wangzhan/1690841153a443103.html"title='ftp服务器文件名格式,ftp服务器文件是什么格式' aria-label='ftp服务器文件名格式,ftp服务器文件是什么格式'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0945.jpg" alt="ftp服务器文件名格式,ftp服务器文件是什么格式"/></span><span class="sptit">ftp服务器文件名格式,ftp服务器文件是什么格式</span></a></li><li><a href="/wangzhan/1690841797a443300.html"title='403Forbidden是什么意思?403Forbidden错误解决方法' aria-label='403Forbidden是什么意思?403Forbidden错误解决方法'><span class="img-box mb5" data-ratio="16:9"><img src="/uploads/image/0811.jpg" alt="403Forbidden是什么意思?403Forbidden错误解决方法"/></span><span class="sptit">403Forbidden是什么意思?403Forbidden错误解决方法</span></a></li></ul></div></div><div class="torson clear"></div><div class="widget widget_tags"><h4 class="bar">标签列表</h4><ul><li class="submenu"><a target="_blank" href="/tag/617776.html">千牛改价服务器出错了什么原因</a></li><li class="submenu"><a target="_blank" href="/tag/617769.html">一刀传世服务器爆满为什么进不去</a></li><li class="submenu"><a target="_blank" href="/tag/617734.html">苹果id链接到服务器错误是什么意思</a></li><li class="submenu"><a target="_blank" href="/tag/617714.html">剑灵什么服务器氪金低一点</a></li><li class="submenu"><a target="_blank" href="/tag/617670.html">三战里什么是主要参战服务器</a></li><li class="submenu"><a target="_blank" href="/tag/617668.html">惠普服务器的ILO是干什么的</a></li><li class="submenu"><a target="_blank" href="/tag/617663.html">阿里云服务器端口不通是什么情况</a></li><li class="submenu"><a target="_blank" href="/tag/617622.html">一般购买的服务器是什么系统的</a></li><li class="submenu"><a target="_blank" href="/tag/617556.html">您已被禁用此服务器是什么意思</a></li><li class="submenu"><a target="_blank" href="/tag/617534.html">乐刷pos连接服务器失败是什么意思</a></li><li class="submenu"><a target="_blank" href="/tag/617531.html">好的塔科夫黑边什么服务器不能玩</a></li><li class="submenu"><a target="_blank" href="/tag/617504.html">二维码为什么人服务器</a></li><li class="submenu"><a target="_blank" href="/tag/617459.html">2u4路服务器是什么意思</a></li><li class="submenu"><a target="_blank" href="/tag/617451.html">DNS服务器不可用是因为什么</a></li><li class="submenu"><a target="_blank" href="/tag/617441.html">服务器的针对方式是指什么意思</a></li><li class="submenu"><a target="_blank" href="/tag/617427.html">和利时M6为什么还有服务器</a></li><li class="submenu"><a target="_blank" href="/tag/617391.html">为什么启动不了mysql服务器失败怎么办</a></li><li class="submenu"><a target="_blank" href="/tag/617377.html">为什么玩lol会没有网络连接服务器</a></li><li class="submenu"><a target="_blank" href="/tag/617349.html">我的世界爱情的服务器有什么用</a></li><li class="submenu"><a target="_blank" href="/tag/617335.html">极光世界一般什么时候开新服务器</a></li></ul></div><div class="torson clear"></div></div></div><footer id="footer"><div class="footer container-w cl"><div class="fnav"></div><div align="center"><span class="copy"> CopyRight © 2022 All Rights Reserved <a href="/" title="拓祥电子编程网" target="_blank">拓祥电子编程网</a><p><a target="_blank" rel="nofollow" href="https://beian.miit.gov.cn/" style="font-size: 12px;">豫ICP备2022026798号-7</a></p><p>友情链接:<a href="https://www.815494.com/biancheng/">编程日记</a>|<a href="https://www.dn580.com/">电脑我帮您</a>|<a href="https://www.loghao.com/">网站日志分析</a>|<a href="https://www.sxydy.com/post/">数学伊甸园</a>|<a href="https://www.lxlong.com/">小龙励志网</a>|<a href="https://www.roclinux.cn/">Linux大棚</a>|<a href="https://www.dn580.com/">电脑知识</a></p></span></div></div></footer><script src="/view/template/mitiqin/js/common.min.js?2.3.0"></script><script src="/view/js/xiuno.js"></script><script src="/view/template/mitiqin/js/app.js?2.3.0"></script><div id="gotop"><div style="display: none; margin-bottom:5px;" id="goTopBtn"><a title="返回顶部" class="gotopa"><span class="iconfont icon-rocket-fill"></span></a></div><div align="center"></div></div></body></html>