рд╣реИрд▓реЛ рдкреНрд░рд┐рдп% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо%ред
рдЖрдЬ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде
CppCMS рдкрд░ рдПрдХ рд╡реЗрдм рд╕рд╛рдЗрдЯ (C ++ рдореЗрдВ рдПрдХ
рдЕрд╕реНрдерд╛рдпреА рдкреБрд╕реНрддрдХрд╛рд▓рдп) рдмрдирд╛рдиреЗ рдХреЗ рдЕрдкрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЖрдк рдЗрд╕реЗ "рдиреМрд╕рд┐рдЦрд┐рдпрд╛ CppCMS рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдорджрдж рдХрд░рдирд╛" рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
C ++ рдореЗрдВ рд╕рд╛рдЗрдЯ рдХреНрдпреЛрдВ рд▓рд┐рдЦреЗрдВ
рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдгрдп рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рддрд░реНрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╡рд┐рдз рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП, "рднрд╛рд╖рд╛ рд╕реНрдХреВрд▓реЛрдВ" рдХреЗ рдпреБрджреНрдз рдХреЛ рднрдбрд╝рдХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдореИрдВ рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рдирддрд╛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реВрдВрдЧрд╛: "рдореИрдВрдиреЗ рдЗрд╕реЗ рдЦрд░реАрджрд╛ред рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИред рдореИрдВ рдЬрд╛рддрд╛ рд╣реВрдВред рдореИрдВ рдмреЗрдЪрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛! "
рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рдореЗрдВ рд╕реЗ, рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╕реНрдерд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╣реИред
рдХреБрдЫ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ
рд╕рд╛рдЗрдЯ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕реЗ (CppCMS) рдПрдХ рд╡рд░реНрдХрд┐рдВрдЧ рдорд╢реАрди рдкрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ Boost c ++, pcre, crypt, python, icu рдХреЛ рдЗрд╕рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдФрд░, рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ * nix рд╕рд┐рд╕реНрдЯрдо рдХреЗ рддрд╣рдд рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред
рдирд┐рд░реНрдорд╛рдг рдЦреБрдж рд╣реА рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ:
mkdir build cd build cmake .. make make install
рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд╕рдм рдХреБрдЫ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЛрдб рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдХрднреА рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реБрдЖред
рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдПрдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╕реНрдЯрдо рдирд┐рд░реНрдорд╛рдг рдЪрд░рдгреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд "рдкрд╛рд░реНрд╕рд░" рд╣реИ, рдореИрдВ QtCreator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
рдЙрдкрд░реЛрдХреНрдд рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореИрдВ рдЖрдЧреЗ рдХреЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рд╕рд╛рдЗрдЯ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдБ рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреА (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЪрд░рдг рдореЗрдВ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд░рдг" рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛)
рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, QtCreator рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ * .tmpl рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдЬреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ tmpl.xml рдлрд╝рд╛рдЗрд▓ (рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд HTML рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ) qtcreator / рдЬреЗрдиреЗрд░рд┐рдХ-рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ / tmpl.xml рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
рдлрд╛рдЗрд▓ рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE language SYSTEM "language.dtd" [ <!ENTITY name "[A-Za-z_:][\w.:_-]*"> <!ENTITY entref "&(#[0-9]+|#[xX][0-9A-Fa-f]+|&name;);"> ]> <language name="TMPL" version="1" kateversion="2.4" section="Markup" extensions="*.tmpl" mimetype="text/tmpl" author="Wilbert Berendsen ( original HTML author)(wilbert@kde.nl)" license="LGPL" priority="10"> <highlighting> <contexts> <context name="Start" attribute="Normal Text" lineEndContext="#stay"> <IncludeRules context="FindHTML" /> </context> <context name="FindHTML" attribute="Normal Text" lineEndContext="#stay"> <DetectSpaces/> <DetectIdentifier/> <StringDetect attribute="Comment" context="Comment" String="<!--" beginRegion="comment" /> <StringDetect attribute="Commenttmpl" context="Commenttmpl" String="<%" beginRegion="commenttmpl" /> <StringDetect attribute="CDATA" context="CDATA" String="<![CDATA[" beginRegion="cdata" /> <RegExpr attribute="Doctype" context="Doctype" String="<!DOCTYPE\s+" beginRegion="doctype" /> <RegExpr attribute="Processing Instruction" context="PI" String="<\?[\w:-]*" beginRegion="pi" /> <RegExpr attribute="Element" context="CSS" String="<style\b" insensitive="TRUE" beginRegion="style" /> <RegExpr attribute="Element" context="JS" String="<script\b" insensitive="TRUE" beginRegion="script" /> <RegExpr attribute="Element" context="El Open" String="<pre\b" insensitive="TRUE" beginRegion="pre" /> <RegExpr attribute="Element" context="El Open" String="<div\b" insensitive="TRUE" beginRegion="div" /> <RegExpr attribute="Element" context="El Open" String="<table\b" insensitive="TRUE" beginRegion="table" /> <RegExpr attribute="Element" context="El Open" String="<ul\b" insensitive="TRUE" beginRegion="ul" /> <RegExpr attribute="Element" context="El Open" String="<ol\b" insensitive="TRUE" beginRegion="ol" /> <RegExpr attribute="Element" context="El Open" String="<dl\b" insensitive="TRUE" beginRegion="dl" /> <RegExpr attribute="Element" context="El Open" String="<&name;" /> <RegExpr attribute="Element" context="El Close" String="</pre\b" insensitive="TRUE" endRegion="pre" /> <RegExpr attribute="Element" context="El Close" String="</div\b" insensitive="TRUE" endRegion="div" /> <RegExpr attribute="Element" context="El Close" String="</table\b" insensitive="TRUE" endRegion="table" /> <RegExpr attribute="Element" context="El Close" String="</ul\b" insensitive="TRUE" endRegion="ul" /> <RegExpr attribute="Element" context="El Close" String="</ol\b" insensitive="TRUE" endRegion="ol" /> <RegExpr attribute="Element" context="El Close" String="</dl\b" insensitive="TRUE" endRegion="dl" /> <RegExpr attribute="Element" context="El Close" String="</&name;" /> <IncludeRules context="FindDTDRules" /> <IncludeRules context="FindEntityRefs" /> </context> <context name="FindEntityRefs" attribute="Other Text" lineEndContext="#stay"> <StringDetect attribute="Commenttmpl" context="Commenttmpl" String="<%" beginRegion="commenttmpl" /> <RegExpr attribute="EntityRef" context="#stay" String="&entref;" /> <AnyChar attribute="Error" context="#stay" String="&<" /> </context> <context name="FindPEntityRefs" attribute="Other Text" lineEndContext="#stay"> <RegExpr attribute="EntityRef" context="#stay" String="&entref;" /> <RegExpr attribute="PEntityRef" context="#stay" String="%&name;;" /> <AnyChar attribute="Error" context="#stay" String="&%" /> </context> <context name="FindAttributes" attribute="Other Text" lineEndContext="#stay"> <RegExpr attribute="Attribute" context="#stay" String="&name;" column="0"/> <RegExpr attribute="Attribute" context="#stay" String="\s+&name;" /> <DetectChar attribute="Attribute" context="Value" char="=" /> </context> <context name="FindDTDRules" attribute="Other Text" lineEndContext="#stay"> <RegExpr attribute="Doctype" context="Doctype Markupdecl" String="<!(ELEMENT|ENTITY|ATTLIST|NOTATION)\b" /> </context> <context name="Comment" attribute="Comment" lineEndContext="#stay"> <DetectSpaces/> <IncludeRules context="##Alerts" /> <DetectIdentifier/> <StringDetect attribute="Comment" context="#pop" String="-->" endRegion="comment" /> <RegExpr attribute="Error" context="#stay" String="-(-(?!->))+" /> </context> <context name="Commenttmpl" attribute="Commenttmpl" lineEndContext="#stay"> <DetectSpaces/> <DetectIdentifier/> <StringDetect attribute="Commenttmpl" context="#pop" String="%>" endRegion="commenttmpl" /> </context> <context name="CDATA" attribute="Other Text" lineEndContext="#stay"> <DetectSpaces/> <DetectIdentifier/> <StringDetect attribute="CDATA" context="#pop" String="]]>" endRegion="cdata" /> <StringDetect attribute="EntityRef" context="#stay" String="]]>" /> </context> <context name="PI" attribute="Other Text" lineEndContext="#stay"> <Detect2Chars attribute="Processing Instruction" context="#pop" char="?" char1=">" endRegion="pi" /> </context> <context name="Doctype" attribute="Other Text" lineEndContext="#stay"> <DetectChar attribute="Doctype" context="#pop" char=">" endRegion="doctype" /> <DetectChar attribute="Doctype" context="Doctype Internal Subset" char="[" beginRegion="int_subset" /> </context> <context name="Doctype Internal Subset" attribute="Other Text" lineEndContext="#stay"> <DetectChar attribute="Doctype" context="#pop" char="]" endRegion="int_subset" /> <IncludeRules context="FindDTDRules" /> <StringDetect attribute="Comment" context="Comment" String="<!--" beginRegion="comment" /> <RegExpr attribute="Processing Instruction" context="PI" String="<\?[\w:-]*" beginRegion="pi" /> <IncludeRules context="FindPEntityRefs" /> </context> <context name="Doctype Markupdecl" attribute="Other Text" lineEndContext="#stay"> <DetectChar attribute="Doctype" context="#pop" char=">" /> <DetectChar attribute="Value" context="Doctype Markupdecl DQ" char=""" /> <DetectChar attribute="Value" context="Doctype Markupdecl SQ" char="'" /> </context> <context name="Doctype Markupdecl DQ" attribute="Value" lineEndContext="#stay"> <DetectChar attribute="Value" context="#pop" char=""" /> <IncludeRules context="FindPEntityRefs" /> </context> <context name="Doctype Markupdecl SQ" attribute="Value" lineEndContext="#stay"> <DetectChar attribute="Value" context="#pop" char="'" /> <IncludeRules context="FindPEntityRefs" /> </context> <context name="El Open" attribute="Other Text" lineEndContext="#stay"> <Detect2Chars attribute="Element" context="#pop" char="/" char1=">" /> <DetectChar attribute="Element" context="#pop" char=">" /> <IncludeRules context="FindAttributes" /> <RegExpr attribute="Error" context="#stay" String="\S" /> </context> <context name="El Close" attribute="Other Text" lineEndContext="#stay"> <DetectChar attribute="Element" context="#pop" char=">" /> <RegExpr attribute="Error" context="#stay" String="\S" /> </context> <context name="El Close 2" attribute="Other Text" lineEndContext="#stay"> <DetectChar attribute="Element" context="#pop#pop#pop" char=">" /> <RegExpr attribute="Error" context="#stay" String="\S" /> </context> <context name="El Close 3" attribute="Other Text" lineEndContext="#stay"> <DetectChar attribute="Element" context="#pop#pop#pop#pop" char=">" /> <RegExpr attribute="Error" context="#stay" String="\S" /> </context> <context name="CSS" attribute="Other Text" lineEndContext="#stay"> <Detect2Chars attribute="Element" context="#pop" char="/" char1=">" endRegion="style" /> <DetectChar attribute="Element" context="CSS content" char=">" /> <IncludeRules context="FindAttributes" /> <RegExpr attribute="Error" context="#stay" String="\S" /> </context> <context name="CSS content" attribute="Other Text" lineEndContext="#stay"> <RegExpr attribute="Element" context="El Close 2" String="</style\b" insensitive="TRUE" endRegion="style" /> <IncludeRules context="##CSS" includeAttrib="true"/> </context> <context name="JS" attribute="Other Text" lineEndContext="#stay"> <Detect2Chars attribute="Element" context="#pop" char="/" char1=">" endRegion="script" /> <DetectChar attribute="Element" context="JS content" char=">" /> <IncludeRules context="FindAttributes" /> <RegExpr attribute="Error" context="#stay" String="\S" /> </context> <context name="JS content" attribute="Other Text" lineEndContext="#stay"> <RegExpr attribute="Element" context="El Close 2" String="</script\b" insensitive="TRUE" endRegion="script" /> <RegExpr attribute="Comment" context="JS comment close" String="//(?=.*</script\b)" insensitive="TRUE" /> <IncludeRules context="##JavaScript" includeAttrib="true"/> </context> <context name="JS comment close" attribute="Comment" lineEndContext="#pop"> <RegExpr attribute="Element" context="El Close 3" String="</script\b" insensitive="TRUE" endRegion="script" /> <IncludeRules context="##Alerts" /> </context> <context name="Value" attribute="Other Text" lineEndContext="#stay" fallthrough="true" fallthroughContext="Value NQ"> <DetectChar attribute="Value" context="Value DQ" char=""" /> <DetectChar attribute="Value" context="Value SQ" char="'" /> <DetectSpaces /> </context> <context name="Value NQ" attribute="Other Text" lineEndContext="#pop#pop" fallthrough="true" fallthroughContext="#pop#pop"> <IncludeRules context="FindEntityRefs" /> <RegExpr attribute="Value" context="#stay" String="/(?!>)" /> <RegExpr attribute="Value" context="#stay" String="[^/><"'\s]" /> </context> <context name="Value DQ" attribute="Value" lineEndContext="#stay"> <DetectChar attribute="Value" context="#pop#pop" char=""" /> <IncludeRules context="FindEntityRefs" /> </context> <context name="Value SQ" attribute="Value" lineEndContext="#stay"> <DetectChar attribute="Value" context="#pop#pop" char="'" /> <IncludeRules context="FindEntityRefs" /> </context> </contexts> <itemDatas> <itemData name="Normal Text" defStyleNum="dsNormal" /> <itemData name="Other Text" defStyleNum="dsNormal" spellChecking="false" /> <itemData name="Comment" defStyleNum="dsComment" /> <itemData name="Commenttmpl" defStyleNum="dsComment" color="#66f" /> <itemData name="CDATA" defStyleNum="dsBaseN" bold="1" spellChecking="false" /> <itemData name="Processing Instruction" defStyleNum="dsKeyword" spellChecking="false" /> <itemData name="Doctype" defStyleNum="dsDataType" bold="1" spellChecking="false" /> <itemData name="Element" defStyleNum="dsKeyword" spellChecking="false" /> <itemData name="Attribute" defStyleNum="dsOthers" spellChecking="false" /> <itemData name="Value" defStyleNum="dsString" color="#a00" spellChecking="false" /> <itemData name="EntityRef" defStyleNum="dsDecVal" spellChecking="false" /> <itemData name="PEntityRef" defStyleNum="dsDecVal" spellChecking="false" /> <itemData name="Error" defStyleNum="dsError" spellChecking="false" /> </itemDatas> </highlighting> <general> <comments> <comment name="multiLine" start="<!--" end="-->" /> </comments> </general> </language>
рдЕрдм рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдкрдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП:
LIBS += -L/usr/local/lib/ -lbooster -lcppcms INCLUDEPATH += /usr/local/include DEPENDPATH += /usr/local/include
Main.cpp рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рд╕реЗ рднрд░реЗрдВ:
#include <cppcms/applications_pool.h> #include <cppcms/url_dispatcher.h> #include <cppcms/http_response.h> #include <cppcms/application.h> #include <cppcms/url_mapper.h> #include <cppcms/service.h> //------------------------------------------------------------------------------------- // Dsc: , // //------------------------------------------------------------------------------------- class WebSite : public cppcms::application{ public: //------------------------------------------------------------------------------------- // Dsc: , //------------------------------------------------------------------------------------- WebSite(cppcms::service &s) : cppcms::application(s) {} //------------------------------------------------------------------------------------- // Dsc: , // ( ) //------------------------------------------------------------------------------------- virtual void main(std::string path) { response().out() << "Hello!"; } }; //------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------- int main(int argc,char **argv) { try { // cppcms::service srv(argc,argv); // srv.applications_pool().mount(cppcms::applications_factory<WebSite>()); // srv.run(); } catch(std::exception const &e) { std::cerr << "Failed: " << e.what() << std::endl; std::cerr << booster::trace(e) << std::endl; return 1; } return 0; }
рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реНрдг рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХрд╛ рд╕реНрдерд╛рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдмрд╛рдЗрдирд░реА рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
WebApp.bin -c config.json
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
{ "WebSite" : { "root" : "", "host" : "localhost:8080", "locdomain" : "localhost", }, "service" : { "ip" : "0.0.0.0", "api" : "http", "port" : 8080 }, "http" : { "script" : "/mb.fcgi" , "rewrite" : [ { "regex" : ".*" , "pattern" : "/mb.fcgi$0" } ], } }
рдЗрддрдирд╛ рдХрд╛рдлреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ "рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рд╡рд┐рдиреНрдпрд╛рд╕" рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ
рдЗрд╕рд▓рд┐рдП, рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдБ рдФрд░ рдЦреЛрд▓реЗрдВред
рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА? рдирд╣реАрдВ?
рдпрд╣ рд╕рдЪ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЦреБрдж рдХреЛ рдПрдХ рднреЛрдЬ рд▓рд╛рдЗрди рдЖрдЙрдЯрдкреБрдЯ рддрдХ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрджрд╛рд╣рд░рдг рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдЪрд▓реЛ рдкрд╣рд▓реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдПрдХ * .cpp рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ "рдЪрд╛рд▓реВ" рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдбрд╛рдпрдирд╛рдорд┐рдХ рдбреЗрдЯрд╛ (рдЯреЗрдореНрдкрд▓реЗрдЯ рдбреЗрдЯрд╛) рдХреА рд╕рдВрд░рдЪрдирд╛ рд╡рд╛рд▓реА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЙрдиреНрд╣реЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
data / tmpl_master.h
#ifndef TMPL_MASTER_H #define TMPL_MASTER_H #include <cppcms/view.h> namespace Data { //------------------------------------------------------------------------------------- // Dsc: //------------------------------------------------------------------------------------- struct infoPage { std::string title; // std::string description; // std::string keywords; // std::map<std::string,std::string> menuList; // (url,desc) //------------------------------------------------------------------------------------- // Dsc: , //------------------------------------------------------------------------------------- infoPage() : title (""), description(""), keywords (""), menuList ( ) {} //------------------------------------------------------------------------------------- // Dsc: , //------------------------------------------------------------------------------------- ~infoPage(){} }; //------------------------------------------------------------------------------------- // Dsc: //------------------------------------------------------------------------------------- struct Master :public cppcms::base_content { infoPage page; //------------------------------------------------------------------------------------- // Dsc: //------------------------------------------------------------------------------------- Master() : page() {} //------------------------------------------------------------------------------------- // Dsc: //------------------------------------------------------------------------------------- ~Master(){} }; } #endif
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд╕реА рднреА рд╕реНрдорд╛рд░реНрдЯ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЪрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдХрдВрдЯреЗрдирд░ рд╣реЛрддреЗ рд╣реИрдВред
рдЪрд▓рд┐рдП рдЦреБрдж рд╣реА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрд╕рдореЗрдВ рдорд╛рд╕реНрдЯрд░.рдордкреНрд▓ рдлрд╝рд╛рдЗрд▓, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде:
<% c++ #include "data/tmpl_master.h" %> <% skin defskin %> <% view Master uses Data::Master %> <% template page_main() %>MAIN TEMPLATE<% end %> <% template page_footer() %> <% end %> <% template page_left_sidebar() %> <% end %> <% template render() %> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title><%= page.title %></title> <meta name="keywords" content="<%= page.keywords %>" /> <meta name="description" content="<%= page.description %>" /> <link href="/media/css/style.css" rel="stylesheet"> </head> <body> <div class="wrapper"> <header class="header"> <div class="nav" > <% foreach menuItem in page.menuList %> <ul> <% item %> <li><a href="<%= menuItem.first %>"><%= menuItem.second %></a></li> <% end %> </ul> <% end %> </div> </header> <div class="middle"> <div class="container"> <main class="content"><% include page_main() %></main> </div> <aside class="left-sidebar"> <div> <% include page_left_sidebar() %> </div> </aside> </div> </div> <footer class="footer"><% include page_footer() %></footer> </body> </html> <% end template %> <% end view %> <% end skin %>
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рд╣реИ?
рдмрд╣реБрдд рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ
<% c++ #include "data/tmpl_master.h" %>
рд╣рдо рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреАред
рд▓рд╛рдЗрди
<% skin defskin %>
рд╡рд░реНрддрдорд╛рди рддреНрд╡рдЪрд╛ рдХреЗ рдирд╛рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рд╛рдЗрдЯ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рд╕реНрдкреНрд▓реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд▓рд╛рдЗрди
<% view Master uses Data::Master %>
рд╡рд░реНрддрдорд╛рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдирд╛рдо "рдорд╛рд╕реНрдЯрд░" рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдмрд╛рдж рдореЗрдВ рд╣рдо рдЗрд╕реЗ рдкреГрд╖реНрда рднрд░рдиреЗ рдХреЗ рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВрдЧреЗ), рдФрд░ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ :: рдорд╛рд╕реНрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рднреА рдмрдирд╛рддреЗ рд╣реИрдВред C ++ рдореЗрдВ рдХреМрди рд╕рд╛ рдЕрдиреБрд╡рд╛рдж тАЬрдбреЗрдЯрд╛ :: рдорд╛рд╕реНрдЯрд░ рд╕рдВрджрд░реНрднтАЭ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ (рдпрджрд┐ рдЖрдк рд╡рд┐рд╡рд░рдг рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдЙрддреНрдкрдиреНрди рдлрд╝рд╛рдЗрд▓ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ)
рд▓рд╛рдЗрдиреНрд╕
<% template page_main() %>MAIN TEMPLATE<% end %>
<% template page_footer() %> <% end %>
<% template page_left_sidebar() %> <% end %>
<% template page_main() %>MAIN TEMPLATE<% end %>
<% template page_footer() %> <% end %>
<% template page_left_sidebar() %> <% end %>
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдП рдЬрд╛рдПрдВрдЧреЗ рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЕрд░реНрдерд╛рддред
virtual const char* page_main(){ return "MAIN TEMPLATE"; }
, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред )ред
рдЪрд▓реЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ C ++ рдХрдВрдкрд╛рдЗрд▓рд░ tmpl рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рдЧрд▓реЗрдЧрд╛ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рдлрд╝рд╛рдЗрд▓ "make_templates.sh" рдмрдирд╛рдПрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдЙрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ (рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдпрд╛ рддреЛ рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдХреЗ рдпрд╛ рдЖрдкрдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ "рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рднрд╛рдЧ" рдореЗрдВ рджрд░реНрдЬ рдХрд░рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдЕрдм QtCreator рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдЖрдкрдХреЛ "рдХрд╕реНрдЯрдо рд╕реНрдЯреЗрдк" рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛
рдЖрджреЗрд╢: "./make_templates.sh"
рдХрд╛рд░реНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛: "% {sourceDir}"
рдХрдорд╛рдВрдб рддрд░реНрдХ: "-i% {sourceDir} -o% {buildDir}"
рдлрд╝рд╛рдЗрд▓ рдХреЛ "рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп" рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВред
рдпрджрд┐ рдЕрд╕реЗрдВрдмрд▓реА рд╕рдлрд▓ рд░рд╣реА, рддреЛ libcpp_defskin.so рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдб рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред
рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдпрд╛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХреА рд╣реИ, рдореИрдВ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╣рд▓реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЯреАрдПрдордкреАрдПрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдХреНрд╕рд░ рдмрджрд▓рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдзрдиреНрдпрд╡рд╛рдж рдХрд╛ рдХрд╛рдо рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддрд╛рдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдмрдВрдзреЗ рд╣реЛрдВ - рдЖрдкрдХреЛ config.json рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛
{ "WebSite" : { "root" : "", "host" : "localhost:8080", "locdomain" : "localhost", }, "service" : { "ip" : "0.0.0.0", "api" : "http", "port" : 8080 }, "http" : { "script" : "/mb.fcgi" , "rewrite" : [ { "regex" : "/media(/.+)", "pattern" : "$1" }, { "regex" : ".*" , "pattern" : "/mb.fcgi$0" } ], }, "views" : { "default_skin" : "defskin" , "paths" : [ "./" ], "skins" : [ "cpp_defskin" ], }, }
рдФрд░ main.cpp рдореЗрдВ рдЙрдЪрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ:
#include "data/tmpl_master.h" ... WebSite::main(std::string path) { Data::Master tmpl; tmpl.page.title = path; tmpl.page.description = "description"; tmpl.page.keywords = "keywords"; tmpl.page.menuList.insert(std::pair<std::string,std::string>("/","MAIN")); tmpl.page.menuList.insert(std::pair<std::string,std::string>("/else","ELSE")); render("Master",tmpl); }
рдЕрдм рдЬрдм рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд░реБрдХреЛ, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реАрдПрд╕рдПрд╕ рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛, рдЕрдм рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреВрдВрдЧрд╛ред
Config.json рдореЗрдВ рдПрдХ рдФрд░ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝реЗрдВ
"file_server" : { "enable" : true, "listing" : true, "document_root" : "./media" },
рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЦрдВрдб рдХреЗ рд╕рд╛рде рд╣рдо рдмрд╛рдЗрдирд░реА рдХреЛ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдФрд░ рдЬрд┐рд╕ рдирд┐рдпрдо рд╕реЗ рд╡рд╣ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЕрдиреБрднрд╛рдЧ http
{ "regex" : "/media(/.+)", "pattern" : "$1" },
рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ
рдпрд╣ рд╣реИ, / рдореАрдбрд┐рдпрд╛ / рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдЕрдиреБрд░реЛрдз рдХреЛ "рдлрд╝рд╛рдЗрд▓ рд╕рд░реНрд╡рд░" рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдореАрдбрд┐рдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ, рдФрд░ make_templates.sh рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдЖрдЗрдЯрдо рднреА рдЬреЛрдбрд╝реЗрдВ:
рдореАрдбрд┐рдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ (рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЛрд░реНрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ), css рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ, рдФрд░ рдЗрд╕рдореЗрдВ style.css рдлрд╝рд╛рдЗрд▓
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } body { line-height: 1; } ol, ul { list-style: none; } blockquote, q { quotes: none; } blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } table { border-collapse: collapse; border-spacing: 0; } html { height: 100%; } article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } body { font: 12px/18px Arial, sans-serif; width: 100%; height: 100%; } .wrapper { width: 800px; margin: 0 auto; min-height: 100%; height: auto !important; height: 100%; } .header { height: 50px; background: #FFE680; } .middle { width: 100%; padding: 0 0 50px; position: relative; } .middle:after { display: table; clear: both; content: ''; } .container { width: 100%; float: left; overflow: hidden; } .content { padding: 0 270px 0 270px; } .left-sidebar { float: left; width: 250px; margin-left: -100%; position: relative; background: #B5E3FF; } .footer { width: 800px; margin: -50px auto 0; height: 50px; background: #BFF08E; position: relative; }
рд╣рдо рдлрд┐рд░ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рдЪреВрдВрдХрд┐ рд╕рд╛рдЗрдЯ рдиреМрд╕рд┐рдЦрд┐рдП рдорд╛рд╕реНрдЯрд░ рдХреЗ рдкрд╣рд▓реЗ рдХрд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реИ - рдЖрдк рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕
рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рддрдВрддреНрд░ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИред рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдбреЗрдЯрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ tmpl_news.h рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ
#ifndef TMPL_NEWS_H #define TMPL_NEWS_H #include "tmpl_master.h" namespace Data {
рд╕рд╛рде рд╣реА news.tmpl рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
<% c++ #include "data/tmpl_news.h" %> <% skin defskin %> <% view News uses Data::News extends Master %> <% template page_main() %><%= mainNews %><% end %> <% end view %> <% end skin %>
рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрде рдЬреЛрдбрд╝реЗрдВ (рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП):
TEMPLATES="$INPUT/templates/master.tmpl" TEMPLATES="$TEMPLATES $INPUT/templates/news.tmpl"
Main.cpp рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ
#include <cppcms/applications_pool.h> #include <cppcms/url_dispatcher.h> #include <cppcms/http_response.h> #include <cppcms/application.h> #include <cppcms/url_mapper.h> #include <cppcms/service.h> #include "data/tmpl_master.h" #include "data/tmpl_news.h" //------------------------------------------------------------------------------------- // Dsc: , // //------------------------------------------------------------------------------------- class WebSite : public cppcms::application{ public: //------------------------------------------------------------------------------------- // Dsc: , //------------------------------------------------------------------------------------- WebSite(cppcms::service &s) : cppcms::application(s) { dispatcher().assign("/news(.*)",&WebSite::news,this,1); mapper().assign("news","/news"); dispatcher().assign("(/?)",&WebSite::master,this,1); mapper().assign("master","/"); } //------------------------------------------------------------------------------------- // Dsc: , // ( ) //------------------------------------------------------------------------------------- virtual void main(std::string path) { cppcms::application::main(path); } //------------------------------------------------------------------------------------- // Dsc: //------------------------------------------------------------------------------------- virtual void master(std::string path) { Data::Master tmpl; tmpl.page.title = path; tmpl.page.description = "description"; tmpl.page.keywords = "keywords"; tmpl.page.menuList.insert(std::pair<std::string,std::string>("/","MASTER")); tmpl.page.menuList.insert(std::pair<std::string,std::string>("/news","NEWS")); render("Master",tmpl); } //------------------------------------------------------------------------------------- // Dsc: //------------------------------------------------------------------------------------- virtual void news(std::string path) { Data::News tmpl; tmpl.page.title = path; tmpl.page.description = "description"; tmpl.page.keywords = "keywords"; tmpl.page.menuList.insert(std::pair<std::string,std::string>("/","MASTER")); tmpl.page.menuList.insert(std::pair<std::string,std::string>("/news","NEWS")); tmpl.mainNews = "! !"; render("News",tmpl); } }; //------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------- int main(int argc,char **argv) { try { // cppcms::service srv(argc,argv); // srv.applications_pool().mount(cppcms::applications_factory<WebSite>()); // srv.run(); } catch(std::exception const &e) { std::cerr << "Failed: " << e.what() << std::endl; std::cerr << booster::trace(e) << std::endl; return 1; } return 0; } }
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореБрдЦреНрдп рдмрджрд▓рд╛рд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╣реБрдЖ, рдЬрд╣рд╛рдВ рд╣рдордиреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рдХрд┐рд╕ рдкреЗрдЬ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИредрдЕрдм рдпреЗ рдкреГрд╖реНрда рд╡рд┐рднрд┐рдиреНрди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВредрдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╡рд╣ рдХреНрд░рдо рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХреА рдЬрд╛рддреА рд╣реИ (рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдмрд╛рдж рд╡рдВрд╢рдЬреЛрдВ рдХреА рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)редрдЗрд╕ рдкрд░, рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред