2014-11-02 2 views
0

im пытается создать сервлет, где я могу добавлять, удалять и искать клиентов, теперь я застрял в методе поиска, im не уверен, почему мой метод не работает, но вот код, который я создал до сих пор , Я использую DAO шаблон со следующим методом фильтрации клиентов по имени и фамилии:Поиск из базы данных java servlet

public List<Customers> filterCustomer(String name) 
{ 
    List<Customers> customers = new ArrayList<Customers>(); 

    try{ 
     st = getConnection().createStatement();  
     rs = st.executeQuery("SELECT * from customer where first_name like '%" + name + "%'" 
       + "and surname like '%" + name+ "%'"); 
     while(rs.next()) 
     { 
      Customers customer = new Customers(); 
      customer.setId(rs.getInt(1)); 
      customer.setFirst_name(rs.getString(2)); 
      customer.setSurname(rs.getString(3)); 
      customer.setCode(rs.getString(4)); 

      customers.add(customer); 


     } 

В сервлета первый я создать список клиентов, чтобы распечатать их, но если параметр SearchString не равно нулю, то я хочу, чтобы создать новый список этих клиентов, которые соответствуют поисковому запросу. Heres часть сервлета, которую я создал:

out.print("<form method=\"get\" action =\"" + request.getContextPath() +"/Search\" >" 
    + "<input id='searchStringBox' name='searchString'/>" 
    + "<input type='submit' value='Filtreeri'>"); 
CustomerDao dao = new CustomerDao(); 
    List<Customers> customers; 
    customers = dao.getAllCustomers(); 
    String name = request.getParameter("searchString"); 
    if(name != null) 

    customers = dao.filterCustomer(name); 

    out.println("<table id='listTable' class='listTable>'" + 
    "<thead><tr><th scope='col'>Nimi</th><th scope='col'>Perekonnanimi</th>" 
    +"<th scope='col'>Kood</th><th scope='col'></th></tr></thead>"); 

    for(Customers customer : customers) 
    { 
     String value3 = String.valueOf(customer.getId()); 
     request.setAttribute("value3",value3); 
     customer.getId(); 
     out.println(  
    "<tbody><tr> "  
    + "<td>"+ customer.getFirst_name()+" "+"</td>" 
    + "<td>"+ customer.getSurname()+" "+"</td>" 
    + "<td>"+ customer.getCode()+" " +"</td>" 
    + " "+"<td><a href='"+request.getContextPath()+"/Search?id="+value3+"'>Delete</a></td></tr>"      
    );  

ответ

2

Вы ищете клиентов, у которых общая фамилия и имя. Например, если вы ищете «Моисей», вы найдете только такие люди, как:

Moses Moses 
Moses Mosesson 
Moses O'Moses 

... и т.д.. Это будет не найти «Моисей Мэлоун» или «Дженни Мозес».

Причина этого в том, что ваше состояние есть И вместо OR. Поэтому он проверяет, что и имя, и фамилия похожи на «% Moses%» вместе.

Изменить запрос на:

"SELECT * from customer where first_name like '%" + name + "%'" 
      + "OR surname like '%" + name+ "%'" 

После того, как вы убедитесь, что это работает, пожалуйста, прочитайте о SQL Injection and how to prevent it. Никогда не используйте параметры, которые поступают из внешнего мира (человека или хакера, который использует ваш сервлет), не проверяя их на потенциальную инъекцию SQL.

+0

ОТВЕТИТЬ, но можете ли вы объяснить «параметры, которые пришли за пределы мира». –

+0

Я имею в виду значения, которые исходят от конечных пользователей. Вы не можете контролировать то, что они будут отправлять вашему серверу. Значения поступают извне вашей собственной машины, из Интернета, и поэтому вы должны их подозревать. – RealSkeptic

Смежные вопросы