Struts 1.x 标签库详解

Struts 1.x 中的html标签库 2 u+ @) X9 q6 _; m) o2 A4 d
生成html元素的标签
             1)<html:link>相当于<a href>标签
                   A)href:要链接的目的地。比如:<html:link  href="a.jsp">进入a.jsp</html:link>
                   B)forward:要链接到全局转发<html:link forward="msg" >this link</html:link> 4 ?5 d, |& F7 k& R
                      首先要在struts-config.xml中配置全局转发 7 J& [% z: Q0 ?
                       <global-forwards>
                            <forward name="msg" path="/msg.jsp"/>
                       </global-forwards> 5 m& A( H$ p% [  {5 |
                   C)值得注意的是超连接也可以连接action。此时属于get提交,因此不用ActionForm. " H; B' @3 E& s4 q, u
                     比如:
                       <html:link href="SumAction.do?n=4" >this link</html:link>
                       举例:通过本页面进行处理。之后把结果返回本页面,而不是其它的页面
                       创建一个Action,但是不需要创建ActionForm,然后配置此Action的forward 6 Z+ F! A( r& f) p  U
                       让此Action处理完结果之后,跳转回自己 6 u1 V5 z/ A$ L$ Q6 X9 n- \* J
                   D)该标签最具有特色是可以把四种范围内(request,page,session.applicaion)内的 3 K1 w% N. k' B) C
                     变量或javabean的值做为参数进行传递,  比如: 8 k+ A8 K" z3 ?! ?
                     pageContext.setAttribute("uid","chen");                     
                    <html:link page="msg.jsp" paramId="uid" paramName="uid">this pram link</html:link> / L" R; Y+ K( O  J7 z
                      7 \5 T, S* m$ K6 w% a7 S9 t, J
: x" J: {) k# D- \% U  J& C9 @
                     paramId:指定get参数名 % W& K3 O$ X$ `( n
                     paramName:指定参数的值
                     <jsp:useBean id="sum" class="ht.NetBook.sumBean" scope="page"/>
                     <jsp:setProperty name="sum" property="n1" value="10"/>    8 h& z* ?; k. \
                     <html:link href="msg.jsp" paramId="n1" paramName="sum" paramProperty="n1"> ( ?! h4 J' E' g7 J; A" l6 ]

                   paramName:指定javaBean的名字
                   paramProperty:指定javaBean属性,该连接会自动的把javaBean的属性取出来做为get的提交值 8 r" I5 X5 }! h9 A9 l
              
                   举例:通过数据库取出员工的基本资料,然后显示,注意放入删除超连接 3 j$ q2 q; q4 w# s0 _2 f
                   思路:通过javaBean结合超连接进行 2 B5 W% q4 ?! ?. `- N% V4 c: S
- H4 N9 b. i7 @; y$ w
) n0 k; B- u% T  q% s! p$ E1 y
( L* I7 }+ L  S" N, Q1 a
             2)<html:img src="ab.jgp"/>图像标签。相当于<img>标签 & Z, y" R2 F0 [+ d' e
                                  ; c; I0 I6 j/ A
) H8 A2 C' P0 D/ h; t9 }* a& m
    生成html表单元素的标签  
           1)<html:form action="Action.do"> ; o4 I2 F% d, c4 c8 `
                 A:用于生成表单 : n. D* v6 P- {3 S$ G
                 B:action用来指定跳转到struts-config.xml中配置的Action  
                   对于<html:form>的说明:            
                 C:struts表单元素的标签一定要嵌套在<html:form>标签里面,否则会出现错误
                         比如:
                           <form id="frm" action="testAction.do"> //这是html表单 & R) |3 |/ ^# @! f1 x, ?7 F
                               单价:<html:text property="price"/>//而这是struts表单元素   
                            </form> 9 c" H' z! l+ V  |# ~( Q1 E
! k) _5 e3 [; R; c
                 D:一个Action可以没有对应的ActionForm,但是<html:form action>对应的Action一定要

                     有ActionForm,否则会出现错误   比如: ( V3 L8 ^# N6 x8 H( P+ r. H
                        <html:form  action="testAction.do">
       2 ], V5 f, Z8 N  F3 {9 O0 ?% f
                         </html:form> 9 K7 S1 W) r3 j7 G: B
                    而struts-config.xml的Action配置如下:
                     <action  path="/testAction" type="ht.NetBook.struts.Action.testAction" />
                      即表示testAction没有与之对应的ActionFrom,运行时会出现以下错误: + ^% e3 G; ]0 w5 w) y. Q
                          Cannot retrieve definition for form bean null on action testAction.do
                       如果form Bean为空,则不能编译
                     , {7 m0 P2 E! Q1 R
                E:<html:form>不需要加id或name属性,它经过IE解释之后其名字自动变成与之对应的
                     ActionForm的名字,这也就是为什么如果不为Action指定ActionForm会出错的原因 * h9 A: q* g; `! R# S' U
0 K' ]% |" Z1 p/ _1 Z
               F:结论:如果要使用struts表单元素必须要放在<html:form>中,而此 $ V8 X$ G0 ^+ |+ @
                     <html:form>对应的Action一定要有ActionForm才可以正常运行,
                     如果不使用struts表单元素,也可以使用普通的html标签,同样
                     可以与struts结合,但是struts里面的有些标签更加智能
                                       , T9 ^' z3 S# D6 a  R5 u
* k9 L. z7 v" C7 I9 \
             3)<html:button property="register"/>生成普通的按钮
             4)<html:submit>提交</html:submit>生成提交按钮
             5)<html:reset>重置</html:reset>生成重置按钮   W: J  B* I, ^) P. a6 _5 T8 p
             6)<html:text property="uid"/>用于生成文本框 ; n% L, ^( [7 q
                A:prperty中的值一定要与ActionForm中的属性值保持一致
                B:struts里面的文本框在表单提交以后值会依然保留这与一般的html标签不一样 4 y: B$ Z# l$ w$ i# `, c- r  Z4 d
                C:可以使用<html:text property="uid" value="值"/>的方法赋值给文本框    ) k) f% r( Z" w6 z$ M
' Q% E1 i7 T' L! e

5 u$ A3 p# S0 `+ K* C
2 Y3 q) G$ E" y5 \
             7)<html:reset>复位</html:reset>与普通html的重置按钮一样 * W: l2 @9 h+ L! d, _' T( O, v
             8)<html:submit>提交</html:submit>与普通的html的提交按钮一致

             9)<html:checkbox>相当于html的checkbox
                格式:<html:checkbox property="discount"/>
                      其中的property中的属性名一定要与ActionForm中类型为布尔类型的属性关联    比如:
                         public class discountActionForm extends ActionForm {
                                private boolean discount=true;      //此处将会使checkbox自动勾选 4 B3 g& M. w* _  V
                          } 4 v& y% D$ ?8 B
                     则可以使用<html:checkbox property="discount"/>与该discount的关联 9 t% O/ K. O3 ?, W2 {; ]2 j
                   说明:
                    1)该标签一定要配合普通隐藏域标签才能够正常使用,否则只有勾选一次,以后不管是否勾选其值都是true - e7 T, ]. ?, ?' ~  x" C, `# H* t6 P
                       <html:checkbox property="discount"/> 4 H5 B5 ~0 F) P' M8 ?
                       <input type="hidden" name="discount" value="flase"> ) u; ?9 ^. k* s- H! B
                    2)可以Action中的Excecute方法里面。去检查discount的值
                        discountActionForm frm=(discountActionForm)form;
                        if (frm.getDiscount()) {做一些事件}
                   3)该标签默认情况是在页面初始化时不会自动选中,可以设置ActionForm里面的属性默认
                     值为true.比如:
                     举例:让用户输入商品单价与商品数量,实付款,用是否打折来显示应付款与找零
9 X, O& N  p4 L5 [3 `


              10)<html:multibox/>产生复选框
1 @. a; N2 r3 h$ r! x
                    与<html:checkbox>的区别在于,它可以与ActionForm中数组属性对应    比如:
                     <html:multibox property="love" value="唱歌"/>唱歌<br>
                    <html:multibox property="love" value="跳舞"/>跳舞<br> # _2 j. w1 f, W% u! K  n; I& Y' n" G* k, q
                    <html:multibox property="love" value="足球"/>足球<br>
                    <html:multibox property="love" value="音乐"/>音乐<br>
                  说明:
                     1)其中每个mulitbox的property值必须一样,才可以做为一个复选框组。
                     2)property="love"中的love必须是在ActionForm中定义的数组 # a4 z0 Y6 M" k6 Z9 h; [; n& m( M
                        private String love[]; 4 G% y7 m) z! L; I" j0 n0 m4 D
                        public String[] getLove() {
                               return love; , i' K$ S& k8 z7 H/ o
                        }
                        public void setLove(String[] love) {
                               this.love = love;
                      } % ]8 [8 }! m) m0 @6 B- E
                    3)当用户选中某个复选框后,会把该复选框的值存入ActionForm中的love数组中
                    4)与<html:checkbox>一样,也存在同样的缺点,就是如果选中之后取消勾选此时
                      还是会继续勾选。解决的方案是增加一个隐藏域 & i" o9 u- @  K0 J
                      <html:multibox property="love" value="唱歌"/>唱歌<br>
                      <html:multibox property="love" value="跳舞"/>跳舞<br> 3 I, v1 A8 w7 O- P- [4 x
                      <html:multibox property="love" value="足球"/>足球<br> . f% |2 E4 l% j6 J
                      <html:multibox property="love" value="音乐"/>音乐<br>
                      <input type="hidden" name="love"/>//注意不要value=flae
                    5)加了隐藏域之后,struts会把隐藏域的值也加入到love数组中,所以在使用时,
                      应该去掉。for(int i=0;i<frm.getLove().length-1;i++) //长度减1去掉
                     举例: + i9 J3 ^, H# D" x! x2 |$ A4 I7 K
                         1)爱好,把人的爱好放入数据库中保存
                         2)各模块之间的权限管理 0 `. c+ d' z8 p& }* Y: y  y
! E3 O, B7 D9 Z% ?% m% _
5 Q9 f* k5 n- t' T$ z/ v7 N
                 11)<html:radio>产生一组单选框
                      <html:radio property="degree" value="1">高中</html:radio><br>
                      <html:radio property="degree" value="2">中专</html:radio><br>   a7 s& r$ G- [$ J/ R2 P  u
                      <html:radio property="degree" value="3">大学</html:radio><br> " s* w3 [' i5 I. z; m/ v4 c
                      <html:radio property="degree" value="4">小学</html:radio><br>
                   说明: % Y. v% h8 O: @/ a0 j
                      1)property的值必须与ActionForm中的某个属性关联,以后选择了那个单选框
                          Struts就会与之对应的值赋给ActionForm的关联的属性 + Z# x5 Y( O5 O" e
                      2)单选框不需要隐藏域,就可以正常的工作 . @  C5 Q3 J8 E% O$ H5 f
                      3)如何要设置默认的选项,可以把ActionForm中关联的属性值设置成单选框中
                        与之对应的值
                            public class discountActionForm { $ p' b- y3 B; E3 d! o* L& F
                                      private String degree="1";//设置默认值。 ' x3 l5 ~8 y! _3 Q; }
                             } 7 b$ E  E5 F9 ^% Q" E

                        这样"高中"就默认选中了。因为ActionForm中的degree关联的值与"高中"单选框的值相同 * j( [% A% u5 i7 v* j5 U: R
                        举例: 5 a( h4 }2 f$ _& p+ h
                           1)爱好 : E# R" [( K* l3 ~! y- ?3 S0 F; Z
                           2)投票---要求从数据库读取投票项,进行投票
  1. 12) <html:select property="color">下拉列表框
  2.                       A:一个<html:select>会包括多个<html:option>
  3.                       B:property属性值与ActionForm中对应的属性关联。
  4.                            public class ActionForm extends ActionForm {
  5.                                private String color;
  6.                                get...
  7.                                set...
  8.                            }
  9.                       C:<html:option>中有一个显示值与实际值
  10.                            <html:select property="color">
  11.                            <html:option value="yellow">黄色</html:option>
  12.                            <html:option value="green">绿色</html:option>
  13.                            <html:option value="blue">蓝色</html:option>
  14.                            </html:select>
  15.                       D:<html:select>不用设置默认值,它会自动选中第一项
  16.                       D:该类型的下拉列表一般适合于不与数据库发生交互的情况
  17.                      
  18.                  13)<html:options collection>该options非常适合于与数据库进行交互
  19.                       比如:<html:options collection="save" labelProperty="voteItem" property="id"/>
复制代码
A:<html ptions>标签必须放在<html:select>里面 5 ^4 Z/ S% n9 @" R$ G5 I  ?
                    B:collection表示Javabean的一个集合,该集合一定要放在四个范围里面 7 _/ u; _$ F4 V6 T+ U
                    C:labelProperty表示显示的值
                    D:property选中之后的值 6 ]/ ~# h) V; {# h( Q
                   比如:一个jsp页面 % q; c1 y* Z/ u  I+ [" R4 S
                     <%
                          java.util.List save=votes.getAllvote();//返回投票的javabean的集合   I4 X5 L- ~8 G- M9 _& S% X) t
                          request.setAttribute("save",save);
                      %>
" B( ~, Z" e+ E! L! p
, B; \: x$ h. [9 z6 Y0 H* t
                      <html:select property="id"> //此处的id一定要与ActionForm中的属性对应
                            <html ptions collection="save" labelProperty="voteItem" property="id"/>   : M# L' O3 D/ q
                      </html:select>                               //此处不能用${save}
                      & O. t  F2 o; T# N) A; J+ x! F
                     ActionForm的定义            & C0 t. _% R0 p) \7 d  v
                     public class voteActionForm extends ActionForm { " V3 y; Q* I, |' g
                         private String id;
                          get...
                          set...
                      }
                      JavaBean(描述类vote)的定义 8 f* M$ _, Q3 G9 t  c
                       public class vote {
                          private String id;
                          private String voteItem; 4 x$ e2 t% P& X2 _; h
                                 get... 6 k# I, S: U/ ?2 B4 A
                                 set... $ q$ C1 A% i' R( N
                          }
                         9 i0 N% p; s; B% b" I
                       管理类(votes)的定义 ' U( S( D# y; D; b0 p( x; M
                         pulbic class votes{   p/ U, b  s- Q0 f% Q
                              public static List getAllvote() { 2 p" u' z: j, S7 }
                                    vote newInstance=new vote();
                                    newInstance.setId(rs.getInt(1));
                                    newInstance.setVoteItem(rs.getString(2)); + g5 y- b6 b2 F' M) G9 e  f, N
                                    list.add(newInstance); / W' q& f& x. K) c( _( t
                                      return list;
                               } ) y. Y6 j% E+ R+ \0 ~0 |
                        } 4 ~( s# @! q' T* v; Q
                      举例: 8 |! r; @, x* w+ ^. l) a/ t) L
                       1)用<html:select>结合<html ptions>来重做投车票项目 3 l6 m) n1 X! d% i0 H3 E
                       2)让用户选择部门编号,查询出对应的职工信息。要求部门用下拉框实现 7 H+ h8 C( b" N, p
; ~2 f" F+ |; G

                 14)<html:file property="file">文件上传组件 0 b/ e& F& Q2 I+ s
                     A:<html:file>必须嵌套在<html:form>标签中
                     B:<html:form>标签的method必须为post提交 3 U, X) Z8 e/ r8 t+ ?; p8 S
                     C:<html:form>中的enctype必须为multipart/form-data method="post"
                     D:<html:file>标签必须设置property属性。这个属性和ActionForm中的 ; f. m: A/ k+ D6 w4 o  V
                       的FormFile类型的属性对应 1 \* W' j2 [) X( G. z
                     比如:
              ====================ActionForm========================
                       private private org.apache.struts.upload.FormFile file;
                       public get...
                       public set.... - o' E+ w8 J1 f, O0 {1 ?
             ==========================jsp页面===========================
                     
             <html:form action="SumAction.do" method="post" enctype="multipart/form-data" > ; B/ s9 z2 r! X3 [
             <html:file property="file"/>注意这里面的file与ActionForm中的file属性对应 8 L9 n$ s3 x/ y# q
             <html:submit>提交</html:submit>
             </html:form>                   4 Q% B4 [. n1 b1 w+ k7 ?$ R! Y& s
           ============================Action=========================== / y* _; `- f: L5 m# S# S/ p/ i
                    uploadActionForm frm=(uploadActionForm)from; 3 z! X- l$ P" `3 p; U
                    FormFile file=frm.getFile();//得到file对像 % ~- T% \. E0 B- B7 F
                    String fileName=file.getFileName();//得到要上传的文件名 - ^) U9 G8 b# t( {- c6 Z
                    String dir=servlet.getServletContext().getRealPath("upload"); * U# _1 l+ r( h
                                                    //得到文件的路径,这里面统一上传到upload文件夹下面(WebRoot\upload) . ?" ?+ _9 T. \0 t2 {- {
                    String serverPath=dir+"\\"+fileName;                  //服务器的实际文件路径   y0 E: i' I: s# T% t
                    InputStream inputStream=file.getInputStream();//输入流
                    OutputStream outputStream=new FileOutputStream(serverPath);//输出流
                    int readBinary=0;
                    byte buffer[]=new byte[8192];//缓冲区为1024*8也就是8字节 0 F& W7 s: L1 M7 J/ v
                    while((readBinary=inputStream.read(buffer, 0, 8192))!=-1) {      . [" ~! e% _$ b, @

                                                                             //从inputStream中每次读取8字节的的数据到byte数据组中 $ r, I6 p+ w1 Y+ D
                              outputStream.write(buffer, 0, readBinary);         //写入到outputStream中 " O' K' V9 C3 s& R" [7 S
                    }
                    outputStream.close(); $ W2 l$ }0 ^9 b% @+ `0 V
                    inputStream.close(); $ J& T/ r4 |- g: P" ^$ N
           
         ===========================inputStream.read的介绍================== / q# D7 P" \+ V
               inputStream.read(byte b[],int off,int len)
               读取len个字节,放置到下标off开始的字节数组b中,返回实际读取的字节的数量 - z% Y% u. G8 [+ D  P+ }! R
               一般off都是零,因为是从数组的第一个位置开始填充

你可能感兴趣的:(Struts 1.x 标签库详解)