SDU信息门户(11)groovy文件解析

2021SC@SDUSC

目录

一.引言

二.代码解析

1.groovy文件I/O

2.xml处理

3.swing构建器

4.异常处理

5.实现接口

6 .解析和生成JSON对象

三.总结


一.引言

       SDU信息门户系统中使用了groovy文件,这篇博客主要是结合代码解析groovy文件。Apache Groovy是一个功能强大的动态编程语言,靠着其简洁、与Java非常相似以及易于学习的语法,它支持DSL,提供运行阶段和编译阶段元数据编程等强大的功能。Groovy语言兼静态语言和动态语言的特征,同时借鉴了很多语言快速开发的能力。

二.代码解析

1.groovy文件I/O

File类用于实例化以文件名作为参数的新对象。 然后它接受eachLine的函数,将它放到一个line的变量并相应地打印它。

import java.io.File 
class Example { 
   static void main(String[] args) { 
      new File("E:/student.txt").eachLine {  
         line -> println "line : $line"; 
      } 
   } 
}

2.xml处理

     解析字符串,获得XmlSlurper对象(new 方式),获得节点对象(parseXXX(xmlString)方法的返回值),通过节点对象获得节点值、节点属性值

String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
        "<value>\n" +
        "    <books id=\"1\" type=\"android\">\n" +
        "        <book page=\"507\">\n" +
        "            
        "        </book>\n" +
        "        <book page=\"507\">\n" +
        "          
        "        </book>\n" +
        "        <book page=\"100\">\n" +
        "           
        "        </book>\n" +
        "    </books>\n" +
        "\n" +
        "</value>"
def xmlSlurper = new XmlSlurper()

核心类MarkupBuilder
1、先生成根节点,调用方法即可(方法名为根节点名)
2、节点套节点就是,闭包里面吊方法
3、节点的属性、属性值就使用键值对即可
4、节点的值直接使用值即可。

//xml 的生成
//public class StringWriter extends Writer

def sw = new StringWriter() // 生成的xml写入文件
def xmlBuilder = new MarkupBuilder(sw) // 生成xml的核心类

xmlBuilder.LolPersons(id:"1"){
    yasuo(type:")
    gailun(type:"")
}
println(sw)
----------------------------------------
log:
<LolPersons id='1'>
  <yasuo</yasuo>
  <gailun type='' desc='></gailun>
</LolPersons>

3.swing构建器

      Groovy有可以用来创建标准对象和结构的构建器。 groovy中可用的不同构建器。在groovy中,还可以使用groovy中提供的swing构建器创建图形用户界面。swing组件的主要类是Swing Builder类。导入groovy.swing.SwingBuilde类。类型对于变量,属性,方法,闭包的参数以及方法的返回类型都是可有可无的,都是在给变量赋值的时候才决定它的类型, 不同的类型会在后面用到,任何类型都可以被使用,即使是基本类型 (通过自动包装(autoboxing)). 当需要时,很多类型之间的转换都会自动发生,比如在这些类型之间的转换: 字符串(String),基本类型(如int) 和类型的包装类 之间,可以把不同的基本类型添加到同一数组(collections)中。

import groovy.swing.SwingBuilder 
import javax.swing.* 

// Create a builder 
def myapp = new SwingBuilder()

// Compose the builder 
def myframe = myapp.frame(title : 'Tutorials Point', location : [200, 200], 
   size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE {         
      label(text : )
   } 
	
// The following  statement is used for displaying the form 
frame.setVisible(true)

4.异常处理

      如果文件(file.txt)不在E盘中,那么将引发以下异常。扩展RuntimeException的类称为未检查异常,例如,ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsException等。未检查的异常在编译期不检查,而是在运行时检查。典型的情况是ArrayIndexOutOf Bounds Exception,当您尝试访问大于数组长度的数组的索引时,会发生这种情况。

class student {
   static void main(String[] args) {
      try {
         def arr = new int[3];
         arr[5] = 5;
      }catch(ArrayIndexOutOfBoundsException ex) {
         println("Catching the Array out of Bounds exception");
      }catch(Exception ex) {
         println("Catching the exception");
      }
		
      println("Let's move on after the exception");
   } 
}

5.实现接口

     SDU信息门户系统处理的事件在一个事件列表events中. 列表是动态的;这些不同的事件的事件处理程序在变量handler所引用的代码块中. 循环 events中的每个事件,使用 asType( ) 方法创建每个接口的实现.在代码块上调用此方法 并使用 forName( )方法获得接口的Class metaobject作为参数.上面的代码, 在代码块上使用asType( ) 方法. 假如你不同的方法有不同的实现, 可以使用Map代替单一的代码块. 这样的话, 你可以用简单的方式在Map上调用asType( )方法 . 

frame = new JFrame(size:[300,300],layout:new FlowLayout(), defaultCloseOperation:javax.swing.WindowConstants.EXIT_ON_CLOSE)
frame.setVisible(true)
button = new Button("click")
positionLabel = new JLabel("")
msgLabel = new JLabel("")
frame.contentPane.add button
frame.contentPane.add positionLabel
frame.contentPane.add msgLabel

button.addActionListener(
        {JOptionPane.showMessageDialog(frame,"You clicked!")} as ActionListener
)
displayMouseLocation = { positionLabel.setText("$it.x, $it.y" ) }
frame.addMouseListener(displayMouseLocation as MouseListener)
frame.addMouseMotionListener(displayMouseLocation as MouseMotionListener)
handleFocus = [
        focusGained : { msgLabel.setText("Good to see you!" ) },
        focusLost : { msgLabel.setText("Come back soon!" ) }
]

button.addFocusListener(handleFocus as FocusListener)
events = ['WindowListener' , 'ComponentListener' ]
// Above list may be dynamic and may come from some input
handler = { msgLabel.setText("$it" ) }
for (event in events)
{
    handlerImpl = handler.asType(Class.forName("java.awt.event.${event}" ))
    frame."add${event}" (handlerImpl)
}
frame.show()

6 .解析和生成JSON对象

     JsonParserCharArray解析器基本上采用一个JSON字符串并对底层字符数组进行操作。在值转换期间,它复制字符子数组(称为“斩波”的机制)并单独操作它们。JsonFastParser是JsonParserCharArray的一个特殊变体。在解析给定的JSON字符串期间,它尽可能努力地避免创建新的字符数组或String实例。它只保留指向底层原始字符数组的指针。此外,它会尽可能晚地推迟对象创建。JsonParserUsingCharacterSource是一个非常大的文件的特殊解析器。获取对象时,您可以看到我们实际上可以通过键访问JSON字符串中的值。

NEWLINE = System.getProperty("line.separator")
INDENT = "  "

def printJSON(level, col, o) {
  switch (o) {
    case null: OUT.append("null"); break
    case Tuple: printJSON(level, o[0], o[1]); break
    case Map:
      OUT.append("{")
      o.entrySet().eachWithIndex { entry, i ->
        OUT.append("${i > 0 ? "," : ""}$NEWLINE${INDENT * (level + 1)}")
        OUT.append("\"${escapeStr(entry.getKey().toString())}\"")
        OUT.append(": ")
        printJSON(level + 1, col, entry.getValue())
      }
      OUT.append("$NEWLINE${INDENT * level}}")
      break
    case Object[]:
    case Iterable:
      OUT.append("[")
      def plain = true
      o.eachWithIndex { item, i ->
        plain = item == null || item instanceof Number || item instanceof Boolean || item instanceof String
        if (plain) {
          OUT.append(i > 0 ? ", " : "")
        }
        else {
          OUT.append("${i > 0 ? "," : ""}$NEWLINE${INDENT * (level + 1)}")
        }
        printJSON(level + 1, col, item)
      }
      if (plain) OUT.append("]") else OUT.append("$NEWLINE${INDENT * level}]")
      break
    case Boolean: OUT.append("$o"); break
    default:
      def str = FORMATTER.formatValue(o, col)
      OUT.append(FORMATTER.isStringLiteral(o, col) ? "\"${escapeStr(str)}\"" : str);
      break
  }
}

printJSON(0, null, ROWS.transform { row ->
  def map = new LinkedHashMap<String, String>()
  COLUMNS.each { col ->
    if (row.hasValue(col)) {
      def val = row.value(col)
      map.put(col.name(), new Tuple(col, val))
    }
  }
  map
})

三.总结

           通过这次的学习,我初步了解了一部分Groovy的知识,Groovy是一门基于JVM的动态语言,同时也是一门面向对象的语言,语法上和Java非常相似。它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。 Java作为一种通用、静态类型的编译型语。SDU信息门户中多数的groovy文件是为了解析和生成JSON文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值