2016-09-25 9 views
0

データレコード情報をjsonフォーマットとして送信し、データベースレコードを取得する情報を使用しています。私はちょうどそれがdatatable情報を一般的なものにする正しい方法であることを知りたかったので、すべてのdatatable関連のクエリに対して同じ方法を使うことができます。ここでの私の試みは、次のとおりです。データテーブル情報をパースしてJavaで使用する一般的な方法

index.htmlを

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="ISO-8859-1"> 
<link rel="stylesheet" href="css/jquery.dataTables.min.css"> 
<script type="text/javascript" src="js/jquery.js"></script> 
<!-- <script type="text/javascript" src="js/jquery.dataTables.js"></script> --> 
<script type="text/javascript" src="js/datatables.min.js"></script> 


<title>Insert title here</title> 
</head> 
<body> 
<table id="example" class="display" cellspacing="0" width="100%"> 
     <thead> 
      <tr> 
       <th>Id</th> 
       <th>FirstName</th> 
       <th>LastName</th> 
       <th>FullName</th> 
       <th>Email</th> 
       <th >Action</th> <!-- data-orderable="false" --> 
      </tr> 
     </thead> 

     </table> 

</body> 
<script> 
    $(document).ready(function() { 
     getDatatable(); 
}); 
    var dt=null; 
function getDatatable(){ 
    if(dt){ 
     //dt.destroy(); 
    } 
     dt= $('#example').DataTable({ 
      processing: true, 
      serverSide : true, 
      //deferRender: true, 
      order: [[0, 'asc']], 
      paging : true, 
      //stateSave: true, 
      "ajax": { 
       url:"data-source", 
       type:"POST", 
       datatype : "json", 
       data: function(d){ 
        console.log(d); 
        return JSON.stringify(d); 
       } 
      }, 
      "columns": [ 
       { data: "id" ,name:"id"}, 
       { data: "firstName",name:"firstName" }, 
       { data: "lastName",name:"lastName" }, 
       { data: "fullName",name:"fullName" }, 
       { data : function(o){ 
        return o.email; 
       },name:"email" 
       }, 
       { "data": function(o1){ return "<input type='button' value='Ok' onclick='func1("+o1.id+",2)'>" }}, 
      ] 
     }); 

} 

function func1(a,b){ 
    console.log(dt) 
    console.log(a+"="+b); 
    $.ajax({ 
     url:"check_update", 
     data:{id:a}, 
     success:function(data){ 
      dt.draw(false); 
     },error:function(dd){ 
      console.log(dd) 
     } 
    }); 

    //dt.page(); 
    //return "ee"; 
} 


</script> 
</html> 

DataTableの解析utilsのクラスファイルのコード:

private Map<String, Object> parseDatatable(HttpServletRequest r) { 
     Gson g = new Gson(); 
     Enumeration<String> obj = r.getParameterNames(); 
     String json = obj.hasMoreElements() ? obj.nextElement() : null; 
     Map<String, Object> m2 = new HashMap<>(); 
     if (json == null) { 
      return m2; 
     } 
     System.out.println("json=" + json); 
     Map<String, Object> m1 = g.fromJson(json, HashMap.class); 
     int draw = ((Double) m1.get("draw")).intValue(); 
     int startLimit = ((Double) m1.get("start")).intValue(); 
     int endLimit = ((Double) m1.get("length")).intValue(); 

     String searchKey = ((Map<String, String>) m1.get("search")).get("value"); 

     List<Map<String, Object>> order = (List<Map<String, Object>>) m1.get("order"); 
     int orderColumn = ((Double) order.get(0).get("column")).intValue(); 
     String orderBy = order.get(0).get("dir").toString(); 

     List<Map<String, Object>> columns = (List<Map<String, Object>>) m1.get("columns"); 

     //system.out.println(orderColumn+"="+columns.size()); 
     List<String> l1 = new LinkedList<>(); 
     for (Map<String, Object> m : columns) { 
      String col=m.get("name").toString(); 
      //system.out.println(col); 
      boolean searchable=(boolean)m.get("searchable"); 
      if(col.isEmpty()){ 
       col=m.get("data").toString(); 
      } 
      if(!col.equalsIgnoreCase("function") && searchable) 
      l1.add(col); 
     } 
     orderColumn=orderColumn<=(l1.size()-1)?orderColumn:0; 


     m2.put("draw", draw); 
     m2.put("startLimit", startLimit); 
     m2.put("endLimit", endLimit); 
     m2.put("searchKey", searchKey); 
     m2.put("orderColumn", orderColumn); 
     m2.put("orderBy", orderBy); 
     m2.put("columns", l1); 

     //system.out.println("m2=" + m2); 
     return m2; 
    } 

    private String getSearchCondition(String searchKey,List<String> columns) { 
     String where3=" WHERE "; 
     for (int i=0;i<columns.size();i++) { 
      if(i==columns.size()-1) 
      where3+=columns.get(i)+" LIKE '%"+searchKey+"%' "; 
      else 
       where3+=columns.get(i)+" LIKE '%"+searchKey+"%' OR "; 

     } 
     return where3; 
    } 

とコントローラクラスコード:

@RequestMapping(value = "/data-source", method = { RequestMethod.POST, 
     RequestMethod.GET }, produces = "application/json") 
@ResponseBody 
public Object simpleJson1(HttpServletRequest r, @RequestBody String s) 
     throws Employee1DaoException { 
    //system.out.println("simpleJson1"); 
    ////system.out.println(s); 

    Map<String, Object> m0 = parseDatatable(r); 

    int draw = (int) m0.get("draw"); 
    int startLimit = (int) m0.get("startLimit"); 
    int endLimit = (int) m0.get("endLimit"); 
    String searchKey = (String) m0.get("searchKey"); 
    int orderColumn = (int) m0.get("orderColumn"); 
    String orderBy = (String) m0.get("orderBy"); 
    List<String> columns = (List<String>) m0.get("columns"); 

    String where1 = "",where2="",where3=""; 
    // //system.out.println(searchKey); 
    if (searchKey != null && !searchKey.isEmpty() && !searchKey.equalsIgnoreCase("null")) { 
     where3 = getSearchCondition(searchKey,columns);//" WHERE "; 

     //draw = 0; 
    } 
    where2 =where3+ " ORDER BY "+columns.get(orderColumn)+" "+orderBy+" limit " + (startLimit) + "," + endLimit; 
    where1 =where3+ " ORDER BY "+columns.get(orderColumn)+" "+orderBy; 

    //system.out.println(where1); 
    //system.out.println(where2); 
    //system.out.println(where3); 

    int cnt = employee1Dao.findByQuery(where1).size(); 
    List<Employee1> le = employee1Dao.findByQuery(where2); 
    Map<String, Object> m1 = new HashMap<>(); 

    for (Employee1 e1 : le) { 
     if(e1.getId()==35){ 
      e1.setEmail("[email protected]"); 
     } 
    } 
    m1.put("draw", draw); 
    m1.put("recordsTotal", cnt); 
    m1.put("recordsFiltered", cnt); 
    m1.put("data", le); 

    return m1; 
} 

私はあなたの提案をしたいです私はすべての一般的なdatatable関連する操作に共通にすることができます。

+0

:-)著者だと*読み取り可能ではなく、*一般的な*。一度それをきれいにすると、改善のためのいくつかの明白なパターンが現れるかもしれませんが、これはあなたが今持っている混乱の中に単に見えません。 – kryger

+0

@kryger:Sopステートメントから離れて、私は何か間違ったことをしなかったし、またコメントしています。あなたに提案があれば、共有してください。 – Joe

答えて

1

次のlibraryはあなたのニーズに合っています。

例:

@RestController 
public class UserRestController { 

    @Autowired 
    private UserRepository userRepository; 

    @JsonView(DataTablesOutput.View.class) 
    @RequestMapping(value = "/data/users", method = RequestMethod.GET) 
    public DataTablesOutput<User> getUsers(@Valid DataTablesInput input) { 
     return userRepository.findAll(input); 
    } 
} 

Mavenのアーティファクト:

<dependency> 
    <groupId>com.github.darrachequesne</groupId> 
    <artifactId>spring-data-jpa-datatables</artifactId> 
    <version>3.0</version> 
</dependency> 

免責事項:私は*クリーン*私はあなたのコードを作成することをお勧めしたい。この段階では

関連する問題