What is Jython? - Chariot Solutions

Download Report

Transcript What is Jython? - Chariot Solutions

Using Jython to
Speed Development
Don Coleman, Aaron Mulder, Tom
Purcell
Chariot Solutions
| JavaOne 2003 | BOF-1069
Goal
Use Jython to make software
development easier.
1
| JavaOne 2003 | BOF-1069
Who are we?
• We are J2EE Architects
• We write commercial Java software
• We use Jython as a tool for developing and
testing Java software
1
| JavaOne 2003 | BOF-1069
Presentation Agenda
• About Jython
─ Language Overview
─ Using the Interactive Interpreter
• Server Side Jython
─ Accessing Databases
─ Accessing EJBs
─ PyServlet
─ Embedded Jython
• Advanced Jython
1
| JavaOne 2003 | BOF-1069
About Jython
| JavaOne 2003 | BOF-1069
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
1
| JavaOne 2003 | BOF-1069
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
1
| JavaOne 2003 | BOF-1069
Installing Jython
•
•
•
•
1
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-1069
Sample Code
class Greeter:
def sayHello(self, name = None):
if name == None:
print "Hello"
else:
print "Hello, %s" % name
def sayGoodbye(self):
print "Goodbye"
1
| JavaOne 2003 | BOF-1069
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
1
| JavaOne 2003 | BOF-1069
Interactive Command Line
$ jython
>>> print “Hello world!”
Hello world!
>>>
Use CTRL+D to exit on UNIX
Use CTRL+Z to exit on Windows
1
| JavaOne 2003 | BOF-1069
Language Overview
| JavaOne 2003 | BOF-1069
Language Overview
•
•
•
•
•
•
•
•
1
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-1069
Variable Assignment and Printing
>>> s = 17
>>> print s
17
>>> s = “JavaOne”
>>> print s
JavaOne
>>>
1
| JavaOne 2003 | BOF-1069
Creating a method
>>> def add(a,b):
...
return a + b
...
>>> add(4,5)
9
>>>
1
| JavaOne 2003 | BOF-1069
Creating a class
>>> class Calc:
...
def add(self, a, b)
...
return a + b
...
>>> c = Calc()
>>> c.add(4,5)
9
>>>
1
| JavaOne 2003 | BOF-1069
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
1
| JavaOne 2003 | BOF-1069
Dictionaries
Dictionaries are similar to HashMaps
>>> dict = {}
>>> dict['color'] = 'red'
>>> dict[17] = 'seventeen'
>>> dict
{'color':'red', 17:'seventeen'}
>>> dict['color']
'red'
>>>
1
| JavaOne 2003 | BOF-1069
Loops / Iterators
>>> l = ['spam','bacon','eggs']
>>> for item in l:
...
print item
...
spam
bacon
eggs
>>>
1
| JavaOne 2003 | BOF-1069
Using Java in Jython
>>> from java.lang import *
>>> System.getProperty(“user.home”)
'/home/dcoleman'
>>> from java.math import BigDecimal
>>> b = BigDecimal(“17”)
>>> b
17
>>>
1
| JavaOne 2003 | BOF-1069
Jython Modules
• A module is a collection of jython code
• May contain, code, methods, classes
• Import modules
import module
from module import object
• Run modules like a script
─ $ jython module.py
1
| JavaOne 2003 | BOF-1069
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()
1
| JavaOne 2003 | BOF-1069
Server-Side Jython
| JavaOne 2003 | BOF-1069
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
1
| JavaOne 2003 | BOF-1069
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()
1
| JavaOne 2003 | BOF-1069
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)
1
| JavaOne 2003 | BOF-1069
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
1
| JavaOne 2003 | BOF-1069
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
1
| JavaOne 2003 | BOF-1069
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>
1
| JavaOne 2003 | BOF-1069
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
1
| JavaOne 2003 | BOF-1069
Demo
| JavaOne 2003 | BOF-1069
Advanced Jython
| JavaOne 2003 | BOF-1069
PyUnit
•
•
•
•
1
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-1069
PyUnit
import unittest
class DemoTestCase(unittest.TestCase):
def testBar(self):
self.assertEquals(5, len("hello"))
if __name__ == '__main__':
unittest.main()
1
| JavaOne 2003 | BOF-1069
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
1
| JavaOne 2003 | BOF-1069
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
1
| JavaOne 2003 | BOF-1069
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
1
| JavaOne 2003 | BOF-1069
Code Completion
Jython Console with Code Completion
http://don.freeshell.org/jython
1
| JavaOne 2003 | BOF-1069
Conclusion
| JavaOne 2003 | BOF-1069
Q&A
| JavaOne 2003 | BOF-1069
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/cgibin/moinmoin/EclipsePythonIntegration
1
| JavaOne 2003 | BOF-1069
| JavaOne 2003 | BOF-1069