Struts2 OGNL案例

先定义两个实体类User和Address

User

package cn.entity;

public class User {
    private String name;
    private int age;
    private Address address;
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

Address

package cn.entity;

public class Address {
    private String country; // 国家
    private String city; // 城市
    private String street; // 街道
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
}

创建出一个action先创建出两个成员变量 然后在核心方法中实例化成员变量。

package cn.action;

import cn.entity.Address;
import cn.entity.User;

import com.opensymphony.xwork2.ActionSupport;

public class ShowOriginalAndJavaBeanAction extends ActionSupport {
    private User user;
    private String message;
    public String execute(){
        setUser(new User());
        getUser().setName("jbit");
        getUser().setAge(23);
        Address address=new Address();
        address.setCountry("中国");
        address.setCity("北京");
        address.setStreet("长安街");
        getUser().setAddress(address);
        setMessage("展示原始类型和JavaBean");
        return SUCCESS;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

核心配置:struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="showOriginalAndJavaBeanAction" class="cn.action.ShowOriginalAndJavaBeanAction">
<result>result.jsp</result>
</action>
</package>
</struts>

result页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP ‘result.jsp‘ starting page</title>

  </head>

  <body>
       信息:<s:property value="message" default="展示数据" /><br/>
       姓名:<s:property value="user.name" /><br/>
       年龄:<s:property value="user.age"  /><br/>
      国家:<s:property value="user.address.country" />
    <s:debug></s:debug>
  </body>
</html>

property标签用于输出ValueStack中对象属性的值,其中value属性用来指定要输出对象的属性,如果没有value属性,则默认输出ValueStack栈顶的对象,类型为Object;default属性是属性值为空时默认的默认值,类型为String

效果展示:

二>>多值类型请求参数的处理

如果在请求中出现多个值对应同一个请求参数的情况,Struts2会将这样的数据转换为面向集合的数据类型,如集合,数组

1.数组

表单代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP ‘index.jsp‘ starting page</title>

  </head>

  <body>
    <s:form action="ArraysDataTransfer.action">
        <s:textfield name="hobbies" label="爱好:"/>
        <s:textfield name="hobbies" label="爱好:"/>
        <s:textfield name="hobbies" label="爱好:"/>

        <s:textfield name="numbers[0]" label="数字:"/>
        <s:textfield name="numbers[1]" label="数字:"/>
        <s:textfield name="numbers[2]" label="数字:"/>
        <s:submit value="提交"/>
    </s:form>
  </body>
</html>

第一个数组属性是hobbies,接收提交的爱好信息;第二个数组属性是numbers,接收提交的数字,如果数据转移要正常工作,这些属性必须存在ValueStack中。在Action类中公开这些属性

ArraysDataTransferAction

package cn.action;

import com.opensymphony.xwork2.ActionSupport;

public class ArraysDataTransferAction extends ActionSupport {
    private String[] hobbies;
    private Double[] numbers=new Double[3];

    public String execute(){
        System.out.println("hobbies的长度是"+hobbies.length);
        for(int i=0;i<hobbies.length;i++){
            System.out.println("hobbies数组中第"+i+"个元素是:"+hobbies[i]);
        }
        System.out.println("numbers的长度是"+numbers.length);
        for(int i=0;i<numbers.length;i++){
            System.out.println("numbers数组中第"+i+"个元素是:"+numbers[i]);
        }

        return SUCCESS;
    }
    public String[] getHobbies() {
        return hobbies;
    }
    public void setHobbies(String[] hobbies) {
        this.hobbies = hobbies;
    }
    public Double[] getNumbers() {
        return numbers;
    }
    public void setNumbers(Double[] numbers) {
        this.numbers = numbers;
    }
}

struts.xml

<action name="ArraysDataTransfer" class="cn.action.ArraysDataTransferAction">
            <result name="success">result2.jsp</result>
        </action>

result2.jsp

  <body>
       请查看控制台的输出
  </body>

2.集合

使用List与使用数组几乎相同,仅有不同的是集合类型可以借助泛型实现

表单代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP ‘index.jsp‘ starting page</title>

  </head>

  <body>
    <s:form action="listDataTransfer">
        <s:textfield name="hobbies" label="爱好:"/>
        <s:textfield name="hobbies" label="爱好:"/>
        <s:textfield name="hobbies" label="爱好:"/>

        <s:textfield name="numbers[0]" label="数字:"/>
        <s:textfield name="numbers[1]" label="数字:"/>
        <s:textfield name="numbers[2]" label="数字:"/>

        <s:textfield name="users.name" label="姓名:"/>
        <s:textfield name="users.name" label="姓名:"/>
        <s:textfield name="users.name" label="姓名:"/>
        <s:submit value="提交"/>
    </s:form>
  </body>
</html>

相同名称参数有多个数据输入,可以将具有相同名称的参数看作一个集合,特殊说明的是users.name,当ognl解析这个表达式时,会首先定位user属性,与之不同的是,user是一个指定了元素为User对象的List。

ListDataTransferAction

package cn.action;

import com.opensymphony.xwork2.ActionSupport;

import cn.entity.User;

import java.util.*;

public class ListDataTransferAction extends ActionSupport {
    private List<String> hobbies;
    private List<Double> numbers;
    private List<User> users;

    public String execute(){
        System.out.println("hobbies的长度是"+hobbies.size());
        for(int i=0;i<hobbies.size();i++){
            System.out.println("hobbies数组中第"+i+"个元素是:"+hobbies.get(i));
        }
        System.out.println("numbers的长度是"+numbers.size());
        for(int i=0;i<numbers.size();i++){
            System.out.println("numbers数组中第"+i+"个元素是:"+numbers.get(i));
        }
        System.out.println("users的长度是"+users.size());
        for(int i=0;i<users.size();i++){
            System.out.println("users数组中第"+i+"个元素是:"+users.get(i).getName());
        }
        return SUCCESS;
    }
    public List<String> getHobbies() {
        return hobbies;
    }
    public void setHobbies(List<String> hobbies) {
        this.hobbies = hobbies;
    }
    public List<Double> getNumbers() {
        return numbers;
    }
    public void setNumbers(List<Double> numbers) {
        this.numbers = numbers;
    }
    public List<User> getUsers() {
        return users;
    }
    public void setUsers(List<User> users) {
        this.users = users;
    }

}

struts.xml

<action name="listDataTransfer" class="cn.action.ListDataTransferAction">
            <result>result2.jsp</result>
        </action>

result2.jsp

  <body>
       请查看控制台的输出
  </body>

三>>访问集合对象

package cn.action;

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

import cn.entity.Address;
import cn.entity.User;

import com.opensymphony.xwork2.ActionSupport;

public class ShowArraysAndListAction extends ActionSupport {

    private String[] hobbies;
    private List<Double> numbers;
    private List<User> users;

    private User user;

    public String execute() throws Exception {
        users=new ArrayList<User>();
        user=new User();
        user.setUsername("火狐");
        user.setPassword("11");
        Address address=new Address();
        address.setCountry("中国");
        address.setCity("北京");
        address.setStreet("长安街");
        user.setAddress(address);
        users.add(user);
        user=new User();
        user.setUsername("hh");
        user.setPassword("10");
        Address address2=new Address();
        address2.setCountry("中国");
        address2.setCity("北京");
        address2.setStreet("海淀");
        user.setAddress(address);
        users.add(user);
        return SUCCESS;

    }

    public String[] getHobbies() {
        return hobbies;
    }

    public void setHobbies(String[] hobbies) {
        this.hobbies = hobbies;
    }

    public List<Double> getNumbers() {
        return numbers;
    }

    public void setNumbers(List<Double> numbers) {
        this.numbers = numbers;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

}

实体类

User

package cn.entity;

public class User {
    //用户输入的姓名
    private String username;
    //用户输入的密码
    private String password;

    private Address address;
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    /*
     * 获取名字
     * @return 名字
     */
    public String getUsername() {
        return username;
    }
    /*
     * 设置名字
     * @para name名字
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /*
     * 获取密码
     * @return 密码
     */
    public String getPassword() {
        return password;
    }

    /*
     * 设置密码
     * @para password密码
     */
    public void setPassword(String password) {
        this.password = password;
    }

}

Address

package cn.entity;

public class Address {
    private String country; // 国家
    private String city; // 城市
    private String street; // 街道
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
}

struts.xml

<action name="showArrayAndListAction" class="cn.action.ShowArraysAndListAction">
        <result name="success">result.jsp</result>
        </action>

result.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP ‘result.jsp‘ starting page</title>

</head>

<body>
     迭代数组输出:<br/>
    <s:iterator value="hobbies">
        <s:property /><br/>
    </s:iterator>
    迭代集合(元素类型为Double):<br/>

<s:iterator value="numbers">
    <s:property /><br/>
</s:iterator>

迭代集合(元素类型为User):<br/>

    <s:iterator value="users">
               用户名:<s:property value="username" /><br />
               密码:<s:property value="password" /><br />
               国家:<s:property value="address.country" /><br />
    </s:iterator>

    <s:debug></s:debug>
</body>
</html>

效果:

时间: 2024-10-14 00:02:57

Struts2 OGNL案例的相关文章

Struts2 OGNL

OGNL(Object-Graph Navigation Language)的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能. 1.OGNL表达式的计算是围绕OGNL上下文进行的. OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示.它里面可以存放很多个Ja

Struts2 OGNL概述

OGNL概述 1.之前web阶段,学习过EL表达式,EL表达式在jsp中获取域对象里面的值 2.OGNL是一种表达式,这个表达式功能更加强大 (1)在struts2里面操作值栈数据 (2)一般把ognl在struts操作:和struts2标签一起使用操作值栈 3.OGNL不是struts2的一部分,单独的项目,经常和struts2一起使用 (1)使用ognl时候首先导入jar包,struts2提供包 OGNL入门案例 1.使用ognl+struts2标签实现计算字符串长度 支持对象方法调用.例如

Struts2 OGNL使用详解(转)

OGNL OGNL ( Object Graph Navigation Language ),对象图导航语言.这是一种强大的表达式语言,通过它可以非常方便的来操作对象属性. 在 Struts2 中,OGNL 需要和 Struts2 标签库配套来使用. OGNL context |                                | -- application                                |                            

struts2 OGNL配和通用标签和其它标签的使用

三.OGNL配合通用标签的其他使用 1.iterator标签(很重要) 动作类 1 package com.itheima.web.action; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.itheima.domain.Student; 7 import com.opensymphony.xwork2.ActionSupport; 8 /** 9 * s:iterator标签的使用 10 * @

struts2 OGNL表达式

五.OGNL简介(非常重要) 1.什么是OGNL OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个单独的开源项目. Struts2框架使用OGNL作为默认的表达式语言. 2.OGNL的功能 前提:OGNL是struts2整合的一个开源项目,所以在struts2中,要想使用OGNL表达式,必须使用Struts2标签库 2.1.支持普通方法的调用 1 <%@ page language="java" import=&qu

Struts2——OGNL(一)

二十.OGNL 1.直接访问值栈中的action属性 <s:property value="v"/> 2.访问值栈中对象普通属性(set/get方法) 在OGNL中访问对象的属性时,必须传入属性才会初始化一个Domain Model对象,但是要保持Domain Model中有默认的构造方法 http://localhost:8080/OGNL/ognl?username=u&password=p&user.age=25 User的name属性为25 http

struts2 ognl表达式访问值栈

1:简单的说,值栈是对应每一个请求对象的轻量级的数据存储中心,在这里统一管理着数据,供Action.Result.Interceptor等Struts2的其他部分使用,这样数据被集中管理起来而不凌乱. 简单的说,值栈能够线程安全的为每个请求提供公共的数据存取服务. 当有请求的时候,Struts2会为每个请求创建一个新的值栈,也就是说,栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据. 正是因为值栈和请求的对应关系,因此值栈能保证线程安全的为每个请求提供

Struts2入门案例

struts2最简便的案例 Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点.Struts 2拥有更加广阔的前景,自身功能强大,还对其他框架下开发的程序提供很好的兼容性.下面我们了解一下syruts2的应用 1.引入jar包 2在src包下创建一个名为struts.xml的配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts

struts2—OGNL

1.OGNL表达式 1.ONGL是对象视图导航语言 ${user.name}这种写法就是对象视图导航 2.OGNL的jar包是包含在Struts2基础包中 3.OGNL的存储方式 4.OGNL表达式使用方式 public void ognlBasc() throws OgnlException { OgnlContext oc = new OgnlContext(); User user = new User("zjj","123456"); oc.setRoot(