基于请求参数填充Javabeans的简易方法

8

我有一个简单的人类:

package simpleApp.entities;

public class Person {
    private String name;
    private String secondname;

    public void setSecondname(String cognome) {
        this.secondname = cognome;
    }
    public String getSecondname() {
        return secondname;
    }
    public void setName(String nome) {
        this.name = nome;
    }
    public String getName() {
        return name;
    }

}

还有一个简单的HTML页面:

<html>
<body>

    <form action="/simpleApp/person/" method="POST">
        name: <input type="text" name="name"><br>
        second name: <input type="text" name="secondname"><br>
        <input type="submit">
    </form>

</body>
</html>

还有一个简单的servlet:

public class Person extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public Person() {
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //LOOK HERE:
        simpleApp.entities.Person p = new simpleApp.entities.Person();

        p.setName(request.getParameterValues("name")[0]);
        p.setSecondname(request.getParameterValues("secondname")[0]);

        response.sendRedirect("/simpleApp/index.html");
    }

}

有没有一种自动化参数设置的方法?类似于魔法一样的东西。
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        simpleApp.entities.Person p = new simpleApp.entities.Person();

        Magic.justSetEverything(p, request);

//      NOT NEEDED ANYMORE!!! MUAHAHAHA more time for coffee
//      p.setName(request.getParameterValues("name")[0]);
//      p.setSecondname(request.getParameterValues("secondname")[0]);

        response.sendRedirect("/simpleApp/index.html");
    }

这当然可以通过反射API来实现,但问题是除非你经常遇到这种情况或者有大量属性需要设置,否则这可能会带来更多的麻烦。此外,请记住您可能需要进行一些验证(“参数是否已给定?”“该值对于此字段是否有效?”) - johusman
1
为了您的健康,请将您的servlet重命名为PersonServlet或其他名称。 - Jeremy
谢谢johusman,我希望已经有了一些东西。验证和其他逻辑稍后在类的实例上完成。 - Simon
Jeremy,这只是我为了这篇SO帖子而特意编写的示例 :) - Simon
2个回答

20

通常会使用 Apache Commons BeanUtils 来实现该功能。

BeanUtils.populate(bean, request.getParameterMap());

就是这样。

为了更进一步,你可以采用一个MVC框架,并使用Javabeans作为模型,这样你就不需要担心它们了,例如JSFSpring MVC


与具体问题无关,在这个特定的例子中,getParameterValues()使用起来很笨拙。只需使用getParameter()即可。

p.setName(request.getParameter("name"));
p.setSecondname(request.getParameter("secondname"));

0

另一种实现方式。 SpringMvc可以自动绑定请求,但您也可以手动执行。

final WebRequest servletWebRequest = new ServletWebRequest(request);
final WebRequestDataBinder binder = new WebRequestDataBinder(bean);
binder.bind(servletWebRequest);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接