如何实现姓名和出生年份的验证

时间:2014-08-20 14:08:29

标签: java mysql servlets jpa

我有一个带有html表单的jsp页面,它有一个名称,出生年份和搜索按钮的两个文本字段,用于搜索用户。用户可以通过输入姓名和出生年份或者通过姓名或出生年份来搜索,这意味着他可以将一个文本字段留空并输入名称,反之亦然。因此,如果我们输入例如刚出生的年份,表中的结果应该显示出生年份的所有用户。

我从数据库表生成了一个实体类,如下所示:

@Entity
@Table(name = "persons")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Person.findAll", query = "SELECT p FROM Person p"),
    @NamedQuery(name = "Person.findById", query = "SELECT p FROM Person p WHERE v.id = :id"),
    @NamedQuery(name = "Person.findByName", query = "SELECT p FROM Person p WHERE v.name = :name"),
    @NamedQuery(name = "Person.findByYearBirth", query = "SELECT p FROM Person p WHERE v.yearBirth= :yearBirth"),
@NamedQuery(name = "Person.findByNameYearBirth", 
            query = "SELECT p FROM Person p WHERE p.name = :name or p.yearBirth = :yearBirth")})
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Size(max = 45)
    @Column(name = "name")
    private String name;

    @Column(name = "yearBirth")
    private Short yearBirth;

    // constructors, setters, getters...
}

ControllerServlet类:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String path = request.getServletPath();

    if (path.equals("/index")) {
    }
    else if (path.equals("/search_users")) {
        String name = request.getParameter("name");
        String yearBirth= request.getParameter("yearBirth");

        Query findByNameYearBirth = em.createNamedQuery("Person.findByNameYearBirth");
        findByNameYearBirth.setParameter("name", name);
        findByNameYearBirth.setParameter("yearBirth", Short.parseShort(yearBirth));
        List persons = findByNameYearBirth.getResultList();
        request.setAttribute("findByNameYearBirth", persons);
    }
    else if (path.equals("/add_person")) {
    }
    else if (path.equals("/delete_person")) {
    }
    String url = path + ".jsp";
    request.getRequestDispatcher(url).forward(request, response);
}

在ControllerServlet类的doPost方法内部,对于路径“/ search_users”,如果我输入姓名和出生年份,或者我只输入年份,我可以搜索并获取某人的结果。 因此,如果我输入一个名称并将yearBirth文本字段留空,我会收到例外:java.lang.NumberFormatException: For input string: ""

根据上面的场景和这个例外,我该如何实现验证?

2 个答案:

答案 0 :(得分:2)

Short.parseShort()为空时,yearBrith发生异常String。

findByNameYearBirth.setParameter("yearBirth", Short.parseShort(yearBirth));

在设置为查询参数之前,您应该先将它们检查为空或先清空。

在这种情况下,使用Dynamic query代替NamedQuery使用是合适的。您应该根据nameyearBirth值准备动态查询。


动态查询可以通过em.createQuery()完成。

StringBuilder sb = new StringBuilder();
sb.append("SELECT p FROM Person p");

if (<name or yearBirth is not null and empty>)
    sb.append(" WHERE");
if (<name is not null and not empty>) {
    sb.append(" p.name = :name");
    if (<yearBirth is not null and not empty>)
        sb.append(" AND");
}
if (<yearBirth is not null and not empty>)
    sb.append(" p.yearBirth = :yearBirth");

//then create query
Query query = em.createQuery(sb.toString());

//then set query param
if (<name is not null and not empty>)
    query.setParameter("name", name);
if (<yearBirth is not null and not empty>)
    query.setParameter("yearBirth", Short.parseShort(yearBirth));

//Now your query is ready to use

答案 1 :(得分:0)

4位数年份使用正则表达式

java端的四位数年份

String yearBirth= request.getParameter("yearBirth");
String pattern = "^\d{4}";
if(yearBirth.matches("^\d{4}")) {
    // matches!
} else {
    // doesn't matches
}