`
yaoweinan
  • 浏览: 138318 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

java 动态编译及执行实现Web式java开发

 
阅读更多

废话不说,让大家等了这么久,先看看截图

 

编译失败图:

 编译成功,执行图:



 编译完成,执行时出现异常图:


 

呵呵,这里当然只能执行一些简单的java编程文件,如果要做更强大的功能还需要大家的努力,下面就揭开内幕:

 

1.文件保存

package com.servlets;

import java.io.File;
import java.io.FileWriter;

public class FileTool {
  public static void saveStringToFile(final String content, final String fileName) throws Exception {
    final File file = new File(fileName);
    if(file.isDirectory()){
      throw new Exception("dir is not allowed!");
    }
    if(file.exists()){
      file.delete();
      file.createNewFile();
    }
    FileWriter fileWriter=new FileWriter(file);
    fileWriter.write(content);
    fileWriter.flush();
    fileWriter.close();
  }

  public static void makeDir(String baseDir) {
    File file = new File(baseDir);
    file.mkdirs();
  }
}
 

2.Servlet

 

package com.servlets;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import com.dynamic.DynamicCompile;

/**
 * Servlet implementation class JavaProcess
 */
@WebServlet("/JavaProcess.sock")
public class JavaProcess extends HttpServlet {
  private static final long serialVersionUID = 1L;
  private final static String ABSLUTE_PATH = "E:/Compile";

  /**
   * @see HttpServlet#HttpServlet()
   */
  public JavaProcess() {
    super();

  }

  /**
   * @see Servlet#init(ServletConfig)
   */
  public void init(ServletConfig config) throws ServletException {
    // TODO Auto-generated method stub
  }

  /**
   * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
   */
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String action = request.getParameter("action");
    System.out.println(action);
    if ("compile".equals(action)) {
      compileFile(request, response);
    }
    else if ("run".equals(action)) {
      run(request, response);
    }
    else {

    }
  }

  private void run(HttpServletRequest request, HttpServletResponse response) {
    String className = request.getParameter("name");
    className = className.replace('.', '/');
    final String baseDir = ABSLUTE_PATH + "/" + request.getSession().getId() + "/";
    ByteArrayOutputStream out=new ByteArrayOutputStream();
    DynamicCompile.run(className,baseDir, out);
    String result = new String(out.toByteArray());
    Result result2=new Result(true, result);
    JSONObject ob = JSONObject.fromObject(result2);
    ServletOutputStream outputStream;
    try {
      outputStream = response.getOutputStream();
      PrintWriter o = new PrintWriter(outputStream);
      o.print(ob);
      o.flush();
      o.close();
    }
    catch (IOException e) {
    }
  
  }

  private void compileFile(HttpServletRequest request, HttpServletResponse response) {
    String className = request.getParameter("name");
    String content = request.getParameter("file");
    className=className.substring(className.lastIndexOf('.')+1);
    final String baseDir = ABSLUTE_PATH + "/" + request.getSession().getId() + "/";
    final String dir = baseDir + className.trim() + ".java";
    try {
      createDir(baseDir);
      savefileToDir(dir, content);
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      PrintWriter writer = new PrintWriter(out);
      compileFile(dir, baseDir, writer);
      String result = new String(out.toByteArray());
      JSONObject ob;
      Result result2;
      if (result.isEmpty()) {
        result2 = new Result(true, result);
      }
      else {
        result2 = new Result(false, result);
      }
      ob = JSONObject.fromObject(result2);
      ServletOutputStream outputStream = response.getOutputStream();
      PrintWriter o = new PrintWriter(outputStream);
      o.print(ob);
      o.flush();
      o.close();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  private void createDir(String baseDir) {
    FileTool.makeDir(baseDir);
  }

  private void compileFile(String dir, String baseDir, PrintWriter writer) {
    DynamicCompile.compile(dir, baseDir, writer);
  }

  private void savefileToDir(String dir, String content) throws Exception {
    FileTool.saveStringToFile(content, dir);

  }

  /**
   * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
   */
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  }


}
 

3.执行编译

package com.dynamic;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import com.sun.tools.javac.Main;

public class DynamicCompile {
    public static void compile(String dir, String baseDir,PrintWriter writer){
      String[] agrs=new String[]{"-d",baseDir,dir};
      Main.compile(agrs,writer);
    }
    
    public static boolean run(String className,final String baseDir, ByteArrayOutputStream out){
      PrintStream out1=new PrintStream(out);
      PrintStream err = System.err;
      PrintStream out2 = System.out;
      System.setErr(out1);
      System.setOut(out1);
      XClassLoader load=null;
      load=new XClassLoader(baseDir);
      try {
        Class<?> loadClass = load.loadClass(className);
        final Method method = loadClass.getMethod("main",  new Class[] { String[].class });
        method.invoke(null,new Object[]{new String[]{"21","df","dd"}});
        
      }
      catch (ClassNotFoundException e) {
        e.printStackTrace();
      }
      catch (SecurityException e) {
        e.printStackTrace();
      }
      catch (NoSuchMethodException e) {
        e.printStackTrace();
      }
      catch (IllegalArgumentException e) {
        e.printStackTrace();
      }
      catch (IllegalAccessException e) {
        e.printStackTrace();
      }
      catch (InvocationTargetException e) {
        e.printStackTrace();
      }
      
      System.setErr(err);
      System.setOut(out2);
      return false;
      
    }
}

 4.类加载

package com.dynamic;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class XClassLoader extends ClassLoader {
  private final String classPath;
  
  public XClassLoader(String classPath) {
    super();
    this.classPath = classPath;
  }

  @Override
  protected Class<?> findClass(String name) throws ClassNotFoundException {
    FileInputStream fs;
    try {
      final String path = classPath+ name +".class";
      fs = new FileInputStream(path);
      int s=fs.available();
      byte[] bs=new byte[ s];
      fs.read(bs, 0, s); 
      final String className = name.replace('/','.');
      return this.defineClass(className, bs, 0, s);
    }
    catch (FileNotFoundException e) {
      throw new ClassNotFoundException("Not Found");
    }
    catch (IOException e) {
      throw new ClassNotFoundException("Not Found");
    }
    }

}
 

5.返回数据对象类

package com.servlets;

public class Result {
   private boolean success;
   private String msg;

   public Result(boolean success, String msg) {
     super();
     this.success = success;
     this.msg = msg;
   }

  public boolean isSuccess() {
    return success;
  }

  public void setSuccess(boolean success) {
    this.success = success;
  }

  public String getMsg() {
    return msg;
  }

  public void setMsg(String msg) {
    this.msg = msg;
  }

 }

 6.前台界面

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css"
	href="./extjs3/resources/css/ext-all.css" />
<script type="text/javascript" src="./extjs3/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="./extjs3/ext-all.js"></script>
<style type="text/css">
html,body {
	font: normal 12px verdana;
	margin: 0;
	padding: 0;
	border: 0 none;
	overflow: hidden;
	height: 100%;
}
</style>

<title>Java Compile</title>
<script type="text/javascript">
	Ext.onReady(function() {
		Ext.BLANK_IMAGE_URL = './extjs3/resources/images/default/s.gif';
		var text = new Ext.form.TextArea({
			region : 'center'
		});
		var textName = new Ext.form.TextField({
			fieldLabel : 'Class Name',
			allowBlank:false,
			width : '98%'
			
		});
		var namePanel = new Ext.Panel({
			region : 'north',
			height : '30px',
			items : [ {
				xtype : 'form',
				layout : 'form',
				labelWidth :70,
				layoutConfig : {
					labelSeparator : ':'
				},
				labelAlign : 'left',
				frame : false,
				padding : '8px',
				items : [ textName ]
			} ]
		});
		var compileBtn = new Ext.Button({
			text : 'Compile'
		});
		var runBtn = new Ext.Button({
			text : 'Run'
		});
		var panel_text = new Ext.Panel({
			region : 'center',
			title : 'Java Compile',
			layout : 'border',
			items : [ namePanel, text ],
			buttons : [ compileBtn, runBtn ]
		});
		var console_text = new Ext.form.TextArea({
			width : '100%',
			readOnly : true,
			height : 200
		});
		var panel_console = new Ext.Panel({
			region : 'south',
			title : 'Console',
			collapsible : true,
			height : 200,
			items : [ console_text ]

		});
		var viewport = new Ext.Viewport({
			layout : 'border',
			items : [ panel_console, panel_text ]
		});

		var comileSuccess = function(response,ops) {
			var rs=Ext.util.JSON.decode(response.responseText);
			console_text.setValue(rs.msg);
		}
		var faild = function(e) {
		}
		var compile = function(e) {
			if (e == 'ok') {
				var javaCode = text.getValue();
				var clsName = textName.getValue();
				Ext.Ajax.request({
					url : 'JavaProcess.sock',
					method :'GET',
					success : comileSuccess,
					failure : faild,
					params : {
						action:'compile',
						file : javaCode,
						name : clsName

					}
				});
			}
		}
		compileBtn.on('click', function() {
			Ext.Msg.show({
				title : 'Notice',
				msg : 'Are you sure to compile the code?',
				buttons : Ext.Msg.OKCANCEL,
				fn : compile,
				icon : Ext.MessageBox.QUESTION
			});
		});
		runBtn.on('click',function(){
			var clsName = textName.getValue();
			Ext.Ajax.request({
				url : 'JavaProcess.sock',
				method :'GET',
				success : comileSuccess,
				failure : faild,
				params : {
					action:'run',
					name : clsName

				}
			});
		});

	});
</script>
</head>
</body>
</html>

 

 

小结:在此例子中使用了java反射技术,java动态编译,加载类技术和Jave EE技术,达到了在网页里面编写简单java程序的功能,抛砖引玉,希望大家看了之后能够想到更多,实现更强大的功能。譬如说把编译后的class存在数据库里面,实现一些匪夷所思的功能:)

  • 大小: 9.7 KB
  • 大小: 17.8 KB
  • 大小: 12.4 KB
分享到:
评论

相关推荐

    JavaCompiler --JDK6 API的简介(java动态编译)

    在实际应用中,JavaCompiler 广泛应用于 Java 动态编译中,例如,在 Web 开发中,我们可以使用 JavaCompiler 来动态编译 Java 源代码,以便实现更加灵活的开发。 JavaCompiler 是 Java 中的一个重要的编译器接口,...

    java动态编译 ,写了一个jsp在页面上编辑java代码,然后servlet动态编译并执行main方法

    总结来说,这个项目展示了Java动态编译的实用性和灵活性,通过结合JSP、Servlet和Java的动态编译功能,可以在Web应用中实现代码的实时编辑和执行。这种技术在教育、实验环境或者需要快速迭代和测试的场景下尤其有用...

    Tomcat与Java_Web开发技术详解3.pdf

    Java Web开发是指使用Java语言及相关技术进行Web应用程序的开发工作。它涵盖了从简单的静态网页到复杂的动态网站和企业级应用系统的各个方面。Java Web开发的基础知识主要包括以下几个方面: 1. **Java Servlet**:...

    基于Java的Web开发技术浅析.pdf

    基于Java的Web开发技术,主要是指使用Java语言及相关的技术框架开发基于Web的应用程序。Java语言因其跨平台、面向对象、易用性等特性,在Web开发领域获得了广泛的应用。下面将从几个方面详细阐述基于Java的Web开发...

    Web环境下Java表达式的动态编译与计算.pdf

    本文介绍了一种在Web环境下实现Java表达式的动态编译与计算的方法,该方法利用Java SE 6提供的编译器API实现动态编译,自定义类装载器装入字节代码,并使用反射机制调用计算方法,实现了Java表达式的动态编译与计算...

    java Web系统开发

    首先,我们从基础开始,第二章 "Java开发环境及开发工具" 是学习Java Web开发的起点。这一章会介绍如何设置Java开发环境,包括安装Java Development Kit (JDK) 和集成开发环境(IDE),如Eclipse或IntelliJ IDEA。...

    Java Web开发技术大全

    Java Web开发技术是互联网应用程序构建的核心领域,涵盖了多种技术和工具,用于创建动态、交互式的Web应用。本资源“Java Web开发技术大全”旨在提供全面的学习材料,帮助开发者深入理解和掌握这一领域的关键概念。 ...

    Java Web开发实践教程 课件

    Java Web开发实践教程是一门深度探索Java在Web领域应用的课程,旨在帮助学习者掌握从基础到高级的Java Web开发技术。本课程涵盖了广泛的主题,包括Servlet、JSP、MVC框架(如Spring MVC)、数据库交互、过滤器、监听...

    java反编译工具myeclipse8.5 及以上版本

    MyEclipse是一款强大的Java集成开发环境,它扩展了Eclipse的功能,提供了更多的特性,如支持Java EE、Web服务和数据库等。在MyEclipse 8.5及以上版本中,可以集成反编译插件,使开发者可以直接在IDE内部查看类文件的...

    精通Java--JDK、数据库系统开发、Web开发基础与实例

    《精通Java--JDK、数据库系统开发、Web开发基础与实例》是一本全面覆盖Java编程技术及应用实践的书籍。本书旨在帮助读者深入理解和熟练掌握Java语言,从基础到高级,从理论到实践,全方位提升Java开发技能。 首先,...

    java反编译+api

    Java反编译是Java开发中一个重要的技术环节,它允许我们查看Java字节码并将其转化为可读的源代码,这对于学习、调试、分析或逆向工程Java程序非常有用。在Java世界里,最常用的反编译工具有JAD、FernFlower、Procyon...

    ant编译java web工程build.xml配置文件

    介绍了如何通过ant进行java web工程的编译操作的详细配置

    Java+Web开发实践教程ppt课件源码整理

    在这个教程中,学生和开发者可以学习到如何将Java技术应用到构建动态、交互式的Web应用中。以下是一些关键知识点的详细说明: 1. **Java基础**:Java是一种面向对象的编程语言,具有跨平台性、安全性以及高性能的...

    Java web网站开发 PPT

    【Java Web网站开发】是Web应用开发的重要领域,它涵盖了使用Java语言以及相关技术来创建交互式的、动态的Web应用程序。Java Web开发主要基于Java Servlet、JavaServer Pages(JSP)、JavaServer Faces(JSF)等技术...

    Java web动态网站

    Java Web动态网站是一种基于Java技术构建的互联网应用程序,它能够为用户提供交互式的、内容更新实时的网络服务。这个课程设计适合初学者入门,通过学习,你可以掌握如何利用Java Web技术来开发动态、功能丰富的网站...

    7-Java-web开发17-Java-web开发17-Java-web开发17-Java-web开发17-Java-web开发

    Java Web开发是一个涵盖广泛的主题,包括使用Java语言进行服务器端编程、构建动态网站以及实现企业级应用程序。在Java Web开发中,我们主要涉及到以下几个关键知识点: 1. **Servlet**: Servlet是Java Web应用的...

    Tomcat与Java Web开发技术详解源代码.rar

    源代码压缩包"Tomcat与Java Web开发技术详解源代码.rar"包含了书中所有示例的完整实现,为读者提供了动手实践的宝贵资源。 首先,Tomcat是Apache软件基金会下的一个开源项目,是一款轻量级的应用服务器,主要支持...

    java WEB开发光盘资料

    Java Web开发是构建基于互联网应用程序的关键技术,涵盖了服务器端编程、网页动态呈现和数据交互等多个层面。本压缩包“java WEB开发光盘资料”提供了一系列的学习资源,特别适合那些正在入门或者希望深化Java Web...

    Java+JSP+Mysql实现Web教师信息管理系统

    总结来说,这个“Java+JSP+MySQL实现Web教师信息管理系统”是一个综合运用了多种技术的Web应用实例,展示了如何利用Java后端技术与数据库交互,通过JSP生成动态页面,以实现教育机构对教师信息的高效管理。...

    Java网络编程原理与JSP Web开发核心技术

    JSP(Java Server Pages)是Java Web开发中的重要组件,它允许开发者在HTML页面中嵌入Java代码,实现动态网页的生成。JSP的核心概念包括指令(Directives)、脚本元素(Scripting Elements)和动作(Actions)。指令...

Global site tag (gtag.js) - Google Analytics