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)投票---要求从数据库读取投票项,进行投票
- 12) <html:select property="color">下拉列表框
- A:一个<html:select>会包括多个<html:option>
- B:property属性值与ActionForm中对应的属性关联。
- public class ActionForm extends ActionForm {
- private String color;
- get...
- set...
- }
- C:<html:option>中有一个显示值与实际值
- <html:select property="color">
- <html:option value="yellow">黄色</html:option>
- <html:option value="green">绿色</html:option>
- <html:option value="blue">蓝色</html:option>
- </html:select>
- D:<html:select>不用设置默认值,它会自动选中第一项
- D:该类型的下拉列表一般适合于不与数据库发生交互的情况
-
- 13)<html:options collection>该options非常适合于与数据库进行交互
- 比如:<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都是零,因为是从数组的第一个位置开始填充