chapter3 值接收和标签

来源:互联网 发布:现货白银分钟线数据 编辑:程序博客网 时间:2024/06/07 11:09

第三课

 

一、 值接收 / 类型转换

a)   普通属性

b)  实体对象 PetInfo

c)   DTO对象 PetCondition

二、 值传递

a)   使用request,session,application

b)  封装到属性

三、 Struts标签

a)   非UI标签

i.    if/else if/else标签

ii.   iterator标签

iii.  append标签

b)  UI标签

i.    checkboxlist标签

ii.   doubleSelect标签

iii.  select标签

iv.  radio标签

 

 

一、什么是OGNL,有什么特点?    
 F:\feiduit\java课程PPT\SSH配置包\struts2完整jar\struts-2.2.3\docs\WW\url.html


OGNLObject-GraphNavigation Language,大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点:    
  
1、支持对象方法调用,形式如:objName.methodName()   
  
2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包名)]@[方法名值名],例如:   
  
@java.lang.String@format('foo %s', 'bar')@tutorial.MyConstant@APP_NAME   
  

  
3、访问OGNL上下文(OGNL context)和ActionContext   
  
4、操作集合对象   
  
    
  
二、使用OGNL表达式   
  
OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”“#”“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%#符号的用法。   
  
1“#”符号有三种用途:   
  

(1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:   
  
    
  
名称   
作用   
例子   
    
parameters   
包含当前HTTP请求参数的Map   
#parameters.id[0]作用相当于request.getParameter("id")    
    
request   
包含当前HttpServletRequest的属性(attribute)Map   
#request.userName相当于request.getAttribute("userName")    
    
session   
包含当前HttpSession的属性(attribute)的Map   
#session.userName相当于session.getAttribute("userName")    
    
application   
包含当前应用的ServletContext的属性(attribute)的Map   
#application.userName相当于application.getAttribute("userName")    
    
  
注:attr用于按request > session > application顺序访问其属性(attribute),#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。  
    
  
(2)、用于过滤和投影(projecting)集合,如: books.{?#this.price>35}     
  
books.{?#this.price>35}   
  
(3)、构造Map,如: #{'foo1':'bar1', 'foo2':'bar2'}     
  

#{'foo1':'bar1', 'foo2':'bar2'}这种方式常用在给radioselectcheckbox等标签赋值上。如果要在页面中取一个map的值可以这样写:    
  
<s:property value="#myMap['foo1']"/>     
  
<s:property value="#myMap['foo1']"/>   
  
2“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。   
  

这是一开始最让我不能理解的符号,原因是一些相关资源在表述时不太准备,经过一翻痛苦的探索,终于明白了它的用途。实际上就是让被理解为字符串的表达式,被真正当成ognl来执行。    
  
<s:set name="myMap"value="#{'key1':'value1','key2':'value2'}"/>      
  
<s:property value="#myMap['key1']"/>      
  
<s:url value="#myMap['key1']" />    
  
<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>   
  
<s:property value="#myMap['key1']"/>   
  
<s:url value="#myMap['key1']"/>   
  
上面的代码第2行会在页面上输出“value1”,而第3行则会输出"#myMap['key1']"这么一个字符串。如果将第3行改写成这样:    
  
<s:url value="%{#myMap['key1']}"/>     
  
<s:url value="%{#myMap['key1']}"/>   
  
则输出为“value1”   
  

这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签看不懂类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,翻译一下了。   
  
3“$”有两种用途   
  
(1)、在国际化资源文件中,引用OGNL表达式。   
  
(2)、在Struts 2配置文件中,引用OGNL表达式:    
  
<action name="saveUser" class="userAction"method="save">   
  
<resulttype="redirect">listUser.action?msg=${msg}</result>   
  
</action>   
  
<action name="saveUser" class="userAction"method="save">       
  
<result type="redirect">listUser.action?msg=${msg}</result>   
  
</action>

 

 

验证码页面

<%@ pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

<%@ pagecontentType="image/jpeg"import="java.awt.*,

java.awt.image.*,java.util.*,javax.imageio.*"%>

<%!

Color getRandColor(int fc,int bc)

{

Random random = new Random();

if(fc>255) fc=255;

if(bc>255) bc=255;

int r=fc+random.nextInt(bc-fc);

int g=fc+random.nextInt(bc-fc);

int b=fc+random.nextInt(bc-fc);

returnnew Color(r,g,b);

}

%>

<%

//out.clear();//Õâ¾äÕë¶Ôresin·þÎñÆ÷£¬Èç¹ûÊÇtomacat¿ÉÒÔ²»ÒªÕâ¾ä

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.setDateHeader("Expires", 0);

int width=60, height=20;

BufferedImage image= new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);

Graphics g =image.getGraphics();

Random random = new Random();

g.setColor(getRandColor(200,250));

g.fillRect(0, 0,width, height);

g.setFont(new Font("Times NewRoman",Font.PLAIN,18));

g.setColor(getRandColor(160,200));

for (int i=0;i<155;i++)

{

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(12);

int yl = random.nextInt(12);

g.drawLine(x,y,x+xl,y+yl);

}

String sRand="";

for (int i=0;i<4;i++){

Stringrand=String.valueOf(random.nextInt(10));

sRand+=rand;

g.setColor(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));

g.drawString(rand,13*i+6,16);

}

//½«ÈÏÖ¤Âë´æÈëSESSION

session.setAttribute("rand",sRand);

g.dispose();

ImageIO.write(image,"JPEG",response.getOutputStream());

out.clear();

out=pageContext.pushBody();

 

%>

 

 

验证码刷新

<a href="javascript:loadimage();">

function loadimage(){

document.getElementById("img").src ="/epet/image.jsp?"+Math.random();

 

}

 

总结

       1.action中的私有属性接收,属性只能多,不能少

              普通属性

privateString loginname;  控件的名称是loginname

              实体对象

privatePetInfo petInfo;   对象控件的名称是petInfo.pet_id

privateList<PetInfo> pets; list集合控件的名称是pets[0].petId

privateMap<String, PetInfo> petsMap;    map集合控件的名称是pets['aa'].petId,括号是map集合的key值

              DTO对象 PetCondition

datebasetransfer object 创建一个临时的对象,专门用于接收值。

 

              3.值传递

使用request,session,application

封装到属性

 

       4.Struts标签,不能和EL表达式结合

                           set

<s:setname="age" value="30"></s:set>  赋值

<s1:setname = "login" value="#session.pet"></s1:set> 从session中取值

一般action属性不需要加#,其他的都需要加

                           if,else if, else判断

<s:set name="age"value="30"></s:set>

<s:if test="#age>60">

<s:elseif test="#age>35">

<s:else>

                          

                           debug         测试,查看堆栈信息,查询那些需要加#

<s:debug></s:debug>

                           iterator      迭代循环

<s98:iterator value="%{#session.petList}"var="ipet" status="i">

<s98:if test="#i.index==0">

<s98:set name= "obj"value="#ipet"></s98:set>

<s98:iterator value="#obj" var="pet"status="i">

<tr>

<td style="text-align:right;">

<s98:property value="#i.index +1"/><br>

</td>

<td>

<a href="pet.htm#9"target="_blank">

<s98:property value="#pet.pet_name"/>

</a>

</td>

                                 

<td style="text-align:right;">

<s98:set var ="type" value="#pet.pet_type"></s98:set>

<s98:if test="#type == 1">ǧìûÖí</s98:if>

<s98:elseif test="#type == 2">¿É°®Ã¨</s98:elseif>

<s98:elseif test="#type == 3">¾Þ´óÁú</s98:elseif>

</td>

<td style="text-align:right;">

<s98:set var="total"value="%{#pet.pet_strength+#pet.pet_cute+#pet.pet_love}"></s98:set>

<s98:property value="#total"/>

</td>

<tdstyle="text-align:right;"><s98:propertyvalue="#pet.pet_strength"/></td>

<tdstyle="text-align:right;"><s98:propertyvalue="#pet.pet_cute"/></td>

<td style="text-align:right;"><s98:propertyvalue="#pet.pet_love"/></td>

<td style="text-align:center;"><ahref="mailto:liu@.net"><s98:propertyvalue="#pet.pet_owner_name"/></a></td>

</tr>

</s98:iterator></s98:if></s98:iterator>

                          

       5.导入标签库

<%@ taglib uri="/struts-tags"prefix="s" %>

 

 


原创粉丝点击