科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道JAVA热点:取代JSP的新技术--tapestry

JAVA热点:取代JSP的新技术--tapestry

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

取代JSP的新技术--tapestry

作者:baocl 来源:赛迪网技术社区 2007年10月25日

关键字: Tapestry JSP java

  • 评论
  • 分享微博
  • 分享邮件
学号 
姓名
性别
班级















20012400 宗锋 计算机研一
20011389 桑一珊 计算机研一

添加学生

 

与前面的简单应用不同,我们在这个页面中定义了七个组件,下面看一下部分Home.jwc文件,我们将详细讲述一下怎样描述这些组件。











EditStudent

 

在这里,我们的specification的class属性值不再是BasePage,而是其派生类ListStudent。对于每一个组件,id属性指定唯一的标识符,这个值与html文件中的jwcid值相对应,type 指定组件名,binding指定组件怎得到数据,property-path是一系列属性的集合,这些属性一般定义在javabean中,例如上面的property-path="student",则在相应的javabean类ListStudent中应该有个函数getStudent。liststudent是一个Foreach组件,这个组件其实是一个for循环,它从source中读入一个数组,将其一个一个的赋值给value参数指定的属性。id,name,gender,department四个是Insert组件,这个组件用来插入文本数据,参数value指定要插入的值,property-path指定怎样获取这些值,eachstudent.id相当于调用javabean的getEachstudent().getId()。add是一个Page组件,page属性指定页面名(定义在application文件中),static-binding表明要绑定的数据是不可修改的。$remove$组件没有在这个文件中描述,因为Tapestry运行时会自动删除这种组件。
下面看一下ListStudent类:

  1. package test; 
  2. import com.primix.tapestry.*;
  3. import sun.jdbc.odbc.JdbcOdbcDriver ;
  4. /**
  5. * 返回每个学生的数据
  6. *
  7. */
  8. public class ListStudent extends BasePage
  9. {
  10. private Student eachstudent;
  11. private Student[] student;
  12. public void detach()
  13. {
  14. eachstudent=null;
  15. student=null
  16. super.detach();
  17. }
  18. public Student getEachstudent()
  19. {
  20. return eachstudent;
  21. }
  22. public void setEachstudent(Student value)
  23. {
  24. eachstudent = value;
  25. }
  26. public Student[] getStudent()
  27. try{
  28. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  29. student=StudentFactory.findAllStudents();
  30. }catch(Exception e){
  31. e.printStackTrace();
  32. }
  33. return student;
  34. }
  35. }


这个类有四个函数,其中detach函数是将页面放入缓冲池时执行的操作,getStudent函数返回所有的学生记录,这是给jwc文件中liststudent组件的source参数赋值,getEachstudent给这个组件的value参数赋值,因为source是一个数组,每次循环需要从中取出一条记录赋值给eachstudent,所以还有一个函数为setEachstudent,你会注意到这个函数很简单,其实是Tapestry帮你做了大部分工作。
至此,显示学生的部分已经完成,下面看一下EditStudent.html





 

 学生管理系统


 


学号:

姓名:


性别: 

男 



班级:









在这个文件中,用到了另外一些常用的组件,先看一下EditStudent.jwc中的这些组件的描述:

















 






form是一个Form组件,它的参数listener指定submit这个form时有那个函数处理。ifError是一个Conditional组件,这个组件指定当condition满足时才会显示,在本例中,如果error不为空,则condition满足。在这个组件中,有嵌套了一个Insert类型的组件,用于将错误显示。这是Tapestry中经常用到的处理错误的方式。gender是一个RadioGroup组件,它绑定了javabean中的gender属性,selected参数指定那个radio被选中,在这个组件中,又嵌套了两个Radio组件,分别用来表示男,女。Radio的value参数指定当用户选定这个radio时,RadioGroup绑定的属性值将会等于field-name中指定的值(这个值必须是static的),在本例中,gender=test.EditStudent.MALE。id是一个TextField组件,其参数value绑定到javabean中的id属性。
下面是相应的EditStudent类:

  1. package test; 
  2. import com.primix.tapestry.*;
  3. public class EditStudent extends BasePage
  4. {
  5. public static final int MALE = 1;
  6. public static final int FEMALE = 2;
  7. private int gender;
  8. private String error;
  9. private String id;
  10. private String sname;
  11. private String department;
  12. public void detach()
  13. {
  14. error = null;
  15. id=null;
  16. sname=null;
  17. gender=0;
  18. department=null
  19. super.detach();
  20. }
  21. public int getGender()
  22. {
  23. return gender;
  24. }
  25. public String getId()
  26. {
  27. return id;
  28. }
  29. public String getSname()
  30. {
  31. return sname;
  32. }
  33. public String getDepartment()
  34. {
  35. return department;
  36. }
  37. public void setGender(int value)
  38. {
  39. gender = value;
  40. fireObservedChange("gender", value);
  41. }
  42. public void setId(String value)
  43. {
  44. id = value;
  45. fireObservedChange("id", value);
  46. }
  47. public String getError()
  48. {
  49. return error;
  50. }
  51. public void setSname(String value)
  52. {
  53. sname = value;
  54. fireObservedChange("sname", value);
  55. }
  56. public void setDepartment(String value)
  57. {
  58. department = value;
  59. fireObservedChange("department", value);
  60. }
  61. public void formSubmit(IRequestCycle cycle)
  62. {
  63. //判断用户是否添完了所有数据
  64. if (gender== 0||id==null||id.equals("")||sname==null||sname.equals("")||
  65. department==null||department.equals(""))
  66. {
  67. error = "请填充完所有选项";
  68. return;
  69. }
  70. //将学生保存
  71. try{
  72. Student student=new Student();
  73. student.setId(id);
  74. student.setName(sname);
  75. if(gender==1)
  76. student.setGender("男");
  77. else
  78. student.setGender("女");
  79. student.setDepartment(department);
  80. student.save(null);
  81. }catch(Exception e){
  82. e.printStackTrace();
  83. //清空当前的各个属性,以免再次进入此页面时,各属性仍旧保留原来的值
  84. setSname(null);
  85. setDepartment(null);
  86. setId(null);
  87. setGender(0);
  88. //重定向到Home页面
  89. cycle.setPage("Home");
  90. }
  91. }


在本类的一些设置属性的函数中使用了fireObservedChange这个函数,这个函数激发一个改变事件,通知当前的属性的值已经改变。

其他应用



Tapestry中自带的例子中的Workbench中的localization例子演示了怎样使用本地化,你只需要创建不同语言的html模板,还有图形等其它一些html中用到的资源。例如创建一个法语版的EditStudent.html,则相应的html文件名为EditStudent_fr.html,而jwc中定义的组件的描述不用有多个版本。这里要介绍一下Tapestry本地化中经常用到的一个概念:assets。assets是一些web应用中用到的资源,如图象,视频。assets有三种:external, internal 和private。External类型的assets来源于任意的URL。Internal类型的assets来源于和Tapestry应用在同一个服务器上的URL。Private 类型的assets允许部署在WAR的WEB-INF/classes目录下(同上面的html模板,jwc文件一样),这个目录对于web服务器来说是不可见的。
看一下Workbench中localization例子中的localization.jwc文件的片断:







 

Tapestry还支持创建自己的可重用组件,其自身带了一个这样的例子:Border。同时它还有其它一些例子:Inspector展示了怎样监视你的应用程序。vlib是一个用tapestry作表示层的j2ee应用程序(用jboss作为应用服务器)。

Tapestry的功能非常强大,本文只是介绍了其一小部分,还有很多方面没有涉及到,例如javascript在Tapestry中的应用。具体可以看其文档,相信如果你用一下这个框架,你就会被它深深吸引。Tapestry的文档做的不是很全,不过经过不断的摸索,相信你会很快掌握它 查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章