ognl

来源:互联网 发布:宝宝唱歌软件 编辑:程序博客网 时间:2024/05/16 00:45
  知识点:struts2页面标签和ognl
1、struts2页面标签
要使用struts2的标签必须在jsp页面导入<%@ taglib prefix="s" uri="/struts-tags"%>
1.1、select标签(代码如下)
Java代码 复制代码 收藏代码
  1. <!-- select标签 #表示取值栈中的值 attr. 不需要指定作用域-->
  2. <s:select list="#attr.list" name="mylist" listKey="age" listValue="uname" headerKey="0" headerValue="请选择" size="7" >
  3. </s:select>

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

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


注意:当在页面上选中select标签的值或者checkbox的值,假如要在后台拿选择的情况,则必须定义相应的变量,命名必须和页面相应标签的名字相同,当是checkbox时,则action中定义拿值的变量必须是数组。假如页面有多个标签则后台必须有相对应的拿值属性,否则会报空指针错误(代码如下)
Java代码 复制代码 收藏代码
  1. package cn.zhuojingxinxi.web;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.apache.struts2.ServletActionContext;
  5. import cn.zhuojingxinxi.entity.Users;
  6. public class UsersAction {
  7. private Users users=null;
  8. private int [] mycheckbox;
  9. private int [] mylist;
  10. public int[] getMycheckbox() {
  11. return mycheckbox;
  12. }
  13. public void setMycheckbox(int[] mycheckbox) {
  14. this.mycheckbox = mycheckbox;
  15. }
  16. public int[] getMylist() {
  17. return mylist;
  18. }
  19. public void setMylist(int[] mylist) {
  20. this.mylist = mylist;
  21. }
  22. public int[] getCheckbox() {
  23. return mycheckbox;
  24. }
  25. public void setCheckbox(int[] mycheckbox) {
  26. this.mycheckbox = mycheckbox;
  27. }
  28. public Users getUsers() {
  29. return users;
  30. }
  31. public void setUsers(Users users) {
  32. this.users = users;
  33. }
  34. public String execute(){
  35. ServletActionContext.getRequest().setAttribute("list", getList());
  36. if(mycheckbox!=null){
  37. for (int i =0; i < mycheckbox.length; i++) {
  38. System.out.println(mycheckbox[i]);
  39. }
  40. }
  41. return "success";
  42. }
  43. public List<Users> getList(){
  44. List<Users> list=new ArrayList<Users>();
  45. Users users1=new Users();
  46. users1.setUname("zhangsan");
  47. users1.setAge(21);
  48. list.add(users1);
  49. Users users2=new Users();
  50. users2.setUname("lisi");
  51. users2.setAge(24);
  52. list.add(users2);
  53. Users users3=new Users();
  54. users3.setUname("wangwu");
  55. users3.setAge(25);
  56. list.add(users3);
  57. return list;
  58. }
  59. }


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


其中test方法是定义在后台实体类Users中的。执行这段代码能在页面中输出三个sss
Java代码 复制代码 收藏代码
  1. package cn.zhuojingxinxi.entity;
  2. public class Users {
  3. private String uname;
  4. private int age;
  5. public String getUname() {
  6. return uname;
  7. }
  8. public void setUname(String uname) {
  9. this.uname = uname;
  10. }
  11. public int getAge() {
  12. return age;
  13. }
  14. public void setAge(int age) {
  15. this.age = age;
  16. }
  17. public String test(){
  18. return "ssss";
  19. }
  20. }



# 的三种用途:1、取值栈中的值
Java代码 复制代码 收藏代码
  1. <s:set name="myage" value="20"></s:set>
  2. <s:property value="#myage"/>

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

3、构建一个map
Java代码 复制代码 收藏代码
  1. <s:set name="mymap" value="#{'one':'first','two':'second'}"></s:set>
  2. <s:iterator value="#mymap">
  3. <s:property value="key"/>
  4. <s:property value="value"/>
  5. </s:iterator>



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

Java代码 复制代码 收藏代码
  1. <s:textfield name="ssss" label="%{getText('uname')}"></s:textfield>

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


@ 表示调用静态方法
Java代码 复制代码 收藏代码
  1. <s:if test="@cn.zhuojngxinxi.biz.UserService@login('aasssaa')">
  2. 登录成功
  3. </s:if>
  4. <s:else>
  5. 失败
  6. </s:else>

后台login代码:
Java代码 复制代码 收藏代码
  1. package cn.zhuojingxinxi.biz;
  2. public class UserService {
  3. public static Boolean login(String uname){
  4. if(uname!=null&&uname.length()>6){
  5. return true;
  6. }
  7. return false;
  8. }
  9. }
原创粉丝点击