Struts2+Spring2+Hibernate3 web应用示例(五)

 
  • 七、       Web页面

     

    在这一节中,主要使用到了Struts2的标签库。在这里,会对所用到的主要标签做一个初步的介绍。更多的知识请读者访问Struts的官方网站做更多的学习。在编写Web页面之前,先从总体上,对Struts 1.xStruts 2.0的标志库(Tag Library)作比较。

    Struts 1.x

    Struts 2.0

    分类

    将标志库按功能分成HTMLTilesLogicBean等几部分

    严格上来说,没有分类,所有标志都在URI“/struts-tags”命名空间下,不过,我们可以从功能上将其分为两大类:非UI标志和UI标志

    表达式语言(expression languages

    不支持嵌入语言(EL

    OGNLJSTLGroovyVelcity

     

    1、主页面:index.jsp,其代码如下:

    <% @page pageEncoding = " UTF-8 "  contentType = " text/html; charset=UTF-8 "   %>
    <% @ taglib prefix = " s "  uri = " /struts-tags "   %>
    < html >
    < head >
    < meta http - equiv = " Content-Type "  content = " text/html; charset=GBK " />
    < title > 图书管理系统 </ title >
    </ head >
    < body >
    < p >< a href = " <s:url action= " list "  /> " > 进入图书管理系统 </ a ></ p >
    </ body >
    </ html >

    WebRoot/index.jsp

    要在JSP中使用Struts 2.0标志,先要指明标志的引入。通过在JSP的代码的顶部加入以下代码可以做到这点。<%@taglib prefix="s" uri="/struts-tags" %>

    1<s:url>标签:该标签用于创建url,可以通过"param"标签提供request参数。当includeParams的值时'all'或者'get', param标签中定义的参数将有优先权,也就是说其会覆盖其他同名参数的值。

    2、列表页面:list.jsp

    <% @page pageEncoding = " gb2312 "  contentType = " text/html; charset=UTF-8 "   %>
    <% @ taglib prefix = " s "  uri = " /struts-tags "   %>

    < html >
    < head >< title > 图书管理系统 </ title ></ head >
        
    < style type = " text/css " >
            table 
    {
                border: 1px solid black;
                border
    -collapse: collapse;
            }

            
            table thead tr th 
    {
                border: 1px solid black;
                padding: 3px;
                background
    -color: #cccccc;
                background
    -color: expression(this.rowIndex % 2 == 0 ? "#FFFFFF" : "#EEEEEE");
            }

            
            table tbody tr td 
    {
                border: 1px solid black;
                padding: 3px;
            }

            .trs
    {
                background
    -color: expression(this.rowIndex % 2 == 0 ? "#FFFFFF" : "#EEEEEE");
            }

        
    </ style >

        
    < script language = " JavaScript " >    
            
    function  doSearch() {
                
    if(document.all.searchValue.value=="")
                
    {    
                    alert(
    "请输入查询关键字!");
                }
    else{
                    window.location.href
    ="bookAdmin/list.action?queryName="+document.all.searchName.value+"&&queryValue="+document.all.searchValue.value;
                 }

            }

        
    </ script >
    < body >

    < table align = " center " >
    < tr align = " center " >
        
    < td >
            
    < select name = " searchName " >
                
    < option value = " bookName " > 书名 </ option >
                
    < option value = " bookAuthor " > 作者 </ option >
                
    < option value = " bookPublish " > 出版社 </ option >
                
    < option value = " bookDate " > 出版日期 </ option >
                
    < option value = " bookIsbn " > ISNB </ option >
                
    < option value = " bookPage " > 页数 </ option >
            
    </ select >
            
    < input type = " text "  name = " searchValue "  value = ""  size = " 10 " />
            
    < input type = " button "  value = " 查询 "  onClick = " doSearch(); " >
        
    </ td >
    </ tr >
    < tr align = " center " >     
        
    < td >
            
    < a href = " <s:url action= " list "  includeParams= " none " /> " > 全部 </ a >
            
    < a href = ' < s:url action = " edit "   ></ s:url > ' > 增加 </ a >
        
    </ td >
    </ tr >
    < tr >
    < td >
    < table cellspacing = " 0 "  align = " center " >
        
    < thead >
        
    < tr >
            
    < th > 书名 </ th >
            
    < th > 作者 </ th >
            
    < th > 出版社 </ th >
            
    < th > 出版日期 </ th >
            
    < th > ISNB </ th >
            
    < th > 页数 </ th >
            
    < th > 价格 </ th >
            
    < th > 内容提要 </ th >
            
    < th > 删除 </ th >
        
    </ tr >
        
    </ thead >
        
    < tbody >
        
    < s:iterator value = " availableItems " >
            
    < tr class = " trs " >
                
    < td >
                
    < a href = ' < s:url action = " edit "   >< s:param name = " bookId "  value = " bookId "   /></ s:url > ' >
                
    < s:property value = " bookName " />
                
    </ a >
                
    </ td >
                
    < td >< s:property value = " bookAuthor " /></ td >
                
    < td >< s:property value = " bookPublish " /></ td >
                
    < td >< s:text name = " format.date " >< s:param value = " bookDate " /></ s:text ></ td >      
                
    < td >< s:property value = " bookIsbn "   /></ td >
                
    < td >< s:property value = " bookPage "   /></ td >
                
    < td >< s:property value = " bookPrice " /></ td >
                
    < td >< s:property value = " bookContent " /></ td >
                
                
    < td >< a href = ' < s:url action = " delete " >< s:param name = " bookId "  value = " bookId "   /></ s:url > ' > 删除 </ a ></ td >
            
    </ tr >
        
    </ s:iterator >
        
    < tr align = " right " >
            
    < td colspan = " 9 " >
                共
    < s:property value = " totalRows " /> & nbsp;
                第
    < s:property value = " currentPage " /> & nbsp;
                共
    < s:property value = " pager.getTotalPages() " /> & nbsp;
                
    < a href = " <s:url value= " list.action " >
                    <s:param name=
    " currentPage "  value= " currentPage " />
                    <s:param name=
    " pagerMethod "  value= " 'first' " />
                    
                </s:url>
    " > 首页 </ a >
                
    < a href = " <s:url value= " list.action " >
                    <s:param name=
    " currentPage "  value= " currentPage " />
                    <s:param name=
    " pagerMethod "  value= " 'previous' " />
                </s:url>
    " > 上一页 </ a >
                
    < a href = " <s:url value= " list.action " >
                    <s:param name=
    " currentPage "  value= " currentPage " />
                    <s:param name=
    " pagerMethod "  value= " 'next' " />
                </s:url>
    " > 下一页 </ a >
                
    < a href = " <s:url value= " list.action " >
                    <s:param name=
    " currentPage "  value= " currentPage " />
                    <s:param name=
    " pagerMethod "  value= " 'last' " />
                </s:url>
    " > 尾页 </ a >
            
    </ td >
        
    </ tr >     
        
    </ tbody >
    </ table >
    </ td >
    </ tr >
    </ table >
    </ body >
    </ html >

    /WebRoot/list.jsp

    (1)<s:property> :得到'value'的属性,如果value没提供,默认为堆栈顶端的元素。其相关的参数及使用如下表所示:

    名称

    必需

    默认

    类型

    描述

    default

    String

    如果属性是null则显示的default

    escape

    true

    Booelean

    是否escape HTML

    value

    栈顶

    Object

    要显示的值

    id

    Object/String

    用来标识元素的id。在UI和表单中为HTMLid属性

    (2)<s:Iterator>:用于遍历集合(java.util.Collection)或枚举值(java.util.Iterator)。其相关的参数及使用如下表所示:  

    名称

    必需

    默认

    类型

    描述

    status

    String

    如果设置此参数,一个IteratorStatus的实例将会压入每个遍历的堆栈

    value

    Object/String

    要遍历的可枚举的(iteratable)数据源,或者将放入新列表(List)的对象

    id

    Object/String

    用来标识元素的id。在UI和表单中为HTMLid属性

    (3)<s:param>:为其他标签提供参数,比如include标签和bean标签. 参数的name属性是可选的,如果提供,会调用Component的方法addParameter(String, Object), 如果不提供,则外层嵌套标签必须实现UnnamedParametric接口(TextTag) value的提供有两种方式,通过value属性或者标签中间的text,不同之处我们看一下例子:

    <param name="color">blue</param><!-- (A) -->

    <param name="color" value="blue"/><!-- (B) -->
    (A)参数值会以String的格式放入statck.
    (B)该值会以java.lang.Object的格式放入statck.

    其相关的参数及使用如下表所示:

    名称

    必需

    默认

    类型

    描述

    name

    String

    参数名

    value

    String

    value表达式

    id

    Object/String

    用来标识元素的id。在UI和表单中为HTMLid属性

    4)、国际化是商业系统中不可或缺的一部分,所以无论您学习的是什么Web框架,它都是必须掌握的技能。其实,Struts 1.x在此部分已经做得相当不错了。它极大地简化了我们程序员在做国际化时所需的工作,例如,如果您要输出一条国际化的信息,只需在代码包中加入FILE-NAME_xx_XX.properties(其中FILE-NAME为默认资源文件的文件名),然后在struts-config.xml中指明其路径,再在页面用<bean:message>标志输出即可。

    不过,所谓没有最好,只有更好Struts 2.0并没有在这部分止步,而是在原有的简单易用的基础上,将其做得更灵活、更强大。

    5)、list.jsp文件中:

    <s:text name="format.date"><s:param value="bookDate"/></s:text>,为了正确的输出出版日期的格式,采用在资源文件中定义输出的格式,并在页面上调用。format.date就是在资源文件com.sterning.books.web.actions.BooksAction.properties中定义。当然也可以别的文件,放在别的路径下,但此时需要在web.xml中注册才可以使用它。

    正如读者所见,在pojo(本例为Books.java)中将日期字段设置为java.util.Date,在映射文件中(books.hbm.xml)设置为timestamp(包括日期和时间)。为了便于管理,将日期格式保存在国际化资源文件中。如:globalMessagesglobalMessages_zh_CN文件。

    其内容为:

    format.date={0,date,yyyy-MM-dd}

    在页面显示日期时间时:<s:text name="format.date"><s:param value="bookDate"/></s:text>。这样就解决了日期(时间)的显示格式化问题。

     

    3、增加/修改页面:editBook.jsp 

    <% @page pageEncoding = " UTF-8 "  contentType = " text/html; charset=UTF-8 "   %>
    <% @ taglib prefix = " s "  uri = " /struts-tags "   %>

    < html >
    < head >
        
    < title > 编辑图书 </ title >
        
    < s:head />
    </ head >
    < body >
        
    < h2 >
            
    < s: if  test = " null == book " >
                增加图书
            
    </ s: if >
            
    < s: else >
                编辑图书
            
    </ s: else >
        
    </ h2 >
        
    < s:form name = " editForm "  action = " save "  validate = " true " >
        
             
    < s:textfield label = " 书名 "  name = " book.bookName " />
             
    < s:textfield label = " 作者 "  name = " book.bookAuthor " />
             
    < s:textfield label = " 出版社 "  name = " book.bookPublish " />
             
    < s:datetimepicker label = " 出版日期 "  name = " book.bookDate " ></ s:datetimepicker >
             
    < s:textfield label = " ISBN "  name = " book.bookIsbn " />
             
    < s:textfield label = " 页数 "  name = " book.bookPage " />
             
    < s:textfield label = " 价格(元) "  name = " book.bookPrice " />
             
    < s:textfield label = " 内容摘要 "  name = " book.bookContent " />
             
    < s: if  test = " null == book " >
                 
    < s:hidden name = " book.bookId "  value = " %{bookId} " />
             
    </ s: if >          
             
    < s: else >
                 
    < s:hidden name = " book.bookId "   />
             
    </ s: else >
             
    < s:hidden name = " queryName "   />
             
    < s:hidden name = " queryValue "   />
             
    < s:submit value = " %{getText('保存')} "   />
        
    </ s:form >

    < p >< a href = " <s:url action= " list " /> " > 返回 </ a ></ p >
    </ body >
    </ html >


    WebRoot/editBook.jsp

    1)、<s:if><s:elseif><s:else> :执行基本的条件流转。 其相关的参数及使用如下表所示:

    名称

    必需

    默认

    类型

    描述

    备注

    test

     

    Boolean

    决定标志里内容是否显示的表达式

    else标志没有这个参数

    id

     

    Object/String

    用来标识元素的id。在UI和表单中为HTMLid属性

     

     

    2)、<s:text>:支持国际化信息的标签。国际化信息必须放在一个和当前action同名的resource bundle,如果没有找到相应message,tag body将被当作默认message,如果没有tag body,messagename会被作为默认message 其相关的参数及使用如下表所示:

    名称

    必需

    默认

    类型

    描述

    name

     

    String

    资源属性的名字

    id

     

    Object/String

    用来标识元素的id。在UI和表单中为HTMLid属性


    未完待续......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值