J2EE MVC with Webwork2 Xwork, to J2EE MVC with Webwork2 Xwork

Similar documents
新・解きながら学ぶJava

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

EJB-Programming-4-cn.doc

基于CDIO一体化理念的课程教学大纲设计

EJB-Programming-3.PDF

untitled

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

IoC容器和Dependency Injection模式.doc

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

Microsoft Word - 01.DOC

优迈科技教学大纲2009版本

untitled

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型

北 风 网 讲 师 原 创 作 品 ---- 仅 供 学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

untitled

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

《大话设计模式》第一章

Java

JBuilder Weblogic

jsp

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

untitled

Chapter 9: Objects and Classes

untitled

基于ECO的UML模型驱动的数据库应用开发1.doc

Microsoft PowerPoint - ch6 [相容模式]

chp6.ppt

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

第03章 控制反转(Spring IoC)

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises)

设计模式 Design Patterns

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

epub83-1

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

D C 93 2

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

Microsoft Word - Learn Objective-C.doc

北京北信源软件股份有限公司招股书(申报稿)

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

无类继承.key

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

TopTest_Adminstrator.doc

ebook

1

RunPC2_.doc

javaexample-02.pdf


untitled

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

Microsoft Word - 第3章.doc

Strings

Microsoft Word - ch04三校.doc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

untitled

untitled

國家圖書館典藏電子全文

拦截器(Interceptor)的学习

3.1 num = 3 ch = 'C' 2

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

2 Java 语 言 程 序 设 计 教 程 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

WebSphere Studio Application Developer IBM Portal Toolkit... 2/21 1. WebSphere Portal Portal WebSphere Application Server stopserver.bat -configfile..

mvc

untitled

LiveBOS产品白皮书

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

LiveBOS产品白皮书

JavaIO.PDF

第一章 章标题-F2 上空24,下空24

untitled

1. 2. Flex Adobe 3.

untitled

Java 1 Java String Date

06-4.indd

填 写 要 求 1. 以 word 文 档 格 式 如 实 填 写 各 项 2. 表 格 文 本 中 外 文 名 词 第 一 次 出 现 时, 要 写 清 全 称 和 缩 写, 再 次 出 现 时 可 以 使 用 缩 写 3. 本 表 栏 目 未 涵 盖 的 内 容, 需 要 说 明 的, 请 在

untitled

WWW PHP

Chapter 9: Objects and Classes

Servlet

在所有的项目开发中, 一定是多人协作的团队开发, 但是使用框架就会出现一个问题, 我们所 有的 Action 以及相关的路径都要求在我们的 struts.xml 文件中配置, 如果所有的人去修改一个 文件, 那么就会变得混乱, 而且有可能出现冲突, 那么在 struts.xml 文件中为了解决这个问

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

FileMaker 16 ODBC 和 JDBC 指南

"+handlermethod.getbean().getclass().getname()); public void aftercompletion(httpservletrequest req, HttpServletResponse resp, Object handler, Excepti

untitled

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

59 1 CSpace 2 CSpace CSpace URL CSpace 1 CSpace URL 2 Lucene 3 ID 4 ID Web 1. 2 CSpace LireSolr 3 LireSolr 3 Web LireSolr ID

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

untitled

附录J:Eclipse教程

Microsoft Word - PHP7Ch01.docx

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

11 天 山 区 区 环 卫 清 运 队 机 械 工 程 师 4011 C 1 不 限 不 限 机 电 具 有 两 以 工 作 经 12 天 山 区 乌 鲁 木 齐 市 第 15 小 会 计 4012 C 1 不 限 不 限 会 计 财 会 财 电 算 化 临 床 医 预 防 医 公 共 卫 生 与

ebook71-13

Transcription:

MVC with Webwork2 Xwork

Action...1 ActionContext...3 ActionProxyFactory Factory...4 ActionProxyFactory Proxy AOP...7 XworkInterceptor...8 Interceptor...9 LoginAction...10 LoginInterceptor...12 Action Result ActionChainResult...14 EL OGNL...16 OGNL...17...17...18...20...20 List Array Map...21 (projection,selection)...22 MVC ValueStack...24 OgnlValueStack...24 ActionContext OgnlStackValue...26 Interceptor...26 ParametersInterceptor staticparametersinterceptor...26 ChainingInterceptor...26 ModelDrivenInterceptor...26 ValidationInterceptor Xwork...26 AOP...26...26 EL...26 XWork...26 Xwork+Hessian...27

Model2 MVC WebWork Command Xwork XWork WebWork1 Webwork2 Web - WebWork - JPublish - OSWorkFlow - AOBao Ivory Xwork WebWork Type MVC Xwork WebWork Action Xwork Xwork Action public interface Action extends Serializable { public static final String SUCCESS = "success"; public static final String NONE = "none"; public static final String ERROR = "error"; public static final String INPUT = "input"; public String execute() throws Exception; String execute,execute Action public class SignupAction implements Action { private UserService userservice; private String username; private String password; private String confirm; private String email; public String execute() throws Exception { getuserservice().createuser(username, password, email); return SUCCESS; private UserService getuserservice() { if(userservice == null) 1

userservice = new MemoryUserService(); return userservice; set get SignupAction Action Action Struts Action Action Web Hessian TestCase public void testcreateuser() throws Exception { SignupAction action = new SignupAction(); action.setusername("test"); action.setemail("test@test.com"); action.setpassword("1234"); action.setconfirm("1234"); String result = action.execute(); assertequals(result,action.success); SideBar: l TestCase main System.out.println println TestCase assert TestCase public void testcreateuser() throws Exception { SignupAction action = new SignupAction(); action.setusername("test"); action.setemail("test@test.com"); action.setpassword("1234"); action.setconfirm("1234"); String result = action.execute(); assertequals(result,action.success); User TDD User user = action.getuser(); 2

assertequals("test",user.getusername()); ActionContext Action WebWork SignupAction WebWork Action action execute WebWork action SignupAction Web Webwork HtteRequest username action Action execute struts : public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ActionForm HttpServletRequest HttpServletResponse, Action Action Form Xwork ActionContext import com.opensymphony.xwork.actioncontext;... ActionContext ac = ActionContext.getContext(); ActionContext Map WebWork action Action ActionContext getcontext : public static ActionContext getcontext() { ActionContext context = (ActionContext) actioncontext.get(); if (context == null) { OgnlValueStack vs = new OgnlValueStack(); context = new ActionContext(vs.getContext()); setcontext(context); 3

return context; actioncontext ThreadLocal Action ActionContext Action ActionContext execute FormBean ActionContext Action ActionContext ActionProxyFactory Factory Action ActionContext ActionContext Factory ActionProxyFactory. public void testcreateuserwithproxyfactory() throws Exception { Map params = new HashMap(); params.put("username", "test"); params.put("email", "test@test.com"); params.put("password", "1234"); params.put("confirm", "1234"); Map context = new HashMap(); context.put(actioncontext.parameters, params); Xwork ActionProxyFactory factory = ActionProxyFactory.getFactory(); ActionProxy proxy = factory.createactionproxy("", "signup", context); proxy.execute(); SignupAction action = (SignupAction) proxy.getaction(); String result = action.execute(); assertequals(result, Action.SUCCESS); Map Action JavaBean key value Map ActionContext.PARAMETERS Context. factory.createactionproxy ActionProxy 4

map Action ActionContext JUnit java.lang.exception: Could not open file xwork.xml Action createactionproxy Xwork xwork.xml signup Action xwork.xml classpath xwork.xml <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd"> <xwork> <package name="default"> <action name="signup" class="org.erptao.flex.book.xwork.signupaction"> </action> </package> </xwork> package signup org.erptao.flex.book.xwork.signupaction.! action execute public String execute() throws Exception { Map params = username = ActionContext.getContext().getParameters(); (String) params.get("username"); password = (String) params.get("password"); email = (String)params.get("email"); getuserservice().createuser(username, password, email); return SUCCESS; public void testcreateuserwithproxyfactory() throws Exception { Map params = new HashMap(); params.put("username", "test"); params.put("email", "test@test.com"); params.put("password", "1234"); params.put("confirm", "1234"); Map context = new HashMap(); context.put(actioncontext.parameters, params); 5

ActionProxyFactory factory = ActionProxyFactory.getFactory(); ActionProxy proxy = factory.createactionproxy("", "signup", context); String result = proxy.execute(); SignupAction action = (SignupAction) proxy.getaction(); assertequals(result, Action.SUCCESS); User user = action.getuser(); assertequals("test", user.getusername()); assertequals("test@test.com",user.getemail()); TestCase Xwork execute setusername,setpassword ActionContext execute : public String execute() throws Exception { getuserservice().createuser(username, password, email); return SUCCESS; Xwork Action Bean factory struts FormBean Action SignupAction execute public String execute() throws Exception { Map params = username = ActionContext.getContext().getParameters(); (String) params.get("username"); password = (String) params.get("password"); confirm = (String) params.get("confirm"); email = (String)params.get("email"); if(password==null confirm==null!password.equals(confirm)) { throw new Exception("password not set or confirm!= password"); getuserservice().createuser(username, password, email); 6

return SUCCESS; Action Factory factory Bean execute factory execute profiling factory AOP ActionProxyFactory Proxy AOP [XXX ]AOP xwork.xml signupaction ParametersInterceptor <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd"> <xwork> <package name="default"> <interceptors> <interceptor name="params" class="com.opensymphony.xwork.interceptor.parametersinterceptor"/> </interceptors> <action name="signup" class="org.erptao.flex.book.xwork.signupaction"> <interceptor-ref name="params"/> </action> </package> </xwork> xwork.xml <interceptors> <interceptor name="params" class="com.opensymphony.xwork.interceptor.parametersinterceptor"/> <interceptors> package action inteceptor interceptor interceptor stack 7

action interceptor interceptor Interceptor Xwork signup execute TestCase XworkInterceptor Interceptor J2EE Interceptor javax.serlet.filter JBoss Interceptor Interceptor AOP AspectJ Interceptor AOP Xwork Interceptor Action execute execute execute execute Xwork Interceptor Interceptor public interface Interceptor { void init(); void destroy(); String intercept(actioninvocation invocation) throws Exception; init interceptor Interceptor destroy interceptor intercept Intercept String action excute String Interceptor action ActionInvocation public interface ActionInvocation extends Serializable { Action getaction(); boolean isexecuted(); ActionContext getinvocationcontext(); ActionProxy getproxy(); Result getresult() throws Exception; String getresultcode(); OgnlValueStack getstack(); void addpreresultlistener(preresultlistener listener); String invoke() throws Exception; :Invoke(). Interceptor Interceptor 8

Interceptor Intercetor 1 Interceptor Interceptor Interceptor Xwork Action 2 Interceptor Action AOP Before Around After Interceptor XWork AroundInterceptor AroundInterceptor execute invoke Xwork AroundInterceptor Action public abstract class AroundInterceptor implements Interceptor { public void destroy() { public void init() { public String intercept(actioninvocation invocation) throws Exception { String result = null; before(invocation); result = invocation.invoke(); after(invocation, result); return result; protected abstract void after(actioninvocation dispatcher, String result) throws Exception; protected abstract void before(actioninvocation invocation) throws Exception; AroundInterceptor before After After result, result. Interceptor 9

LoginAction Authenticator public interface Authenticator { boolean login(string username,string password); public class DefaultAuthenticator implements Authenticator { private UserService userservice;; /** * */ public DefaultAuthenticator(UserService userservice) { this.userservice = userservice; // TODO Auto-generated constructor stub public boolean login(string username, String password) { User user = userservice.getuserbyname(username); if(user == null) return false; if(user.getpassword()==null) { return password==null; else { return user.getpassword().equals(password); UserService IoC protected void setup() throws Exception { service = new MemoryUserService(); service.createuser("zhansan","123","zhangsan@z.com"); public void testlogin() throws Exception { Map params = new HashMap(); params.put("userservice",service); 10

params.put("username", "syy"); params.put("password", "123"); Map context = new HashMap(); context.put(actioncontext.parameters, params); ActionProxyFactory factory = ActionProxyFactory.getFactory(); ActionProxy proxy = factory.createactionproxy("", "login", context); String result = proxy.execute(); assertequals(result, Action.SUCCESS);,setup UserService testlogin params.put("userservice",service); params.put("username", "syy"); params.put("password", "123"); userservice public class LoginAction implements Action { private String username; private String password; private Authenticator authenticator; /* (non-javadoc) * @see com.opensymphony.xwork.action#execute() */ public String execute() throws Exception { Map params = ActionContext.getContext().getParameters(); username = (String) params.get("username"); password = (String) params.get("password"); UserService service = (UserService) params.get("userservice"); if(getauthenticator(service).login(username,password)) return SUCCESS; else return ERROR; public Authenticator getauthenticator(userservice service) { 11

if(authenticator==null) { authenticator = new DefaultAuthenticator(service); return authenticator; assertequals(result, Action.SUCCESS); assertequals(result, Action.ERROR); params = new HashMap(); params.put("userservice",service); params.put("username", "zhansan"); params.put("password", "123"); context = new HashMap(); context.put(actioncontext.parameters, params); proxy = factory.createactionproxy("", "login", context); result = proxy.execute(); assertequals(result, Action.SUCCESS); User user = service.getuserbyname("zhansan"); asserttrue(user.getlastlogintime()>=beforetime); asserttrue(user.getlastlogintime()<=system.currenttimemillis()); LoginInterceptor LoginInterceptor public class LoginInterceptor extends AroundInterceptor{ protected void after(actioninvocation dispatcher, String result) throws Exception { ActionContext context = dispatcher.getinvocationcontext(); Map params = context.getparameters(); String username = (String) params.get("username"); UserService service = (UserService) params.get("userservice"); User user = service.getuserbyname(username); 12

if(user!=null) user.setlastlogintime(system.currenttimemillis()); /* (non-javadoc) * @see com.opensymphony.xwork.interceptor.aroundinterceptor#before(com.opens ymphony.xwork.actioninvocation) */ protected void before(actioninvocation invocation) throws Exception { // TODO Auto-generated method stub,interceptor ActionInvocation ActionContext xwork <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd"> <xwork> <package name="default"> <interceptors> <interceptor name="login" class="org.erptao.flex.book.xwork.logininterceptor"/> </interceptors> <action name="login" class="org.erptao.flex.book.xwork.loginaction"> <interceptor-ref name="login"/> </action> </package> </xwork> TestFirst Interceptor Interceptor TDD TestCase Interceptor Interceptor 13

Action Result ActionChainResult Action execute Interceptor MVC C C action Action execute String Xwork string Xwork String Xwork.xml Result Result execute SignupAction ActionChainResult <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd"> <xwork> <package name="default"> <result-types> <result-type name= chain class= com.opensymphony.xwork.actionchainresult /> </result-types> <action name="signup" class="org.erptao.flex.book.xwork.signupaction"> <result name="success" type="chain"> <param name="actionname">showsuccess</param> </result> <result name="error" type="chain"> <param name="actionname">showerror</param> </result> </action> </xwork> <action name="showsuccess" class="org.erptao.flex.book.xwork.showsuccessaction"> </action> <action name="showerror" class="org.erptao.flex.book.xwork.showerroraction"> </action> 14

package Result Xwork : <result-types> <result-type name= chain class= com.opensymphony.xwork.actionchainresult /> </result-types> ActionChainResult Action result-type action <result name="success" type="chain"> <param name="actionname">showsuccess</param> </result> <result name="error" type="chain"> <param name="actionname">showerror</param> </result> SignupAction SUCCESS showsuccess action ERROR showerroraction. Xwork.xml public class ShowSuccessAction extends TestCase implements Action{ private String username; private String password; private String confirm; private String email; /* (non-javadoc) * @see com.opensymphony.xwork.action#execute() */ public String execute() throws Exception { Map params = ActionContext.getContext().getParameters(); username = (String) params.get("username"); password = (String) params.get("password"); confirm = (String) params.get("confirm"); email = (String) params.get("email"); fail(); return Action.SUCCESS; ShowSuccessAction TestCase Action action UserTest, fail() assertequals(username,"test"); assertequals(email, "test@test.com"); assertequals(password, "1234"); assertequals(confirm, "1234"); 15

Xwork Result actionname,( <param name="actionname">showsuccess</param>) Result execute public void execute(actioninvocation invocation) throws Exception { HashMap extracontext = new HashMap(); extracontext.put(actioncontext.value_stack, ActionContext.getContext().getValueStack()); extracontext.put(actioncontext.parameters, ActionContext.getContext().getParameters()); extracontext.put("com.opensymphony.xwork.interceptor.component.compon entmanager", ActionContext.getContext().get("com.opensymphony.xwork.interceptor.co mponent.componentmanager")); if (log.isdebugenabled()) { log.debug("chaining to action " + actionname); one // if the namespace wasn't explicitly defined, assume the current if (this.namespace == null) { this.namespace = invocation.getproxy().getnamespace(); proxy = ActionProxyFactory.getFactory().createActionProxy(this.namespace, actionname, extracontext); proxy.execute(); Xwork Action Controller Web Webwork Result EL OGNL Action Web Form 16

username Action username Action Action Action 1 TextField Data String Action string FormBean 2 Action Action action action 3 list map 4 5 JSP javabean JSTL EL.,Velocity WebWork Web tag Xwork Xwork OGNL Object Graph Navigation Language Web Tapestry WebObjects http://www.ognl.org/ OGNL Java OGNL OGNL OGNL JavaBean setter/getter OGNL 17

User public class User { public Group getgroup() { public class Group { private Map users = new HashMap(); private String name; public Group(String name) { this.name = name; public boolean containuser(string username) { return users.containskey(username); public void adduser(user user) { user.setgroup(this); users.put(user.getusername(),user); public Collection getallusers() { return Collections.unmodifiableCollection(users.values()); user group.name group.containuser ( test ) group.allusers.size() Ognl TestCase public void testget() throws OgnlException { User user = new User("test","123","a@a.com"); Object name = getvalue(user,"username",null); assertequals("test",name); Map context = new HashMap(); context.put("hello","hi! "); Object hello = getvalue(user,"#hello + username",context); assertequals("hi! test",hello); 18

public Object getvalue(object rootobject,string expr,map context) throws OgnlException { if(context==null) return Ognl.getValue(Ognl.parseExpression(expr), rootobject); return Ognl.getValue(Ognl.parseExpression(expr), context, rootobject); getvalue Ognl ognl.ognl: Ognl.getValue(Ognl.parseExpression(expr), context, rootobject); string JavaCC AST Context ognl assert "username", context user username "#hello + username" context hello Hi! #hello + username #hello OGNL # TestCase Group group = new Group("testGroup"); group.adduser(user); Object currentgroupusercount = getvalue(user,"group.allusers.size()",null); assertequals(new Integer(1),currentGroupUserCount); Map usercontext = new HashMap(); usercontext.put("requestuser","tttt"); Object hasuser = getvalue(user,"group.containuser( #requestuser )",usercontext); assertequals(boolean.false,hasuser); usercontext.put("requestuser","test"); hasuser = getvalue(user,"group.containuser( #requestuser )",usercontext); assertequals(boolean.true,hasuser); ognl this Object usercountstring = 19

getvalue(user,"group.allusers.size().tostring()",null); assertequals("1",usercountstring); usercountstring = getvalue(user,"group.allusers.size().(#this+1).tostring()",null); assertequals("2",usercountstring); ognl Map newname = new HashMap(); newname.put("newname","ttttttt"); getvalue(user,"username=#newname",newname); assertequals(user.getusername(),"ttttttt"); public void testsetvalue() throws OgnlException { User user = new User("test","123","a@a.com"); setvalue(user,"username",null,"test1"); assertequals(user.getusername(),"test1"); Group group = new Group("testGroup"); group.adduser(user); setvalue(user,"group.name",null,"testgoup1"); assertequals(group.getname(),"testgoup1"); root Context getvalue() OGNL OGNL java b B BigDecimals h H BigIntegers true false null 20

@class@member @org.erptao.flex.someclass@somestaticfiel @org.erptao.flex.someclass@somestaticmethod(args) List Array Map List {element1,element2,element3,.. list List public void testlist() throws OgnlException { User user = new User("test","123","a@a.com"); Object usernameinlist = getvalue(user,"username in {'123','456',null,'tttt'",null); assertequals(boolean.false,usernameinlist); usernameinlist = getvalue(user,"username in {'123','test',null,'tttt'",null); assertequals(boolean.true,usernameinlist); { 123 test null, ttt OGNL List Group group = new Group("test"); group.adduser(user); User anotheruser = new User("test1","123","a@a.com"); group.adduser(anotheruser); User justanotheruser = new User("test2","123","a@a.com"); group.adduser(justanotheruser); Object firstuser = getvalue(user, "group.alluserlist[0]",null); assertequals(user,firstuser); Object seconduser = getvalue(user, "group.alluserlist[1]",null); assertequals(anotheruser,seconduser); Array public void testarray() throws OgnlException { User user = new User("test", "123", "a@a.com"); Group group = new Group("test"); group.adduser(user); User anotheruser = new User("test1", "123", "a@a.com"); group.adduser(anotheruser); User justanotheruser = new User("test2", "123", "a@a.com"); group.adduser(justanotheruser); Object usernameinlist = 21

getvalue(user, "username in new String[] {'123','test',null,'tttt'", null); assertequals(boolean.true, usernameinlist); new ObjectType[] {. Object thirduser = getvalue(user,"group.alluserlist.toarray()[2]",null); assertequals(justanotheruser,thirduser); Map public void testmap() throws OgnlException { Map map = new HashMap(); getvalue(map,"putall(#{ 'foo' : 'foo value', 'bar' : 'bar value' )",null); assertequals(map.get("foo"),"foo value"); assertequals(map.get("bar"),"bar value"); #{ 'foo' : 'foo value', 'bar' : 'bar value' Map,map #{ key1:value1, key2:value2, (projection,selection) OGNL projection selection, selection collection.{xxx public void testporjectionandselection() throws OgnlException { User user = new User("test", "123", "a@a.com"); Group group = new Group("test"); group.adduser(user); User anotheruser = new User("test1", "123", "a@a.com"); group.adduser(anotheruser); User justanotheruser = new User("test2", "123", "a@a.com"); group.adduser(justanotheruser); List usernames = (List) getvalue(user,"group.alluserlist.{username",null); assertequals(usernames.size(),3); 22

assertequals(usernames.get(0),"test"); assertequals(usernames.get(1),"test1"); assertequals(usernames.get(2),"test2"); { #this User nullemailuser = new User("test2", "123", null); group.adduser(nullemailuser); List useremaildomains = (List) getvalue(user,"group.alluserlist.{#this.email==null? null : email.substring(email.indexof('@')+1)",null); assertequals(useremaildomains.size(),4); assertequals(useremaildomains.get(0),"a.com"); assertequals(useremaildomains.get(1),"b.com"); assertequals(useremaildomains.get(2),"c.com"); assertequals(useremaildomains.get(3),null); group.alluserlist.{#this.email==null? null : email.substring(email.indexof('@')+1) user email null null domain email domain Selection collection.{x YYY X? ^ $ List nonnullemailusers = (List)getValue(user,"group.allUserList.{? #this.email!=null",null); assertequals(nonnullemailusers.size(),3); List firstnonnullemailuser = (List)getValue(user,"group.allUserList.{^ #this.email!=null",null); assertequals(firstnonnullemailuser.size(),1); assertequals(firstnonnullemailuser.get(0),user); List lastnonnullemailuser = (List)getValue(user,"group.allUserList.{$ #this.email!=null",null); assertequals(lastnonnullemailuser.size(),1); assertequals(lastnonnullemailuser.get(0),justanotheruser); selection projection SQL List nonnulluserdomains = (List) getvalue(user,"group.alluserlist.{? #this.email!=null.{#this.email.substring(email.indexof('@')+1)",nul 23

l); assertequals(nonnulluserdomains.size(),3); assertequals(nonnulluserdomains.get(0),"a.com"); assertequals(nonnulluserdomains.get(1),"b.com"); assertequals(nonnulluserdomains.get(2),"c.com"); OGNL Xwork OGNL MVC ValueStack XWork Model-2 MVC C View JSP Tag struts tag <logic:iterate id="relative" name="myformbean" property= relatives > <bean:write name="relative" property="value"/> </logic:iterate> webwork <webwork:iterator value= relatives > <webwork:property value= name /> </webwork:iterator> struts tag id bean bean tag Struts nested tag bean tag nested:xx Webwork nested Xwork ValueStack OgnlValueStack OgnlValueStack OGNL root OGNL TestCase OgnlValueStack stack = new OgnlValueStack(); User user = new User("test", "123", "a@a.com"); stack.push(user); dumpstack(stack.getroot()); Object name = stack.findvalue("username"); 24

assertequals("test", name); OgnlValueStack, user push dumpstack username OgnlValueStack OGNL root CompundRoot dump: private void dumpstack(compoundroot root) { System.out.println("---stack top---"); for(int i=0;i<root.size();i++) { System.out.println(root.get(i).toString()); System.out.println("---stack bottom---"); dump ---stack top--- [username:test] ---stack bottom--- stack.getcontext().put("hello", "Hi! "); Object helloname = stack.findvalue("#hello+username"); assertequals("hi! test", helloname); Group Group group = new Group("testGroup"); stack.push(group); dumpstack(stack.getroot()); name = stack.findvalue("name"); assertequals("testgroup", name); ---stack top--- [groupname:testgroup] [username:test] ---stack bottom--- name group name = stack.findvalue("username"); assertequals("test", name); stack Group username ValueStack User username Group Group anothergroup = new Group("testGroup1"); stack.push(anothergroup); dumpstack(stack.getroot()); ---stack top--- [groupname:testgroup1] [groupname:testgroup] [username:test] 25

---stack bottom--- testgroup name name = stack.findvalue("name"); assertequals("testgroup1", name); name = stack.findvalue("[1].name"); assertequals("testgroup", name); ActionContext OgnlValueStack Interceptor ParametersInterceptor staticparametersinterceptor ChainingInterceptor ModelDrivenInterceptor ValidationInterceptor Xwork AOP EL XWork 26

Xwork+Hessian 27