当前位置: 代码迷 >> JavaScript >> 破译JDeveloper 10g使用ADF框架时jsp/jspx文件可视化编辑器丢失所见即所得功能的难题
  详细解决方案

破译JDeveloper 10g使用ADF框架时jsp/jspx文件可视化编辑器丢失所见即所得功能的难题

热度:630   发布时间:2012-11-21 08:23:25.0
破解JDeveloper 10g使用ADF框架时jsp/jspx文件可视化编辑器丢失所见即所得功能的难题

用JDev进行JSF开发的朋友可能都遇到过这样一个问题:原来可以正常使用的所见即所得的jspx/jsp编辑器突然不再工作,显示了一张当前页面的元素树的列表,就象下面的这样:

?

怎么回事呢?这还得从JDEV 10g对编辑页面的渲染说起。根据我从网上查到的资料来看,JDEV渲染JSF页面时,由于某些原因并不直接解析jsp/jspx页面源码,而是通过一个内置的web环境来动态执行和显示的,即JDEV全读取web.xml、faces-config.xml等配置文件,并根据这些配置文件中的信息来渲染页面内容并显示在编辑器内。

换句话说,导致上述问题的原因是修改了项目的web.xml或faces-config.xml,在里面添加了部分内容,从而导致JDEV无法正常渲染页面。

?但有些内容是必须添加的,如进行权限判断的filter。怎么办?在开发过程中把添加的内容屏蔽掉是一个办法,但在程序发布的时候还得恢复。有没有其它的办法呢?当然有!

根据JDEV页面渲染的原理,我们可以在添加的filter、JSF listener等程序中对运行环境进行判断。如果当前是真正的web运行,就正常执行,否则就实现短路。怎么进行运行环境判断呢?参考从网上找到的信息,可以通过HttpServletRequest的getServerPort方法。在真正的web环境中,这个方法返回的值肯定大于0(TCP/IP的端口是从1到65535的),而在模拟环境中这个值应该是-1,即小于0。下面以一个Filter为例子:

java 代码
  1. import?javax.servlet.Filter; ??
  2. import?javax.servlet.FilterConfig; ??
  3. import?javax.servlet.ServletException; ??
  4. import?javax.servlet.ServletRequest; ??
  5. import?javax.servlet.ServletResponse; ??
  6. import?javax.servlet.FilterChain; ??
  7. ??
  8. import?java.io.IOException; ??
  9. ??
  10. import?javax.servlet.http.HttpServletRequest; ??
  11. import?javax.servlet.http.HttpSession; ??
  12. import?javax.servlet.http.HttpServletResponse; ??
  13. ??
  14. import?org.apache.log4j.Logger; ??
  15. ??
  16. public?class?SecurityFilter?implements?Filter?{ ??
  17. ??
  18. ??
  19. ????private?Logger?logger?=?Logger.getLogger(this.getClass()); ??
  20. ????public?void?init(FilterConfig?filterConfig)?throws?ServletException?{ ??
  21. ????????logger.info("SecurityFilter?initialized"); ??
  22. ????} ??
  23. ??
  24. ????public?void?doFilter(ServletRequest?request,?ServletResponse?response,? ??
  25. ?????????????????????????FilterChain?chain)?throws?IOException,? ??
  26. ???????????????????????????????????????????????????ServletException?{ ??
  27. ????????/* ?
  28. ?????????*? ?
  29. ?????????*?Due?to?Oracle?JDev?10.1.3.x's?limitation,?we?must?test?the?environment?that? ?
  30. ?????????*?filter?runs?in.?Otherwise,JDeveloper:?ADF?Faces?Editor?Shows?in?Outline?View,?not?WYSIWYG ?
  31. ?????????*?See?also?below?page?for?more?information: ?
  32. ?????????*?http://www.orablogs.com/fnimphius/archives/001822.html ?
  33. ?????????*?http://forums.oracle.com/forums/thread.jspa?messageID=1752303? ?
  34. ?????????*? ?
  35. ?????????*?@date?2007-06-06 ?
  36. ?????????*/??
  37. ??
  38. ????????if?(request.getServerPort()?<?0)? ??
  39. ????????{ ??
  40. ??????????chain.doFilter(request,?response); ??
  41. ??????????return; ??
  42. ????????} ??
  43. ??
  44. ????????HttpServletRequest?req?=?(HttpServletRequest)request; ??
  45. ????????HttpServletResponse?res?=?(HttpServletResponse)response; ??
  46. ????????HttpSession?session?=?req.getSession(true); ??
  47. ???????? ??
  48. ????????String?contextpath?=?req.getContextPath(); ??
  49. ????????String?http?=?req.getRequestURI(); ??
  50. ????????String?id?=?(String)session.getAttribute("loginId"); ??
  51. ????????if?(http.equals(contextpath?+?"/faces/login.jspx"))?{ ??
  52. ????????????chain.doFilter(request,?response); ??
  53. ????????}?else?if?((id?==?null?||?"".equals(id))?&&?(http.endsWith(".jspx")))?{ ??
  54. ????????????res.sendRedirect(contextpath?+?"/faces/login.jspx"); ??
  55. ????????}?else?{ ??
  56. ????????????chain.doFilter(request,?response); ??
  57. ????????} ??
  58. ????} ??
  59. ??
  60. ????public?void?destroy()?{ ??
  61. ????????logger.info("SecurityFilter?destroied"); ??
  62. ????} ??
  63. ??
  64. } ??
  65. ??

对于JSF的Listener,根据实际情况的不同,需要将上面的逻辑添加到beforePhase或afterPhase方法中。

另外,如果是因修改web.xml引起,还得注意加入的元素在web.xml中的位置,比如加入了一个新的Filter,那么这个与这个Filter对应的filter-mapping定义应在adfFilter的定义下面。举例如下:

?

?

相信通过这个办法能够解决JDEVELOPER 10G在编辑JSP/JSPX页面方面的所见即所得功能缺失的问题。还要说明的是,ORACLE公司JDEVELOPER开发团队已经注意到这个问题,并许诺在下个主要版本即11G中予以解决。

参考:http://www.orablogs.com/fnimphius/archives/001822.html