Как привязать параметры ServletRequest к объектам домена? - PullRequest
0 голосов
/ 24 декабря 2009

Я хочу привязать параметры запроса ServletRequest к произвольным объектам домена. Параметры доступны в виде карты типа

Map<String, String[]> // String = key, String[] = values

Они должны быть преобразованы и привязаны к полям целевого объекта. Я хотел бы иметь такой метод:

// definition: 
public void bind(Map<String, String[]>, T target)

// usage:
bind(request.getParameterMap(), domainObject);

Каков наилучший способ привязать параметры запроса к объекту домена в сервлете Java? Какие библиотеки доступны для этой цели или как бы вы их написали?

Ответы [ 2 ]

1 голос
/ 24 декабря 2009

Вы когда-нибудь рассматривали Spring MVC (http://springsource.org) Framework)? Он предоставляет функциональные возможности связывания, которые можно использовать за пределами Spring. Кроме того, если вы в настоящее время не используете другой MVC Framework, это хороший вариант для рассмотреть.

0 голосов
/ 24 декабря 2009

Я бы сказал, что это зависит от того, какой объект является действительным domainObject. Если это bean-компонент, вы можете использовать автоматическое создание бинов на основе отражений, например мой BeanPropertyController (это бесплатно, попробуйте! Лицензия ASF2.0 ) сделать следующее:

/* Assumed parameter input:
 * a=hello
 * c=123
 * e=f,g,h
 * 
 * Matching bean:  
 */
public class ParamBean {
    private String a;
    private int c;
    private String[] e;
    /* + all the normal getters and setters you'd see in a bean */
}

/* somewhere in your servlet: */

BeanPropertyController bpc = BeanPropertyController.of(ParamBean.class);

for (Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
    bpc.mutate(entry.getKey(),
               getNiceValue(entry.getValue(), bpc.typeOf(entry.getKey()));
}

ParamBean bean = bpc.getObject(ParamBean.class);

/* somewhere else in the class */

public Object getNiceValue(String[] objs, Class<?> desiredClass) {
    if (objs.length == 1) {
        Object o = objs[0];
        return convertString(o);
    } else {
        Object[] newObjs = Object[objs.length];

        for (int i=0;i<objs.length;i++) {
            newObjs[i] = convertString(objs[i]);
        }

        return (Object) newObjs;
    }
}

private Object convertString(String value, Class<> desiredClass) {
    if (Number.class.isAssignableFrom(desiredClass)) {
        Double d = null;
        try {
            d = Double.parseDouble(value)
        } catch (NumberFormatException e) {
            // Not of the desired type, do whatever you want
        }
        if (Double.class.isAssignableFrom(desiredClass)) {
            return d;
        } else if (Long.class.isAssignableFrom(desiredClass)) {
            return d.longValue();
        } else if (Integer.class.isAssignableFrom(desiredClass)) {
            return d.intValue();
        } // and so on...
    } else if (Boolean.class.isAssignableFrom(desiredClass)) {
        try {
            return Boolean.valueOf(value);
        } catch (NullPointerException e) {
            // Not of the desired type, do whatever you want
        }
    } else {
        return value; // or whatever your default type is
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...