将所有请求参数映射到类对象

时间:2014-09-29 13:00:47

标签: java servlets

长话短说,我试图将作为请求一部分发送的所有参数映射到自定义类。

custom.class

public class data
{
    private String a;
    private String b;

    public String GetA()
    {
        return this.a;
    }

    public String SetA(String a)
    {
        this.a = a;
    }

    public String GetB()
    {
        return this.a;
    }

    public String SetB(String b)
    {
        this.b = b;
    }
}

现在我可以访问这样的参数:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    request.getParameter("a");
    request.getParameter("b");
}

但正如我上面提到的,我希望将所有参数加载到类对象中。

我认为最好的方法是将参数转换为地图对象,然后以某种方式使用我们从地图对象中检索的所有值来评估类对象。 但是我不知道如何实现这一目标。

所以我真的很感激,如果有人能指出我的文件或建议我怎么能这样做?

为我糟糕的英语道歉。

提前致谢, 亚历

3 个答案:

答案 0 :(得分:1)

HttpRequest上有一个方法可以将参数作为地图获取,this可以使用哪些方法?您可以遍历参数映射,并为每个条目填充自定义类

    YourDataClass data = new YourDataClass();
    Map<String, String[]> map = request.getParameterMap();
    for (Map.Entry<String, String[]> entry : map.entrySet()) {
        // do whatever you need
        data.addParam(entry.getKey(), entry.getValue());
    }

答案 1 :(得分:1)

我知道这有点旧,但我偶然发现了一个类似的问题,我提出了一个相当简单的解决方案。

我的方法是使用google gson实现来获取具有简单字符串属性的Json对象,然后可以将其解析为您选择的对象(再次使用gson)。它将创建的Json对象的键值对映射到对象(如果存在)。所以它实际上非常通用,可以调整到任何类型的对象,而不需要自制的属性到属性映射。

让我们假设你有一个目标对象,你想要包装你的请求参数,看起来像这样:

public class RequestInfo {
    private String a;
    private String b;

    public RequestInfo() {
    }

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }
}

您的HTTPServletRequest具有此花式参数映射,其中包含键和值。这个值是一个String数组,我真的不能告诉你原因,但在我的情况下,我只假设我所拥有的每个属性只产生一个可能的值,这就是为什么我只使用它的第一个条目。 这个想法很简单:创建一个空的Json对象,遍历参数映射并在Json对象中创建键值对。我们来看看:

// create an empty json object
JsonObject requestJson = new JsonObject();
// iterate over all the paramters
for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
    // add every item as a property to the json
    requestJson.addProperty(entry.getKey(), entry.getValue()[0]);
}

现在你有一个非常简单的Json对象,所有的请求参数都被映射为String类型的键值对。最后,让gson将此对象解析为您自己的表示形式。一行代码,仅此而已:

// let Gson parse the Json to your own object
RequestInfo info = new Gson().fromJson(requestJson, RequestInfo.class);

现在您将所有匹配的参数解析为您自己的对象。请注意,Gson还能够识别不同的Object类型并正确解析它们。因此,即使我们只在Json对象中创建String键值对,如果您指定了这样的对象,gson也能够将它们解析为Integers,Longs等。

现在,如果您的请求信息对象发生变化,您不必更新任何匹配的算法以及其他案例,if-else结构或更新的构造函数,gson将为您处理它。而且,如果你想要映射不同类型的请求,你几乎可以使用相同的算法,你只需要在fromJson调用中更新类定义。

希望这有用。

答案 2 :(得分:0)

如果我理解你,你应该在你的数据类中做一个构造函数,它将a,b作为参数:

public data(String aa, String bb){
    a = aa;
    b = bb;
}

然后你可以在你的doPost()方法中调用你的构造函数:

data d = new data(request.getParameter("a"), request.getParameter("b"));