Tiles的使用-遗补和总结

2024-01-07 14:38
文章标签 总结 使用 tiles 遗补

本文主要是介绍Tiles的使用-遗补和总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 一.) Tiles配置
要正常使用tiles,必须在Structs配置文件中加入下列代码:
 <plug-in className="org.apache.struts.tiles.TilesPlugin" >
 <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml, /WEB-INF/tiles-tests-defs.xml,/WEB-INF/tiles-tutorial-defs.xml,
 /WEB-INF/tiles-examples-defs.xml" />
 <set-property property="moduleAware" value="true" />
 <set-property property="definitions-parser-validate" value="true" />
 </plug-in>

1.definitions-factory-class:(可选)


      definition factory类的名称,可以使用自己编写definition factory。如果不指定,使用国际化factory。
2.definitions-config:(可选)
       指定tiles的配置文件, 可以是多个,中间用逗号隔开。每个文件按次序被读取,遇到definition就添加进definition factory中。如果产生重名,后面的definition将替代前面的。
3.moduleAware:(可选)
       如果是true(默认值),一个Struts module就会有一个factory;如果是false,多个Struts module分享单独的一个factory。
4.definitions-parser-validate:(可选)
        如果是true(默认值),validate.DTD会在文件头中被指定;如果是false,没有validation。

 
二.) 把Definition's名称做为Struts Forward

如果用Tiles' servlet替代Struts' servlet,那么你可以使用Tiles配置文件中的definition名称来替代URL。你Struts Action的配置像下面一样:


 <action path="/tutorial/testAction2" type="org.apache.struts.example.tiles.tutorial.ForwardExampleAction">
 <forward name="failure" path="forward.example.failure.page"/>
 <forward name="success" path="forward.example.success.page"/>
 </action>


在这里你的Action代码和以前一样,但forward mapping现在被指定为一个definition名称,当action forward碰到definition名称时,它就装载definition,创建并初始化Tile's attributes相关的内容,再插回到definition中。
 
三.) 为View准备数据:添加一个控制器(controller)
       我们常常需要给Jsp页面传递一些计算好的数据。MVC框架中,控制器用来做这个事情。要解析Tiles和Struts,我们可以用一个Struts Action作为controller,一个JSP页面作为一个view,然后在Tile中将两者组合。所以当你插入Tile时,在Jsp页面显示前Action会先被调用。
       Tils可以通过controller(每个Tile对应一个sub-controller)产生,再合成的一个完整的web页面。这个方法比用一个单独的controller来控制所有Tile的页面要好,因为它允许独立的构建Tile,而不用担心怎样传递数据。
有几种方法能够把Action和一个View做为一个Tile:
在<insert>或<definition>中使用Action类名或Action URL。
让struts-config.xml中的Action指向一个definition名称。在tiles-onfig.xml文件中指定一个含URL的difinition和一个含有view的difinition。第一个difinition作为一个完整的Tile difinition(action+view),第二个difinition作为view difinition。
可以让多个view和一个controller结合。选择一个恰当的controller,对于有main view和error view来说是很有用的。和以前一样,但可以多个forward到一个view definition。
       将controller放入中Tile最简单的方法是在<insert>和<definition>中指定,可以是本地URL或一个类。在Jsp页面显示前controller被调用。controller使用共享的Tile内容填充Jsp页面,所以它可以读取、修改和添加Tile属性。controller一般用来做这么几件事情:model的数据被传递到view前进行处理;属性传递到view前对其进行修改或添加。
       你可以使用当前web应用程序的Structs Action URL来做为controller,你的action可以扩展org.apache.struts.action.TilesAction,来替代Structs Action类。TilesAction继承原来的execute()方法。还提供了一个新的execute()方法,这个方法多了"tileContext"参数,当你需要处理Tile的属性是很有用。
 <tiles:insert page="layout.jsp" controllerUrl="myAssociatedAction.do” >
 <tiles:put name="title" value="Test controller set in insert" />
 <tiles:put name="header" value="header.jsp" />
 <tiles:put name="body" value="body.jsp" />
 </tiles:insert>

Structs Action中的描述:
 <action path="/myAssociatedAction" type="org.apache.struts.example.tiles.MyAssociatedAction">
 </action>

Action中的描述:
 public final class MyAssociatedAction extends TilesAction {
  public ActionForward execute( ComponentContext context,ActionMapping mapping,ActionForm form,
                                               HttpServletRequest request, HttpServletResponse response)
  throws IOException, ServletException{
     String title = (String)context.getAttribute( "title" );
     System.out.println( "Original title" + title );
     context.putAttribute( "title", "New Title" );
     return null;
 }
}


如果你使用类名做为controller,就必须继承下面基类或接口中的一个:
        org.apache.struts.tiles.Controller:这是个controller接口定义了cintorller方法。这些方法接收包含当前Tile内容的参数和普通的servlet参数(request、response和servletContext)。
        org.apache.struts.tiles.ControllerSupport:这是个底层类,没有方法。
 <tiles:insert page="layout.jsp" controllerClass="org.apache.struts.example.tiles.test.TestTileController" >
 <tiles:put name="title" value="Test controller set in insert" />
 <tiles:put name="header" value="header.jsp" />
 <tiles:put name="body" value="body.jsp" />
 </tiles:insert>

在definition中使用的例子:
 <definition name="tileWithActionAsController" path="/actionAsController.do" >
 <put name="title" value="Title" />
 <put name="anAttribute" value="aValue" />
 </definition>

Action被用作controller:  <action path="/ actionAsController " type="org.apache.struts.example.tiles.ActionAsController">
 <forward name="failure" path="/failurePage.jsp"/>
 <forward name="success" path="success.definition"/>
 </action>


四.) 举个例子:RssChannel

在这个例子中,我们将创建一个Tile,通过指定的URL读取Rss channel的内容,再使用一个合适的layout把内容显示出来。Tile产生一个controller和view,controller从XML文件中读取channel内容,然后创建一个容易被view调用的bean做为model。channel feed的URL被当作Tile 的属性值。
这样做的优点是:

能够在页面的任何地方插入Tile。
可以在同一个Tile页面中插入多个不同的channel。
只需要简单的修改view就能更改channel。
每个Tile可以放置几个channel,方便使用。
注:在jakarta-struts-1.2.2中的tiles-documentation.war有相关的代码。
Definition:
tiles-examples-defs.xml
------------------------------------------------------------------------------------------------------------------------------------------
<definition name="examples.rssChannel.body" path="/examples/tiles/rssChannels.jsp" 
 controllerUrl="/examples/controller/rssChannel.do" >
    <putList name="urls" >
     <!--<add value="http://www.newsforge.com/newsforge.rss" /> -->
     <add value="http://xmlhack.com/rss.php" />
     <add value="http://lwn.net/headlines/rss" />
   </putList>
  </definition>

控制器是一个Action URL,在Structs配置文件中有声明: stucts-examples-config.xml
------------------------------------------------------------------------------------------------------------------------------------------ 
 <action    path="/controller/rssChannel"
                type="org.apache.struts.webapp.tiles.rssChannel.RssChannelsAction">
 </action>
这个Action没有forward到一个view,相关的view是一个Tile definition。

Contorller:
controller就是一个java类。它从Tile putList 属性中接收channel URL列表,用RSSDigester类来解析channel的内容。然后把bean中的相关内容做为model,通过Tile 属性传递给view。  public final class RssChannelsAction extends TilesAction {

    private static Log log = LogFactory.getLog(RssChannelsAction.class);
    public static final String CHANNELS_KEY = "CHANNELS";
    public static final String CHANNEL_URLS_KEY = "urls";
    public static final String CHANNEL_URL_KEY = "url";

    public ActionForward execute(ComponentContext context,ActionMapping mapping, ActionForm form,
                                                 HttpServletRequest request,HttpServletResponse response)
        throws Exception {
        log.debug("Enter Rss Channel Action");
        ActionMessages errors = new ActionMessages();
        // -- Retrieve parameters --
        // Urls can come from a list, or from a single attribute.
        List channels = (List) context.getAttribute(CHANNEL_URLS_KEY);
        if (channels == null) {
            Object url = context.getAttribute(CHANNEL_URL_KEY);
            channels = new ArrayList(1);
            channels.add(url);
        }
        log.debug("urls count" + channels.size());
        // -- Loop through channels --
        List channelBeans = new ArrayList(channels.size());
        try {
            for (int i = 0; i < channels.size(); i++) {
                RSSDigester digester = new RSSDigester();
                String url = (String) channels.get(i);
                // Add application path if needed
                if (url.startsWith("/")) {
                    url = toFullUrl(request, url);
                }
                log.debug("Channel url=" + url);
                Channel obj = (Channel) digester.parse(url);
                log.debug("Channel:" + obj);
                channelBeans.add(obj);
            }
           
        } catch (Throwable t) {
            errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("rss.access.error"));
            servlet.log(t.toString());
        }

        // -- Handle Errors ---
        if (!errors.isEmpty()) {
            this.saveErrors(request, errors);
            // If no input page, use error forwarding
            log.debug("Exit Rss Channel Action : error");
            return null;
        }

        // -- Save Bean, and Continue  ---
        log.debug("Exit Rss Channel Action");

        // Use Tile context to pass channels
        context.putAttribute(CHANNELS_KEY, channelBeans);

        return null;
    }

    /**
     * Compute Full local url from an url starting with "/".
     */
    private String toFullUrl(HttpServletRequest request, String url) {
        StringBuffer buff = new StringBuffer();
        buff.append(request.getScheme()).append("://").append(request.getServerName());
        if (request.getServerPort() != 80) {
            buff.append(":").append(request.getServerPort());
        }
        buff.append(request.getContextPath()).append(url);
        return buff.toString();
    }
}

 

View:
把Tile的CHANNELS属性中得到数据迭代显示出来。
<%--
/**
* Summarize channels as unadorned HTML.
*
* @param CHANNELS List of channels
*/
--%>
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tiles.tld" prefix="tiles" %>
<div align="center"><font size="+1"><b>
<tiles:importAttribute name="CHANNELS" scope="page"/>
<logic:iterate name="CHANNELS" id="CHANNEL" >
<TABLE border="0" cellspacing="0" cellpadding="4" width="100%" align="center" >
<TR>
<TD class="spanhd" ><logic:present name="CHANNEL" property="image">
<a href="<bean:write name="CHANNEL" property="link"/>">
<img src="<bean:write name="CHANNEL" property="image.URL"/>"></logic:present></a>
</TD>
<TD class="spanhd" width="100%"><bean:write name="CHANNEL" property="title"/> <a
href="<bean:write name="CHANNEL" property="link"/>">[home]</a></TD>
</TR>
<TD class="yellow" colspan="2"><bean:write name="CHANNEL" property="description"/></TD>
</TR>
<TR>
<TD class="datagrey" colspan="2">
<logic:iterate name="CHANNEL" property="items" id="ITEM">
<br><b><bean:write name="ITEM" property="title"/></b>
<br><bean:write name="ITEM" property="description"/>
<br>&nbsp;&nbsp;[ <a href="<bean:write name="ITEM" property="link"/>">more</a> ]
<br>
</logic:iterate>
</TD>
</TR>
</TABLE>
<br>
</logic:iterate>
</b></font></div>

从这个例子中可以看到,要更换channel,只需改变Tile definition中<putList>的值。

总结篇

一.) 常用到的layout
Tiles有个令人感兴趣的地方,它可以复用现有的layout,定义一个新的layout,简单改变一下属性设置就可以扩展一个layout。对于一个layout,只不过是以现有页面为基础,抽取并提供一些属性的描述。
注:在jakarta-struts-1.2.2中的tiles-documentation.war有相关的代码。

Classic layout
这个layout经常会被web站点采用。它提供典型的"header, menu, body ,footer",用<header>和<body>做为HTML页面的骨架,在恰当的地方放置header、menu、body、footer。
所需属性:
tiltle - String类型;
header、menu、body、footer - URL或definition名称。
调用layout的代码:
 <tiles:insert page="/layouts/classicLayout.jsp" flush="true">
 <tiles:put name="title" value="Browser Title" />
 <tiles:put name="header" value="/header.jsp" />
 <tiles:put name="footer" value="/footer.jsp" />
 <tiles:put name="menu" value="/menu.jsp" />
 <tiles:put name="body" value="definition.name" />
 </tiles:insert>

也能够在definition中调用:
 <definition name="mainLayout" path="/layouts/classicLayout.jsp">
 <put name="title" value="Browser Title" />
 <put name="header" value="/header.jsp" />
 <put name="footer" value="/footer.jsp" />
 <put name="menu" value="menu.main" />
 <put name="body" value="main.portal.body" />
 </definition>


layout的代码:  <HTML>
 <HEAD>
 <link rel=stylesheet href="<%=request.getContextPath()%>/layouts/stylesheet.css" type="text/css">
 <title><tiles:getAsString name="title"/></title>
 </HEAD>
 <body bgcolor="#ffffff" text="#000000" link="#023264" alink="#023264" vlink="#023264">
 <table border="0" width="100%" cellspacing="5">
 <tr><td colspan="2"><tiles:insert attribute="header" /></td>
 </tr>
 <tr><td width="140" valign="top"><tiles:insert attribute='menu'/></td>
 <td valign="top" align="left"><tiles:insert attribute='body' /></td>
 </tr>
 <tr><td colspan="2"><tiles:insert attribute="footer" /></td>
 </tr>
 </table></body></html>


Menu Layout
这个layout用于带有链接的菜单。一个菜单需要一个"item" bean列表,每个"item"包含一个子菜单的数据。可以用一个属性相同的menu layout来代替另一种menu layout(例如可以用vbox layout构建一个垂直的menu,下面会讲到)。
所需属性
title - String类型,做为菜单标题(可选)。
items - List类型,Items 是带有vlaue、link、tooltip、icon参数的bean。
调用layout的代码:  <definition name="examples.menu.settings" path="/layouts/menu.jsp" >
 <put name="title" value="Preferences" />
 <putList name="items" >
 <item value="my Portal Settings" link="/examples/myPortalSettings.jsp" classtype="org.apache.struts.tiles.beans.SimpleMenuItem" />
 <item value="my Menu Settings" link="/examples/myMenuSettings.jsp" classtype="org.apache.struts.tiles.beans.SimpleMenuItem" />
 </putList>
 </definition>

definition中描述了两个属性:tilte和list。list是一个item bean 列表,每个item相当于菜单中的一个选项,包含一些参数,value表示选项的标题,link表示链接。
layout的代码:  <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
 <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
 <%@ taglib uri="/WEB-INF/tiles.tld" prefix="tiles" %>
 <%@ page import="java.util.Iterator" %>

 <%-- Push tiles attributes in page context --%>
 <tiles:importAttribute /><table>
 <logic:present name="title">
 <tr><th colspan=2>
 <div align="left"><strong><tiles:getAsString name="title"/></strong></div></th>
 </tr>
 </logic:present>
 <%-- iterate on items list --%>
 <logic:iterate id="item" name="items" type="org.apache.struts.tiles.beans.MenuItem" >
 <% // Add site URL if link starts with "/"
 String link = item.getLink();
 if(link.startsWith("/") ) link = request.getContextPath() + link;
 %>
 <tr><td width="10" valign="top" ></td>
 <td valign="top" ><font size="-1"><a href="<%=link%>">
 <logic:notPresent name="item" property="icon"><%=item.getValue()%></logic:notPresent>
 <logic:present name="item" property="icon">
 <% // Add site URL if link starts with "/"
 String icon = item.getIcon();
 if(icon.startsWith("/") ) icon = request.getContextPath() + icon;
 %>
 <img src='<%=request.getContextPath()%><bean:write name="item" property="icon" scope="page"/>'
 alt='<bean:write name="item" property="tooltip" scope="page" ignore="true"/>' />
 </logic:present></a></font></td>
 </tr>
 </logic:iterate></table>


VBox 或 VStack Layout
这个layout用于垂直的显示Tile列表,常被菜单条或multi - columns layout采用。
所需属性
list - 要插入的列表名称或URL
调用的layout代码:  <definition name="examples.menu.bar" path="/layouts/vboxLayout.jsp" >
 <putList name="list" >
 <add value="examples.userMenu" />
 <add value="examples.menu.links" />
 <add value="doc.menu.links" />
 <add value="examples.menu.settings" />
 <add value="doc.menu.taglib.references" />
 <add value="doc.menu.printer.friendly" />
 <add value="examples.menu.admin" />
 </putList>


layout代码:  <%@ page import="java.util.Iterator"%>
 <%@ taglib uri="/WEB-INF/tiles.tld" prefix="tiles" %>
 <tiles:useAttribute id="list" name="list" classname="java.util.List" />
 <%  // 用Tile 属性初始化一个脚本变量。
       // 这里不使用<logic:iterate>标签,因为在JSP1.1不允许这么做。
 <%
 Iterator i=list.iterator();
 while( i.hasNext() )
 {
 String name= (String)i.next();
 %>
 <tiles:insert name="<%=name%>" flush="true" />
 <br>
 <%
 } // end loop
 %>


Multi-columns Layout
这个layout垂直显示Tile多行列表。每一行代表一个列表,常用来构建多个Tile主体的入口。
所需属性
numCols - 行数
list1 - 第一个Tile列表
list2、list3、listn - 第n个Tile类别(可选)
调用的代码:  <definition name="examples.portal.body" path="/layouts/columnsLayout.jsp" controllerUrl="/portal/myPortal.do" >
 <put name="numCols" value="2" />
 <putList name="list0" >
 <add value="/examples/tiles/portal/login.jsp" />
 <add value="/examples/tiles/portal/messages.jsp" />
 <add value="/examples/tiles/portal/newsFeed.jsp" />
 </putList>
 <putList name="list1" >
 <add value="/examples/tiles/portal/advert3.jsp" />
 <add value="/examples/tiles/portal/stocks.jsp" />
 <add value="/examples/tiles/portal/whatsNew.jsp" />
 <add value="/examples/tiles/portal/advert2.jsp" />
 </putList>
 </definition>


layout的代码:  <tiles:useAttribute id="numColsStr" name="numCols" classname="java.lang.String" />
 <table>
 <tr>
 <%
 int numCols = Integer.parseInt(numColsStr);
 ComponentContext context = ComponentContext.getContext( request );
 for( int i=0; i<numCols; i++ )
 {
 java.util.List list=(java.util.List)context.getAttribute( "list" + i );
 pageContext.setAttribute("list", list );
 if(list==null)
 System.out.println( "list is null for " + i );
 %>
 <td valign="top">
 <tiles:insert page="/layouts/vboxLayout.jsp" flush="true" >
 <tiles:put name="list" beanName="list" beanScope="page" />
 </tiles:insert>
 </td>
 <%
 } // end loop
 %>
 </tr>
 </table>

这边同样也不能使用<logic:iterate>标签,在JSP1.1不允许在一个标记体内插入另一个页面。
Center Layout
这个layout常由"top, left, center, right, bottom"组成,left和right部分是可选的。
所需属性
header、body、footer - 用difinition名称或URL显示相应的部分。
right、left - 用difinition名称或URL显示相应的部分(可选)。
调用layout的代码:和classic layout类似  <tiles:insert page="/layouts/centerLayout.jsp" flush="true">
 <tiles:put name="header" value="/header.jsp" />
 <tiles:put name="footer" value="/footer.jsp" />
 <tiles:put name="right" value="/menu.jsp" />
 <tiles:put name="left" value="/menuLeft.jsp" />
 <tiles:put name="body" value="definition.name" />
 </tiles:insert>

也可以忽略left和right部分:  <tiles:insert page="/layouts/centerLayout.jsp" flush="true">
 <tiles:put name="header" value="/header.jsp" />
 <tiles:put name="footer" value="/footer.jsp" />
 <tiles:put name="body" value="definition.name" />
 </tiles:insert>


layout的代码:  <%@ taglib uri="/WEB-INF/tiles.tld" prefix="tiles" %>
 <table border="0" width="100%" cellspacing="5">
 <tr>
 <td colspan="3"><tiles:insert attribute="header" /></td>
 </tr>
 <tr>
 <td width="140" valign="top">
 <tiles:insert attribute=right ignore='true'/>
 </td>
 <td valign="top" align="left">
 <tiles:insert attribute='body' />
 </td>
 <td valign="top" align="left">
 <tiles:insert attribute='left' ignore='true'/>
 </td>
 </tr>
 <tr>
 <td colspan="3">
 <tiles:insert attribute="footer" />
 </td>
 </tr>
 </table>


Tabs Layout
这个layout用表格的形式来呈现Tile类表。Tabs Layout有一个body区域,用来显示当前被选中的Tile;还有一个索引区域,显示可用的表格或Tile。
所需属性
tabList - 列表的URL或definition名称,我们用MenuItem来存储数据。
selectedIndex - 默认被选中的表格
parameterName - HTTP参数名,在HTTP request中存储选中的Tile信息。
调用layout的代码:创建了带有三个索引的tab layout  <definition name="examples.tabs.body" path="/layouts/tabsLayout.jsp" >
 <put name="selectedIndex" value="0" />
 <put name="parameterName" value="selected" />
 <putList name="tabList" >
 <item value="Doc Home" link="/index.jsp" classtype="org.apache.struts.tiles.beans.SimpleMenuItem" />
 <item value="Quick overview" link="/doc/quickOverview.jsp" classtype="org.apache.struts.tiles.beans.SimpleMenuItem" />
 <item value="Tutorial" link="/doc/tutorial.jsp" classtype="org.apache.struts.tiles.beans.SimpleMenuItem" />
 </putList>
 </definition>


layout的代码:  <%@ taglib uri="/WEB-INF/tiles.tld" prefix="tiles" %>
 <tiles:useAttribute name="parameterName" classname="java.lang.String" />
 <tiles:useAttribute id="selectedIndexStr" name="selectedIndex" ignore="true" classname="java.lang.String" />
 <tiles:useAttribute name="tabList" classname="java.util.List" />
 <%
 String selectedColor="#98ABC7";
 String notSelectedColor="#C0C0C0";
 int index = 0; // Loop index
 int selectedIndex = 0;
 // Check if selected come from request parameter
 try {
 selectedIndex = Integer.parseInt(selectedIndexStr);
 selectedIndex = Integer.parseInt(request.getParameter( parameterName ));
 }
 catch( java.lang.NumberFormatException ex )
 { // do nothing
 }
 // Check selectedIndex bounds
 if( selectedIndex < 0 || selectedIndex >= tabList.size() ) selectedIndex = 0;
 String selectedBody =
 ((org.apache.struts.tiles.beans.MenuItem)tabList.get(selectedIndex)).getLink(); // Selected body
 %><table border="0" cellspacing="0" cellpadding="0">
 <%-- Draw tabs --%>
 <tr><td width="10"">&nbsp;</td>
 <td>
 <table border="0" cellspacing="0" cellpadding="5">
 <tr><logic:iterate id="tab" name="tabList" type="org.apache.struts.tiles.beans.MenuItem" >
 <% // compute href
 String href = request.getRequestURI() + "?"+parameterName + "=" + index;
 String color = notSelectedColor;
 if( index == selectedIndex )
 {
 selectedBody = tab.getLink();
 color = selectedColor;
 } // enf if
 index++;
 %>
 <td bgcolor="<%=color%>"><a href="<%=href%>" /><%=tab.getValue()%></a></td>
 <td width="1" ></td>
 </logic:iterate>
 </tr></table></td>
 <td width="10" >&nbsp;</td></tr>
 <tr><td height="5" bgcolor="<%=selectedColor%>" colspan="3" >&nbsp;</td></tr>
 <%-- Draw body --%>
 <tr><td width="10" bgcolor="<%=selectedColor%>">&nbsp;</td>
 <td><tiles:insert name="<%=selectedBody%>" flush="true" /></td>
 <td width="10" bgcolor="<%=selectedColor%>">&nbsp;</td></tr>
 <tr><td height="5" bgcolor="<%=selectedColor%>" colspan="3" >&nbsp;</td>
 </tr></table> 
 

这篇关于Tiles的使用-遗补和总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/580242

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画