Tomcat 8.x JSP标签节点信息转成字符串写入*.java文件,visit & accept


类1:cn.java.visitor.Node

package cn.java.visitor;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

abstract class Node {
	protected String qName;
	protected String localName;
	protected HashMap attrs;
	protected Node parent;
	protected Nodes body;
	public abstract void accept(Visitor v);
	public Node(String qName, String localName,HashMap attrs,Node parent){
		this.qName = qName;
		this.localName = localName;
		this.attrs = attrs;
		addToParent(parent);
	}
	public Node(){
	}

	public Nodes getBody() {
		return body;
	}

	public void setBody(Nodes body) {
		this.body = body;
	}

	private void addToParent(Node parent) {
		if (parent != null) {
			this.parent = parent; // 保存对父节点的依赖
			Nodes parentBody = parent.getBody();
			if (parentBody == null) {
				parentBody = new Nodes();
				parent.setBody(parentBody);
			}
			parentBody.add(this); // 保存父节点对子节点的依赖
		}
	}

	@Override
	public String toString() {
		return "Node [qName=" + qName + ", localName=" + localName + ", attrs=" + attrs + "]";
	}

	/**
	 * 节点列表
	 */
	public static class Nodes {
		private final List<Node> list;
		private Node.Root root;

		public Nodes() {
			list = new Vector<>();
		}

		public Nodes(Node.Root root) {
			this.root = root;
			list = new Vector<>();
			list.add(root);
		}

		public void add(Node n) {
			list.add(n);
			root = null;
		}

		public void remove(Node n) {
			list.remove(n);
		}

		public int size() {
			return list.size();
		}

		public void visit(Visitor v)  {
			Iterator<Node> iter = list.iterator();
			while (iter.hasNext()) {
				Node n = iter.next();
				n.accept(v);
			}
		}
	}

	/**
	 * 访问器
	 */
	public static class Visitor {
		public void visit(CustomTag node){
		}

		public void visit(IncludeAction node){

		}

		public void visit(NodeType1 node){

		}

		protected void doVisit(Node n)  {
		}

		protected void visitBody(Node n){
			if (n.getBody() != null) {
				n.getBody().visit(this);
			}
		}

		public void visit(Root n)  {
			doVisit(n);
			visitBody(n);
		}
	}

	/**
	 * 根节点
	 * @author Administrator
	 */
	public static class Root extends Node {

		public Root() {
		}

		@Override
		public void accept(Visitor v){
			v.visit(this);
		}
	}

	/**
	 * 节点类型1
	 * @author Administrator
	 *
	 */
	public static class CustomTag extends Node {
		private final String prefix;

		public CustomTag(String qName, String prefix, String localName,HashMap attrs ,Node parent){
			super(qName, localName,attrs,parent);
			this.prefix = prefix;
		}

		@Override
		public void accept(Visitor v) {
			v.visit(this);
		}

		@Override
		public String toString() {
			return "CustomTag [qName=" + qName + ", localName=" + localName + ", prefix=" + prefix + ", attrs=" + attrs + "]";
		}


	}

	/**
	 * 节点类型2
	 * @author Administrator
	 *
	 */
	public static class IncludeAction extends Node {

		public IncludeAction(String qName, String localName,HashMap attrs,Node parent) {
			super(qName, localName,attrs,parent);
		}

		@Override
		public void accept(Visitor v) {
			v.visit(this);
		}
		
	}

	/**
	 * 节点类型3
	 * @author Administrator
	 *
	 */
	public static class NodeType1 extends Node {
		public NodeType1(String qName, String localName,HashMap attrs ,Node parent) {
			super(qName, localName,attrs,parent);
		}

		@Override
		public void accept(Visitor v) {
			v.visit(this);
		}
	}
}

类2:cn.java.visitor.Generator

package cn.java.visitor;

import cn.java.visitor.Node.CustomTag;
import cn.java.visitor.Node.IncludeAction;
import cn.java.visitor.Node.NodeType1;


public class Generator {

	private class GenerateVisitor extends Node.Visitor {
		
		public void visit(CustomTag node){
			System.out.println(node);
		}
		
		public void visit(IncludeAction node){
			System.out.println(node);
		}
		
		public void visit(NodeType1 node){
			System.out.println(node);
		}
		
	}
	
	public static void generate(Node.Nodes page){
		Generator gen = new Generator();
		page.visit(gen.new GenerateVisitor());
	}
			
}

类3:主类 cn.java.visitor.Test

package cn.java.visitor;

import java.util.HashMap;
import cn.java.visitor.Node.CustomTag;
import cn.java.visitor.Node.IncludeAction;

public class Test {

	public static void main(String[] args) {
		
		Node.Root root = new Node.Root();
		new CustomTag("myprefix:tag1","myprefix","tag1" ,new HashMap(){
			{
				put("attr1", "attr1_value");
				put("attr2", "attr2_value");
			}
		},root);
		new CustomTag("myprefix:tag2","myprefix","tag2",null,root);
		new CustomTag("myprefix:tag3","myprefix","tag3",new HashMap(){
			{
				put("attr1", "attr1_value");
				put("attr2", "attr2_value");
			}
		},root);
		new IncludeAction("jsp:include","include",new HashMap(){
			{
				put("attr1", "attr1_value");
				put("attr2", "attr2_value");
			}
		},root);
		new IncludeAction("jsp:include","include",null,root);
		Node.Nodes page = new Node.Nodes(root);
		Generator.generate(page);
	}

}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值