struts2从零开始(六)

  
      知识点:struts2页面标签和ognl
       1、struts2页面标签
          要使用struts2的标签必须在jsp页面导入<%@ taglib prefix="s"  uri="/struts-tags"%>
      1.1、select标签(代码如下)
    
 <!-- select标签 #表示取值栈中的值 attr. 不需要指定作用域--> 
     <s:select list="#attr.list"  name="mylist" listKey="age" listValue="uname" headerKey="0" headerValue="请选择" size="7" >
         
     </s:select>

    注意:#表示取值栈中的值,而attr表示不需要指定作用域,用的比较多,但是用request也是可以的。
         struts2首先访问jsp页面的时候,不会像struts1一样调用get方法来初始化页面的标签,而是直接到值栈中去拿值(容错能力比struts1强)

     1.2、checkboxlist标签(代码如下)
     
 <!-- 复选框 checkbox -->
       <s:checkboxlist list="#attr.list" name="mycheckbox" listKey="age" listValue="uname"  ></s:checkboxlist>


  注意:当在页面上选中select标签的值或者checkbox的值,假如要在后台拿选择的情况,则必须定义相应的变量,命名必须和页面相应标签的名字相同,当是checkbox时,则action中定义拿值的变量必须是数组。假如页面有多个标签则后台必须有相对应的拿值属性,否则会报空指针错误(代码如下)
        
package cn.zhuojingxinxi.web;

import java.util.ArrayList;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import cn.zhuojingxinxi.entity.Users;

public class UsersAction {

	 private Users users=null;
	 private int [] mycheckbox;
	 private int [] mylist;

	public int[] getMycheckbox() {
		return mycheckbox;
	}

	public void setMycheckbox(int[] mycheckbox) {
		this.mycheckbox = mycheckbox;
	}

	public int[] getMylist() {
		return mylist;
	}

	public void setMylist(int[] mylist) {
		this.mylist = mylist;
	}

	public int[] getCheckbox() {
		return mycheckbox;
	}

	public void setCheckbox(int[] mycheckbox) {
		this.mycheckbox = mycheckbox;
	}

	public Users getUsers() {
		return users;
	}

	public void setUsers(Users users) {
		this.users = users;
	}
	   
	
	public String execute(){
	    ServletActionContext.getRequest().setAttribute("list", getList());
	      if(mycheckbox!=null){
	    	
	    	for (int i = 0; i < mycheckbox.length; i++) {
	    		System.out.println(mycheckbox[i]);
	    		
	    	}
	    }
		return "success";
	}
	
	
	public List<Users> getList(){
		  List<Users> list=new ArrayList<Users>();
		  Users users1=new Users();
		  users1.setUname("zhangsan");
		  users1.setAge(21);
		  list.add(users1);
		  
		  Users users2=new Users();
		  users2.setUname("lisi");
		  users2.setAge(24);
		  list.add(users2);
		  
		  Users users3=new Users();
		  users3.setUname("wangwu");
		  users3.setAge(25);
		  list.add(users3);
		  
		  return list;
		
		
		
	}
}


    1.3、迭代(见证ognl的强大之处,能够调用后台的方法这是EL表达式不能做到的)
         
 <s:iterator value="#attr.list" status="i" id="u">
         
           <s:property value="#u.test()"/>
         
         
         </s:iterator>


   其中test方法是定义在后台实体类Users中的。执行这段代码能在页面中输出三个sss
      
package cn.zhuojingxinxi.entity;

public class Users {
	private String uname;
	private int age;
	
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public String test(){
		return "ssss";
	}
	
	
	
	
	
	

}

  

    # 的三种用途:1、取值栈中的值
                   
 <s:set name="myage" value="20"></s:set>
         
           <s:property value="#myage"/>

                  2、投影一个集合
                  ? 的用途是给条件
                   
<s:iterator value="#attr.list.{?#this.age>20}.{uname}">
              <s:property />
           
           </s:iterator>

                  3、构建一个map
              
<s:set name="mymap" value="#{'one':'first','two':'second'}"></s:set>
           
           <s:iterator value="#mymap">
                <s:property value="key"/>
                <s:property value="value"/>
           
           </s:iterator>



    % 取资源文件中的内容(或者计算字符串的值类似于js中的eval,可用于做国际化)
       
 <s:submit value="%{#mymap.one}"></s:submit>

       
 <s:textfield name="ssss" label="%{getText('uname')}"></s:textfield>

        以上拿的是国际化资源文件中键为uname的值,假如在action要拿资源文件中的值可以继承actionSupport,然后可以在execute方法中调用this.getText("uname");
    

    @ 表示调用静态方法
    
  <s:if test="@cn.zhuojngxinxi.biz.UserService@login('aasssaa')">
                     登录成功
                 </s:if>
                <s:else>
                    失败
                </s:else>

  后台login代码:
   
package cn.zhuojingxinxi.biz;

public class UserService {
	
	public static Boolean login(String uname){
		if(uname!=null&&uname.length()>6){
			
			return true;
		}
		
		   return false;
		
		
	}

}

  

源码下载请点这里:
   

猜你喜欢

转载自1136051009.iteye.com/blog/1770409