当前位置: 首页 > news >正文

网站模块设计软件彩票网站开发定制

网站模块设计软件,彩票网站开发定制,怎样做企业营销网站,wordpress 自定义页面jasper 获取当前日期为了对我的JSP执行一些检查和统计分析#xff0c;我需要一个包含在其中的元素的类似于DOM的层次模型。 但是#xff0c;解析JSP页面并不是一件容易的事#xff0c;最好留给它一个出色的工具-Tomcat#xff0c;Jetty#xff0c;GlassFish以及其他所有工… jasper 获取当前日期 为了对我的JSP执行一些检查和统计分析我需要一个包含在其中的元素的类似于DOM的层次模型。 但是解析JSP页面并不是一件容易的事最好留给它一个出色的工具-TomcatJettyGlassFish以及其他所有工具都可以使用Jasper JSP编译器。 有一种简单的方法可以调整它以生成所需的任何输出以将JSP转换为所需的任何形式包括页面的对象模型 定义一个Node.Visitor子类来处理JSP的节点标签等 编写一个简单的Compiler子类重写其generateJava来调用访问者 继承编译器执行程序JspC的子类重写其方法getCompilerClassName以返回您自己的编译器的类 让我们看一下代码。 实作 1.自定义访问者 编译器将调用Visitor来处理已解析的JSP的树对象模型。 此实现仅打印有关页面中有趣的节点子集的信息以使其嵌套清晰。 package org.apache.jasper.compiler;import java.util.LinkedList; import org.apache.jasper.JasperException; import org.apache.jasper.compiler.Node.CustomTag; import org.apache.jasper.compiler.Node.ELExpression; import org.apache.jasper.compiler.Node.IncludeDirective; import org.apache.jasper.compiler.Node.Visitor; import org.xml.sax.Attributes;public class JsfElCheckingVisitor extends Visitor {private String indent ;Overridepublic void visit(ELExpression n) throws JasperException {logEntry(ELExpression, n, EL: n.getEL());super.visit(n);}Overridepublic void visit(IncludeDirective n) throws JasperException {logEntry(IncludeDirective, n, toString(n.getAttributes()));super.visit(n);}Overridepublic void visit(CustomTag n) throws JasperException {logEntry(CustomTag, n, Class: n.getTagHandlerClass().getName() , attrs: toString(n.getAttributes()));doVisit(n);indent ;visitBody(n);indent indent.substring(0, indent.length() - 1);}private String toString(Attributes attributes) {if (attributes null || attributes.getLength() 0) return ;LinkedListString details new LinkedListString();for (int i 0; i attributes.getLength(); i) {details.add(attributes.getQName(i) attributes.getValue(i));}return details.toString();}private void logEntry(String what, Node n, String details) {System.out.println(indent n.getQName() at line: n.getStart().getLineNumber() : details);}} 笔记 访客必须位于org.apache.jasper.compiler包中因为基本类org.apache.jasper.compiler.Node是包私有的 visitBody方法触发对嵌套节点的处理 还有更多我可以覆盖的方法和通行方法doVisit但是我只选择了对我来说有趣的那些方法 节点的属性为... sax类型。 Attributes 它包含属性名称和值作为字符串 attribute.getTypei通常是CDATA Node结构包含有关父节点标签名称标签处理程序类源文件的相应行以及源文件的名称的信息以及其他有用信息 CustomTag可能是最有趣的节点类型例如所有JSF标签都属于这种类型 输出示例对于JSF页面 jsp:directive.include at line:5: [fileincludes/stdjsp.jsp] jsp:directive.include at line:6: [fileincludes/ssoinclude.jsp] f:verbatim at line:14: Class: com.sun.faces.taglib.jsf_core.VerbatimTag, attrs: htm:div at line:62: Class: com.exadel.htmLib.tags.DivTag, attrs: [stylewidth:100%;]h:form at line:64: Class: com.sun.faces.taglib.html_basic.FormTag, attrs: [idinputForm]htm:table at line:66: Class: com.exadel.htmLib.tags.TableTag, attrs: [cellpadding0, width100%, border0, styleClassclear box_main]htm:tr at line:71: Class: com.exadel.htmLib.tags.TrTag, attrs:htm:td at line:72: Class: com.exadel.htmLib.tags.TdTag, attrs:f:subview at line:73: Class: com.sun.faces.taglib.jsf_core.SubviewTag, attrs: [idcars]jsp:directive.include at line:74: [file/includes/cars.jsp]h:panelGroup at line:8: Class: com.sun.faces.taglib.html_basic.PanelGroupTag, attrs: [rendered#{bookingHandler.flowersAvailable}] ...htm:tr at line:87: Class: com.exadel.htmLib.tags.TrTag, attrs: [styleheight:5px]htm:td at line:87: Class: com.exadel.htmLib.tags.TdTag, attrs: 我不打印“关闭标签”因为很明显当缩进相同或较小的另一个节点出现或输出结束时标签结束。 2.编译器子类 重要的部分是我刚刚复制的generateJava从中删除了一些代码并添加了对Visitor的调用。 所以实际上下面清单中的3行是新的65670 public class OnlyReadingJspPseudoCompiler extends Compiler {/** Were never compiling .java to .class. */Override protected void generateClass(String[] smap) throws FileNotFoundException,JasperException, Exception {return;}/** Copied from {link Compiler#generateJava()} and adjusted */Override protected String[] generateJava() throws Exception {// Setup page info areapageInfo new PageInfo(new BeanRepository(ctxt.getClassLoader(),errDispatcher), ctxt.getJspFile());// JH: Skipped processing of jsp-property-group in web.xml for the current pageif (ctxt.isTagFile()) {try {double libraryVersion Double.parseDouble(ctxt.getTagInfo().getTagLibrary().getRequiredVersion());if (libraryVersion 2.0) {pageInfo.setIsELIgnored(true, null, errDispatcher, true);}if (libraryVersion 2.1) {pageInfo.setDeferredSyntaxAllowedAsLiteral(true, null,errDispatcher, true);}} catch (NumberFormatException ex) {errDispatcher.jspError(ex);}}ctxt.checkOutputDir();try {// Parse the fileParserController parserCtl new ParserController(ctxt, this);// Pass 1 - the directivesNode.Nodes directives parserCtl.parseDirectives(ctxt.getJspFile());Validator.validateDirectives(this, directives);// Pass 2 - the whole translation unitpageNodes parserCtl.parse(ctxt.getJspFile());// Validate and process attributes - dont re-validate the// directives we validated in pass 1/*** JH: The code above has been copied from Compiler#generateJava() with some* omissions and with using our own Visitor.* The code that used to follow was just deleted.* Note: The JSPs name is in ctxt.getJspFile()*/pageNodes.visit(new JsfElCheckingVisitor());} finally {}return null;}/*** The parents implementation, in our case, checks whether the target file* exists and returns true if it doesnt. However it is expensive so* we skip it by returning true directly.* see org.apache.jasper.JspCompilationContext#getServletJavaFileName()*/Override public boolean isOutDated(boolean checkClass) {return true;}} 笔记 我从生成Java中删除了许多对我来说不重要的代码 对于与我预期不同的分析类型某些代码可能会有用因此请查看原始的Compiler类然后自己决定。 我不太在乎JSP EL因此可以优化编译器使其仅需一次通过。 3.编译器执行器 直接使用编译器很困难因为它取决于许多复杂的设置和对象。 因此最简单的方法是重用Ant任务JspC这还有查找要处理的JSP的额外好处。 如前所述关键是重写getCompilerClassName以返回编译器的类第8行 import org.apache.jasper.JspC;/** Extends JspC to use the compiler of our choice; Jasper version 6.0.29. */ public class JspCParsingToNodesOnly extends JspC {/** Overriden to return the class of ours (default null JdtCompiler) */Override public String getCompilerClassName() {return OnlyReadingJspPseudoCompiler.class.getName();}public static void main(String[] args) {JspCParsingToNodesOnly jspc new JspCParsingToNodesOnly();jspc.setUriroot(web); // where to search for JSPs//jspc.setVerbose(1); // 0 false, 1 truejspc.setJspFiles(helloJSFpage.jsp); // leave unset to process all; comma-separatedtry {jspc.execute();} catch (JasperException e) {throw new RuntimeException(e);}} } 笔记 JspC通常会在指定的Uriroot下找到所有文件但是您可以通过将其逗号分隔的名称传递给setJspFiles来告诉它忽略所有选定的文件。 编译依赖 以您的常春藤形式 dependency namejasper orgorg.apache.tomcat rev6.0.29 dependency namejasper-jdt orgorg.apache.tomcat rev6.0.29 dependency nameant orgorg.apache.ant rev1.8.2 执照 这里的所有代码都直接来自Jasper因此属于同一许可证即Apache许可证版本2.0 。 结论 Jasper并不是真正为扩展和模块化而设计的因为关键的Node类是程序包私有的并且其API非常复杂以致仅重用其中的一部分非常困难。 幸运的是通过提供一些“伪”对象Ant任务JspC使它可以在servlet容器之外使用并且有一种方法可以通过很少的工作来调整它以满足我们的需求尽管要弄清楚它并不容易。 我不得不应用一些肮脏的技巧即使用包私有类中的内容并覆盖一个不打算被覆盖的方法 generateJava 但它可以工作并提供非常有价值的输出这使得您可以做任何想做的事情用一个JSP来做。 参考在我们的Java博客上与我们的JCG合作伙伴 JakubHolý 合作 通过Jasper入侵获取JSP页面的对象模型 。 快乐的编码... 拜伦 相关文章 Java Code Geeks Andygene Web原型 为什么自动化测试可以提高您的开发速度 代码质量对客户很重要。 很多。 使用FindBugs产生更少的错误代码 针对用户和新采用者的敏捷软件开发建议 翻译自: https://www.javacodegeeks.com/2011/06/hacking-jasper-to-get-object-model-of.htmljasper 获取当前日期
http://www.sadfv.cn/news/438709/

相关文章:

  • 网站建设深圳官网软件公司都是干什么的
  • 国内做心理咨询师培训出名的网站有教做点心的网站吗
  • 怎么才能百度做网站金华网站制作企业
  • 茶道网站开发背景设计大型网站建设
  • 2017年做那个网站致富指数基金怎么买
  • 关于汽车的网站iis7搭建asp网站
  • 房产网站栏目建设通辽做网站建设
  • 郑州网站建设zhuotop如何做网站 优帮云
  • 网站技术解决方案是什么深圳市住房保障署官网登录
  • 哪家网络公司做网站好为什么说新浪的门户网站做的好
  • 11免费建网站visual studio怎么新建网站
  • c2c电商网站聊城建设学校毕业证
  • 德阳市网站建设三端网站如何做
  • 有没有可以做app的网站吗做淘宝客网站需要注意什么
  • 做网站详情的图片动漫设计与制作培训学院
  • 网站聚合页面怎么做杭州seo优化公司
  • 建立搜索引擎网站怎么做网上销售
  • 论文目录链接怎么做如何做网站导航栏的seo优化
  • 网站建设与维护管理实训报告西安市建设工程
  • 软文网站发布平台模板加官网主页
  • c语言程序设计网站一个企业是如何做网站建设的
  • 服务外包网站阳江网雨大精神病专科医院
  • 新公司董事长致辞做网站网页游戏排行榜2024前十名
  • 网站建设开发软件有哪些网站开发价格
  • 公司 网站建设 简介西安攻略旅游自由行怎么玩
  • 环境设计案例网站全网商城系统
  • 大成设计网站建设网站图片搜索技术哪里可以做
  • 响应式网站建设公司‘创建自己网站
  • 现在做网站还用dw做模板了吗本地网站建设教程xampp
  • 购物网站建设报价网上运营培训班