变量参数传递

变量存取范围及JSP、JSTL和Struts技术中变量的存取方法
JSP中变量的定义范围实际有5种:本地范围,页面范围(page),请求范围(request),会话范围(session)和应用程序范围(application)。
以下介绍在各种技术中的变量存取方法。
u  JSP中:
存储:
本地范围变量直接定义,如:
   String name="name in page";
page 范围变量保存在 pageContext 隐式对象中,如:
   pageContext.setAttribute("nameContext","name in pageContext");
request 范围变量保存在 request 隐式对象中,如:
   request.setAttribute("nameRequest","name in Request");
session 范围变量保存在 session 隐式对象中,如:
   session.setAttribute("nameSession","name in Session");
application 范围变量保存在 application 隐式对象中,如:
   application.setAttribute("nameApplication","name in Application");
读取:
   name: <%= name %> < br />
nameContext: <%= pageContext.getAttribute( "nameContext" ).toString() %> < br />
nameRequest: <%= request.getAttribute( "nameRequest" ).toString() %> < br />
nameSession: <%= session.getAttribute( "nameSession" ).toString() %> < br />
nameApplication: <%= application.getAttribute( "nameApplication" ).toString() %>
u  JSTL中
JSTL中没有本地范围的概念。只有page,request,session和application范围的变量。
存储
使用c:set存储变量。
scope属性默认为page, 若不指定则变量存储在page范围里:
   < c:set var = "name" value = "name in where" />
   < c:set var = "namePage" value = "name in pageScope" scope = "page" ></ c:set >
   < c:set var = "nameRequest" value = "name in requestScope" scope = "request" ></ c:set >
   < c:set var = "nameSession" value = "name in sessionScope" scope = "session" ></ c:set >
   < c:set var = "nameApplication" value = "name in ApplicationScope" scope = "page" ></ c:set >
读取
使用c:out读取变量
c:out标签依次从page,request,session,application范围查找指定变量然后输出。也可以指定查找范围。
   nameSession - < c:out value = "${nameSession}"/> - 依次搜索至 session 范围,找到 nameSession 变量,然后输出。 < br />
   namePage - < c:out value = "${pageScope.namePage }"/> - 指定搜索范围为 page 范围 < br >
   nameRequest - < c:out value = "${requestScope.nameRequest }"/> - 指定搜索范围为 request 范围 < br >
   nameSession - < c:out value = "${sessionScope.nameSession }"/> - 指定搜索范围为 session 范围 < br >
   nameApplication - < c:out value = "${applicationScope.nameApplication }"/> - 指定搜索范围为 application 范围 < br >
   name - < c:out value = "${pageScope.name }"/>
struts
JSTL 一样,只有 page,request,session,application 范围。
存储
使用 bean:define
toScope
属性指定存储范围,默认为 page, 若不指定则变量存储在 page 范围里
读取
使用 bean:write
scope
属性指定读取范围,若没有设置此属性,则依次从 page,request,session,application 范围查找指定变量然后输出。
struts之参数传递

html:link有很多参数选项,如关键有:
action --指定点击链接后,进入的*.do动作action的值不需要跟后缀,struts自动补上.do
page  -- 跟action一样的功能,不过这个不会自动补.do,也就是说可以链接其他类型的动作,如html,jsp,php等

paramId--指定参数的key名称,如要输出http://abc.com/ss?kk=abc,则paramId="kk"
paramName -- 能识别作用域(任意)内的Object的名称。
paramProperty--paramName的输出属性,paramId,paramName ,paramProperty可以组成单一参数传递的link,如<html:link  action="/PRC301E1"  paramId="prc_no" paramName="element" paramProperty="fjPrcNo">,当element.getfjPrcNo()的值为prc1时,则输出为 http://xxoo.com/PRC301E1.do?prc_no=prc1

name--为HashMap属性的对象,用此属性,可以进行多参数输出。例:

CODE:
[Copy to clipboard]
     <%
        HashMap map=new HashMap();
       map.put("check","22");
       map.put("name","abc");
       pageContext.setAttribute("map",map); //因为所有tag的取值只会搜索作用域(page/request/session/application),而不会识别当前的实例,所以只有存入。
      %>
      <html:link action="/PRC301E1"  name="map">
        多参数输出
      </html:link>

-----------------------------------------------------------------------------------------

在struts标签<html:link>的page属性指定的URI后面传递参数可以有几种方式:

1.若明确参数名和参数值则直接在URI后输出,
如:<html:link page="/test.do?action=add">add</html:link>

2.对于参数值不确定的,paramName和paramProperty来输出,用paramId属性指定参数名。
对于paramName指定的对象应该存在于page、request、session、application其中之一。一般来说,是从Action类传过来的,作为request的属性之一(requst.setAttribute("name",object))。
如果paramName指定的对象是action的ActionForm,则无需使用request.setAttribute方法。
例:<html:link page="/test.do" paramId="userid" paramName="uid">uname</html:link>
若参数值是一个bean对象的属性值(比如ActionForm,或者集合中存放的对象)则:
<html:link page="/test.do" paramId="userid" paramName="user" paramProperty="uid">uname</html:link>

3.若两个参数,一个确定一个不确定,则是以上两种方法的结合,即:
<html:link page="/test.do?action=modify" paramId="userid" paramName="uid">modify</html:link>

4.对于多个参数的问题,可以使用一个HashMap集合对象来存放所有的参数名及对应的参数值的方式,paramName属性值指定为该HashMap集合对象即可。
举例:
<%
//代码理想的位置应该是在action中
//可以在jsp页面测试
  java.util.HashMap pms = new java.util.HashMap();
  pms.put("code", "001002");
  pms.put("name", "tester");
  pms.put("alias", new String[]{"matin","jack"});
  request.setAttribute("params", pms);
%>
<html:link action="/test.do" name="params" >test</html:link>
编译后的结果:<a href="/test.do?code=001002&name=tester&alias=matin&alias=jack">test</a>
这种方式虽然可以解决传多参数的问题,但是实现起来也比较麻烦,特别是对记录集中的数据逐条列出的时候

5.针对有的网友在<html:link>标签中嵌入使用jsp脚本(scriptlet)的问题,
例如:
<html:link page="/test.do?code=<%=varible%>">add</html:link>,这种写法是错误的,是无法编译的。
有的网友认为在struts标签内是不允许使用jsp脚本的,这种说法也不准确。如果前面的写法改成:
<html:link page="<%="/test.do?code="+varible%>">add</html:link>,就可以被执行,但是要注意URL相对路径的问题。

虽然在struts标签中嵌入jsp脚本不是真正意义上的struts应用,但是有时在委曲求全的情况下也只能如此了,除非使用自定义标签。比如在form表单中可能需要根据具体数据让某个字段是只读的,就可以用嵌入jsp脚本来实现:
<%
boolean rdonly=false;
if(2==2) rdonly=true;
%>
<html:text property="userid" readonly="<%=rdonly%>" />

6.另外一种比较变态的方法,既不是真正意义上的struts,也不符合xml规范。那就是在<a>标签中用<bean:write>标签输出参数值。
如:<a href="test.do?uid=<bean:write name="user" property="userid"/>&name=<bean:write name="user" property="username"/>">test</a>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值