??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美日韩精品久久,亚洲午夜高清视频,亚洲第一福利在线观看http://www.aygfsteel.com/rendong/category/13647.htmlzh-cnFri, 02 Mar 2007 06:51:51 GMTFri, 02 Mar 2007 06:51:51 GMT60 Struts Tiles讲解http://www.aygfsteel.com/rendong/archive/2006/08/02/61417.htmlrendongrendongWed, 02 Aug 2006 15:11:00 GMThttp://www.aygfsteel.com/rendong/archive/2006/08/02/61417.htmlhttp://www.aygfsteel.com/rendong/comments/61417.htmlhttp://www.aygfsteel.com/rendong/archive/2006/08/02/61417.html#Feedback0http://www.aygfsteel.com/rendong/comments/commentRss/61417.htmlhttp://www.aygfsteel.com/rendong/services/trackbacks/61417.html
我很喜欢 struts Q这是我目前最熟悉?MVC Framework Q但?struts ?template Engine ?Turbine(jakarta 另外一?mvc frameworkQ还有一?tapestry )?用的 Velocity 有异曲同工之妙,另外如果你们?Mail List 看到 Craig R. McClanahan q号人物Q?他就是“神”的代言人!
MVCII Framework
Cotroller是指由 Servlet 所d,Model ?JavaBean所开? 最后以 JSP ?View 端的呈现,最?资料返回到客户? 而今天我要讨论的是客户端的 Template Engine -- Tiles.

View (Template Engine)-Tiles
Tiles是MCedric Dumoulin老大所开发的 Template Engine , 什么叫?Template Engine呢, 他是一个版面切割控制的处理中心.通常我们在早古时代大U?( 1995 ~ 2000 )年?, 设计|页大多?Frame 为切割网늚方式 , 因ؓ当时|络带宽不, 加上开发工L~?所以我们那时候对于版面的控制?概也只是q样, 但随着宽带|络的普及化,造就了网늚复杂功能, HTML 4.0 包含?Layer的功能,问?来了, Layer 无法跨过 Frame变成一个Q动的控制窗?所?Frame渐渐被淘汰,变成整个网는 Table 的切割来l合而成, 但是, Table 的设计大多属于网늾工的工作,你要他们懂得如何写动态程??大概只有 1/10 的美工可以做?所以我们徏议是各师其职,让|页视觉大师的工作就单纯只是|页设计,?所?Template Engine就应运而生,那比较有名的有, Velocity, Tiles, FreeMaker等{? ?Struts?是?Tiles的,q次我就针对 Tiles 做初U的介绍.

基本? 你在撰写 JSP的时? 如果 /WEB-INF/lib/之下有攽struts.jar那׃表说, 你?JSP 可以?import struts 的组件进? ?struts-tiles.tld我通常会放?/WEB-INF/tlds/目录之?所以你?JSP 的开始的地方p?br /><%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %> q意思就是说你这个网将会通过 Struts-Tiles q个 TagLib去调用 Tiles Template Engine , 你可以自 己打开 struts-tiles.tld q个文g看看, 里面的定义就是说,当你调用到其中?tag时?他需要去?用哪一个程序来执行你想得到的结?

完全战略首部?-建立模板 (template.jsp)
建立一?template.jsp? 你先规划书面需要切割成为各个区?本范例是切成上方标题?top),左方主选单 (menu),xȝ面再切割上下区域各ؓ main ?copyright :


<%@ page contentType="text/html;charset=BIG5" %>
<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>

<BODY leftmargin="0" marginheight="0" marginwidth="0" topmargin="0" bgcolor="#FFFFFF"

link="#660000">
<table border=\'0\' cellpadding=\'0\' cellspacing=\'0\' width=\'100%\'>
 <!-- 上方标题?-->
 <tr>
 <td colspan=\'2\'>
  <img src="<%=request.getContextPath()%>/images/top.gif" border="0">
 </td>
 <!-- 左方主选单 -->
 <tr valign=\'top\'>

 <td width=\'120\' bgcolor=\'#FFFFFF\' align=\'center\'>
  <tiles:insert attribute="menu"/>
 </td>

 <!-- xȝ?-->
 <td width=\'680\'>
  <table border=\'0\' cellpadding=\'0\' cellspacing=\'0\' width=\'100%\'>
  <tr>
   <td  bgcolor=\'ffffff\'>
   <tiles:insert attribute="main"/>
   </td>
  </tr>

  </table>
 </td>
 <tr>
 <td colspan=\'2\'>
  <tiles:insert attribute="copyright"/>
 </td>
</table>




完全战略二部?-定义 definations.xml
Ҏ template.jsp 定义?InsertTag 属性名U?( attribute )给予一?jsp/html来昄


 <definition name="test.screen" path="/admin/template.jsp">
  <put name="menu" value="/menu.jsp"/>
  <put name="main" value="/index.jsp"/>
  <put name="copyright" value="/copyright.jsp"/>
 </definition>

完全战略三部?-制作 ScreenServlet.java (WARN:copyrights are reserved by Softleader Copr.)
~译以下之程?ScreenServlet.class)攑ֈ /WEB-INF/classes/com/softleader/system/init/之?


package com.softleader.system.init;

import java.util.StringTokenizer;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import java.io.IOException;
import java.io.PrintWriter;

import java.net.URL;

import javax.servlet.*;
import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.tiles.*;
import org.apache.struts.tiles.TilesUtil;

public class ScreenServlet extends HttpServlet {

    private ServletContext context;
    /** Debug flag */
    public static final boolean debug = true;
    /** Associated definition factory */
    protected DefinitionsFactory definitionFactory;
    protected ComponentDefinition definition;
    private TilesRequestProcessor trp;

    public void init()  throws ServletException {
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
        process(request, response);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse  response)
    throws IOException, ServletException {
        process(request, response);

    }

    public void process(HttpServletRequest request, HttpServletResponse  response)
    throws IOException, ServletException {
        // init screen
        String screenName = null;
        String selectedUrl = request.getRequestURI();

        // get the screen name
        int lastPathSeparator = selectedUrl.lastIndexOf("/") + 1;
        int lastDot = selectedUrl.lastIndexOf(".");
        if (lastPathSeparator != -1 && lastDot != -1 && lastDot > lastPathSeparator) {
            screenName = selectedUrl.substring(lastPathSeparator);
        }

        try {
            // Read definition from factory, but we can create it here.
            //ComponentDefinition definition = DefinitionsUtil.getDefinition( screenName,

request, this.getServletContext() );
            //System.out.println("get Definition " + definition );
            //DefinitionsUtil.setActionDefinition( request, definition);
            //DefinitionsFactory definitionsFactory =

DefinitionsUtil.getDefinitionsFactory(getServletContext());
            DefinitionsFactory definitionsFactory = TilesUtil.getDefinitionsFactory(request,

getServletContext());

            String uri="";
            Controller controller;
            ComponentContext tileContext = null;

            if( definitionsFactory != null ) {
                // Get definition of tiles/component corresponding to uri.
                ComponentDefinition definition
                    = definitionsFactory.getDefinition(screenName, request, getServletContext());


                if( definition != null ){
                    // We have a definition.
                    // We use it to complete missing attribute in context.
                    // We also get uri, controller.
                    uri = definition.getPath();
                    controller = definition.getOrCreateController();

                    if( tileContext == null ) {

                        tileContext = new ComponentContext( definition.getAttributes() );
                        ComponentContext.setContext( tileContext, request);

                    }
                    else
                        tileContext.addMissing( definition.getAttributes() );
                } // end if
            } // end if


            RequestDispatcher rd = getServletContext().getRequestDispatcher(uri);

            rd.forward(request, response);


        }  catch( Exception ex ) {
        }
    }

}

q且讑֮ web.xml增加一?ScreenServlet

  <servlet>
    <servlet-name>ScreenServlet</servlet-name>
    <display-name>ScreenServlet</display-name>
    <servlet-class>com.softleader.system.init.ScreenServlet</servlet-class>
    <load-on-startup>3</load-on-startup>
  </servlet>

试|页呈现
当然,你需要自己徏立相兛_义在 definations.xml ?jsp文? 接着重新启动 tomcat, 你就可以看到 http://localhost:8080/test.screen是一个整合v来的画面了?

  1. 讑֮相关?compile 环境, 基本?可以直接?struts source ?libs ?sources
  2. 讑֮相关?properties ?xml,如果不太了? L接查?oreilly 所出的 Struts
  3. 请尊重知识?本文章之原始文件不得用于商业用?需要时请于本公司联l?
  4. Struts |站: http://jakarta.apache.org/struts/
  5. Tiles网? http://www.lifl.fr/~dumoulin/tiles/
  6. Tomcat |站: http://jakarta.apache.org/tomcat/
  7. 以上E序都在 Tomcat 4.1.x以上以?Sun JDK 1.4.x以上测试完?

上周告诉大家使用 tile 的基本方?当然也有更基本的, 相关的文件有 Manning 出的 Struts in Action ?Oreilly 出的 Programming Jakarta Struts 里面都有详尽的解? 不过今天要介l的时更高阶的技?- Tile Layout ,书上 都没有提?呵呵!!

单独使用 Tiles
?tiles.jar 攑ֈ WEB-INF/lib/
?tiles.tld 攑ֈ WEB-INF/
?commons-digester.jar,commons-collections.jar,commons-beanutils.jar 攑ֈ WEB-INF/lib/ ?br />?jakarta commons *.tld 攑ֈ WEB-INF/ ?br />
接着?WEB-INF/web.xml 中增?br />


<servlet>
 <servlet-name>action</servlet-name>
 <servlet-class>org.apache.struts.titles.TilesServlet</servlet-class>


 <init-param>
  <param-name>definitions-config</param-name>
  <param-value>/WEB-INF/tiles/tiles-definitions.xml</param-value>
 </init-param>
 <init-param>
  <param-name>definitions-parser-validate</param-name>
  <param-value>true</param-value>
 </init-param>
</servlet>

使用 <putList> ?<add>
单来? 上一介l的 tiles definitions 的方法是一对一, tiles:insert 会去?definitions 中的 put ? 把指向的 jsp 抓进? 一起包装成一个网送到客户端的览? 但是, 如果我希望在 template 中一?加入多笔的页面该怎么做呢, 哪就得用 <putList> 接着使用 iterate 把他一个一个取出来昄.


<titles:insert page="/template.jsp">
 <tiles:putList name="items">
  <tiles:add value="home"/>
  <tiles:add><img

src="<%=request.getContextPath()%>/images/logo.gif"></titles:add>
  <tiles:add value="documentation"/>
 </titles:putList>
</titles:insert>

??view ?jsp 中要?


<tiles:importAttribute/>
<table>
 <logic:iterate id="item" name="items">
 <tr><td><%=item%></td></tr>
 </logic:iterate>
</table>

RssChannel
所谓的 RssData, 是一?webservice 的格? 相关的介l有
XML.com RSS 的介l?br />Oreilly RSS I中?br />RSS 教学手册
RSS 最新消?/font>
基本上有几个好处

  • 可能放到各个不同的 tiles channel ?.
  • 在同一?page 可能攑ֈ好几个不?channel .
  • 可以简单的重新l出 channel 画面.
  • 可能符合好几个 channel , 每一个都可以各自重绘.

首先 我们先定?tiles-definition.xml , 最重要? ?controllerUrl 需要设?, 此外, q需要得?rss 的格?



<definition name="examples.rssChannel.body" path="/examples/tiles/rssChannels.jsp"
 controllerUrl="/examples/controller/rssChannel.do">
 <putList name="urls">
  <add value="http://newsforge.com/newsforge.rss"/>
  <add value="http://xmlhack.com/rss.php"/>
  <add value="http://lwn.net/headlines/rss"/>
 </putList>
</definition>

?strut-config.xml 中定?


 <action path="/examples/controller/rssChannel"
   type="org.apache.struts.example.tiles.rssChannel.RssChannelsAction">
 </action>

接着建立一?RssChannelsAction ?Class


 public final class RssChannelsAction extends TilesAction {
  public static final String CHANNELS_KEY = "CHANNELS";

  public static final String CHANNEL_URLS_KEY= "urls";

  public ActionForward doExecute(ActionMapping mapping,
    ActionForm form, HttpServletRequest request,
    HttpServletResponse response)
  throws IOException, ServletException, Exception {
   org.apache.commons.digester.rss.Channel channel = null ;


   List channels = (List)context.getAttribute(CHANNEL_URLS_KEY);
   List channelBeans = new ArrayList(channels.size());

   for ( int i=0 ; i < channels.size(); i++ ) {
    RSSDigester digester = new RSSDigester();
    String url = (String)channels.get(i);

    Channel obj = (Channel) digester.parse(url);
    channelBeans.add(obj);
   }
   context.putAttribute(CHANNELS_KEY,channelBeans);
   return null;
  }  

 }

最? ?view ?jsp q样可以看?rssChannel 的资料啦


<%@ 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/struts-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>  [ <a href="<bean:write name="ITEM"

property="link"/>">more</a> ]
<br>
</logic:iterate>
</TD>
</TR>
</TABLE>
<br>
</logic:iterate>

</b></font></div>

Layouts
目前 tiles-example 有提供几U不同的 layout 可以参?

Layout NameParametersUse
Class Layout
  1. title
  2. header
  3. menu
  4. body
  5. fotter
使用 <tiles:getAsString attribute="title"> 取得标题?
其余使用 <tiles:insert attribute="menu">
Menu Layout
  1. title
  2. items
使用 <tiles:getAsString attribute="title"> 取得标题?
其余使用 org.apache.struts.tiles.beans.MenuItem ?iterate
VBox or VStack Layout
  1. list
使用 <tiles:useAttribute classname="java.util.List" name="list" id="list">
Multi-columns Layout
  1. numCols
  2. list1
  3. list2 [optional]
  4. list3 [optional]
  5. listn [optional]
使用 <tiles:useAttribute classname="java.util.String" name="numCols" id="numColsStr"> 接着使用 <tiles:insert> ?<tiles:put> 资料放q来
Center Layout
  1. header
  2. right
  3. body
  4. left
  5. footer
使用 <tiles:insert> ?<tiles:put> 资料放q来
Tabs Layout
  1. tabList
  2. selectedIndex
  3. parameterName
q个几乎以上用到的观念都会用?/td>
当然, 你也可以建立自己?Layout , 我们希望你能建立W合 MVC 观念?Layout!!



rendong 2006-08-02 23:11 发表评论
]]>
Struts s Tiles 使用入门完全ȝ(转蝲)http://www.aygfsteel.com/rendong/archive/2006/08/02/61416.htmlrendongrendongWed, 02 Aug 2006 15:09:00 GMThttp://www.aygfsteel.com/rendong/archive/2006/08/02/61416.htmlhttp://www.aygfsteel.com/rendong/comments/61416.htmlhttp://www.aygfsteel.com/rendong/archive/2006/08/02/61416.html#Feedback0http://www.aygfsteel.com/rendong/comments/commentRss/61416.htmlhttp://www.aygfsteel.com/rendong/services/trackbacks/61416.html一Q说?br />Struts1.1以后增加了Tiles包得struts在页面的处理斚w多了一U选择.q且更容易实C码的重用。Tiles中对面的划分有点象jakarta的另外一个项目Turbine中的TDK。增加了layout的概?其实是把一个页面划分ؓ几块。通常的来说一个页面大概可以划分ؓ如下几块Qhead面头部:存放一个运用的公共信息Qlogo{,如果是网站可能是最上面的一?menu面菜单:攄一个运用中需要用的菜单Q或者在每一个页面都使用的连?footer面N:如版权信息等.body面主题内容:每个面相对独立的内?如果按上面的划分那对每一个页面我们只要写body里面的内容,其他的就可以׃n重用.如果大多数页面的布局基本相同我们甚至可以使用一个jsp文gҎ不同的参数调用不同的body.

二:Tiles配置和基本配|文件介l?br />Tiles有一个配|文?tiles-defs.xml
tiles-defs.xml定义了每一个页面的l成元素和Ş式?br />下面我将说明如下所C的一个tiles-defs.xml文g
tiles-defs.xml
-----------------------------------------------
<tiles-definitions>
<!--定义/layouts/classicLayout.jsp的组成名UCؓsite.mainLayout-->
<!--后面附/layouts/classicLayout.jsp的内?->
<definition name="site.mainLayout" path="/layouts/classicLayout.jsp">
<put name="title" value="Tiles Blank Site" />
<put name="header" value="/tiles/common/header.jsp" />
<put name="menu" value="site.menu.bar" />
<!--menu的组成ؓsite.menu.bar对应的页?->
<put name="footer" value="/tiles/common/footer.jsp" />
<put name="body" value="/tiles/body.jsp" />
</definition>
<!--定义site.index.pageQ承site.mainLayout-->
<definition name="site.index.page" extends="site.mainLayout" >
<put name="title" value="Tiles Blank Site Index" />
<put name="body" value="/tiles/body.jsp" />
<!--以上两个元素替换site.mainLayout中的元素-->
</definition>

<definition name="site.menu.bar" path="/layouts/vboxLayout.jsp" >
<putList name="list" >
<add value="site.menu.links" />
<add value="site.menu.documentation" />
</putList>
</definition>
</tiles-definitions>

附:/layouts/classicLayout.jsp
--------------------------------
<html>
<head>
<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>

在web.xml里面配置tiles,配置完后对应struts action servlet的配|如?
web.xml
-----------------
<!-- Action Servlet Configuration -->
<servlet>
<servlet-name>action</servlet-name>
<!-- Specify servlet class to use:
- Struts1.0.x: ActionComponentServlet
- Struts1.1: ActionServlet
- no Struts: TilesServlet
-->
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

<!-- Tiles Servlet parameter
Specify configuration file names. There can be several comma
separated file names
-->
<init-param>
<param-name>definitions-config</param-name>
<param-value>/WEB-INF/tiles-defs.xml</param-value>
</init-param>

<!-- Tiles Servlet parameter
Specify Tiles debug level.
O : no debug information
1 : debug information
2 : more debug information
-->
<init-param>
<param-name>definitions-debug</param-name>
<param-value>1</param-value>
</init-param>

<!-- Tiles Servlet parameter
Specify Digester debug level. This value is passed to Digester
O : no debug information
1 : debug information
2 : more debug information
-->
<init-param>
<param-name>definitions-parser-details</param-name>
<param-value>0</param-value>
</init-param>

<!-- Tiles Servlet parameter
Specify if xml parser should validate the Tiles configuration file.
true : validate. DTD should be specified in file header.
false : no validation
-->
<init-param>
<param-name>definitions-parser-validate</param-name>
<param-value>true</param-value>
</init-param>

<!-- Struts configuration, if Struts is used -->
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>validate</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>

<load-on-startup>2</load-on-startup>
</servlet>

三:使用Tiles
如果已经配置好tiels-defs.xmlQ接下来可以在jsp文g中用这些定义了?br />有如下的方式使用tiles
3.1:
<tiles:insert definition="site.mainLayout" flush="true" />
插入site.mainLayout标记的一?/p>

3.2Q?br /><tiles:insert template="/tutorial/basic/myFramesetLayout.jsp" >
<tiles:put name="title" content="My first frameset page" direct="true" />
<tiles:put name="header" content="/tutorial/common/header.jsp" direct="true"/>
<tiles:put name="footer" content="/tutorial/common/footer.jsp" direct="true"/>
<tiles:put name="menu" content="/tutorial/basic/menu.jsp" direct="true"/>
<tiles:put name="body" content="/tutorial/basic/helloBody.jsp" direct="true"/>
</tiles:insert>

/tutorial/basic/myFramesetLayout.jsp
---------------------------------
<html>
<head>
<title><tiles:get name="title"/></title>
</head>

<frameset rows="73, *, 73">
<frame src="<%=request.getContextPath()%><tiles:get name="header" />" name="header" >
<frame src="<%=request.getContextPath()%><tiles:get name="body" />" name="body" >
<frame src="<%=request.getContextPath()%><tiles:get name="footer" />" name="footer" >
</frameset>

</html>
插入/tutorial/basic/myFramesetLayout.jsp
q把title的D定ؓ:My first frameset page
header讑֮?tutorial/common/header.jsp

四:后记
Tiles的用在他的文里面写的比较详细。以上是一些简单和基本的用。具体的文可以看Struts里面的一个tiles-documentation.war的包。但即是这个包也不是很全。可以通过上的的连接到作者的主页上去找。个得用Tiles在做企业q用的时候可能不如在做网站那h能体C性。但在系l开始设计的时候考虑q规划好整个UIQ那在修改和l护的时候将节省不少的工作量Q因为通常UI的确定在代码~写l束和完成,所有尽可能的用多个子面构成一个页面,后面的美化和l护比直接l护一个很大的面Ҏ



rendong 2006-08-02 23:09 发表评论
]]>
վ֩ģ壺 ʡ| | ʯ¥| Ӣ| | ɯ| | | ӱʡ| ٹ| ¤| ʯׯ| | | | | û| | | | | | | | | | Դ| Ͻ| | Ǹ| | ī| | ߰| ˳| | | ī񹤿| ²| | |