1.3. Mire jó a Java technológia?

A java korábbi időszakában a legtöbb Java platformra készült program asztali alkalmazás vagy applet volt. Ha a weben szörfözünk, találkozhatunk appletekkel. Az applet olyan program, amely bizonyos megszorításokkal futtatható Javát ismerő böngészőben. Kezdetben ezt látványos grafikai effektusok készítésére használták. Mára ez a felhasználás visszaszorult, és viszonylag ritkán találkozhatunk appletekkel.

Az eredeti célja szerint a Java magas szintű programozási nyelv és erős szoftverplatform kíván lenni. A gazdag osztálykönyvtár segítségével nagyon sokféle programot készíthetünk.

Az asztali alkalmazás olyan program, amely közvetlenül a Java platformon (pl. nem böngészőben) futtatható. Az alkalmazások speciális fajtája szerverként fut, hálózati klienseket kiszolgálva. Például lehet webszerver, proxy-szerver, levelező szerver vagy nyomtató szerver.

Szintén speciális program a szervlet (servlet). Szerver oldalon fut, de nem önállóan, hanem egy szerver-futtatókörnyezet részeként. Pl. egy portált ki lehet szolgálni néhány szervlet együttesével, vagy akár egyetlen szervlettel. Ebben az esetben a szervlet a webszerver részeként fut. A szervletek hasonlóak az appletekhez, mivel futásidejű kiterjesztései a (szerver) alkalmazásoknak.

A mobil telefonon, kézi számítógépen futó alkalmazást midletnek hívjuk.

(Bár nem az Oracle fejleszti, az Android platformra is döntően Java nyelven készítik az alkalmazásokat.)

Hogyan nyújtja az API ezt a sokféle támogatást? Szoftverkomponensek csomagjaiként, amelyek sokféle feladatot ellátnak. A Java platform minden teljes implementációja (például a midlet futtatókörnyezet nem teljes) rendelkezik a következő tulajdonságokkal:

  • Alap összetevők: objektumok, sztringek, szálak, számok, I/O, adatstruktúrák, dátum és időkezelés, stb.
  • Appletek: a szokásos felhasználások
  • Hálózatok: URL, TCP, UDP, socket-ek, IP címzés
  • Nemzetközi programozás: Segítség az egész világon használható alkalmazások írásához. A programok könnyedén tudnak alkalmazkodni a helyi sajátosságokhoz, és többféle nyelven kommunikálni a felhasználókkal
  • Biztonság: alacsony és magas szintű védelem, beleértve az elektronikus aláírást, titkos-, és nyilvános kulcsú titkosítást, hozzáférés-szabályozást és azonosítást
  • Szoftver komponensek: a JavaBeans használatával könnyen összeilleszthető komponenseket fejleszthetünk
  • Objektum szerializáció: lehetővé teszi a könnyűsúlyú perzisztenciát és az RMI‑t
  • JDBC: relációs adatbázis-kezelők széles köréhez nyújt egységes elérési felületet

A Java platform ezen felül tartalmaz API-t a 2D és 3D grafikához, szerverekhez, telefóniához, beszédfeldolgozáshoz, animációhoz stb.

1.3.1. Applet példa

import java.applet.*;
import java.awt.*;

public class DrawingLines extends Applet {

   int width, height;

   public void init() {
      width = getSize().width;
      height = getSize().height;
      setBackground( Color.black );
   }

   public void paint( Graphics g ) {
      g.setColor( Color.green );
      for ( int i = 0; i < 10; ++i ) {
         g.drawLine( width, height, i * width / 10, 0 );
      }
   }
}

1.3.2. Midlet példa

/*
* Copyright © 2013 Nokia Corporation. All rights reserved. Nokia and Nokia
* Connecting People are registered trademarks of Nokia Corporation. Oracle and
* Java are trademarks or registered trademarks of Oracle and/or its affiliates.
* Other product and company names mentioned herein may be trademarks or trade
* names of their respective owners. See LICENSE.TXT for license information.
*/
package com.nokia.example;

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.midlet.MIDlet;

public class HelloWorldMIDlet extends MIDlet {

    public HelloWorldMIDlet() {
    }

    // Sets the MIDlet's current Display to a HelloScreen object.
    public void startApp() {
        Displayable current = Display.getDisplay(this).getCurrent();
        if (current == null) {
            HelloScreen helloScreen = new HelloScreen(this, "Hello, world!");
            Display.getDisplay(this).setCurrent(helloScreen);
        }
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}

1.3.3. Servlet példa

package org.ow2.frascati.examples.helloworld.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.osoa.sca.annotations.Property;

public class HelloWorldHttpServlet
     extends HttpServlet
{
private static final long serialVersionUID = 1L;

/**
* A configurable property 'name'.
*/
@Property(name = "name")
private String name;

/**
* @see HttpServlet#doGet(HttpServletRequest, HttpServletResponse)
*/
@Override
public final void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      String query = request.getQueryString();
      out.println("<html><body>Hello " + (query==null?"World":query) + " I'm " + name + "</body></html>");
      out.close();
    }

}

1.3.4. Activity példa

/*
* Copyright 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.example.android.basicnetworking;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;

import com.example.android.common.logger.Log;
import com.example.android.common.logger.LogFragment;
import com.example.android.common.logger.LogWrapper;
import com.example.android.common.logger.MessageOnlyLogFilter;

/**
* Sample application demonstrating how to test whether a device is connected,
* and if so, whether the connection happens to be wifi or mobile (it could be
* something else).
*
* This sample uses the logging framework to display log output in the log
* fragment (LogFragment).
*/
public class MainActivity extends FragmentActivity {

    public static final String TAG = "Basic Network Demo";
    // Whether there is a Wi-Fi connection.
    private static boolean wifiConnected = false;
    // Whether there is a mobile connection.
    private static boolean mobileConnected = false;

    // Reference to the fragment showing events, so we can clear it with a button
    // as necessary.
    private LogFragment mLogFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_main);

        // Initialize text fragment that displays intro text.
        SimpleTextFragment introFragment = (SimpleTextFragment)
                    getSupportFragmentManager().findFragmentById(R.id.intro_fragment);
        introFragment.setText(R.string.intro_message);
        introFragment.getTextView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16.0f);

        // Initialize the logging framework.
        initializeLogging();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            // When the user clicks TEST, display the connection status.
            case R.id.test_action:
                checkNetworkConnection();
                return true;
            // Clear the log view fragment.
            case R.id.clear_action:
                mLogFragment.getLogView().setText("");
                return true;
        }
        return false;
    }

    /**
     * Check whether the device is connected, and if so, whether the connection
     * is wifi or mobile (it could be something else).
     */
    private void checkNetworkConnection() {
      ConnectivityManager connMgr =
          (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
      NetworkInfo activeInfo = connMgr.getActiveNetworkInfo();
      if (activeInfo != null && activeInfo.isConnected()) {
          wifiConnected = activeInfo.getType() == ConnectivityManager.TYPE_WIFI;
          mobileConnected = activeInfo.getType() == ConnectivityManager.TYPE_MOBILE;
          if(wifiConnected) {
              Log.i(TAG, getString(R.string.wifi_connection));
          } else if (mobileConnected){
              Log.i(TAG, getString(R.string.mobile_connection));
          }
      } else {
          Log.i(TAG, getString(R.string.no_wifi_or_mobile));
      }
    }

    /** Create a chain of targets that will receive log data */
    public void initializeLogging() {

        // Using Log, front-end to the logging chain, emulates
        // android.util.log method signatures.

        // Wraps Android's native log framework
        LogWrapper logWrapper = new LogWrapper();
        Log.setLogNode(logWrapper);

        // A filter that strips out everything except the message text.
        MessageOnlyLogFilter msgFilter = new MessageOnlyLogFilter();
        logWrapper.setNext(msgFilter);

        // On screen logging via a fragment with a TextView.
        mLogFragment =
                (LogFragment) getSupportFragmentManager().findFragmentById(R.id.log_fragment);
        msgFilter.setNext(mLogFragment.getLogView());
    }
}

1.3.5. Swing példa

/*
* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
*   - Redistributions of source code must retain the above copyright
*     notice, this list of conditions and the following disclaimer.
*
*   - Redistributions in binary form must reproduce the above copyright
*     notice, this list of conditions and the following disclaimer in the
*     documentation and/or other materials provided with the distribution.
*
*   - Neither the name of Oracle or the names of its
*     contributors may be used to endorse or promote products derived
*     from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/**
* This example, like all Swing examples, exists in a package:
* in this case, the "start" package.
* If you are using an IDE, such as NetBeans, this should work
* seamlessly.  If you are compiling and running the examples
* from the command-line, this may be confusing if you aren't
* used to using named packages.  In most cases,
* the quick and dirty solution is to delete or comment out
* the "package" line from all the source files and the code
* should work as expected.  For an explanation of how to
* use the Swing examples as-is from the command line, see
* http://docs.oracle.com/javase/javatutorials/tutorial/uiswing/start/compi... */
package start;

/*
* HelloWorldSwing.java requires no other files.
*/
import javax.swing.*;       

public class HelloWorldSwing {
    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("HelloWorldSwing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Add the ubiquitous "Hello World" label.
        JLabel label = new JLabel("Hello World");
        frame.getContentPane().add(label);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}