初识Struts2_OGNL表达式
一、配置文件
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 <!-- 启用开发者模式,当修改struts配置文件时不用重启服务器 --> 8 <constant name="struts.devMode" value="true" /> 9 <!-- 要访问静态方法,一定要把这项设置为true --> 10 <constant name="struts.ognl.allowStaticMethodAccess" value="true" ></constant> 11 <!-- 12 include的意思 是: 13 引用default.xml 14 --> 15 <package name="default" namespace="/" extends="struts-default"> 16 <action name="user" class="cn.su.action.UserAction"> 17 <result>/ognl.jsp</result> 18 </action> 19 </package> 20 21 </struts>
二、Action
Action中用到的User对象
1 package cn.su.domain; 2 3 public class User { 4 private String name; 5 public static int age = 18; 6 public User(){} 7 public User(String name){ 8 this.name = name; 9 } 10 public String getName() { 11 return name; 12 } 13 14 public void setName(String name) { 15 this.name = name; 16 } 17 public static String sayHello(){ 18 return "user say hello"; 19 } 20 }
Action
1 package cn.su.action; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.HashSet; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Set; 9 10 import cn.su.domain.User; 11 12 import com.opensymphony.xwork2.ActionSupport; 13 14 public class UserAction extends ActionSupport { 15 private String username; 16 private User user; 17 private List<User> list = new ArrayList<User>(); 18 private Set<User> set = new HashSet<User>(); 19 private Map<String,User> map = new HashMap<String, User>(); 20 21 /*在构造方法中初始化 list,set,map*/ 22 public UserAction(){ 23 list.add(new User("l1")); 24 list.add(new User("l2")); 25 list.add(new User("l3")); 26 27 set.add(new User("s1")); 28 set.add(new User("s2")); 29 set.add(new User("s3")); 30 31 map.put("mk1",new User("mv1")); 32 map.put("mk2",new User("mv2")); 33 map.put("mk3",new User("mv3")); 34 } 35 public String execute(){ 36 return SUCCESS; 37 } 38 public String hello(){ 39 return "hello"; 40 } 41 public String getUsername() { 42 return username; 43 } 44 45 public void setUsername(String username) { 46 this.username = username; 47 } 48 49 public User getUser() { 50 return user; 51 } 52 53 public void setUser(User user) { 54 this.user = user; 55 } 56 public List<User> getList() { 57 return list; 58 } 59 public void setList(List<User> list) { 60 this.list = list; 61 } 62 public Set<User> getSet() { 63 return set; 64 } 65 public void setSet(Set<User> set) { 66 this.set = set; 67 } 68 public Map<String, User> getMap() { 69 return map; 70 } 71 public void setMap(Map<String, User> map) { 72 this.map = map; 73 } 74 75 }
三、jsp页面
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib uri="/struts-tags" prefix="s" %> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 9 <html> 10 <head> 11 <base href="<%=basePath%>"> 12 13 <title>My JSP 'index.jsp' starting page</title> 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 </head> 23 24 <body> 25 <ul><!-- 访问的url:http://localhost:8080/Struts2_OGNL/user?username=Tom&user.name=Jack --> 26 <li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li> 27 <!-- 前台传递参数 user.name=Jack 28 user一定要有无参的构造方法,才能正确被struts创建 29 当前台没有传递任何跟user有关的参数时 30 struts不会创建user对象,即user=null 31 --> 32 <li>访问值栈中对象的普通属性(get set方法):<s:property value="user.name"/>|<s:property value="user['name']"/>| <s:property value="user[\"name\"]"/>| wrong: <%--<s:property value="user[age]"/>--%></li> 33 <li>访问值栈中对象的普通方法:<s:property value="username.length()"/></li> 34 <li>访问值栈中action的普通方法:<s:property value="hello()"/></li> 35 <hr /> 36 <!-- 静态方法和属性一定要是public的才可以访问 37 访问静态方法还需配置 38 常量 struts.ognl.allowStaticMethodAccess为true 39 --> 40 <li>访问静态方法:<s:property value="@cn.su.domain.User@sayHello()"/> </li> 41 <li>访问静态属性:<s:property value="@cn.su.domain.User@age"/></li> 42 <li>访问Math类的静态方法:<s:property value="@@max(1,2)"/></li> 43 <hr /> 44 <li>访问普通类的构造方法:<s:property value="new cn.su.domain.User()"/></li> 45 <hr /> 46 <li>访问List:<s:property value="list"/></li> 47 <li>访问List中某个元素:<s:property value="list[0]"/></li> 48 <li>访问List中元素某个属性的集合:<s:property value="list.{name}"/></li> 49 <li>访问List中元素某个属性的集合中的特定值:<s:property value="list.{name}[0]"/>|<s:property value="list[0].name"/> </li> 50 <li>访问Set:<s:property value="set"/></li> 51 <!-- 不能通过set[0]来访问set中的元素,因为set是无序的,可能每次取出的set[0]都不是同一个元素 --> 52 <li>访问Set中某个元素:<s:property value="set[0]"/></li> 53 <li>访问Map:<s:property value="map"/></li> 54 <li>访问Map中某个元素: <s:property value="map.mk1"/>|<s:property value="map['mk1']"/> |<s:property value="map[\"mk1\"]"/> </li> 55 <li>访问Map中所有的key:<s:property value="map.keys"/></li> 56 <li>访问Map中所有的value:<s:property value="map.values"/></li> 57 <li>访问容器的大小:<s:property value="map.size()"/> |<s:property value="map.size"/> </li> 58 <hr /> 59 <!-- 相当于对list进行遍历,取出name='s1'的元素 --> 60 <li>投影(过滤):<s:property value="list.{?#this.name='s1'}[0]"/></li> 61 <!-- 取出list集合中name='s1'的第一个元素 --> 62 <li>投影:<s:property value="list.{^#this.name=='s1'}.{name}"/></li> 63 <!-- 取出list集合中name='s1'的最后个元素 --> 64 <li>投影:<s:property value="list.{$#this.name=='s1'}.{name}"/></li> 65 <!-- 66 注意: 67 <s:property value="list.{$#this.name='s1'}.{name}"/> 68 ^ 69 | 70 | 71 这里少了个等号,就相当给每个user.name赋值 72 --> 73 <li>投影:<s:property value="list.{?#this.name=='s4'}.{name}==null"/></li> 74 <hr /> 75 <!-- [0]取出的是值栈中的所有元素 --> 76 <li>[]:<s:property value="[0].username"/></li> 77 <!-- [1]取出的是值栈中的下标为一的元素 78 也就是说不能够单个的取出值栈中的第一个元素 79 --> 80 <li>[]:<s:property value="[1]"/></li> 81 114 </ul> 115 <s:debug></s:debug> 116 </body> 117 </html>