- 浏览: 138318 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
yaoweinan:
没有.....
Itext 5.4.0 生成PDF中文不报错,Adobe 不显示 -
马文涛:
我也发现这个问题了,你找到解决办法了吗?
Itext 5.4.0 生成PDF中文不报错,Adobe 不显示 -
coding1688:
博主辛苦了,也可以参考一下这篇文章:四步轻松搞定瀑布流布局ht ...
瀑布流布局个人实现 -
yaoweinan:
嘿嘿,那个只是最笨的办法,实际上是不行的,现在一般的都有sw ...
文件上传(无刷新,带进度条,带网速)下载完整 -
javazzu:
我为啥不行呢
文件上传(无刷新,带进度条,带网速)下载完整
废话不说,让大家等了这么久,先看看截图 :
编译失败图:
编译成功,执行图:
编译完成,执行时出现异常图:
呵呵,这里当然只能执行一些简单的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存在数据库里面,实现一些匪夷所思的功能:)
发表评论
-
写自己的框架,让别人笑掉大牙吧(AOP)
2013-04-30 12:50 676基于前面破框架我自己也实现了一下AOP技术,AOP技术现在也很 ... -
写自己的框架,让别人笑掉大牙吧(IOC2)
2013-04-22 14:23 902上篇中主要使用配置文件来定义一些类实例之间的组织关系 ... -
写自己的框架,让别人笑掉大牙吧(IOC1)
2013-04-19 17:44 779IOC在java框架中到处可见,我们只需要创建 ... -
关于java中对象属性值的校验的思考
2013-04-15 14:09 1557现在在java 开发中经常会遇到要交验某个obje ... -
Ant 使用小结
2013-03-01 15:25 820以前的项目中都没有用到过ant,都是手动打war,复制cop ... -
JXLayer 使用简单介绍
2012-11-01 17:25 1319JXLayer 是一个很好的Swing 控件装饰类库,其主要要 ... -
关于Jtextinpt 内容的限制
2012-09-28 15:00 811在JTextInput 限制输入内容,这个一般的通过按键输入进 ... -
Spring mvc 小编(配置)
2012-09-26 15:58 1017上一篇讲述了Spring mvc 中常用的几个注解标示,这章 ... -
Spring mvc 小编(注解)
2012-09-21 17:16 1073前不久做web 项目用过spring mvc 觉着这玩意挺不错 ... -
构造中的多态
2012-08-25 23:19 856各位仁兄,前几日我在 ... -
Swing JtableModel 使用之旅
2012-07-29 03:25 1031JTable 是我们一般展示数据的一个很好的Grid组建,个人 ... -
模版模式(TemplatePattern)
2012-07-15 11:08 797模版模式分为2个部分 1.抽象模版 2.具体模版 ... -
门面模式(Facade Pattern)
2012-06-10 19:37 988门面模式(Facade Pattern):门面模式在我个人感觉 ... -
代理模式例子
2012-06-04 15:07 987代理模式简单点就和现实中一样,只是代理实质性的还是别人在做。比 ... -
策略模式应对旅行中出现的问题
2012-06-04 14:21 887策略模式是针对在进行过程中出现一些问题的应对模式。一般可以分为 ... -
java 工厂模式简单介绍及例子
2012-06-03 23:16 1065java中工厂模式在java ee中经常碰见,是一种常见的模式 ... -
java 动态代理及自定义标注使用例子
2012-06-03 00:14 1237java中动态代理,在实际应用中有着很大的作用,譬如在一些类似 ... -
response.setContentType("") 小抄本
2012-02-18 10:00 829response.setContentType(" ... -
ftp文件上传 、下载
2012-02-09 13:36 1536使用spring mvc +commons-net-1.4.1 ... -
flex3 socket+java
2012-02-06 12:10 1089首先解决的问题是flex的沙箱问题,由于flex 连接服务器存 ...
相关推荐
在实际应用中,JavaCompiler 广泛应用于 Java 动态编译中,例如,在 Web 开发中,我们可以使用 JavaCompiler 来动态编译 Java 源代码,以便实现更加灵活的开发。 JavaCompiler 是 Java 中的一个重要的编译器接口,...
总结来说,这个项目展示了Java动态编译的实用性和灵活性,通过结合JSP、Servlet和Java的动态编译功能,可以在Web应用中实现代码的实时编辑和执行。这种技术在教育、实验环境或者需要快速迭代和测试的场景下尤其有用...
Java Web开发是指使用Java语言及相关技术进行Web应用程序的开发工作。它涵盖了从简单的静态网页到复杂的动态网站和企业级应用系统的各个方面。Java Web开发的基础知识主要包括以下几个方面: 1. **Java Servlet**:...
基于Java的Web开发技术,主要是指使用Java语言及相关的技术框架开发基于Web的应用程序。Java语言因其跨平台、面向对象、易用性等特性,在Web开发领域获得了广泛的应用。下面将从几个方面详细阐述基于Java的Web开发...
本文介绍了一种在Web环境下实现Java表达式的动态编译与计算的方法,该方法利用Java SE 6提供的编译器API实现动态编译,自定义类装载器装入字节代码,并使用反射机制调用计算方法,实现了Java表达式的动态编译与计算...
首先,我们从基础开始,第二章 "Java开发环境及开发工具" 是学习Java Web开发的起点。这一章会介绍如何设置Java开发环境,包括安装Java Development Kit (JDK) 和集成开发环境(IDE),如Eclipse或IntelliJ IDEA。...
Java Web开发技术是互联网应用程序构建的核心领域,涵盖了多种技术和工具,用于创建动态、交互式的Web应用。本资源“Java Web开发技术大全”旨在提供全面的学习材料,帮助开发者深入理解和掌握这一领域的关键概念。 ...
Java Web开发实践教程是一门深度探索Java在Web领域应用的课程,旨在帮助学习者掌握从基础到高级的Java Web开发技术。本课程涵盖了广泛的主题,包括Servlet、JSP、MVC框架(如Spring MVC)、数据库交互、过滤器、监听...
MyEclipse是一款强大的Java集成开发环境,它扩展了Eclipse的功能,提供了更多的特性,如支持Java EE、Web服务和数据库等。在MyEclipse 8.5及以上版本中,可以集成反编译插件,使开发者可以直接在IDE内部查看类文件的...
《精通Java--JDK、数据库系统开发、Web开发基础与实例》是一本全面覆盖Java编程技术及应用实践的书籍。本书旨在帮助读者深入理解和熟练掌握Java语言,从基础到高级,从理论到实践,全方位提升Java开发技能。 首先,...
Java反编译是Java开发中一个重要的技术环节,它允许我们查看Java字节码并将其转化为可读的源代码,这对于学习、调试、分析或逆向工程Java程序非常有用。在Java世界里,最常用的反编译工具有JAD、FernFlower、Procyon...
介绍了如何通过ant进行java web工程的编译操作的详细配置
在这个教程中,学生和开发者可以学习到如何将Java技术应用到构建动态、交互式的Web应用中。以下是一些关键知识点的详细说明: 1. **Java基础**:Java是一种面向对象的编程语言,具有跨平台性、安全性以及高性能的...
【Java Web网站开发】是Web应用开发的重要领域,它涵盖了使用Java语言以及相关技术来创建交互式的、动态的Web应用程序。Java Web开发主要基于Java Servlet、JavaServer Pages(JSP)、JavaServer Faces(JSF)等技术...
Java Web动态网站是一种基于Java技术构建的互联网应用程序,它能够为用户提供交互式的、内容更新实时的网络服务。这个课程设计适合初学者入门,通过学习,你可以掌握如何利用Java Web技术来开发动态、功能丰富的网站...
Java Web开发是一个涵盖广泛的主题,包括使用Java语言进行服务器端编程、构建动态网站以及实现企业级应用程序。在Java Web开发中,我们主要涉及到以下几个关键知识点: 1. **Servlet**: Servlet是Java Web应用的...
源代码压缩包"Tomcat与Java Web开发技术详解源代码.rar"包含了书中所有示例的完整实现,为读者提供了动手实践的宝贵资源。 首先,Tomcat是Apache软件基金会下的一个开源项目,是一款轻量级的应用服务器,主要支持...
Java Web开发是构建基于互联网应用程序的关键技术,涵盖了服务器端编程、网页动态呈现和数据交互等多个层面。本压缩包“java WEB开发光盘资料”提供了一系列的学习资源,特别适合那些正在入门或者希望深化Java Web...
总结来说,这个“Java+JSP+MySQL实现Web教师信息管理系统”是一个综合运用了多种技术的Web应用实例,展示了如何利用Java后端技术与数据库交互,通过JSP生成动态页面,以实现教育机构对教师信息的高效管理。...
JSP(Java Server Pages)是Java Web开发中的重要组件,它允许开发者在HTML页面中嵌入Java代码,实现动态网页的生成。JSP的核心概念包括指令(Directives)、脚本元素(Scripting Elements)和动作(Actions)。指令...