using jython to speed development

Post on 03-Jan-2016

60 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

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. - PowerPoint PPT Presentation

TRANSCRIPT

| JavaOne 2003 | BOF-1069

Using Jython to Speed Development

Don Coleman, Aaron Mulder, Tom PurcellChariot Solutions

| JavaOne 2003 | BOF-10691

Goal

Use Jython to make software development easier.

| JavaOne 2003 | BOF-10691

Who are we?

• We are J2EE Architects

• We write commercial Java software

• We use Jython as a tool for developing and testing Java software

| JavaOne 2003 | BOF-10691

Presentation Agenda

• About Jython─ Language Overview─ Using the Interactive Interpreter

• Server Side Jython─ Accessing Databases─ Accessing EJBs─ PyServlet─ Embedded Jython

• Advanced Jython

| JavaOne 2003 | BOF-1069

About Jython

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-10691

Sample Code

class Greeter: def sayHello(self, name = None): if name == None: print "Hello" else: print "Hello, %s" % name

def sayGoodbye(self): print "Goodbye"

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-10691

Interactive Command Line

$ jython

>>> print “Hello world!”

Hello world!

>>>

Use CTRL+D to exit on UNIX

Use CTRL+Z to exit on Windows

| JavaOne 2003 | BOF-1069

Language Overview

| JavaOne 2003 | BOF-10691

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()”)

| JavaOne 2003 | BOF-10691

Variable Assignment and Printing

>>> s = 17

>>> print s

17

>>> s = “JavaOne”

>>> print s

JavaOne

>>>

| JavaOne 2003 | BOF-10691

Creating a method

>>> def add(a,b):

... return a + b

...

>>> add(4,5)

9

>>>

| JavaOne 2003 | BOF-10691

Creating a class

>>> class Calc:

... def add(self, a, b)

... return a + b

...

>>> c = Calc()

>>> c.add(4,5)

9

>>>

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-10691

Dictionaries

Dictionaries are similar to HashMaps>>> dict = {}

>>> dict['color'] = 'red'

>>> dict[17] = 'seventeen'

>>> dict

{'color':'red', 17:'seventeen'}

>>> dict['color']

'red'

>>>

| JavaOne 2003 | BOF-10691

Loops / Iterators

>>> l = ['spam','bacon','eggs']

>>> for item in l:

... print item

...

spam

bacon

eggs

>>>

| JavaOne 2003 | BOF-10691

Using Java in Jython

>>> from java.lang import *

>>> System.getProperty(“user.home”)

'/home/dcoleman'

>>> from java.math import BigDecimal

>>> b = BigDecimal(“17”)

>>> b

17

>>>

| JavaOne 2003 | BOF-10691

Jython Modules

• A module is a collection of jython code

• May contain, code, methods, classes

• Import modulesimport modulefrom module import object

• Run modules like a script─ $ jython module.py

| JavaOne 2003 | BOF-10691

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()

| JavaOne 2003 | BOF-1069

Server-Side Jython

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-10691

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()

| JavaOne 2003 | BOF-10691

zxJDBC Example

from com.ziclix.python.sql import zxJDBCfrom 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)

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-10691

Mapping PyServlet

<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>

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-1069

Demo

| JavaOne 2003 | BOF-1069

Advanced Jython

| JavaOne 2003 | BOF-10691

PyUnit

• PyUnit is based on the JUnit Framework

• Test are generally shorter with PyUnit

• Ability to access private methods

• Ant integration (using JUnit task)

| JavaOne 2003 | BOF-10691

PyUnit

import unittest

class DemoTestCase(unittest.TestCase):

def testBar(self): self.assertEquals(5, len("hello"))

if __name__ == '__main__': unittest.main()

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-10691

Code Completion

Jython Console with Code Completion

http://don.freeshell.org/jython

| JavaOne 2003 | BOF-1069

Conclusion

| JavaOne 2003 | BOF-1069

Q&A

| JavaOne 2003 | BOF-10691

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

| JavaOne 2003 | BOF-1069

top related