460 likes | 663 Views
Using Jython to Speed Development. Don Coleman, Aaron Mulder, Tom Purcell Chariot Solutions. Goal. Use Jython to make software development easier. Who are we?. We are J2EE Architects We write commercial Java software We use Jython as a tool for developing and testing Java software.
E N D
Using Jython to Speed Development Don Coleman, Aaron Mulder, Tom PurcellChariot Solutions
Goal Use Jython to make software development easier.
Who are we? • We are J2EE Architects • We write commercial Java software • We use Jython as a tool for developing and testing Java software
Presentation Agenda • About Jython • Language Overview • Using the Interactive Interpreter • Server Side Jython • Accessing Databases • Accessing EJBs • PyServlet • Embedded Jython • Advanced Jython
What is Jython? • Jython is an implementation of the Python language that runs on the JVM • Jython excels at scripting and is excellent for exploring and debugging code • Jython's interpreted nature allows you to work with Java without a compiler and manipulate live objects on the fly • Jython gives you the power of Java + Python
What is Python? Python is a mature language that ... • has clear syntax • is easy to learn • is easy to use • is object oriented • is powerful
Installing Jython • Install JDK 1.4 • Download Jython from http://www.jython.org • cd to the directory with jython-21.class • Start the installer$ java -cp . jython-21
Sample Code class Greeter: def sayHello(self, name = None): if name == None: print "Hello" else: print "Hello, %s" % name def sayGoodbye(self): print "Goodbye"
Why would you use Jython? • Live interaction with Java for experimentation • Testing and debugging • Write quick scripts without needing to compile • Quick runtime tests • BigDecimal("0").equals(BigDecimal("0.00")) • Inspecting private variables or methods • Rapid development • Embedded scripting
Interactive Command Line $ jython >>> print “Hello world!” Hello world! >>> Use CTRL+D to exit on UNIX Use CTRL+Z to exit on Windows
Language Overview • supports modules, classes and methods • dynamic typing (don't declare variable types) • familiar control structures (for, if, while ...) • uses # for comments • built-in collection types (lists, dictionaries) • indentation for code blocks { not braces } • no semicolons to indicate end of line; • omits “new” keyword (“o = Object()”)
Variable Assignment and Printing >>> s = 17 >>> print s 17 >>> s = “JavaOne” >>> print s JavaOne >>>
Creating a method >>> def add(a,b): ... return a + b ... >>> add(4,5) 9 >>>
Creating a class >>> class Calc: ... def add(self, a, b) ... return a + b ... >>> c = Calc() >>> c.add(4,5) 9 >>>
Lists Lists are like arrays and ArrayLists >>> l = [] >>> l.append(1) >>> l.append('string') >>> l.append(12.3) >>> print l [1, 'string', 12.3] >>> len(l) 3 >>> l[2] 12.3
Dictionaries Dictionaries are similar to HashMaps >>> dict = {} >>> dict['color'] = 'red' >>> dict[17] = 'seventeen' >>> dict {'color':'red', 17:'seventeen'} >>> dict['color'] 'red' >>>
Loops / Iterators >>> l = ['spam','bacon','eggs'] >>> for item in l: ... print item ... spam bacon eggs >>>
Using Java in Jython >>> from java.lang import * >>> System.getProperty(“user.home”) '/home/dcoleman' >>> from java.math import BigDecimal >>> b = BigDecimal(“17”) >>> b 17 >>>
Jython Modules • A module is a collection of jython code • May contain, code, methods, classes • Import modulesimport module from module import object • Run modules like a script • $ jython module.py
Inheriting from Java from javax.swing import * from java.awt import Color class GreenPanel(JPanel): • def __init__(self): • self.background = Color.green • def toString(self): • return "GreenPanel" if __name__ == "__main__": • f = Jframe("Green", size=(200,200)) • f.getContentPane().add(GreenPanel()) • f.show()
Database Access • Can use standard JDBC calls in Jython • There's a more “pythonic” DB API called zxJDBC, included with Jython 2.1 • Use whichever you're comfortable with, though zxJDBC is a little more compact
JDBC Example from java.lang import * from java.sql import * Class.forName("org.hsqldb.jdbcDriver") conn = DriverManager.getConnection( "jdbc:hsqldb:demo", "sa", "") stmt = conn.createStatement() rs = stmt.executeQuery("SELECT code, desc FROM states") while rs.next(): print rs.getString("code"),rs.getString("desc") rs.close() stmt.close() conn.close()
zxJDBC Example from com.ziclix.python.sql import zxJDBC from pprint import pprint conn = zxJDBC.connect("jdbc:hsqldb:demo", "sa", "", "org.hsqldb.jdbcDriver") cursor = conn.cursor() cursor.execute("SELECT code, desc FROM states") data = cursor.fetchall() cursor.close() conn.close() pprint(data)
A Jython EJB Client • Set up the classpath, jndi.properties like normal, then... >>> from javax.naming import * >>> c = InitialContext() >>> home = c.lookup("Demo") >>> demo = home.create() >>> demo.setFoo("Jython") >>> demo.getFoo() 'Jython' >>> demo.getDate() Tues Jun 10 11:45:17 PST 2003
PyServlet • Jython includes a servlet that executes *.py scripts • Similar to the way *.jsp files are executed • Just need to map the servlet in the web.xml file • Can provide “python.home” and “python.path” init-params to customize the Jython libs and configuration
<web-app> <servlet> <servlet-name>PyServlet</servlet-name> <servlet-class> org.python.util.PyServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>PyServlet</servlet-name> <url-pattern>*.py</url-pattern> </servlet-mapping> </web-app> Mapping PyServlet
Embedded Jython • Can execute Jython within a servlet or EJB container • Jython can load resource references, local EJB references, etc. like any other component • Can set up a client to interact with the Jython in the server, just like the normal interpreter • Probably need to customize the environment to make additional JARs visible to Jython
PyUnit • PyUnit is based on the JUnit Framework • Test are generally shorter with PyUnit • Ability to access private methods • Ant integration (using JUnit task)
PyUnit import unittest class DemoTestCase(unittest.TestCase): def testBar(self): self.assertEquals(5, len("hello")) if __name__ == '__main__': unittest.main()
Accessing non-public code Edit the Jython registry file The registry is a text file in the Jython installation directory # Setting this to false will allow Jython to provide access to # non-public fields, methods, and constructors of Java objects. python.security.respectJavaAccessibility = false
Compiling Jython to Java • allows Jython code to run in Java • jythonc is the compiler .py > .java > .class • jython.jar must be in the classpath • special @sig comment to declare the method's signature in Java
Jython Standard Libraries • Jython includes a rich set of built-in libraries • You can run most Python code except where - modules implemented in C - modules that target a particular platform - modules where JVM lacks functionality
Code Completion Jython Console with Code Completion http://don.freeshell.org/jython
Links... • This presentation is available from http://www.chariotsolutions.com/presentations.html • Jython www.jython.org • Python www.python.org • Jython Console http://don.freeshell.org/jython • Jython Essentials by Samuele Pedroni & Noel Rappin http://www.oreilly.com/catalog/jythoness/ • JEdit http://www.jedit.com • Eclipse Python Integration http://www.python.org/cgi-bin/moinmoin/EclipsePythonIntegration