struts2 Action的参数处理和应用(数据访问和处理)-技术培训

这是一次为部门作的技术培训ppt,以下将其贴出,以方便大家查看。
下载地址:http://download.csdn.net/download/fly_m/5562553

本培训从最基本的数据如何进行访问和如何调用方法开始,逐步深入,讲解在数据处理当中涉及到的数据访问,转换,封装以及数据创建等内容。然后结合struts2,讲解在struts2中是如何运用这些理论来处理这些事项,并且是如何运行的;最后讲解了一个之前提到过如何在sturts2中使用带参数进行方法调用,并且是如何作到的。
涉及到以下主题

基本的数据访问
数据链
Request请求中的数据处理
数据转换和封装
泛型映射
Struts2中的数据处理
方法参数映射
Struts2中的数据增强处理

继续阅读“struts2 Action的参数处理和应用(数据访问和处理)-技术培训”

ognl针对javaBean属性错误的解析方式(针对类首2位字母均为大写的情况)

在使用Struts2进行属性信息显示时,经常使用如下的显示语句:

<s:property value="xx.name"/>

而对于如上的语句,在后台则是使用ognl进行数据解析。在解析时,实际的执行代码类似于这样的处理逻辑

action.getXx().getName()

然而,在ognl里面是否是严格按照javaBean的解析方式呢,如果是这样的话,那就对了。但实际情况即不是,它自作聪明地想要自己去实际properDescripter,但却弄巧成拙(可以使用这个词)。
以下代码针对于 版本ognl 2.7.3以及3.0.5(最新的也存在这个问题)。

问题出现在获取getXx()这个方法上。对于像如下的属性声明:

public class Tx {
	private CGame cGame;

	public CGame getCGame(long[] ids) {
		return null;
	}

	public CGame getcGame() {
		return cGame;
	}
}

在执行以下代码:

                Tx t = new Tx();
		System.out.println(Ognl.getValue("cGame", t));

它并不会返回正常的cGame,而是会报一个NoSuchMethodException的错误。在上面的javaBean中,由于CGame的声明方法为首2全字母为大写,根据javaBean的特殊规定,因此 getMethod直接为首字母小写形式,而并不是简单粗暴的getCGame()形式。但ognl即直接栽到这里了。在上面的Ognl.getValue("cGame")中,ognl会去找相应的getMethod,即会调用OgnlRuntime.getMethodValue(xxx)方法,方法内部代码如下所示:

        Object result = null;
        Method m = getGetMethod(context, (target == null) ? null : target.getClass() , propertyName);
//最终会调用到 getDeclaredMethods(targetClass, propertyName, false /* find 'get' methods */);
//其中关键代码为
//以下代码在OgnlRuntime 1745行 3.0.5版本

//悲剧,强行将首字母大写了
                    String baseName = Character.toUpperCase(propertyName.charAt(0)) + propertyName.substring(1);

                    for (Class c = targetClass; c != null; c = c.getSuperclass()) {
                        Method[] methods = c.getDeclaredMethods();

                        for (int i = 0; i < methods.length; i++) {

                            if (!isMethodCallable(methods[i]))
                                continue;

                            String ms = methods[i].getName();

                            if (ms.endsWith(baseName)) {

因此,在以上的执行代码中,Ognl最终会找到getCCGame(long[])这个方法,并认为这个方法就是最终的方法,但由于它需要getMethod,因此它还会作一个判断,即判断参数列表为0。结果惟一的getCCgame(long[])就被排除了。最后就会报一个NoSuchMethodException错误。而我们正确的getcGame()方法,从一开始就被排除在Ognl的查找范围之外。

要解决以上的问题,方法也很简单,一是将属性名修改为首2位字母均为小写的情况,另一个方法就是再写一个叫getCGame()的方法,里面直接返回getcGame()。但这两种方法,均不是最妥的方法,但也只能这样做了。

在struts2方法上直接使用参数(不带注解)进行逻辑处理

众所周知,在使用struts2时,所写的逻辑方法都是无参数的,所以的参数都是写在action内部的。如果一个action方法过多,而每个方法所使用的参数都不尽相同时,就会造成一个action内参数过多,且每个参数都有get/set,造成程序混乱,并且在可读性和使用上都不太方便。因为,你不知道你所调用的方法使用了哪些参数,而这个方法会返回哪些结果,在界面上哪些get对象是可以使用的。

那么,能否直接在方法上使用参数呢,就像在action里面一样,直接注入,直接使用,并且没有副作用呢?你想像使用spring mvc甚至更好的方式(无注解)使用struts2吗?这种想法是可以滴,当然现有的struts2是不支持滴。不过,我们可以修改之,让其支持。
本篇所使用以及参考的相关技术前提(可google之)

  • struts2(xwork)中valueStack中的工作原理
  • 在valueStack中CompoundRoot对象如何使用
  • OGNL的propertyAccessor以及扩展
  • struts2(xwork)所提供的ognl扩展
  • 使用spring中所提供的localVariable访问方法参数信息
  • java编译保存方法变量信息

本篇所提供内容工作前提

  • action中每个方法名称惟一(不支持方法重载)
  • java文件编译时保存了调试信息中的方法变量信息

本篇技术内容索引

  1. 获取方法信息
  2. 方法参数注入
  3. 方法调用调整
  4. Map及List泛型参数注入修正
  5. 方法内数据返回

继续阅读“在struts2方法上直接使用参数(不带注解)进行逻辑处理”