用于检索HttpServletRequest参数的Java库

时间:2014-03-19 08:47:53

标签: java java-ee web

我正在开发一个使用Servlets的应用程序。我被要求不要让我的老板使用Struts2 or JSF or SpringMVC,而只是Servlets and Jsps。在我的Servlet中,我需要调用request.getParameter("parameterName")来检索参数值。 我的问题 是否存在Java库,我可以将JavaBeanHttpServletRequest个对象传递给并填充已填充的JavaBean。即JavaBean自动填充请求参数。

2 个答案:

答案 0 :(得分:1)

我通常认为任何类型的JavaBean反射都是Commons BeanUtils,而且他们确实在BeanUtilsBean中有适当的方法:

  

public void populate(Object bean, Map<String,? extends Object> properties) throws IllegalAccessException, InvocationTargetException

     

根据以下内容填充指定bean的JavaBeans属性   指定的名称/值对。此方法使用Java反射API   识别相应的&#34;属性设置器&#34;方法名称和处理   String类型的setter参数,boolean,int,long,float和   双。另外,这些类型的数组设置器(或者   相应的原始类型)也可以被识别出来。

     

要为每个属性调用的特定setter方法是   使用通常的JavaBeans内省机制确定。从而,   您可以使用BeanInfo类来识别自定义setter方法   与bean本身的类相关联。如果没有这样的BeanInfo   class是可用的,标准方法名称转换(&#34; set&#34; plus   使用了有问题的财产的大写名称。

     

注意:与JavaBeans规范相反,它具有更多   一个setter方法(具有不同的参数签名)用于相同的方法   属性。

     

警告 - 此方法的逻辑是为提取而自定义的   来自HTTP请求的基于字符串的请求参数。可能是   不是你想要的类型转换的一般属性复制。   为此,请查看copyProperties()方法。

请注意,它是自定义用于从HTTP请求中提取基于字符串的请求参数,因此它正是您想要的。作为HTTP请求参数的问题以Map<String, String[]>的形式出现,需要从数组中解包。

我做了一个快速测试,以确保它按预期工作。我注意到类必须public并且在自己的文件中才能使内省工作。

我像这样创建一个JavaBean:

public class JavaBean {

    String userName;
    String password;
    Integer id;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

}

并使用以下内容进行快速测试:

public static void main(String[] args) throws Exception {
    final Map<String, String[]> params = new HashMap<>();
    params.put("userName", new String[]{"userA"});
    params.put("password", new String[]{"secrect"});
    params.put("id", new String[]{"10"});
    final JavaBean javaBean = new JavaBean();
    BeanUtilsBean.getInstance().populate(javaBean, params);
    System.out.println(javaBean.getUserName());
    System.out.println(javaBean.getPassword());
    System.out.println(javaBean.getId());

}

输出符合预期:

userA
secrect
10

我还注意到,对于数字属性,它似乎不喜欢int - 似乎期待Integer

答案 1 :(得分:0)

来自Ignite Realtime的Jive软件有一个BeanUtils类,看起来可以做你想要的。它是开源的。我从来没用过它。它位于OpenFire下载here