首页 > 代码库 > Struts2 OGNL案例
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="http://www.mamicode.com/"> <title>My JSP ‘result.jsp‘ starting page</title> </head> <body> 信息:<s:property value="http://www.mamicode.com/message" default="展示数据" /><br/> 姓名:<s:property value="http://www.mamicode.com/user.name" /><br/> 年龄:<s:property value="http://www.mamicode.com/user.age" /><br/> 国家:<s:property value="http://www.mamicode.com/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="http://www.mamicode.com/"> <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="http://www.mamicode.com/提交"/> </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="http://www.mamicode.com/"> <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="http://www.mamicode.com/提交"/> </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="http://www.mamicode.com/"><title>My JSP ‘result.jsp‘ starting page</title></head><body> 迭代数组输出:<br/> <s:iterator value="http://www.mamicode.com/hobbies"> <s:property /><br/> </s:iterator> 迭代集合(元素类型为Double):<br/><s:iterator value="http://www.mamicode.com/numbers"> <s:property /><br/></s:iterator>迭代集合(元素类型为User):<br/> <s:iterator value="http://www.mamicode.com/users"> 用户名:<s:property value="http://www.mamicode.com/username" /><br /> 密码:<s:property value="http://www.mamicode.com/password" /><br /> 国家:<s:property value="http://www.mamicode.com/address.country" /><br /> </s:iterator> <s:debug></s:debug></body></html>
效果:
Struts2 OGNL案例