我有一个带有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: ""
根据上面的场景和这个例外,我该如何实现验证?
答案 0 :(得分:2)
当Short.parseShort()
为空时,yearBrith
发生异常String。
findByNameYearBirth.setParameter("yearBirth", Short.parseShort(yearBirth));
在设置为查询参数之前,您应该先将它们检查为空或先清空。
在这种情况下,使用Dynamic query
代替NamedQuery
使用是合适的。您应该根据name
和yearBirth
值准备动态查询。
动态查询可以通过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
}