??xml version="1.0" encoding="utf-8" standalone="yes"?>色88888久久久久久影院,日韩中文字幕在线一区,一区 二区 三区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这是我目前最熟?zhn)?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呢, 他是一个版面切割控制的处理中心(j).通常我们在早古时代大U?( 1995 ~ 2000 )年?, 设计|页大多?Frame 为切割网늚方式 , 因ؓ(f)当时|络带宽不, 加上开发工L(fng)~?所以我们那时候对于版面的控制?概也只是q样, 但随着宽带|络的普?qing)?造就?jin)网늚复杂功? HTML 4.0 包含?Layer的功能,问?来了(jin), 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我通常?x)放?/WEB-INF/tlds/目录之?所以你?JSP 的开始的地方p?br /><%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %> q意思就是说你这个网将?x)通过 Struts-Tiles q个 TagLib去调用 Tiles Template Engine , 你可以自 己打开 struts-tiles.tld q个文g看看, 里面的定义就是说,当你调用到其中?tag时?他需要去?用哪一个程序来执行你想得到的结?

完全战略首部?-建立模板 (template.jsp)
建立一?template.jsp? 你先规划书面需要切割成为各个区?本范例是切成上方标题?top),左方主选单 (menu),x(chng)ȝ面再切割上下区域各ؓ(f) 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%\'>
 (tng)<!-- 上方标题?-->
 (tng)<tr>
 (tng)<td colspan=\'2\'>
 (tng) (tng)<img src="<%=request.getContextPath()%>/images/top.gif" border="0">
 (tng)</td>
 (tng)<!-- 左方主选单 -->
 (tng)<tr valign=\'top\'>

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

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

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




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


 (tng)<definition name="test.screen" path="/admin/template.jsp">
 (tng) (tng)<put name="menu" value="/menu.jsp"/>
 (tng) (tng)<put name="main" value="/index.jsp"/>
 (tng) (tng)<put name="copyright" value="/copyright.jsp"/>
 (tng)</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 {

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

 (tng) (tng) (tng) (tng)public void init() (tng) (tng)throws ServletException {
 (tng) (tng) (tng) (tng)}


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

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

 (tng) (tng) (tng) (tng)}

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

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

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

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

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

getServletContext());

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)String uri="";
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)Controller controller;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)ComponentContext tileContext = null;

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


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

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)if( tileContext == null ) {

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

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


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

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)rd.forward(request, response);


 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)} (tng) (tng)catch( Exception ex ) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}
 (tng) (tng) (tng) (tng)}

}

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

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

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

  1. 讑֮相关?compile 环境, 基本?可以直接?struts source ?libs ?sources
  2. 讑֮相关?properties ?xml,如果不太了(jin)? L(fng)接查?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>
 (tng)<servlet-name>action</servlet-name>
 (tng)<servlet-class>org.apache.struts.titles.TilesServlet</servlet-class>


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

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


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

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

??view ?jsp 中要?


<tiles:importAttribute/>
<table>
 (tng)<logic:iterate id="item" name="items">
 (tng)<tr><td><%=item%></td></tr>
 (tng)</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"
 (tng)controllerUrl="/examples/controller/rssChannel.do">
 (tng)<putList name="urls">
 (tng) (tng)<add value="http://newsforge.com/newsforge.rss"/>
 (tng) (tng)<add value="http://xmlhack.com/rss.php"/>
 (tng) (tng)<add value="http://lwn.net/headlines/rss"/>
 (tng)</putList>
</definition>

?strut-config.xml 中定?


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

接着建立一?RssChannelsAction ?Class


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

 (tng) (tng)public static final String CHANNEL_URLS_KEY= "urls";

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


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

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

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

 (tng)}

最? ?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">
 (tng) (tng)<a href="<bean:write name="CHANNEL" property="link"/>">
 (tng) (tng) (tng) (tng)<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> (tng) (tng)[ <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个几乎以上用到的观念都?x)用?/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以后增加?jin)Tiles包得struts在页面的处理斚w多了(jin)一U选择.q且更容易实C码的重用。Tiles中对面的划分有点象jakarta的另外一个项目Turbine中的TDK。增加了(jin)layout的概?其实是把一个页面划分ؓ(f)几块。通常的来说一个页面大概可以划分ؓ(f)如下几块Qhead面头部:存放一个运用的公共信息Qlogo{,如果是网站可能是最上面的一?menu面菜单:攄一个运用中需要用的菜单Q或者在每一个页面都使用的连?footer面N:如版权信息等.body面主题内容:每个面相对独立的内?如果按上面的划分那对每一个页面我们只要写body里面的内容,其他的就可以׃n重用.如果大多数页面的布局基本相同我们甚至可以使用一个jsp文gҎ(gu)不同的参数调用不同的body.

二:(x)Tiles配置和基本配|文件介l?br />Tiles有一个配|文?tiles-defs.xml
tiles-defs.xml定义?jin)每一个页面的l成元素和Ş式?br />下面我将说明如下所C的一个tiles-defs.xml文g
tiles-defs.xml
-----------------------------------------------
<tiles-definitions>
<!--定义/layouts/classicLayout.jsp的组成名UCؓ(f)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的组成ؓ(f)site.menu.bar对应的页?->
<put name="footer" value="/tiles/common/footer.jsp" />
<put name="body" value="/tiles/body.jsp" />
</definition>
<!--定义site.index.pageQ(h)承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>

附:(x)/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>

三:(x)使用Tiles
如果已经配置好tiels-defs.xmlQ接下来可以在jsp文g中用这些定义了(jin)?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定ؓ(f):My first frameset page
header讑֮?tutorial/common/header.jsp

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



rendong 2006-08-02 23:09 发表评论
]]>
վ֩ģ壺 | | ɳ| | | | | | | | °Ͷ| »| | | Դ| | ͩ®| | ͷ| ¦| | | | | ¡Ң| | Դ| ǭ| ˷| | ֬| | ̩˳| ű| | ¹| | ̫| | ֦| |