Extjs combox从后台请求数据实现二级联动

写在前面,自研究生找到这份工作,开始自学java web,零零碎碎花了半年的时间,web开发的知识体系基本算是过了一遍,包括ssh框架,但之前都是零碎的实现,前端就只练习前端,后端只练习后端,前后端的是怎么交互的,理论上知道那么回事,可是从来没用过,趁着实习及试用期时间,学习了下Extjs,把extjs的相关知识结合起来,写了这么个demo:

踩到的坑:

  后代去数据库查询的结果为list,最终要按照全台约定的格式拼接成json对象,这个拼接过程竟然纠结了很久,都有现成的轮子啊;

  Hibernate的hql查询与jdbc的sql查询还是有差别的!

需要完善的地方:

  引入Spring框架,对象都是new出来的

  spring mvc(用的还是servlet)

  在第一级combox改变时,第二级combox是根据第一级的value传到后台,去数据库重新获取数据的,如何实现将第二级combox的store只从后台获取一次,然后只在前台筛选!(Extjs还是不熟啊,只会个皮毛)

前端js代码:

 1 Ext.onReady(function () {
 2     //创建一个Ext.data.store对象,用于为category提供数据
 3     var categoryStore = Ext.create('Ext.data.Store',
 4         {
 5             //指定读取数据的name ,id值
 6             fields:["name","id"],//与后台约定好请求的数据源格式
 7             proxy:
 8                 {
 9                     type:'ajax',
10                     url:'/getAllCategory',
11                     reader:{//使用Ext.data.reader.Json读取服务器数据
12                         type:'json',
13                         root:"data"//直接读取服务器响应的数据
14                     }
15 
16                 },
17             autoLoad:true
18         });
19 
20     //创建一个Ext.data,store对象,为Book提供数据
21     var bookStore = Ext.create('Ext.data.Store',
22         {
23             //指定读取数据的name,id字段
24             fields:['bookname','bookid',"categoryId"],
25             proxy:
26                 {
27                     type:'ajax',
28                     url:'/getBooksByCategory',//向该URL发送请求
29                     reader:{
30                         //使用Ext.data.reader.Json读取服务器数据
31                         type:'json',
32                         root:'data'//直接读取服务器响应的data数据
33                     }
34                 }
35         });
36 
37     Ext.create('Ext.form.Panel',{
38         title:'选择图书',
39         bodyPadding:5,
40         width:350,//指定表单宽度
41         //默认使用anchore布局方式
42         layout:'anchor',
43         renderTo:Ext.getBody(),
44         //设置表单控件默认占满整个容器
45         defaults:{
46             anchor:'100%'
47         },
48         items:[//为表单里添加一些组件
49             //第一个组件,一个复选框
50             {
51                 id:'category_combo',
52                 xtype:'combo',
53                 fieldLabel:'选择种类',
54                 width:300,
55                 store:categoryStore,//使用categoryStore数据提供下拉列表项的数据
56                 displayField:"name",//列表项的显示文本使用name字段
57                 valueField:"id",//列表项的值使用id字段的值
58                 queryModel:'local',//指定使用Store中已有数据,如果不指定数据源,可以直接从从数据库中获取?
59                 listeners:{
60                     select:function (combo,ecords)
61                     {
62                         //只要一选择category的复选框,将触发级联框book的数据值刷新
63                         Ext.getCmp('book_combo').reset();
64                         //调用bookstore的load()方法加载服务器响应
65                         bookStore.load({
66 
67                             //发送请求categoryId参数,该参数代表图书类别,往哪里请求?往store请求,而非数据库请求
68                             params:{
69                                 categoryId:combo.value
70                             }
71 
72                         });
73 
74                     }
75                 }
76             },
77             {
78                 id:'book_combo',
79                 xtype:'combo',
80                 fieldLabel:'选择图书',
81                 width:300,
82                 store:bookStore,//使用bookStore数据提供下拉列表项的数据
83                 displayField:'bookname',//列表项的显示文本使用name字段的值
84                 valueField:'bookid',//列表项的值使用id字段的值
85                 queryMode:'local'//指定使用Store中已有的数据
86             }
87         ]
88     });
89 
90 });

后台核心代码:

扫描二维码关注公众号,回复: 1927228 查看本文章

GetBookServlet

 1 @WebServlet(urlPatterns = "/getBooksByCategory")
 2 public class GetBooksServlet extends HttpServlet {
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         doPost(req, resp);
 6     }
 7 
 8     @Override
 9     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
10         req.setCharacterEncoding("utf-8");
11         IBookService bookService = new BookService();
12         Integer categoryId = Integer.valueOf(req.getParameter("categoryId"));
13         //准备json串
14         List<Book> books = bookService.getBookByCategoryId(categoryId);
15         List list = new ArrayList();
16 
17 
18         for (int i = 0; i <books.size() ; i++) {
19             Map<String,Object> map =new HashMap<>();
20             map.put("bookid",books.get(i).getBookId());
21             map.put("bookname",books.get(i).getBookName());
22             map.put("author",books.get(i).getAuthor());
23             map.put("categoryId",books.get(i).getCategory().getCategoryId());
24             list.add(i,map);
25         }
26 
27         Map<String,Object> map = new HashMap<>();
28         map.put("data",list);
29 
30         //将map包装成json对象后输出
31         resp.setContentType("text/html;charset=utf-8");
32         System.out.println(new JSONObject(map));
33 
34         resp.getWriter().print(new JSONObject(map));
35     }
36 }

GetAllCategory

 1 @WebServlet(urlPatterns = "/getAllCategory")
 2 public class GetAllCategoryServlet extends HttpServlet {
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         doPost(req, resp);
 6     }
 7 
 8     @Override
 9     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
10         //这里是没有请求参数的!
11         req.setCharacterEncoding("utf-8");
12         ICategoryService categoryService = new CategoryService();
13         //准备JSON串
14         List<Category> categories = categoryService.getAllCategory();
15         List list = new ArrayList();
16 
17         for (int i =0;i<categories.size();i++){
18             Map<String,Object> map = new HashMap<>();
19             map.put("id",categories.get(i).getCategoryId());
20             map.put("name",categories.get(i).getCategoryName());
21             list.add(i,map);
22         }
23 
24         Map<String,Object> map = new HashMap<>();
25 
26         map.put("data",list);
27         //map.put("success",true);
28         //将map包装成json对象后输出
29         /*[{"data":[{"name":"古典小说","id":1},{"name":"都市言情","id":2}]}]*/
30         JSONArray js = JSONArray.fromObject(map);
31         System.out.println(js);
32         /*[{"data":[{"name":"古典小说","id":1},{"name":"都市言情","id":2}]}]*/
33 
34         //一个是json数组,还有一个是json对象,浏览器只支持对象,即下面这个!!!!!
35 
36         /*{"data":[{"name":"古典小说","id":1},{"name":"都市言情","id":2}]}*/
37 
38         //准备输出服务器的响应
39         resp.setContentType("text/html;charset=utf-8");
40         System.out.println(new org.json.JSONObject(map));
41         resp.getWriter().print(new org.json.JSONObject(map));
42     }
43 }

用到的持久层代码片段:

 1     @Override
 2     /**
 3      * 数据量较少,就不用分页了,直接通过hql语句查询
 4      */
 5     public List<Category> getAllCategory() {
 6         session = HibernateUtil.getSession();
 7         try{
 8             List resultList = session.createQuery("from Category c").list();
 9             return resultList;
10         }catch (Exception e){
11             e.printStackTrace();
12             throw e;
13         }
14     }
15 
16 
17     @Override
18     public List getBookByCategoryId(Integer id) {
19         session = HibernateUtil.getSession();
20         try{
21             List resultList =  session
22                     .createQuery("from Book b where b.category.id =:id").setInteger("id",id).list();
23             System.out.println("查询完毕,正在返回结果");
24             return resultList;
25         }catch (Exception e){
26             e.printStackTrace();
27             System.out.println("根据目录id查询失败!");
28             throw e;
29         }
30     }

猜你喜欢

转载自www.cnblogs.com/ditto/p/9276421.html