Tapstry3的追忆------学习笔记(一)

官方主页:http://tapestry.apache.org/

Apache Tapstry一直是我比较欣赏的MVC框架,他的很多设计理念都比同时代的Struts来得先进。

可能是由于中文资料的不足而一直没有被广大Java爱好者们所熟知。

目前Tapstry5正在热火朝天的开发中(说实话,这个版本已经让我苦苦等待很久了,至今还没有Release)。

事先声明一下,这个系列的所有代码并非都是我所作,但是当年,我正是通过它们才对T3有了现在的认识。

IDE:MyEclipse6.0(他自带Tapestry3的类库)

如下图所示建立工程:

 

用到的jar包一览如下:

bsf-2.3.0.jar
commons-beanutils-1.6.1.jar
commons-codec-1.2.jar
commons-collections-2.1.jar
commons-digester-1.5.jar
commons-fileupload-1.0.jar
commons-lang-1.0.jar
commons-logging-1.0.2.jar
jakarta-oro-2.0.6.jar
javassist-2.5.1.jar
ognl-2.6.7.jar
tapestry-3.0.3.jar
tapestry-contrib-3.0.3.jar
xercesImpl.jar
xmlParserAPIs.jar

 

Home.java

  1. package mo.org.cpttm.album;
  2. import org.apache.tapestry.*;
  3. import org.apache.tapestry.html.*;
  4. public abstract class Home extends BasePage {
  5.     
  6.     public String getImageUrl(int imageId) {
  7.         return getEngine().getService("image").getLink(
  8.                 getRequestCycle(),
  9.                 null,
  10.                 new Object[] { new Integer(imageId) }).getURL();
  11.     }
  12.     
  13.     public abstract String getImageId();
  14.     public void onOk(IRequestCycle cycle) {
  15.         cycle.activate("Upload");
  16.     }
  17. }

ImageDB.java

  1. package mo.org.cpttm.album;
  2. import java.io.*;
  3. import javax.servlet.*;
  4. public class ImageDB {
  5.     public static byte[] loadImage(int imageId, ServletContext context) {
  6.         File imageFile = new File(
  7.                 context.getRealPath("/WEB-INF/imagedb"),
  8.                 imageId + ".jpg");
  9.         try {
  10.             FileInputStream input = new FileInputStream(imageFile);
  11.             try {
  12.                 byte[] imageData = new byte[(int) imageFile.length()];
  13.                 input.read(imageData);
  14.                 return imageData;
  15.             } finally {
  16.                 input.close();
  17.             }
  18.         } catch (IOException e) {
  19.             throw new RuntimeException(e);
  20.         }
  21.     }
  22.     public static void saveImage(int imageId, byte[] imageData, ServletContext context) {
  23.         File imageFile = new File(
  24.                 context.getRealPath("/WEB-INF/imagedb"),
  25.                 imageId + ".jpg");
  26.         try {
  27.             FileOutputStream output = new FileOutputStream(imageFile);
  28.             try {
  29.                 output.write(imageData);
  30.             } finally {
  31.                 output.close();
  32.             }
  33.         } catch (IOException e) {
  34.             throw new RuntimeException(e);
  35.         }
  36.     }   
  37. }

ImageService.java

  1. package mo.org.cpttm.album;
  2. import java.io.*;
  3. import javax.servlet.*;
  4. import javax.servlet.http.*;
  5. import org.apache.tapestry.*;
  6. import org.apache.tapestry.engine.*;
  7. import org.apache.tapestry.request.*;
  8. public class ImageService extends AbstractService {
  9.     public String getName() {
  10.         return "image";
  11.     }
  12.     public void service(
  13.             IEngineServiceView engine,
  14.             IRequestCycle cycle,
  15.             ResponseOutputStream output) throws ServletException, IOException {
  16.         int imageId =  ((Integer) getParameters(cycle)[0]).intValue();
  17.         byte imageData[] = ImageDB.loadImage(
  18.             imageId,
  19.             cycle.getRequestContext().getServlet().getServletContext());
  20.         HttpServletResponse response = cycle.getRequestContext().getResponse();
  21.         response.setContentType("image/jpeg");
  22.         response.setHeader("Content-disposition""attachment; filename=foo.jpg");
  23.         response.setContentLength(imageData.length);
  24.         try {
  25.             OutputStream out = response.getOutputStream();
  26.             out.write(imageData);
  27.         } catch (IOException e) {
  28.             throw new ApplicationRuntimeException(e);
  29.         }
  30.     }
  31.     public ILink getLink(IRequestCycle cycle, IComponent component, Object[] args) {
  32.         return constructLink(cycle, getName(), null, args, false);
  33.     }
  34. }

Upload.java

  1. package mo.org.cpttm.album;
  2. import java.io.*;
  3. import org.apache.tapestry.*;
  4. import org.apache.tapestry.html.*;
  5. import org.apache.tapestry.request.*;
  6. public abstract class Upload extends BasePage {
  7.     public abstract IUploadFile getFile();
  8.     
  9.     public void onOk(IRequestCycle cycle) {
  10.         if (getFile().getFileName().length()==0) {
  11.             return;
  12.         }
  13.         byte imageData[] = new byte[(int) getFile().getSize()];
  14.         InputStream fileInput = getFile().getStream();
  15.         try {
  16.             fileInput.read(imageData);
  17.         } catch (IOException e) {
  18.             throw new RuntimeException(e);
  19.         }
  20.         ImageDB.saveImage(101, imageData, cycle.getRequestContext().getServlet().getServletContext());
  21.         
  22.         cycle.activate("Home");
  23.     }
  24. }

Album.application

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE application PUBLIC
  3.   "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
  5. <!-- generated by Spindle, http://spindle.sourceforge.net -->
  6. <application name="Album" engine-class="org.apache.tapestry.engine.BaseEngine">
  7.     <description>add a description</description>
  8.     <page name="Home" specification-path="Home.page"/>
  9.     <service name="image" class="mo.org.cpttm.album.ImageService"/>
  10. </application>

Home.html

  1. <html>
  2. <a href="" jwcid="download">Download photo #101</a>   
  3. <img src="/Album/app?service=image&sp=101"/>
  4. <form jwcid="form">
  5.     <input type="Submit" value="OK"/>
  6. </form>
  7. </html>

Home.page

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE page-specification PUBLIC
  3.   "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
  5. <!-- generated by Spindle, http://spindle.sourceforge.net -->
  6. <page-specification class="mo.org.cpttm.album.Home">
  7.     <property-specification name="imageId" type="java.lang.String"/>
  8.     <component id="download" type="ServiceLink">
  9.         <static-binding name="service" value="image"/>
  10.         <binding name="parameters" expression="101"/>
  11.     </component>
  12.     <component id="form" type="Form">
  13.         <binding name="listener" expression="listeners.onOk"/>
  14.     </component>
  15. </page-specification>

Upload.html

  1. <html>
  2. <form jwcid="uploadForm">
  3.     <input type="File" jwcid="upload"/><p>
  4.     <input type="Submit" value="OK"/>
  5. </form>
  6. </html>

Upload.page

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE page-specification PUBLIC
  3.   "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
  5. <!-- generated by Spindle, http://spindle.sourceforge.net -->
  6. <page-specification class="mo.org.cpttm.album.Upload">
  7.     <property-specification name="file" type="org.apache.tapestry.request.IUploadFile"/>
  8.     <component id="uploadForm" type="Form">
  9.         <binding name="listener" expression="listeners.onOk"/>
  10.     </component>
  11.     <component id="upload" type="Upload">
  12.         <binding name="file" expression="file"/>
  13.     </component>
  14. </page-specification>

web.xml

  1. <?xml version="1.0"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  3.     xmlns:xsi="http://www.w3.org/TR/xmlschema-1/"
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
  5.     <display-name>Album</display-name>
  6.     <servlet>
  7.         <servlet-name>Album</servlet-name>
  8.         <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
  9.         <load-on-startup>1</load-on-startup>
  10.     </servlet>
  11.     <servlet-mapping>
  12.         <servlet-name>Album</servlet-name>
  13.         <url-pattern>/app</url-pattern>
  14.     </servlet-mapping>
  15. </web-app>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值