Download Lecture notes 7

Document related concepts
no text concepts found
Transcript
CE203 - Application Programming
Part 5
Autumn 2016
CE203 Part 6
1
Reminder
• Assignment 2 is due 12th December at 11:59:59
– Demos in your regular lab slot next week!
– (more details soon)
Autumn 2016
CE203 Part 6
2
Learning objectives
•
•
•
•
•
•
JDBC refresh
Inner classes
Anonymous inner classes
Java security manager
Graphics methods
Using Frames (more details)
Autumn 2016
CE203 Part 6
3
Using JDBC
JDBC (Java Database Connectivity) allows Java to access
and manipulate relational SQL databases.
Communication to databases: by Strings containing SQL.
Communication from databases: in rows of a ResultSet.
String
e.g.
“SELECT …”
Database
ResultSet
Result table.
Autumn 2016
CE203 Part 6
4
JDBC – General Idea
http://ramj2ee.blogspot.co.uk/2014/07/jdbc-architecture.html#.VjJE425kpoy
Autumn 2016
CE203 Part 6
5
Connect
• Assuming the JDBC driver is setup steps to connect ...
1)
Load driver
Class.forName( "com.mysql.jdbc.Driver“ );
2)
Get connection
connection = DriverManager.getConnection(
"jdbc:mysql://localhost/mydb");
3)
Create statement object
statement = connection.createStatement();
Autumn 2016
CE203 Part 6
6
Executing Queries 1
Statement can be used as many times as required to perform
SQL queries and updates.
Queries performed using executeQuery()
ResultSet res = statement.executeQuery(
"SELECT name FROM employees");
res.next()
res
Autumn 2016
CE203 Part 6
Name
Salary
James
35k
Tom
23k
7
Using Metadata 1
getMetaData() obtains information about resultSet,
e.g. number of columns, names and types of objects.
The method returns an object of type ResultSetMetaData to
which we can apply methods
e.g. getColumnCount() and getColumnName().
Autumn 2016
CE203 Part 6
8
Executing Updates
To update a table use INSERT, UPDATE or DELETE
statements…
…apply executeUpdate() to a Statement object.
This method returns an int, indicating number of rows in the
table after update:
int i = statement.executeUpdate(
"DELETE FROM employees WHERE salary<1000");
System.out.println(
"Employees table now has " + i + " rows");
Autumn 2016
CE203 Part 6
Name
Name
Bob
Bob
John
Tim
Tim
Salary
Salary
1400
1400
950
2000
2000
Age
Age
23
23
21
34
34
9
Closing Connections
close() = close connections and release resources
Should be applied to any Statement objects created and then to
the Connection object (unless you use try-with-resources):
try
{
statement.close();
connection.close();
}
catch (SQLException e)
{
System.out.println(
"problems closing database");
}
Autumn 2016
CE203 Part 6
10
Prepared Statements 1
Parameterised Statements (or Stored Procedures).
Allow you to write a SQL statement with question marks
as placeholders. e.g.:
String updateString = "update COFFEES " +
"set SALES = ? "
"where COF_NAME like ?";
has two placeholders.
Autumn 2016
CE203 Part 6
11
Transactions 1
Allow batch processing of statements.
CAP = Consistent, Available, Partition Tolerant
A group of statements = a transaction.
auto-commit mode: an individual statement is treated as a
transaction (normal operation).
To disable auto-commit mode for a Connection con, write:
con.autoCommit(false);
Autumn 2016
CE203 Part 6
12
Questions?
Autumn 2016
CE203 Part 6
13
Learning objectives
•
•
•
•
•
•
JDBC refresh
Inner classes
Anonymous inner classes
Java security manager
Graphics methods
Using Frames (more details)
Autumn 2016
CE203 Part 6
14
Inner Classes 1
In Java a class may be declared within another class; such a
class is called an inner class.
Methods of inner class may access private instance variables
and methods of enclosing class.
Inner class
Conventional
arrangement
Frame
Frame
Autumn 2016
handleButton
handleButton
CE203 Part 6
15
Inner Classes 2
Inner classes frequently used for the event-handlers in GUI
programs.
On the following slides we write a square-calculating
application using this approach.
Since the inner class may access the members of the
FilledFrame class it is no longer necessary to store a
reference to the frame in the TextHandler object; hence no
constructor is needed.
Autumn 2016
CE203 Part 6
16
Inner Classes 3
// usual imports needed
public class FilledFrame extends JFrame
{
private JTextField input, result;
public FilledFrame()
{
JLabel prompt = new JLabel(
"Type a number and press return");
input = new JTextField(5);
result = new JTextField(25);
result.setEditable(false);
}
Autumn 2016
setLayout(new FlowLayout());
add(prompt); add(input);
add(result);
input.addActionListener(new TextHandler());
CE203 Part 6
17
Inner Classes 4
// class Arith2 continued
private class TextHandler implements ActionListener
{
}
public void actionPerformed(ActionEvent e)
{
String txt = e.getActionCommand();
input.setText("");
String answer = null;
try
{
int n = Integer.parseInt(txt.trim());
answer = "The square is " + n*n;
}
catch(Exception ex)
{
answer = "Invalid input“;
}
result.setText(answer);
}
} // end of inner class
// end of Arith class
Autumn 2016
CE203 Part 6
18
Inner Classes 5
Autumn 2016
CE203 Part 6
19
Inner Classes 6
Note, although the inner class was declared as private, its
actionPerformed method had to be public.
The class must correctly implement the ActionListener
interface;
this interface requires the actionPerformed method to
be public.
Unless an inner class is declared as static, objects of the class
must belong to objects of an outer class.
Therefore, an inner class object can be created only in the
non-static methods of the enclosing class.
Autumn 2016
CE203 Part 6
20
Inner Classes 7
If an inner class is public we can refer to objects of that class outside the
enclosing class.
The following slides present a student class, which contains a public inner class
to hold details of all of the student’s examination marks.
(The bodies for some of the inner class methods are omitted.)
Methods of enclosing class can
refer to objects of inner class.
Enclosing class
int method_1(){ …}
Public Inner class
Public inner class
Integer varA;
To refer to inner class (Marks) outside the Student class we use:
Student.Marks.
(We have already encountered this notation – Entry is an inner interface of Map.)
Autumn 2016
CE203 Part 6
21
Inner Classes 8
public class Student extends Person
{
private int regno;
private Marks marks;
public Student(String name, Date dob,
int regnum)
{
super(name, dob);
regno = regnum;
marks = new Marks();
}
public int regNumber()
{
return regNo;
}
// will inherit methods to get name and dob
Autumn 2016
CE203 Part 6
22
Inner Classes 9
// class Student continued
public void addMark(String module,
float mark)
{
marks.add(module, mark);
}
public Marks getMarks()
{
return marks;
}
public String toString()
{
// body omitted
}
Autumn 2016
CE203 Part 6
23
Inner Classes 10
// class Student continued
public class Marks {
private HashMap<String, Float> map;
public Marks() {
map = new HashMap<String, Float>();
}
public void add(String module, float mark) {
map.add(module, mark);
}
public float get(String module) {
return map.get(module).floatValue();
}
public float getAverage() { …… }
public String toString() { …… }
}
}
Autumn 2016
CE203 Part 6
24
Inner Classes 11
Assuming that variable lisa refers to a Student object
holding details about a student called Lisa, we retrieve and
print her marks for CE203 and CE204 using...
Student.Marks m = lisa.getMarks();
System.out.println("CE203: " +
m.get("CE203") +
"CE204: " +
m.get(CE204"));
Autumn 2016
CE203 Part 6
25
Take away message
• Inner classes provide a method for nesting classes within
one another.
• Members of the inner class are accessible to the enclosing
class
• Inner class object cannot be instantiated in static methods
of the enclosing class.
Autumn 2016
CE203 Part 6
26
Anonymous Inner Classes 1
When writing GUIs, an inner class that implements the ActionListener
interface often has just a single object, created and passed as an argument to
addActionListener().
class eventHandler implements ActionListener{…}
Button.addActionListener(new eventHandler() );
The object is effectively anonymous – no variable refers to it.
We can take this one step further by using an anonymous inner class.
Button.addActionListener(new actionListener(){…} );
An anonymous inner class must either implement an interface or extend an
existing class.
Autumn 2016
CE203 Part 6
27
Anonymous Inner Classes 2
Following slides demo how to use an anonymous inner class.
We replace
TextHandler constructor call
With
new ActionListener(){……}
(with the body of the text-handling class in the braces)
This call is an argument to a method
Therefore, don’t forget to place a closing parenthesis and
semicolon after the brace.
Note, despite the syntax, this code does not make a call to an
ActionListener constructor (an interface does not have a
constructor);
Instead the default constructor of the anonymous class is called.
Autumn 2016
CE203 Part 6
28
Anonymous Inner Classes 3
// usual imports needed
public class FilledFrame extends JFrame
{
private JTextField input, result;
public void FilledFrame()
{
JLabel prompt = new JLabel(
"Type a number and press return");
input = new JTextField(5);
result = new JTextField(25);
result.setEditable(false);
setLayout(new FlowLayout());
add(prompt);
add(input);
add(result);
Autumn 2016
CE203 Part 6
29
Anonymous Inner Classes 4
// FilledFrame constructor continued
input.addActionListener(
new ActionListener()
{
public void actionPerformed(
ActionEvent e)
{
// method body
}
}
);
}
}
Autumn 2016
CE203 Part 6
30
Anonymous Inner Classes 5
Anonymous inner classes can’t have constructors
-a constructor must have the same name as the class and an
anonymous inner class has no name.
Compiler generates a default constructor, which will call the noargument constructors for any object instance variables.
-if an anonymous class has object instance variables they
must be of classes that have no-argument constructors.
Additionally, if the anonymous class extends another class…
-constructor will call the no-argument constructor for
the superclass
-cannot use anonymous inner classes to extend classes that
have no such constructor.
Autumn 2016
CE203 Part 6
31
Anonymous Inner Classes 6
Uses of anonymous inner classes:
-extend an existing class
-replace inherited default methods.
On the following slides we write a program, Greeting, using
an anonymous inner class that extends an existing class.
Autumn 2016
CE203 Part 6
32
Anonymous Inner Classes 7
import javax.swing.*;
import java.awt.*;
public class Greeting
{
public static void main( String[] args )
{
Jframe frame = new Jframe();
frame.setSize( 500, 500 );
frame.setVisible( true );
add(new JLabel("Hello"), BorderLayout.NORTH);
frame.add( new Jlabel( “Hello”), BorderLayout.NORTH );
// main method continued on next slide
// previous version had
//
add(new GreetingPanel(),
//
BorderLayout.CENTER);
Autumn 2016
CE203 Part 6
33
Anonymous Inner Classes 8
// Greeting4 main method continued
frame.add(new JPanel()
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.blue);
g.drawRect(50, 100, 40, 30);
g.fillRect(120, 100, 30, 40);
}
},
BorderLayout.CENTER);
}
}
Autumn 2016
CE203 Part 6
34
Anonymous Inner Classes 9
Autumn 2016
CE203 Part 6
35
Take away messages
• Anonymous inner classes are created without an
associated name.
• Anonymous inner classes must either implement an
interface or extend an existing class.
• Anonymous inner classes don’t have constructors
– Instead an anonymous constructor is created that calls
no-argument constructors for all object instance
variables.
Autumn 2016
CE203 Part 6
36
Quiz and Break
• Quiz
kahoot.it
• Followed by: Break
5 minutes
Autumn 2016
CE203 Part 6
37
Learning objectives
•
•
•
•
•
•
JDBC refresh
Inner classes
Anonymous inner classes
Java security manager
Graphics methods
Using Frames (more details)
Autumn 2016
CE203 Part 6
38
Java Security Manager 1
• Java designed to work in a distributed
environment
• Code can be downloaded dynamically from a
variety of (un-trusted) sources
• Running such code alongside applications that
contain confidential information poses a risk.
• Security built into Java via access control
Autumn 2016
CE203 Part 6
39
Java Security Manager 2
• All access control decisions are done by a security
manager: java.lang.SecurityManager.
• A security manager must be installed into the Java runtime
to activate the access control checks.
• Applets are run with a security manager by default.
• Applications have no security manager by default.
Autumn 2016
CE203 Part 6
40
Java Security Manager 3
Two options to use a security manager:
• Set one via the setSecurityManager method in the
java.lang.System class, i.e..:
System.setSecurityManager(new SecurityManager());
• Call Java using appropriate command line arguments, e.g.:
javac -Djava.security.manager ...
Autumn 2016
CE203 Part 6
41
Java Security Manager 4
• A small set of default permissions are granted to code by class
loaders.
• Administrators can then flexibly manage additional code
permissions via a security policy.
• This is done via the java.security.Policy class. There is
only one Policy object installed into the Java runtime at any
given time.
• Policy files tell the security manager what is allowed by whom
(and what is not).
• Policies are defined declaratively in text files (usually created
via a policy tool utility)
Autumn 2016
CE203 Part 6
42
Java Security Manager 5
In Java 1.1 code was either…
Remote code
trusted
Local code
or
trusted
untrusted.
Untrusted code was run in a
“sandbox” and given only limited
access to vital resources e.g.
files.
JVM
Sandbox
Valuable resources (files etc.)
JDK 1.1 Security model
Local code was considered “safe”
remote code (e.g. applets) was
considered “unsafe”.
Autumn 2016
CE203 Part 6
43
Java Security Manager 6
In Java 2 onwards…
No built in concept that local code is
“trusted” and remote code
“untrusted”.
All code is checked against a
security policy when loaded.
Depending on policy the code is
then either allowed access to
resources or run in a sandbox.
Autumn 2016
CE203 Part 6
Local or Remote code
Security policy
Class loader
JVM
Sandbox
Valuable resources (files etc.)
JDK 2 Platform Security model
Code runs with different
permissions according to
security policy. Not built-in notion
of “trusted” code.
44
Java Security Manager 7
• System security is ensured by the use of protection domains.
• Domain: a set of objects that are directly accessible by the principle
• Principle: the entity in the system to which permissions are granted
(or denied).
• For example, a principle may be a class (or set of classes).
Domain
Files
Memory
Sockets
Autumn 2016
Keyboard
Suspicious looking
class
deleteFiles();
accessBankAccount();
stealMoney();
CE203 Part 6
Principle
45
Java Security Manager 8
• Domain categories
– System domain (access to files, sockets etc.)
– Application domain (access to memory, CPU etc.)
– etc.
• Domain:
– Encompasses set of classes with the same permissions.
– Determined by policy
• Java application environment manages mapping from code (classes and instances)
to protection domains and associated permissions
classA
classB
classC
Domain A
->
Permissions
Domain B
->
Permissions
Security policy
Classes in Java runtime
Autumn 2016
CE203 Part 6
46
Java Security Manager 9
• Example…
• Applets are not allowed to exit the virtual machine.
• Therefore, the exit() method of the RunTime class calls the checkExit() function in
the security manager.
• Security manager checks origin of exit request and throws exception if its invalid.
Public void exit( int status ) {
SecurityManager sm = System.getSecurityManager();
if (sm != null)
sm.checkExit( status );
exitInternal(status);
}
Autumn 2016
CE203 Part 6
47
Java Security Manager 10
Sample code snippet:
…
Permission perm = new
java.io.FilePermission("/tmp/abc", "read");
SecurityManager sm = System.getSecurityManager();
if (sm != null)
{
sm.checkPermission(perm);
}
...
Autumn 2016
CE203 Part 6
48
Java Security Manager 10
http://docs.oracle.com/javase/8/docs/technotes/guides/security/overview/jsoverview.html
Autumn 2016
CE203 Part 6
49
Java Security Manager (Example)
//file: EvilEmpire.java
import java.net.*;
public class EvilEmpire
{
public static void main(String[] args) throws Exception
{
try
{
Socket s = new Socket("www.essex.ac.uk", 80);
System.out.println("Connected!");
}
catch (SecurityException e)
{
System.out.println("SecurityException:
could not connect.");
}
}
}
(see Niemeyer and Knudsen, 2005)
Autumn 2016
CE203 Part 6
50
Java Security Manager (Example) 2
Run this code without any parameters:
C:\> java EvilEmpire
Connected!
… and with security manager:
C:\> java –Djava.security.manager EvilEmpire
SecurityException: could not connect.
… and perhaps use your own policy file:
C:\> java –Djava.security.manager
-Djava.security.policy=EvilEmpire.policy
EvilEmpire
(you can of course also use IntelliJ to do this)
Autumn 2016
CE203 Part 6
51
Take away messages
• The security manager allows you to control which parts of
your code can access which resources.
• This allows you control access to sensitive resources.
• By default a security manager is loaded with applets but
not with desktop applications.
Autumn 2016
CE203 Part 6
52
Java Security Manager
• This has just been a quick overview.
• Check the Java homepage for more details, e.g.
http://docs.oracle.com/javase/8/docs/technotes/guides/
security/overview/jsoverview.html
Autumn 2016
CE203 Part 6
53
Learning objectives
•
•
•
•
•
•
JDBC refresh
Inner classes
Anonymous inner classes
Java security manager
Graphics methods
Using Frames (more details)
Autumn 2016
CE203 Part 6
54
Graphics Methods 1
We already encountered the drawString, setColor,
drawRect and fillRect methods from the Graphics
class;
these are normally used in paint and
paintComponent methods, which take an argument
of type Graphics.
drawLine() can be used to draw a line;
this method has four arguments, the x and y
coordinates of each end of the line, so, for example,
g.drawLine(0,10,30,40);
(0,10)
(30,40)
will draw a line from (0,10) to (30,40).
Autumn 2016
CE203 Part 6
55
Graphics Methods 2
clearRect(): similar to fillRect but draws the rectangle
in the background colour (effectively erasing anything that
was displayed in the area specified by the arguments).
drawOval() and fillOval() produce an oval instead of a
rectangle.
These methods take the same four arguments as drawRect()
x- and y-coordinates of the top-left corner
width and height
They draw an oval enclosed by the rectangle specified by the
arguments, touching the rectangle at the centre of each side.
If the rectangle is a square, the oval will of course be a circle.
Autumn 2016
CE203 Part 6
56
Graphics Methods 3
To draw a circle with centre coordinates (x,y) and radius r…
-top left-hand corner of the enclosing rectangle will be
(x-r,y-r)
-width and height of the rectangle will be the
diameter of the circle (i.e. twice the radius).
x-r,y-r
Hence we would use
r
g.drawOval(x-r,y-r,2*r,2*r);
Autumn 2016
CE203 Part 6
x,y
57
Graphics Methods 4
drawRoundRect()
and
fillRoundRect()
produce
rectangles with rounded corners;
they have six arguments:
-the first four are the same as the arguments of
drawRect(),
-the last two indicate the width and height of the
imaginary oval produced by combining the four arcs at
the corners.
Autumn 2016
CE203 Part 6
58
Graphics Methods 5
drawArc() and fillArc() produce a portion of an oval (an
outline or a segment);
they also have six arguments:
the first four are the same as drawOval(),
the fifth indicates the starting position of the arc by
specifying the angle in degrees (see the diagram on the next
slide),
the sixth indicates the number of degrees through
which the arc extends (positive numbers indicating
anticlockwise and negative numbers indicating clockwise).
Autumn 2016
CE203 Part 6
59
Graphics Methods 6
The segment shown below would be produced by
g.fillArc(10,10,300,200,10,40);
->
(10,10)
40⁰
<-
200
10⁰
<Autumn 2016
300
->
CE203 Part 6
60
Graphics Methods 7
drawPolygon() and fillPolygon() can produce polygons:
each takes three arguments:
two int arrays containing the x- and y-coordinates
respectively of the corners
an int indicating the number of corners.
For example we could use the following program fragment to
draw a solid triangle with corners at (10,10), (90,70) and (30,110).
(10,10)
int[] xCoords = { 10, 90, 30 };
int[] yCoords = { 10, 70, 110 };
g.fillPolygon(xCoords, yCoords, 3);
(90,70)
(30,110)
Autumn 2016
CE203 Part 6
61
Graphics Methods 8
If the third argument to drawPolygon() or fillPolygon()
is smaller than the size of the arrays only part of each array
will be used.
Thus, the same arrays can be reused to draw polygons with
different numbers of sides.
If the size of either of the arrays is smaller than the third
argument an exception will be thrown.
See also, drawPolyline() which does not connect the last
co-ordinate pair from the arrays with the first pair (i.e. it
draws an incomplete polygon).
Autumn 2016
CE203 Part 6
62
Graphics Methods 9
drawPolygon() and fillPolygon() can also be used with an
argument of type Polygon;
useful if we wish to store information about polygons
before they are drawn.
The Polygon class has a constructor that takes three arguments
similar to those of drawPolygon.
There is also a no-argument constructor that allows us to add
coordinates to a polygon one at a time using the addPoint
method:
Polygon p = new Polygon();
p.addPoint(10, 10);
p.addPoint(90, 70);
p.addPoint(30, 110);
g.drawPolygon(p);
Autumn 2016
CE203 Part 6
63
Learning objectives
•
•
•
•
•
•
JDBC refresh
Inner classes
Anonymous inner classes
Java security manager
Graphics methods
Using Frames (more details)
Autumn 2016
CE203 Part 6
64
Using Frames 1
We have seen GUI examples that extend the
JFrame class. We shall now explore the JFrame
class in more detail.
We start with a simple frame-based application…
Autumn 2016
CE203 Part 6
65
Using Frames 2
public class Greeting extends JFrame
{
public Greeting()
{
super("Greeting example");
setSize(300, 200);
setVisible(true);
}
}
Autumn 2016
public void paint(Graphics g)
{
super.paint(g);
g.drawString("Hello!", 20, 20);
g.setColor(Color.blue);
g.drawRect(50, 100, 40, 30);
g.fillRect(120, 100, 30, 40);
}
CE203 Part 6
66
Using Frames 3
The JFrame class has a constructor that takes a string
argument to specify the contents of the title bar of the
window.
We invoked this in our constructor using super.
We also used the constructor to specify the size of the
frame.
A frame is not displayed until it is explicitly made visible
so we need to make a call to the setVisible method; this
could be done elsewhere (e.g. in a main method that
creates a frame object) if we did not write a constructor.
Autumn 2016
CE203 Part 6
67
Using Frames 4
Reminder: we need a main method to create a Greeting object; this
could be placed in a separate class in a separate file, e.g.
public class Greet
{
public static void main(String args[])
{
JFrame myFrame = new Greeting();
myFrame.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
}
}
Autumn 2016
CE203 Part 6
68
Using Frames 5
specifies what should
happen when the user clicks the close-box of the
window containing the frame.
This will usually be the termination of the program,
as in this example.
Other options include…
DISPOSE_ON_CLOSE, which causes the window to
be closed whilst leaving the program running (e.g.
skype)
DO_NOTHING_ON_CLOSE, which indicates that the
click should be ignored.
setDefaultCloseOperation()
Autumn 2016
CE203 Part 6
69
Using Frames 6
What if we want to do something specific when
the window is closed?
e.g. if the program has created several
frames we may wish to decrement the frame
count and terminate if it reaches zero.
In such circumstances it is necessary to add a
window listener (similar to an action listener) to
the frame.
Autumn 2016
CE203 Part 6
70
Summary
• Today we covered…
– Inner classes
– Anonymous inner classes
– Java security manager
– Graphics methods
– Frames
Autumn 2016
CE203 Part 6
71
Next week
• Threads
• More on the Java swing library
Autumn 2016
CE203 Part 6
72