一>>原始类型与包装类型

先定义两个实体类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>

效果:

Struts2 OGNL案例的更多相关文章

  1. Struts2(Ognl)

    OGNL(Object-Graph Navigation Language)全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整 ...

  2. 三、第一个Struts2应用案例(编码步骤)

    第一个Struts2应用案例(编码步骤) 编写2个jsp hello.jsp <body>     <a href="${pageContext.request.conte ...

  3. 案例45-crm练习改写客户列表使用struts2&OGNL

    1 修改CustomerAction代码 2 修改jsp/customer/list.jsp代码 <%@ page language="java" contentType=& ...

  4. 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】

    一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...

  5. Struts2 OGNL使用详解(转)

    OGNL OGNL ( Object Graph Navigation Language ),对象图导航语言.这是一种强大的表达式语言,通过它可以非常方便的来操作对象属性. 在 Struts2 中,O ...

  6. Struts2入门案例

    struts2最简便的案例   Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点.Struts 2拥有更加广阔的前景,自身功能强大,还对其他框架 ...

  7. Struts2 OGNL 自动转换Date类型的一些注意事项

    Strut2 有比较完善的使用OGNL的jsp标签自动转化为对应的后台对象的功能. 这里java.util.Date的自动转化有一些需要注意的地方(局部转换): 1.必须要在struts的xml文件中 ...

  8. Struts2 OGNL 字符串自定义转化对象细节

    要使用Struts2的自定义对象转化,需要几个要点: 1.要有继承DefaultTypeConverter的实现类,要重写convertValue,并且参数value转化而来的String是Strin ...

  9. struts2 OGNL表达式

    一.OGNL OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对 ...

随机推荐

  1. 增加线程异步发送消息的方法一(Thread)

    @RequestMapping(value="order/updateOrder.do") public String updateOrder(HttpServletRequest ...

  2. 2>&1 linux

    2>&1使用 2>&1使用 一 相关知识 1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |).2)默认地,标准的输出为终端(terminal),但是也可 ...

  3. javaxml文件基础:Dom怎么生成xml文件

    package CreateXmlByDom; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax. ...

  4. 企业商务差旅信息化管理与移动App

    背景       某航空公司需要到北京某服务提供商公司学习交流,为了节省出行成本让出差员工乘坐公司运营航线,去程路途较远.需要在先乘飞机到天津机场,转地铁后,再乘动车到北京.回程时发生 后补机票失败, ...

  5. socket.io,命名空间

    原文:http://www.cnblogs.com/xiezhengcai/p/3966263.html 命名空间 在api部分我们说io.connect('ws://103.31.201.154:5 ...

  6. 适应手机端的jQuery图片滑块动画DEMO演示

    在线预览 下载地址 实例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...

  7. 如何合理优化WEB前端 高效提升WEB前端性能

    对前端开发工程师来说,前端性能优化的重要性是不言而喻的,最为大家所知的是YSLOW的23条优化规则,在我的理解中,性能优化不纯粹是指用户访问网站的速度,也包括开发的效率,这里我总结下我理解中的WEB前 ...

  8. ArcGIS中的坐标系统定义与投影转换【转】

    ArcGIS中的坐标系统定义与投影转换 坐标系统是GIS数据重要的数学基础,用于表示地理要素.图像和观测结果的参照系统,坐标系统的定义能够保证地理数据在软件中正确的显示其位置.方向和距离,缺少坐标系统 ...

  9. Mac系统下Android生成keystore

    首先打开终端(在搜索里面搜索Te即可出来) 然后输入  cd /Library/Java/Home/bin/ 然后这步很关键,由于我们用的是当前用户,所以没有最高权限,不能在Library文件夹下生成 ...

  10. IOS开发基础知识--碎片7

    三十八:各个版本IPHONE分辨率及图片的实现原理 desert@2x : iPhone 4s ( x ) desert-568h@2x : iPhones , 5C and 5S ( x ) des ...