程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 通過JSF 2實現可重用的Ajax化組件(6)

通過JSF 2實現可重用的Ajax化組件(6)

編輯:J2EE

清單6顯示了監聽程序的最終實現:

清單6.監聽程序

  1. package com.coreJSf;
  2. import Java.io.Serializable;
  3. import Java.util.ArrayList;
  4. import Java.util.List;
  5. import Java.util.Map;
  6. import Javax.enterprise.context.SessionScoped;
  7. import Javax.faces.component.UIInput;
  8. import Javax.faces.component.UISelectItems;
  9. import Javax.faces.component.UISelectOne;
  10. import Javax.faces.context.FacesContext;
  11. import Javax.faces.event.ValueChangeEvent;
  12. import Javax.inject.Named;
  13. @Named
  14. @SessionScoped
  15. public class AutocompleteListener implements Serializable {
  16. private static String COMPLETION_ITEMS_ATTR = "coreJSf.completionItems";
  17. public void valueChanged(ValueChangeEvent e) {
  18. UIInput input = (UIInput)e.getSource();
  19. UISelectOne listbox = (UISelectOne)input.findComponent("listbox");
  20. if (listbox != null) {
  21. UISelectItems items = (UISelectItems)listbox.getChildren().get(0);
  22. Map<String, Object> attrs = listbox.getAttributes();
  23. List<String> newItems = getNewItems((String)input.getValue(),
  24. getCompletionItems(listbox, items, attrs));
  25. items.setValue(newItems.toArray());
  26. setListboxStyle(newItems.size(), attrs);
  27. }
  28. }
  29. public void completionItemSelected(ValueChangeEvent e) {
  30. UISelectOne listbox = (UISelectOne)e.getSource();
  31. UIInput input = (UIInput)listbox.findComponent("input");
  32. if(input != null) {
  33. input.setValue(listbox.getValue());
  34. }
  35. Map<String, Object> attrs = listbox.getAttributes();
  36. attrs.put("style", "display: none");
  37. }
  38. private List<String> getNewItems(String inputValue, String[] completionItems) {
  39. List<String> newnewItems = new ArrayList<String>();
  40. for (String item : completionItems) {
  41. String s = item.substring(0, inputValue.length());
  42. if (s.equalsIgnoreCase(inputValue))
  43. newItems.add(item);
  44. }
  45. return newItems;
  46. }
  47. private void setListboxStyle(int rows, Map<String, Object> attrs) {
  48. if (rows > 0) {
  49. Map<String, String> reqParams = FacesContext.getCurrentInstance()
  50. .getExternalContext().getRequestParameterMap();
  51. attrs.put("style", "display: inline; position: absolute; left: "
  52. + reqParams.get("x") + "px;" + " top: " + reqParams.get("y") + "px");
  53. attrs.put("size", rows == 1 ? 2 : rows);
  54. }
  55. else
  56. attrs.put("style", "display: none;");
  57. }
  58. private String[] getCompletionItems(UISelectOne listbox,
  59. UISelectItems items, Map<String, Object> attrs) {
  60. Strings] completionItems = (String[])attrs.get(COMPLETION_ITEMS_ATTR);
  61. if (completionItems == null) {
  62. completionItems = (String[])items.getValue();
  63. attrs.put(COMPLETION_ITEMS_ATTR, completionItems);
  64. }
  65. return completionItems;
  66. }
  67. }

JSF在Ajax調用期間調用監聽程序的valueChanged()方法來響應文本輸入中的keyup事件。該方法會創建一組新的完成項目,然後將列表框的項目設置為這個新的項目集。該方法還會設置列表框的樣式屬性,以確定AJax調用返回時是否顯示列表框。

清單6中的setListboxStyle()方法將使用x和y請求我在發起清單5中的AJax調用時指定的參數值。

JSF會在AJax調用期間調用監聽程序的其他公共方法completionItemSelected(),以響應列表框中的選擇事件。該方法會將列表框的值復制到文本輸入中,並隱藏列表框。

請注意,valueChanged()方法還會將原始完成項目存儲在列表框的某個屬性中。由於每個autoComplete組件都維護自己的完成項目列表,因此多個autoComplete組件可以在相同頁面中和諧共存,而不會影響彼此的完成項目。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved