Anda di halaman 1dari 44

Tema 6

Arquitectura Java EE y plataforma


.NET: componentes, persistencia
y seguridad. Características,
elementos y funciones en entornos
Java, C, C++ y.Net.
Desarrollo de sistemas

Guion-resumen

1. Introducción a las plataformas Java 3. Plataforma .Net: componentes,


EE y .Net persistencia y seguridad
2. Arquitectura Java EE: componentes, 3.1. Introducción a la Plataforma .NET
persistencia y seguridad
3.2. Componentes de la Arquitectura
2.1. Introducción a la Arquitectura .NET
Java EE
3.3. Persistencia
2.2. Lenguajes de programación
3.4. Seguridad
utilizados en Java EE
4. Características, elementos y
2.3. Componentes
funciones de java, C, C++ y .Net
2.4. Persistencia
4.1. Introducción histórica: C, C++,
2.5. Seguridad JAVA y .NET
4.2. El lenguaje C
4.3. El lenguaje C++
4.4. El lenguaje JAVA
4.5. Lenguajes de .NET

Los anexos que complementan este tema están disponibles en la página web:
http://www.recursoscertificados.com/9788491475798
Anexo I. Lenguaje C
Anexo II. Lenguaje C++
Anexo III. Lenguaje Java
Anexo IV. Visual Basic.Net
Anexo V. C#.Net

6-2
Arquitectura Java EE y plataforma .NET

1. Introducción a las plataformas Java EE y .Net


Antes de estas plataformas, JavaEE, .Net y otras de menor impacto, el desarrollo estaba
centrado en los procesos. Se podría hablar de programación orientada a procesos. Cada
proceso se construía como un elemento monolítico, codificando cada una de sus partes y
generando una aplicación, o herramienta, completa.

Los procesos se podían enlazar. Los resultados y/o datos generados por un proceso se
utilizaban en otro. O bien se podían comunicar. En este caso existe intercambio de mensa-
jes entre distintos procesos que, de esta forma, colaboran.

Con la llegada de la web, y especialmente de las aplicaciones web, este paradigma no


era suficiente. Aparecen grandes entornos, servidores y servicios centrados en los aspectos
no funcionales, que ofrecen multitud de servicios para el desarrollo sobre ellos de las fun-
cionalidades de cada aplicación. De esta forma, el desarrollo se centra en componentes a
desplegar sobre plataformas ya existentes, componentes que pueden colaborar de diversas
formas, especialmente de forma remota.

2. Arquitectura Java EE: componentes, persistencia y seguridad


2.1. Introducción a la Arquitectura Java EE
Antes de profundizar en la arquitectura Java EE es necesario introducir su lenguaje
base, Java.

Java es un lenguaje de programación creado por Sun Microsystems. Inicialmente se


pensó para la programación de elementos empotrados, pero pronto se reorientó hacia la
web. Por ello se diseñó con el objetivo de ser multiplataforma, de poder ejecutarse en dis-
tintos entornos operativos y en distinto hardware.

Las principales características de Java son:

— Es un lenguaje orientado a objetos: la definición de los objetos fusiona sus esta-


do/datos y su comportamiento/operaciones. Esta definición se llama clase y cada
una de sus instancias objeto. Las clases se extienden mediante herencia, permi-
tiendo la reutilización de código. Las clases encapsulan la implementación interna
de su estructura y datos.
— Utiliza una máquina virtual: esta máquina es la que logra que Java sea indepen-
diente de la plataforma final de ejecución. Los programas Java se desarrollan y
ejecutan para esta máquina virtual (JVM – Java Virtual Machine). La implemen-
tación de la JVM en cada entorno (Windows-i386, Linux-i686, 32 bits, 64 bits,
etc.) es la que permite al programa ejecutarse.
— Es un lenguaje semi compilado / semi interpretado:
• En tiempo de compilación se realizan las operaciones de com-
probación sintáctica, resolución de tipos y de referencias. Per-

6-3
Desarrollo de sistemas

mite, por tanto, la detección temprana de errores de codificación. La com-


pilación produce bytecode, que no es código realmente ejecutable aunque
sí de bajo nivel. Es decir, es un código sencillo, cercano al de un procesador
y sistema operativo.
• En tiempo de ejecución se interpretan los bytecodes traduciéndolos a ope-
raciones reales de CPU y según el entorno operativo en el que se realice la
ejecución.
— Para facilitar su aprendizaje utiliza una sintaxis similar a la de otros lenguajes
como C++ y, por extensión, el propio C.
En general, el desarrollo en Java es relativamente sencillo, dado que incorpora gran
cantidad de clases y APIs internas para la realización de multitud de funciones. Además de
estas APIs internas también existen muchas otras de carácter libre y que se pueden integrar
en el desarrollo de aplicaciones.
JEE es una extensión sobre Java para el desarrollo de aplicaciones multicapa basadas en
componentes. Para desarrollar una aplicación se realiza el desarrollo de sus componentes y
la integración final de los mismos. Un componente puede utilizarse en varias aplicaciones.
JEE son las siglas de Java Enterprise Edition. Inicialmente se denominó J2EE haciendo
referencia a la versión 2 de Java.
Para lograr y facilitar el desarrollo basado en componentes JEE introduce dos grandes
bloques:
— Servidores de aplicación.
— APIs de desarrollo de componentes.
Un servidor de aplicación es un entorno que facilita la ejecución de una aplicación. Las
principales funciones de un servidor de aplicación son:
— Gestionar el despliegue y ciclo de vida de las aplicaciones.
— Suministrarles servicios para automatizar aspectos no funcionales.
— Integrar distintos componentes facilitando su enlace y comunicación.
En JEE, por tanto, el desarrollo de aplicaciones no da lugar a programas ejecutables
sino a componentes desplegables en un servidor de aplicación.
Por otra parte, JEE introduce numerosos APIs para el desarrollo de los componentes.
Por una parte, estas APIs definen cómo debe ser cada tipo de componente para así
poder manejarlo. De forma resumida se puede explicar este concepto como la definición de
clases base a extender. Existiría una clase base para cada tipo de componente.
Los componentes concretos desarrollados extenderían estas clases. Estas APIs
son necesarias para que los servidores de aplicación puedan desplegar, mane-
jar e integrar los componentes desarrollados.

6-4
Arquitectura Java EE y plataforma .NET

En el desarrollo de componentes se implementan estas APIs dando lugar a compo-


nentes JEE.

Por otra parte, también existen APIs que definen el comportamiento del servidor de
aplicación y los servicios que este proporciona a los componentes desplegados. Estas APIs
son utilizadas por los componentes desarrollados para realizar tareas no funcionales como:
gestión de la seguridad, integración con bases de datos, comunicaciones remotas, localiza-
ción e integración con otros componentes, etc.

En el desarrollo de servidores de aplicación se implementan estas APIs dando lugar a


servidores de aplicaciones compatibles con el estándar JEE. Dado que existe gran cantidad
de servicios y APIs, no todos los servidores de aplicación cumplen con el estándar completo
JEE. De forma que solo pueden ejecutar y gestionar un subconjunto de los posibles com-
ponentes definidos en el estándar.

En relación a ambos conjunto de APIs, JEE es solo la especificación. Aunque incluye


la implementación final de elementos básicos no implementa de forma completa todas
estas APIs. La implemnetación final y completa es misión de cada uno de los servidores de
aplicación. Las tecnologías definidas en la especificación son:

— Enterprise JavaBeans (EJB): para el desarrollo de componentes EJB.


— Java Servlet: para el desarrollo de componentes de servidor web.
— JavaServer Page (JSP): para el desarrollo de páginas web dinámicas.
— JavaServer Pages Standard Tag Library (JSTL): extensión de JSP para la integración
utilizando TAGS extendidos sobre HTML.
— JavaServer Faces (JSF): implementación del patrón MVC en componentes de
interfaz con estado.
— Java Message Service (JMS): comunicación de componentes basada en mensajes.
— Java Transaction API (JTA): gestión avanzada de transacciones.
— JavaMail API y JavaBeans Activation Framework (JAF).
— Tecnologías XML (JAXP, JAX-RPC, JAX-WS, JAXB, SAAJ, JAXR) JPA, JDBC API
— Java Naming and Directory Interface (JNDI): exposición, localización y enlace
con otros componentes y servicios.
— Java Authentication and Authorization Service (JAAS): implementación de meca-
nismos de seguridad y uso en aplicaciones.

2.2. Lenguajes de programación utilizados en Java EE


En el desarrollo de componentes y aplicaciones JEE están implicados
varios lenguajes:

6-5
Desarrollo de sistemas

— Java: lenguaje principal para el desarrollo de los componentes.


— HTML, JavaScript y CSS: para el diseño y construcción de los documentos e inte-
faces web.
— XML: para la configuración y despliegue de los componentes y para intercambio
de datos.
— SQL: para el acceso a bases de datos.

2.2.1. JAVA
Anteriormente se ha descrito el lenguaje base de JEE. A continuación simplemente se
recoge como ejemplo una clase Java con los elementos más importantes:

package es.jaar.gestionalumnos.dao;
import es.jaar.dao.BaseDAO;
import es.jaar.dao.AlumnosDAO;
import java.util.HashMap;
import java.util.Map;
public class AlumnosDAOImpl extendes BaseDAO implements Alumnos-
DAO {
private Map tablaAlumnos;
private Map alumnosPorDNI;

public AlumnosDAOImpl (String fileName) {


super (fileName);
this.tablaAlumnos = new HashMap ();
this.alumnosPorDNI = new HashMap ();
}
// Interfaz AlumnosDAO
public Alumno getAlumno (String id) {
Alumno alumno = (Alumno) this.tablaAlumnos.get(id);
if (alumno == null ) {
throw new DAOException (“No existe el
alumno con id=” + id);
}

6-6
Arquitectura Java EE y plataforma .NET

return alumno;
}
public Alumno getAlumnoPorDNI (String dni) {
Alumno alumno = (Alumno) this.alumnosPorDNI.get(dni);
if (alumno == null ) {
throw new DAOException (“No existe el alumno con
dni=” + dni);
}
return alumno;
}
public void createAlumno (Alumno alumno) {
String dni = alumno.getDNI();
if (this.alumnosPorDNI.get(dni) != null) {
throw new DAOException (“DNI duplicado.”);
}
String newId = super.newId ();
alumno.setId ( newId );
this.tablaAlumno.put( newId, alumno );
this.alumnosPorDNI.put ( dni, alumno );
super.saveTable (tablaAlumnos);
}

En primer lugar, se hace la declaración de paquete (package). En Java un paquete es
conjunto de clases y recursos asociados. Los paquetes permiten organizar los elementos de
una aplicación en subconjuntos.

En el ejemplo tendriamos el paquete de DAOs (dao) de la aplicación de gestión de


alumnos (gestionalumnos) de la organización JAAR (es.jaar). Para Java la estructura de
paquetes es una organización recursiva, similar a un árbol de carpetas.

En segundo lugar se indican las clases que se utilizarán (import). En el ejemplo se


indican tanto la interfaz AlumnoDAO como la clase base BaseDAO y dos clases del paquete
general de utilidades java.util.

Se declara la clase que se está desarrollando (class). Al declararla se indi-


ca, si existe, la clase que se extiende, de la que hereda la actual. En el ejemplo

6-7
Desarrollo de sistemas

BaseDAO. También se indican, si existen, las interfaces implementadas (en el ejemplo


AlumnoDAO).

Los atributos de la clase se declaran como variables (tablaAlumnos y alumnosPorD-


NI). Se indica la visibilidad, que normalmente será private o protected, y su tipo. El tipo de
un atributo puede ser un tipo primitivo (int, boolean, char, etc.), una clase del API (String,
Map, Date, etc.) o una de las clases desarrolladas por la aplicación o sus librerías.

El constructor de la clase es un método especial que debe cumplir: no tiene tipo, pues
no devuelve ningún valor, y se llama igual que la clase. En el ejemplo es AlumnosDAOImpl
(). El constructor del ejemplo utiliza la referencia super para invocar a operaciones de la
clase extendida BaseDAO. En este caso de su propio constructor.

En Java los métodos pueden sobrecargarse. Es decir, pueden definirse varios métodos
con igual nombre pero diferenciados por los parámetros que utilizan. Eso también es apli-
cable a los constructores.

Además del constructor se definen los distintos métodos de la clase. En el ejemplo son
los métodos: getAlumno, getAlumnoPorDNI y saveAlumno.

Al igual que super puede utilizarse para referenciar elementos de la clase base, se utiliza
this para referenciar a los elementos de la clase actual. Normalmente es opcional.

2.2.2. HTML
No es objeto de este tema describir de forma general el lenguaje HTML. Simplemente
indicar cómo se utiliza en el desarrollo de aplicación JEE.

En primer lugar, los Java Servlets generan como resultado páginas o documentos
HTML. De esta forma, estas clases presentarán por una parte código Java para realizar sus
funciones y por otra código también Java que producirá la salida HTML correspondiente.
Se verá más adelante en este manual.

En segundo lugar, también las páginas JSP integran código Java con código HTML. En
este caso, además, el código HTML suele predominar sobre el propio código Java. Dado
que cada página JSP se corresponde, precisamente, con una página HTML de la aplicación.
También se verá más adelante en el presente manual.

Finalmente, pueden existir otros elementos o componentes que estén estrechamente


relacionados con el desarrollo de la interfaz web y por tanto con HTML. Aunque estos
serán siempre elementos auxiliares de los Servlets y JSP.

2.2.3. JavaScript y CSS


Como elementos auxiliares de las páginas web. El código JavaScript y CSS
también será necesario para su desarrollo, estando más relacionado con los
Servlets y JSP que con otros componentes de JEE.

6-8
Arquitectura Java EE y plataforma .NET

En general los recursos JavaScript y CSS se mantiene en ficheros independientes, por lo


que el código no aparecerá directamente junto con los componentes Java de la aplicación.

2.2.4. XML
XML son las siglas de eXtensible Markup Language, aunque realmente no es un len-
guaje como tal sino un metalenguaje. Es decir, utilizando el estándar y formatos XML se
pueden definir otros lenguajes más específicos: como el propio XHTML, un esquema para
describir elementos bibliográficos, un modelo de datos, etc.

XML se utiliza para modelar información y/o documentos, no para desarrollar progra-
mas o procesos.

Las principales ventajas de XML, y la razón de su amplio uso, son:

— Capacidad de extensión.
— Disponibilidad de herramientas para su análisis y tratamiento. Además, dadas sus
estrictas reglas, los análizadores sintácticos son sencillos y eficientes.
— Facilidad de comprensión.
Por un parte, XML es utilizado en Internet para el intercambio de información entre
sistemas, especialmente cuando coexisten distintas tecnologías e infraestructuras (dado que
XML es estándar). En este sentido JEE integra el APIs JAXP (Java API for XML Processing).
Este API permite de forma fácil integrar XML en el desarrollo de aplicaciones JEE.

Por otra parte, XML es el lenguaje utilizado por JEE para los descriptores de despliegue.
Los descriptores de despliegue se utilizan para indicar al servidor de aplicaciones los com-
ponentes que se van a cargar, sus dependencias y su configuración. Sin estos descriptores
el servidor de aplicaciones no podrá utilizar los componentes desarrollados.

Por cada tipo de componente JEE existe un estándar particular sobre su descriptor. Para
esto se utiliza el mecanismo de esquemas de XML. En el siguiente recurso se pueden con-
sultar los distintos esquemas utilizados en el estándar: http://www.oracle.com/webfolder/
technetwork/jsc/xml/ns/javaee/index.html

2.2.5. SQL
SQL es el lenguaje estándar para el acceso a bases de datos relacionales. Por tanto,
se utilizará en los componentes que realicen accesos a datos. Aunque existen alternativas
tecnológicas dentro de JEE que encapsulan las sentencias SQL finales, de forma que los
desarrolladores no necesitan conocer este lenguaje.

En JEE el acceso a bases de datos se realiza con el API JDBC (Java Data-
Base Conectivity), que aplica conceptos similares a los del estándar ODBC
(Open DataBase Connectivity).

6-9
Desarrollo de sistemas

Mediante JDBC, y desde el código Java de nuestros componentes, se pueden realizar


todas las operaciones propias de acceso a una base de datos relacional: abrir conexiones,
realizar consultas, ejecutar sentencias de mantenimiento de datos, gestionar transacciones,
etc. Pero para la especificación de tales consultas y sentencias se utilizará SQL.

A continuación se muestra la integración del lenguaje SQL dentro del API JDBC
mediante un ejemplo:

package es.jaar.gestionalumnos.dao;

import java.sql.*

public class AlumnoDAOImpl {

private static final DEFAULT_DATABASE_URL =


“jdbc:mysql://localhost:3306/alumnos”;
private static final DEFAULT_DATABASE_LOGIN = “alumnosapp”;
private static final DEFUALT_DATABASE_PASSWORD = “Aska129.3”;

private databaseUrl;
private databaseLogin;
private databasePassword;

public AlumnoDAOImpl () {
this (null, null, null);
}

public AlumnoDAOImpl (String url, String login, String pass) {


this.databaseUrl = (url != null) ? url :
DEFAULT_DATABASE_URL;
this.databaseLogin = (login != null) ? login :
DEFAULT_DATABASE_LOGIN;
this.databasePassword = (pass != null) ? pass :
DEFUALT_DATABASE_PASSWORD;
}

6-10
Arquitectura Java EE y plataforma .NET

private Connection connectDatabase () throws SQLException {


String url = “”;
String login = “alumnosapp”;
String password = “Aska129.3”;
Connection connection = DriverManager.getConnection (
url, login, password);

return connection;
}

public Alumno getAlumno (int id) throws SQLException {


Alumno alumno = null;
Connection connection = null;
try {
connection = connectDatabase();
Statement statement = connection.createStatement();
ResultSet queryResult = statement.executeQuery(
“SELECT id, nombre, apellidos FROM alumnos WHERE
id=” + id);

if (queryResult.next()) {
alumno = new Alumno();
alumno.setId(queryResult.getInt(“id”));
alumno.setNombre(queryResult.getString(“nombre”));
alumno.setApellidos(
queryResult.getString(“apellidos”));
}

return alumno;
} finally {
if (connection != null) {

6-11
Desarrollo de sistemas

connection.close();
}
}
}

public Set<Alumno> getAlumnos () throws SQLException {


Alumno alumno = null;
Set<Alumno> listaAlumnos = new HashSet<Alumno>();
Connection connection = null;
try {
connection = connectDatabase();
Statement statement = connection.createStatement();
ResultSet queryResult = statement.executeQuery(
“SELECT id, nombre, apellidos FROM alumnos”);

while (queryResult.next()) {
alumno = new Alumno();
alumno.setId(queryResult.getInt(“id”));
alumno.setNombre(queryResult.getString(“nombre”));
alumno.setApellidos(
queryResult.getString(“apellidos”));
listaAlumnos.add(alumno);
}

return listaAlumnos;
} finally {
if (connection != null) {
connection.close();
}
}
}

6-12
Arquitectura Java EE y plataforma .NET

public void addAlumno (Alumno alumno) throws SQLException {


Connection connection = null;
try {
connection = connectDatabase();
PreparedStatement statement = connection.
prepareStatemente(
“INSERT INTO alumnos (nombre, apellidos) VALUES
(?, ?)”);
statement.setString(1, alumnos.getNombre());
statement.setString(2, alumnos.getApellidos());
int count = statement.executeUpdate();
if (count != 1) {
throw new SQLException(“Error en insert.”);
}
} finally {
if (connection != null) {
connection.close();
}
}
}

public void updateAlumno (Alumno alumno) throws SQLException {


Connection connection = null;
try {
connection = connectDatabase();
PreparedStatement statement = connection.
prepareStatemente(
“UPDATE alumnos SET nombre = ?, apellidos = ?
WHERE id = ?”);
statement.setString(1, alumno.getNombre());
statement.setString(2, alumno.getApelli-
dos());

6-13
Desarrollo de sistemas

statement.setInt(3, alumno.getId());
int count = statement.executeUpdate();
if (count != 1) {
throw new SQLException(“Error en update.”);
}
} finally {
if (connection != null) {
connection.close();
}
}
}

public void deleteAlumno (Alumno alumno) throws SQLException {


Connection connection = null;
try {
connection = connectDatabase();
PreparedStatement statement = connection.
prepareStatemente(
“DELETE FROM alumnos WHERE id = ?”);
statement.setInt(1, alumno.getId());
int count = statement.executeUpdate();
if (count != 1) {
throw new SQLException(“Error en delete.”);
}
} finally {
if (connection != null) {
connection.close();
}
}
}
}

6-14
Arquitectura Java EE y plataforma .NET

El código Java implementa la lógica y control del DAO, mediante los elementos del
API JDBC se interactúa con el sistema de base de datos (Connection, Statemente, Prepa-
redStatement y ResultSet) y mediante SQL se realiza las peticiones:

— SELECT id, nombre, apellidos FROM alumnos WHERE id=?


— SELECT id, nombre, apellidos FROM alumnos
— INSERT INTO alumnos (nombre, apellidos) VALUES (?, ?)
— UPDATE alumnos SET nombre = ?, apellidos = ? WHERE id = ?
— DELETE FROM alumnos WHERE id = ?

2.3. Componentes
Los principales componentes que se pueden desarrollar dentro de JEE, y que se anali-
zan a continuación, son:

— Java Servlets, y concretamente HttpServlet.


— Páginas JSP.
— Enterprise Java Beans – EJB.

2.3.1. Java Servlets: HttpServlet


Un HttpServlet es un componente JEE diseñado para procesar peticiones web. Es decir,
que atiende a una petición realizada mediante el protocolo HTTP, generalmente enviada
por un navegador web, y genera una respuesta HTML. Se ejecuta dentro de un servidor de
aplicaciones, el cual gestionará su ciclo de vida.
Los HttpServlet son un caso concreto de Java Servlet. Un Java Servlet es un componen-
te orientado a la ejecución de peticiones y generación de respuestas. No está restringido
solo a peticiones web. Sin embargo, la inmensa mayoría de servlets son del tipo concreto
HttpServlet. En el resto del manual se utilizarán ambos conceptos referidos al caso general
HttpServlet.
Realmente es el servidor de aplicaciones el que implementa el protocolo HTTP. De
forma que mantendrá los sockets necesarios, procesará las cabeceras y elementos del pro-
tocolo y ejecutará finalmente el servlet. Al ejecutar el servlet le proveerá de las servicios
necesarios encapsulados en los elementos definidos en el API: HttpServletRequest, Http-
ServletResponse, HttpSession y ServletContext, etc. El funcionamiento sería:
1. El cliente (navegador web) realiza una petición de página o envía los datos de un
formulario al servidor web HTTP. Que en este caso sería un servidor de aplicación
JEE completo o, al menos, un contenedor de servlets.
2. El servidor web recibe la petición e interpreta su información: url
solicitada, parámetros y contexto. En base a la información de des-

6-15
Desarrollo de sistemas

pligue de los servlets contenidos el propio servidor decide qué servlet concreto
debe atender la petición.
3. Si el servlet a utilizar aún no se ha creado se procede a su instanciación e iniciali-
zación. En otro caso simplemente se reutiliza una instancia creada anteriormente.
4. Se delega la atención de la petición al servlet concreto, que no deja de ser el
código Java de la aplicación.
5. El servlet, al procesar la petición, genera una respuesta HTML.
6. El servidor de aplicación envía la respuesta al cliente (navegador web).
A continuación se describen los principales elementos del desarrollo de un servlet
mediante un ejemplo.
El ejemplo consiste en una página web con un formulario de alta de alumno. La infor-
mación del formulario se enviará un servlet que debe realizar la operación de alta y como
respuesta devolverá el listado completo de alumnos.
En primer lugar, el formulario será una página HTML estática (vease cómo en el desa-
rrollo de aplicaciones JEE está involucrado el propio lenguaje HTML):

<HTML>
<HEAD><TITLE>Formulario de alta de Alumno</TITLE></HEAD>
<BODY>
<H1>Alta de alumno.</H1>
<FORM NAME=”formulario” METHOD=”POST”
ACTION=”http://localhost:8080/alumnos/altaalumnos”>
<INPUT TYPE=”text” NAME=”nombre” VALUE=””/>
<INPUT TYPE=”text” NAME=”apellidos” VALUE=””/>
<INPUT TYPE=”submit” VALUE=”Enviar”/>
</FORM>
</BODY>
</HTML>
En el formulario (FORM) se indica que los datos se enviarán mediante un POST de
HTTP a la dirección web http://localhost:8080/alumnos/AlumnoServlet. Los datos que
se enviarán son el nombre y los apellidos.

El servlet podría ser así:

import java.io.*;
import javax.servlet.*;

6-16
Arquitectura Java EE y plataforma .NET

import javax.servlet.http.*;
public class AlumnoServlet extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Utiliza la información de la petición.
Alumno alumno = new Alumno();
alumno.setNombre(request.getParameter(“nombre”));
alumno.setApellidos(request.getParameter(“apellidos”));
// Accede a otros componentes para realizar el alta.
AlumnoDAO dao = daoFactory.getAlumnoDAO();
dao.addAlumno (alumno);
// Obtiene la lista de alumnos para generar la respuesta.

Set<Alumno> setAlumnos = dao.getAllAlumnos();


// Genera la respuesta java + html;
response.setContentType(“text/html”);
PrintWriter writer = response.getWriter();
writer.println(“<HTML>”);
writer.println(
“<HEAD><TITLE>Listado de alumnos</TITLE></
HEAD>”);
writer.println(“<BODY>”);
writer.println(“<H1>Listado de alumnos</H1>”);
writer.println(“<UL>”);
Iterator<Alumno> iteratorAlumnos = setAlumnos.iterator();
while(iteratorAlumnos.hasNext()) {
alumno = iteratorAlumnos.next();
writer.println(“<LI>Nombre: “ + alumno.getNombre() +
“ Apellidos: “ + alumno.getApe-
llidos() + “</LI>”);
}

6-17
Desarrollo de sistemas

writer.println(“</UL>”)
writer.println(“</BODY>”);
writer.println(“</HTML>”);
writer.close();
}
}
Habitualmente el servlet se encargará, como en el ejemplo, de procesar los datos
enviados y generar la respuesta en formato HTML. Pero el propio proceso se delega en un
componente adicional. En el ejemplo se utiliza el DAO de alumnos (AlumnoDAO) para
realizar las operaciones de alta y consulta.

Faltaría indicarle al servidor de aplicaciones que estamos desplegando un servlet y qué


peticiones deberá asignarle. Para esta función se utiliza el descriptor de despliegue, en este
caso el descriptor de aplicación web. Se trata de un fichero web.xml que se incluye en el
directorio WEB-INF del paquete del componente:

<?xml version=”1.0” encoding=”ISO-8859-1”?>


<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=
“http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”
version=”2.4”>
<display-name>Gestión de Alumnos</display-name>
<description>Web de alta y gestión de alumnos.</descrip-
tion>
<!-- Declaración del servlet -->
<servlet>
<servlet-name>ServletDeAlumnos</servlet-name>
<servlet-class>AlumnoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDeAlumnos</servlet-name>
<url-pattern>/altaalumnos</url-pattern>
</servlet-mapping>
</web-app>

6-18
Arquitectura Java EE y plataforma .NET

Con la entrada <servlet> se declara un componente de tipo servlet (dentro del descrip-
tor y el paquete de código se pueden desplegar varios). Se indica un nombre (name) y la
clase que lo implementa (class). Con esta información el servidor de aplicaciones ya sabe
que dicha clase es un servlet y que deberá gestionarlo. Con la entrada <servlet-mapping>
se indica al servidor qué tipo de peticiones deberá delegar en el servlet. Se indica el nombre
(name) del servlet y el patrón de peticiones a asignar (en este caso se asigna la ruta especí-
fica /altaalumnos). La ruta asociada es la misma que se utiliza en el action del formulario.

2.3.2. Páginas JSP


Las páginas JSP son componentes desarrollados como archivos de texto no compi-
lados. Son archivos con extensión JSP que integran etiquetas HTML con código Java. Se
utilizan directivas del tipo <% %> para añadir el código Java sobre el documento HTML.
En tiempo de despliegue es el propio servidor de aplicaciones el que compilará el códi-
go generando un Servlet ad-hoc asociado. En tiempo de ejecución los JSP son Servlets, por
tanto, el modo de utilizarlos y sus capacidades son similares.
Cuando el servidor de aplicaciones debe ejecutar una página JSP comprueba si la pági-
na está ya compilada y si se ha modificado desde la última compilación. Si es necesario se
realiza el proceso de conversión generando el código Java del servlet asociado e invocando
su compilación. Posteriormente el servlet se puede utilizar como cualquier otro. De esta
forma, las páginas JSP presentan cierto retraso en su primera ejecución con respecto a los
servlets.
La diferencia que introducen las páginas JSP es que formalmente son páginas HTML.
Por tanto pueden desarrollarse, al menos inicialmente, con herramientas de diseño. En el
ejemplo anterior de servlet se puede ver mucho código de tipo writer.println(…) para inte-
grar el HTML dentro del código Java. Y dicho código HTML es difícil de percibir. En JSP es
justo al contrario. Se verá facilmente con el siguiente ejemplo:

<%@ page language=”java” %>


<%@ page import = “es.jaar.gestionalumnos.AlumnoDAO”%>
<%@ page import = “es.jaar.gestionalumnos.Alumno”%>
<html>
<body>
<h1>Listado de alumnos</h1>
<table border=”1”>
<tr>
<th>Nombre</th>
<th>Apellidos</th>
</tr>
<%

6-19
Desarrollo de sistemas

Iterator<Alumno> alumnos = dao.getAllAlumnos().iterator();


Alumno alumno;
while (alumnos.hasNext()) {
alumno = alumnos.next();
%>
<tr>
<td><%= alumno.getNombre()%></td>
<td><%= alumno.getApellidos()%></td>
</tr>
</table>
</body>
</html>

Aunque se incluye código Java la estructura del documento HTML es perfectamente


visible. Con la directiva <% %> se introduce el código Java que se ejecutará en el servidor
de aplicaciones. La directiva <%= permite introducir valores directamente desde el código
Java al HTML final.
Para desplegar la página de ejemplo se utiliza una sintaxis similar a la de los servlets.
Dado que en tiempo de ejecución son lo mismo:
<servlet>
<servlet-name>ListadoAlumnosServlet</servlet-name>
<jsp-file>ListadoAlumnos.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>ListadoAlumnosServlet</servlet-name>
<url-pattern>/listadoalumnos</url-pattern>
</servlet-mapping>
Se declara un nuevo servlet pero en lugar de indicar la clase que lo implementa se
indica un fichero JSP (JSP-file). El mapeo es igual al realizado para los servlets.

2.3.3. Entreprise Java Beans - EJB


Los EJB son componentes reutilizables que se ejecutan dentro de un servidor de apli-
caciones JEE. Al contrario que los servlets y las páginas JSP no están enfocados
hacia la interfaz final con el usuario ni a atender directamente sus peticiones.
Por el contrario, su interfaz es consumida por otros componentes.

6-20
Arquitectura Java EE y plataforma .NET

El objetivo es poder desarrollar y desplegar componentes funcionales que encapsulen


procesos particulares de negocio. Y mediante la integración de varios de estos componentes
dar lugar a las aplicaciones completas.
El servidor de aplicaciones, o contenedor, proporciona los siguientes servicios a los EJB:
— Gestión de transacciones: de forma que los servicios provistos por los EJB son
trasaccionales en si mismos. No solo la capa última de persistencia de datos.
— Comunicaciones: el propio contenedor es el encargado de comunicar distintos
componentes tanto dentro del propio contenedor como entre distintos contene-
dores, de forma transparente a los componentes.
— Gestión de recursos: el contenedor gestiona a bajo nivel recursos externos utiliza-
dos por los EJB: bases de datos, sistemas empresariables, colas de mensajes, etc.
— Adaptación: en tiempo de despliegue se pueden modificar algunas características
de los servicios implementados por los EJB. Esto es muy importante para lograr
la verdadera reutilización de componentes desarrollados para una aplicación en
otra distinta.
— Seguridad: el contenedor determina, en base al conjunto de reglas de seguridad,
cuándo un componente puede o no invocar un servicio de otro. Esto evita que
en el propio componente deban implementarse mecanismos de control.
— Persistencia: sincronización entre el estado de un EJB y tablas de una base de
datos.
— Escalabilidad: mediante la creación de clusters de servidores de aplicaciones.
— Gestión de mensajes: mediante JMS se pueden implementar mecanismos de
comunicación basados en mensajes o eventos.
Contando con la aportación del contenedor de EJB el desarrollo de los componentes
es sencillo, pues muchos elementos no es necesario desarrollarlos. Además, esto facilita la
portabilidad de los componentes entre distintos entornos.
Para realizar estas funciones el contenedor participará en todas las invocaciones de
métodos de un EJB. Cuando un sistema cliente, o un mismo EJB, solicita acceso a un bean
EJB el contenedor intercepta la comunicación para gestionarla. Por cada EJB se definen de
forma separada su interfaz de servicio y su implementación. En tiempo de ejecución los
clientes utilizarán la interfaz, pero será el propio contenedor el que reciba las invocaciones
para, antes de dirigirlas a la implementación, realizar su propio trabajo de gestión: transac-
ciones, seguridad, comunicaciones, etc.
Existen tres tipos de beans EJB:
— Session Beans.
— Entity Beans.
— Message Driven Bean.

6-21
Desarrollo de sistemas

Los Session Beans, o beans de sesión, implementan procesos de negocio. Cada uno
de sus métodos será un subproceso de negocio, como por ejemplo: inscribir a un alumno
en un curso, iniciar un curso, evaluar un examen, etc.

Dentro de los Session Beans existen dos subtipos según si el bean tiene o no estado.

Los beans con estado o Statefull Session Bean son los que soportan sucesivas peti-
ciones relacionadas de un mismo cliente. Para ello, deben mantener el estado de dicha
interacción. El servidor de aplicaciones gestiona el mantenimiento del estado, la asociación
cliente-bean y la posible sincronización del estado en un escenario de alta escalabilidad.

Un ejemplo de Statefull Session Bean podría ser una operación de compra. El bean
presentaría varios métodos para incorporar, comprobar y eliminar elementos de la opera-
ción. El estado sería la lista de elementos actualmente incorporados.

El caso opuesto se da cuando cada petición recibida es independiente de las anterio-


res. En este caso se utilizan los Stateless Session Bean, que requieren menos intervención
por parte del servidor de aplicaciones. En este caso el contenedor mantendrá un pool de
instancias, ya que son reutilizables.

Los bean de entidad, o Entity Beans, representan objetos que están almacenados en
un recurso externo. Generalmente un Entity Bean está asociado con tablas de base de
datos. De forma que cada instancia del bean representa una fila de la tabla.

Pero esto no quiere decir que estos beans sea simples elementos de datos. Sino que
los Entity Bean pueden y deben encapsular no solo los datos del elemento sino sus propias
reglas de negocio. Esto permite que el componente sea compartido entre varias aplicacio-
nes sin introducir incoherencias.

El servidor de aplicaciones es el encargado de sincronizar los datos mantenidos por un


Entity Bean y su almacenamiento final. De forma que la información es persistente.

Igualmente, el servidor de aplicaciones gestionará las relaciones entre Entity Beans.


Estas relaciones corresponde con el concepto de relación de las bases de datos relacionales.

Por último están los beans dirigidos por mensajes, o Message Driven Beans. Estos
componentes sirven para implementar procesos de negocio en lo que no existe una invo-
cación directa del cliente hacia el servicio, sino que se utiliza algún mecanismo de colas de
mensajes. Concretamente se utilizarán los mecanismos de JMS (Java Messaging Service).

Además de introducir comunicaciones asíncronas, JMS también facilita la comunica-


ciones entre elementos de distintas tecnologías.

En general los Message Driven Beans son similares a los Stateless Session Bean, salvo
porque son invocados por los servicios de mensajería del propio servidor de
aplicaciones en lugar de estar en comunicación con el cliente real.

6-22
Arquitectura Java EE y plataforma .NET

2.4. Persistencia
Las aplicaciones y componentes JEE pueden utilizar, principalmente, tres métodos de
persistencia:

— DAO basado en JDBC.


— Sistemas ORM.
— Entity Beans.

2.4.1. DAO basados en JDBC


Se implementan clases/objetos específicos encargados del acceso final a los datos
mediante JDBC y SQL.

En este caso los componentes de acceso a datos no están restringidos por ninguna
especificación de JEE y su diseño es libre. En contraposición el servidor de aplicaciones no
aporta ningún servicio para simplificar su desarrollo y gestión.

Esta opción presenta dos grandes inconvenientes:

— Debe desarrollarse toda la lógica de acceso a datos y las propias consultas.

— La aplicación es totalmente dependiente de la definición del modelo datos y de


su implementación.

2.4.2. Mapeo Objeto-Relacional (ORM)


Los sistemas ORM ofrecen servicios para el mapeo entre objetos de la aplicación y
entidades de bases de datos relacionales. De forma que se dispone de una base de datos
orientada a objetos virtual. Desde el punto de vista de la aplicación la base de datos es
orientada a objetos pues se utilizan objetos para su manejo. Pero la persistencia final se
produce en una base de datos relacional.

Los sistemas ORM son una evolución del uso de DAOs y eliminan el desarrollo de
operaciones de consulta y manipulación de datos. Por tanto, permiten una mayor indepen-
dencia del modelo de datos y su implementación.

JEE define el API JPA (Java Persistence Api) para el uso de técnicas y tecnologías de
ORM. A continuación se describen los elementos de una capa de persistencia JPA.

En primer lugar se desarrollan los propios beans de datos. En este caso son elementos
independientes, que no precisan implementar o extender a otros. Sus atributos represen-
tan la información de la entidad y sus métodos pueden modelar la lógica de
negocio particular de la misma. Por ejemplo: el bean alumno con los atributos
DNI, nombre y apellidos. Podría controlar que el DNI utilizarse un formato
específico.

6-23
Desarrollo de sistemas

Por otra parte se desarrollan las clases de servicio con métodos similares a los de un
DAO: crear, eliminar, actualizar, buscar, etc. Implementan el negocio de estos métodos pero
no incorporan las funciones finales de acceso a datos sino que las delegan al motor de per-
sistencia del ORM. Para ello se puede utilizar JPQL, un lenguaje de consultas propio de JPA.

Es necesario indicar al motor de persistencia cómo corresponder los atributos del bean
con datos finales de la base de datos. Esta operación se realizaba originalmente mediante
ficheros XML y aún puede realizarse de esta forma. Por ejemplo:

<? xml version=”1.0” encoding=”UTF-8” ?>


<entity-mappings xmlns=http://java.sun.com/xml/ns/persistence/orm
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=”http://java.sun.com/xml/ns/persistence/
orm
http://java.sun.com/xml/ns/persistence/orm_1_0.xsd”
version=”1.0”>
<description>Mapeo de alumnos</description>
<entity class=”Alumno”>
<table name=”alumnos”/>
<attributes>
<id name=”id”>
<generated-value strategy=”TABLE”/>
</id>
<basic name=”nombre”>
<column name=”nombre” length=”20”/>
</basic>
<basic name=”apellidos”>
<column name=”apellidos” length=”50”/>
</basic>
<basic name=”dni”>
<column name=”dni” length=”10”/>
</basic>
</attributes>
</entity>
</entity-mappings>

6-24
Arquitectura Java EE y plataforma .NET

Pero también puede realizarse mediante anotaciones estándar en el propio bean.


Esto permite integrar en un mismo recurso todos los elementos, haciendo el código
más mantenible. Aunque por otra parte requiere recompilar el código para cambiar el
mapeo.

Las principales anotaciones de JPA son:

— @Entity – Indica al motor que la clase actual es una entidad a mapear. Se asocia,
por tanto, con la propia clase.

— @Table – Asociada con @Entity indica el nombre de la tabla para persistir los
datos. Por ejemplo:

@Entity

@Table ( name=”alumno”)

public class Alumno implements Serializable

— @Id – Indica el atributo que sera clave primaria. Por ejemplo:

@Id

@GeneratedValues ( strategy = GenerationType.IDENTITY )

@Column ( name=”id”, nullable=false )

private Integer id;

— @GeneratedValues – Indica que para un atributo se generarán sus valores.

— @Column – Indica el mapeo de un atributo concreto. Por ejemplo:

@Column ( name=”nombre”, nullable=false, length=20 )

private String nombre;

— @OneToMany – Declara una relación unidireccional de uno a muchos.

— @ManyToOne – Relación muchos a uno.

— @ManyToMany – Relación muchos a muchos.

2.4.3. Entity Beans


La persistencia mediante Entity Beans en EJB 2.0 dará lugar a un bean por cada una
de los entidades del modelo de datos. Cada uno de estos beans tendría su
propia interfaz home, interfaz del bean e implementación. De forma similar
a cualquier otro EJB.

6-25
Desarrollo de sistemas

A partir de EJB 3.0 los Entity Bean son realmente un caso particular de implementa-
ción del modelo ORM. De forma que para su desarrollo los pasos a realizar son similares,
definiendo por una parte el bean y sus métodos de manipulación y por otra su mapeo (que
se realiza mediante anotaciones).

Pero a diferencia del uso directo de ORM con esta alternativa cada una de las entida-
des de datos se podrán utilizar, por el resto de componentes, como un EJB. Se aunan la
facilidad de desarrollo con ORM y la versatilidad de integración de los componentes EJB.

2.5. Seguridad
En JEE existen dos opciones distintas de incorporar seguridad a las aplicaciones y com-
ponentes: seguridad declarativa y seguridad programática.

La seguridad programática consiste en incorporar las comprobaciones de seguridad en


el propio componente. Es decir, programar el filtro de seguridad. JEE, a través de su API
JAAS (Java Authentication and Authorization Service) provee mecanismos para facilitar
estas operaciones.

Sin embargo, es en la declaración declarativa donde JEE proporciona los mecanismos


más avanzados. Con este mecanismo los requisitos de seguridad se describen para que sea
el propio servidor de aplicaciones el que los implemente. Esto hace el código más limpio,
centrado en la funcionalidad del componente, y más portable, dado que en distintas situa-
ciones y organizaciones se presentarán distintos modelos de usuarios y grupos.

Los principales elementos que participan son:

— Los perfiles o roles de la aplicación o componente: por una parte la propia apli-
cación definirá los distintos perfiles de uso que tiene.

— Los permisos: para acceder/ejecutar cada una de las operaciones se requerirá per-
tenecer a uno de los roles anteriores.

— Los usuarios: se proporcionará un mecanismo para consultar las credenciales de


los usuarios y permite su autenticación. Junto con la autenticación se obtendrán
los roles específicos del usuario.

— En el despliegue de los componentes se mapean los grupos o roles reales de la


organización, tal y como se especifican en la autenticación, con los roles utiliza-
dos para definir la seguridad del componente.

— En tiempo de ejecución el contenedor realizará las comprobaciones necesarias


para asegurar la autenticación de los usuarios y que los mismos solo puedan
ejecutar las operaciones permitidas.

La seguridad declarativa puede utilizar formato XML, en los propios des-


criptores de despliegue, o anotaciones.

6-26
Arquitectura Java EE y plataforma .NET

3. Plataforma .Net: componentes, persistencia y seguridad


3.1. Introducción a la Plataforma .NET
La plataforma .NET está orientada al desarrollo de aplicaciones de uso general, es
decir, permite crear todo tipo de aplicaciones. Integrá, en torno a .NET Framework, toda
una serie de tecnologías para distintos contextos y problemáticas.
La plataforma .NET está desarrollada por Microsoft y es operativa solo en entornos
MS Windows.
.NET no es un lenguaje de programación. El framework de .NET, su núcleo, implementa
la especificación CLI (Common Language Infraestruture) de forma que cualquier código o
lenguaje que se compile hacia esta especificación es admitido. Los más destacados son:
— C# es una versión de C orientada a objetos, más parecida a Java que al propio
C++.
— VB.NET (Visual Basic .NET) es un lenguaje sencillo, orientado a desarrolladores
con poca experiencia. Sin embargo, permite sacar partido de muchos aspectos de
.NET.
— F# es un lenguaje principalmente funcional, aunque también permite la progra-
mación tradicional y la orientación a objetos.
— ASP.NET para la creación de páginas web dinámicas, integrando en un mismo
recurso código .NET con etiquetas HTML.
.NET implementa seguridad de tipos, esto quiere decir que el tipo de una variable o
atributo determinará la forma de trabajar con ella y las operaciones admitidas. El resto de
operaciones generarán errores en tiempo de compilación.
En relación a los tipos cabe destacar que .NET define un conjunto de tipos base que
todos los lenguajes deben soportar o mapear con otros tipos. De forma que cualquier apli-
cación o componente .NET podrá compartir valores/datos/objetos con otro componente
.NET, aunque estén desarrollados con lenguajes diferentes.
.NET permite el uso de genéricos, es decir, objetos cuya definición admite la parame-
trización de otro tipo de objetos. Por ejemplo, un genérico de tipo Lista se podría parame-
trizar para ser una Lista de Cadenas de texto. De esta forma la Lista, que inicialmente está
diseñara para trabajar con cualquier otro tipo de datos, estará restringida a trabajar con
cadenas de texto. El uso de genérico puede evitar muchos errores en tiempo de ejecución,
trasladándolos al tiempo de compilación.

3.2. Componentes de la Arquitectura .NET


El conjunto de APIs que debe presentar cualquier implementación de
.NET se denominca .NET Standard. Se trata de una biblioteca de clases base.
Por tanto, los desarrollos .NET están ligados al estándar utilizado, a la version
de .NET Standard.

6-27
Desarrollo de sistemas

Cualquier implementación de .NET debe presentar los siguientes componentes:

— Uno o varios entornos de ejecución. El principal es CLR (Common Language


Runtime).
— Una biblioteca de clases que incluya .NET Standard, aunque también puede
incluir servicios y/o clases adiconales.
— Uno o varios contextos o marcos de ejcución: ASP.NET, Windows Forms, Win-
dows Presentation Foundation.
— Opcionalmente, herramientas para el desarrollo de aplicaciones y componentes
.NET.
Las principales implementaciones de .NET son:

— .NET Core: implementación multiplataforma de .NET. Puede ejecutarse en Win-


dows, MacOS y Linux. Su entorno de ejecución es CoreCLR.
Permite aplicaciones en consola y ASP.NET.
En general, es la implementación a tener en cuenta para el desarrollo de aplica-
ciones y componentes de servidor. Las cuales no tiene interacción directa con la
interfaz gráfica de Windows.
— .NET Framework: implementación solo para Windows. Además de .NET Stan-
dard incorpora APIs específicas para utilizar los recursos y servicios de Windows.
Su entorno de ejecución es CLR para .NET Framework.
Permite aplicaciones en consola, ASP.NET, Windows Forms y Windows Presenta-
tion Foundation.
Es la implementación de referencia para el desarrollo de aplicaciones de escritorio
en Windows.
— Mono: implementación de .NET para entornos de ejecución pequeños. Compa-
tible . NET Standard.
La especificación .NET Standard incluye, para todas las plataformas .NET, las siguientes
APIs:

— Core.
— Threads: incluyendo Tasks para trabajos asíncronos.
— IO.
— Networking: incluyendo HTTP y MAIL.
— Serialización.
— XML.

6-28
Arquitectura Java EE y plataforma .NET

3.3. Persistencia
Dentro de .NET Standard, ADO.NET es el API de acceso a datos. Permite acceder a
bases de datos relacionales, XML y datos de otras aplicaciones medinate OLE DB.

Presenta dos componentes principales: Data Provider y Data Set.

— Data Provider: proporciona acceso de consulta y manipulación de datos en


entornos SQL (bases de datos relacionales). Cada proveedor de datos puede
incorporar objetos específicos, pero todos comparten el siguiente conjunto
común:

• Connection: conexión con una fuente de datos concreta. Factoría para los
objetos Command.

• Command: permite la ejecución de operaciones de acceso: consulta, actua-


lización, borrado…

• DataReader: para el uso eficiente de grandes volúmenes de datos en consulta.

• DataAdapter: permite comunicar los datos utilizando un DataSet.

— DataSet: proporciona un mecanismo para el acceso a datos de forma indepen-


diente a la tipología de su origen. Incluso se puede utilizar también con bases
de datos relacionales, pero tiene un peor rendimiento que los Data Provider en
algunos casos.

• Muy utilizado para trabajar con datos XML o con datos de carácter interno
de una aplicación (sin motor de persistencia externo).

• DataSet representa una colección de datos completa. Puede contener varios


DataTable.

• DataTable representa información en modo tabla: filas y columnas.

• DataView es una representación ordenada de un DataTable, opcionalmente


con opciones de filtrado.

• DataColumn representa una columna: nombre y tipo.

• DataRow representa una fila y permite el acceso de lectura y manipulación.

• DataRelation permite la relación entre tablas.

ADO.NET Entity Framework es una API adicional para el desarrollo y uso de objetos
de tipo entidad. Estos objetos se mapean con datos persistentes en sistemas externos.
Permite a las aplicaciones trabajar siempre con objetos, sin bajar a nivel de
fuentes de datos. Es, por tanto, una implementación ORM para .NET.

6-29
Desarrollo de sistemas

3.4. Seguridad
.NET incorpora un mecanismo propio de seguridad: seguridad de acceso del código.
Este mecanismo otorga permisos o capacidades al código en ejecución en función de su
origen.

Sus funciones son:

— Define los permisos base o derechos de acceso a los recursos del sistema.

— Permite a los componentes y aplicaciones requerir permisos específicos a sus


clientes (códigos invocantes y usuarios).

— Permite a los componentes y aplicaciones requerir firma digital a sus clientes, por
tanto, autenticación fuerte.

— Restringe el acceso a recursos y servicios comparando los permisos concedidos a


los clientes sobre los requeridos.

Los componentes pueden interactuar con el sistema de seguridad para requerir per-
misos específicos de forma imperativa y declarativa. En la forma declarativa se introducen
metadatos sobre el código a nivel de ensamblado, clase o miembro de clase.

Ejemplo en C#:

[PermisoEspecifico (SecurityAction.Demand, Unrestricted = true) ]


public class Servicio {
public Servicio () {
// código de construcción …
}
public void OperacionAlta () {
// Código de alta …
}
public void OperacionCancelación () {
// Código de cancelación …
}
}
Se requiere el permiso PermisoEspecifico para acceder a cualquiera de los miembros
de la clase, incluido su constructor. PermisoEspecifico es un tipo de permiso
creado ad-hoc para la aplicación.

6-30
Arquitectura Java EE y plataforma .NET

El mismo ejemplo de forma imperativa podría ser:

public class Servicio {


public Servicio () {
// código de construcción …
}
public void OperacionAlta () {
PermisoEspecifico Permiso = new PermisoEspecifico ();
Permisos.Demand ();
// Código de alta …
}
public void OperacionCancelación () {
// Código de cancelación …
}
}
La operación OperacionAlta realiza una invocación directa para requerir PermisoEspe-
cifico. El resto de miembros de la clase no están asegurados.

4. Características, elementos y funciones de java, C, C++ y .Net


A pesar de la evolución de los lenguajes de programación y el éxito de cada uno ellos,
hay mucho que avanzar todavía. Pero para comprender mejor esto último, analicemos las
características más esenciales de un buen lenguaje de programación:

1. Una forma clara, sencilla y exacta de la sintaxis para que el programador pueda
expresar las ideas de sus algoritmos (integridad conceptual), haciendo mas fácil
la comprensión del mismo para posibles mejoras o modificaciones.
2. Tener menos restricciones en la forma de codificación de los valores y en la colo-
cación de los mismos (ortogonalidad).
3. Tener la facilidad de que al codificar nuestro algoritmo podamos ver la parte
esencial del mismo en nuestro programa, es decir, al tener codificado nuestro
programa, podamos ver en él nuestro algoritmo una forma sencilla para poder
hacer modificaciones futuras (naturalidad de la aplicación), pero también viendo
cómo va quedando la estructura de nuestros datos.
4. Apoyo para la abstracción, es decir, permitir al usuario una fácil
creación de las estructuras de sus datos de forma breve y sencilla,
sin caer en redundancias.

6-31
Desarrollo de sistemas

5. Un gran problema para los lenguajes de programación es la facilidad de verificar


los programas, pero sobre todo la confiabilidad de que cuando se hace un pro-
grama, el lenguaje verifique todos los posibles errores de semántica y a su vez que
sus datos de salida, o casos de entrada, sean reales y confiables.
6. Otro punto es el entorno de programación. Sin una interfaz, una ayuda o herra-
mientas para la programación, el lenguaje sería inútil, aburrido y desesperante
para el programador.
7. Un factor importante en la creación de los programas es la portabilidad de los
mismos hacia otros sistemas. Para ello el lenguaje de programación debe per-
mitirlo por medio de no basarse en una sola arquitectura en la ejecución de los
programas, tal es el caso de C, FORTRAN, Ada y Pascal, que manejan la imple-
mentación de los programas hacía otros sistemas.
8. El coste según su uso. El coste de tiempo en la ejecución, de traducción, de crea-
ción, prueba y uso y coste de mantenimiento de los programas.
Otras características de los lenguajes de programación son los entornos de diseño.
Estos pueden ser:

— Entorno de procesamiento por lotes. Las instrucciones se ejecutan por secciones,


estructuras o lotes.
— Entorno interactivo. Posibilidad de uso de los periféricos.
— Entornos incrustados. Son aquellos lenguajes grandes que tienen la posibilidad
de llamar a otros más pequeños.
— Entornos de programación.
— Entornos de marcos de ambiente. Posibilidad de interactuar con la red.
Un punto importante en todas estas características es que se debe tener un estándar
para evitar caer en incompatibilidades de equipo.

4.1. Introducción histórica: C, C++, JAVA y .NET


En la década de los setenta Ken Thompson creó un lenguaje de programación deno-
minado B que no tuvo repercusiones espectaculares pero que sirvió de base para que
Dennos Ritchie, en esta misma década, crease el lenguaje C que, a finales de los setenta y
durante los ochenta, fue el lenguaje de programación más utilizado por los programadores.
Este lenguaje se desarrolló usando UNIX como sistema operativo. En 1983 se estableció un
comité para crear el estándar ANSI que definiera el lenguaje C. Al cabo de seis años, 1989,
este estándar fue adoptado comenzando su implementación en 1990. En este mismo año
este estándar también fue adoptado por la ISO.

En 1995 se adoptó la Enmienda 1 del estándar C. En 1989 se creó un


nuevo estándar que, junto con la Enmienda 1, se convirtió en el documento

6-32
Arquitectura Java EE y plataforma .NET

base del estándar C++. A partir de este momento C quedó relegado a un segundo plano,
pero totalmente operativo. De hecho, en 1999, se creó un nuevo estándar y en la actuali-
dad sigue siendo un lenguaje de programación en pleno vigor (a este estándar se le suele
denominar C99).

Es, por tanto, la creciente complejidad de los sistemas lo que ha conducido a la nece-
sidad de cambiar de C a C++. C++ fue inventado por Bjarne Stroustrup en 1979 en los
Laboratorios Bell. La nueva forma de pensar (programación orientada a objetos) hizo que
fuese una auténtica revolución en el mundo de los lenguajes de programación. C++ es una
extensión de C en la que se añaden las características orientadas a objetos, fue estandariza-
do en 1997 cumpliendo los estándares ANSI/ISO.

C++ fue el lenguaje dominante a finales de los ochenta y principios de los noventa. No
obstante, y aunque combinaba de forma perfecta la programación orientada a objetos con
un lenguaje tan completo como C, llegó Internet y se hizo necesario adaptar este lenguaje
a los nuevos. Así fue como en 1995 vio la luz JAVA, aunque ya en 1991 fue desarrollado
y comenzó a ser utilizado. Fue desarrollado durante año y medio por cinco programadores
expertos que crearon este lenguaje de programación cuya sintaxis básica esta basada en C
y que implementa la orientación a objetos de C++. El dominio de JAVA como lenguaje
de programación orientado a objetos se ha extendido hasta ahora. Su utilidad tanto para
aplicaciones independientes de la plataforma como para subprogramas ejecutables dentro
de una pagina web (applets), y muchas características más que veremos a continuación, le
han hecho digno de todo elogio.
En el ámbito de los sistemas Windows también se agotó la evolución propia de C y
C++ y Microsoft dio lugar al framewor de .NET (publicado en 2002), con en el que pre-
tendía responder a la competencia de Java, especialmente en entornos web y empresariales.
Actualmente la plataforma .NET integra en un mismo entorno el desarrollo de aplicaciones
de escritorio y aplicaciones multicapa. En ambos casos mediante el desarrollo e integración
de componentes.

4.2. El lenguaje C
El lenguaje C es el resultado de un proceso de desarrollo que se inició con un lenguaje
denominado BCPL. Este influenció a otro llamado B (inventado por Ken Thompson). En
los años 70, este lenguaje llevó a la aparición del C.
Con la popularidad de las microcomputadoras muchas compañías comenzaron a
implementar su propio C por lo cual surgieron discrepancias entre sí.
Por esta razón ANSI estableció un comité en 1983 para crear una definición no ambi-
güa del lenguaje C e independiente de la máquina que pudiera utilizarse. Algunos tipos de
C existentes son:
— Quick C.
— C++.
— Turbo C.

6-33
Desarrollo de sistemas

— Turbo C ++.
— Borland C.
— Borland C++.
— Microsoft C.
Cuando se habla del lenguaje C se ha de tener en cuenta las dos grandes estandariza-
ciones existentes en su larga historia: por un lado tenemos C89 y C99. Para hacernos una
idea de las diferencias, C89 contiene 32 palabras clave, C99 incluye cinco más. Hoy en día
la mayoría de los compiladores se basan en esta segunda estandarización.
El lenguaje C se engloba dentro de los lenguajes de nivel medio. Como lenguaje de
nivel medio, C permite la manipulación de bits, bytes y direcciones que son los elementos
básicos con los cuales funciona la computadora. El lenguaje C es muy portable, en el senti-
do de que funciona en distintos sistemas o diferentes tipos de computadoras; para que nos
hagamos una idea: Windows en todas sus versiones, DOS, Linux, etc.

C no lleva a cabo una comprobación de errores en tiempo de ejecución. Es el progra-


mador el único responsable de llevar a cabo estas comprobaciones.

Dado que con C podemos manipular bits, bytes y direcciones, se hace ideal para la
programación de sistemas. De hecho el sistema Linux nació con el intento logrado de rees-
cribir el código de UNIX en C.

C es un lenguaje estructurado, pero no estructurado en bloques, ya que no permite


por ejemplo la creación de funciones dentro de funciones. Al ser, por tanto, un lenguaje
estructurado, su sintaxis es la que sirve de base para C++ y JAVA y será la que veamos en
un apartado posterior en este mismo tema.

El componente principal de C es la función que se define como una subrutina inde-


pendiente. Cada una de estas funciones está formada por bloques en los que se desarrolla
toda la actividad del programa. Cada bloque queda delimitado por { y }. A estos bloques se
les conoce como bloques de código, que son un grupo de instrucciones de un programa
conectadas de forma lógica y que es tratado como una unidad.

El lenguaje C tiene una lista de palabras clave que tienen un objetivo definido. Cada
una de estas palabras clave no puede ser utilizada para otro fin diferente al que tiene asig-
nado.

En C, a pesar de no ser un lenguaje fuertemente tipado como ocurre con C++ y JAVA,
sí que se diferencia entre mayúsculas y minúsculas.

Como hemos visto, en C un programa consiste en una o más funciones; no obstante


siempre ha de haber una que sea invocada cuando se ejecuta el programa, es decir, que sea
la primera que se ejecute y que llame a las demás (una función principal), a
esta función se le ha de denominar main(). Main no es una palabra reservada
pero no puede usarse para otras cosas (trataremos main como si fuese una
palabra reservada aunque no lo sea).

6-34
Arquitectura Java EE y plataforma .NET

La mayoría de los programas C incluyen llamadas a varias funciones contenidas en la


biblioteca estándar de C. Todos los compiladores actuales de C incorporan esta biblioteca
estándar en la cual se incluyen funciones que realizan las tareas más habituales (raíces,
impresiones, lectura de ficheros, etc.). Independientemente de esta biblioteca estándar
existen muchas otras que podemos utilizar, o incluso crear nuestra propia biblioteca de
funciones. Para poder fusionar el código del programa con el código de las funciones
existentes en las bibliotecas los compiladores incluyen enlazadores, a cuyo proceso se le
denomina enlace.

En C un programa se puede escribir en varios archivos y compilar cada uno de ellos


por separado. De este modo la recompilacion se puede efectuar en aquel archivo que da
el problema o en el cual queramos realizar alguna modificación sin tener que recompilar
todo el programa. El código objeto completo lo forman todos los archivos del programa
compilados y las rutinas de las bibliotecas utilizadas.

Por tanto, los pasos a seguir en la creación de un programa C son:

— Creación del programa.


— Compilación del programa.
— Enlace del programa con todas las funciones que se necesiten de la biblioteca.

4.2.1. Elementos generales de un programa en C


Aunque cada uno de los programas son distintos, todos tienen características comu-
nes. Los elementos de un programa en C son los siguientes:

Comentarios
Inclusión de archivos
main()
{
variables locales
flujo de sentencias
}
Definición de funciones creadas por el programador utilizadas en
main()
Veamos en qué consiste cada uno:

— Comentarios: se identifican porque van entre diagonales y asterisco. Nos sirven


para escribir información que nos referencie al programa pero que
no forme parte de él. Por ejemplo, especificar qué hace el programa,
quién lo elaboró, en qué fecha, qué versión es, etc.

6-35
Desarrollo de sistemas

— Inclusión de archivos: consiste en llamar a la o las bibliotecas donde se encuen-


tran definidas las funciones de C (instrucciones) que estamos utilizando en el
programa. En realidad, la inclusión de archivos no forma parte de la estructura
propia de un programa sino que pertenece al desarrollo integrado de C. Se inclu-
ye aquí para que el alumno no olvide que debe llamar a los archivos donde se
encuentran definidas las funciones estándar que va a utilizar.
— main(): en C todo está constituido a base de funciones. El programa principal no
es la excepción, main() indica el comienzo de la función principal del programa,
la cual se delimita con llaves.
— Variables locales: antes de realizar alguna operación en el programa se deben
declarar la(s) variable(s) que se utilizarán en el mismo.
— Flujo de sentencias: es la declaración de todas las instrucciones que conforman
el programa.
— Definición de funciones creadas por el programador utilizadas en main():
finalmente, se procede a definir el contenido de las funciones utilizadas dentro
de main(). Estas contienen los mismos elementos que la función principal.
Un programa en C consta de tres secciones. La primera sección es donde van todos
los headers. Estos headers son comúnmente los #define y los #include. Como segunda
sección se tienen las funciones. Al igual que Pascal, en C todas las funciones que se van
a ocupar en el programa deben ir antes que la función principal (main()). Declarando las
funciones a ocupar al principio del programa, se logra que la función principal esté antes
que el resto de las funciones. Ahora, solo se habla de funciones ya que en C no existen
los procedimientos. Y como última sección se tiene a la función principal, llamada main.
Cuando se ejecuta el programa, lo primero que se ejecuta es esta función, y de ahí sigue
el resto del programa.
Los símbolos { y } indican begin y end respectivamente. Si el contenido de una fun-
ción o de un ciclo while, por ejemplo, es de solamente una línea, no es necesario usar llaves
({ }), en caso contrario es obligatorio usarlas.
Ejemplo de un programa en C

/*Programa que imprime un saludo en pantalla*/


#include <stdio.h>
tomates () {
printf(“Dedicado a Ismael”);
}
void main() {
tomates();
}
/* Fin programa */

6-36
Arquitectura Java EE y plataforma .NET

Los primeros lenguajes ensambladores ofrecen una forma de trabajar directamente


con un conjunto de instrucciones incorporadas en la computadora. Cada una de estas
especificaciones se ha de especificar en términos de máquina (bits de los registros).

Dado que esto se hacía muy pesado para el programador, surgieron los primeros len-
guajes de alto nivel, como Fortran, que en un principio se desarrollaron como alternativa
a los lenguajes ensambladores. En un principio estos lenguajes fueron usados para resolver
problemas de matemáticas, ingeniería o científicos (lenguajes orientados al problema).

El lenguaje C está ligado a la computadora y nos ofrece un importante control sobre


los detalles de la implementación de una aplicación; esta es la razón por la cual se le con-
sidera a la vez un lenguaje de bajo y de alto nivel (lenguaje de nivel medio).

Entre las muchas ventajas que posee el lenguaje C citaremos:

— Tamaño óptimo de código. Dado que tiene pocas reglas de sintaxis.

— Conjunto de palabras clave. Palabras reservadas que usa el lenguaje.

— Ejecutables rápidos. Muchos programas C se ejecutan con una velocidad equiva-


lente al lenguaje ensamblador.

— Comprobación de tipos limitada. Se permite visualizar datos de distintas maneras.

— Implementación de diseño descendente. El denominado diseño Top-Down gra-


cias a la implementación de sentencias de control.

— Estructura modular. Compilación y enlazado por separado.

— Interfaz transparente para el lenguaje ensamblador. Se puede llamar a las rutinas


del lenguaje ensamblador desde un compilador C.

— Manipulación de bits. C permite manipular bits y bytes.

— Tipos de datos puntero. C permite manipular direcciones.

— Estructuras extensibles. Los arrays son unidimensionales.

— Memoria eficiente. Los programas C tienden a ser muy eficientes en memoria.

— Portabilidad entre plataformas. Un programa C se puede ejecutar en una compu-


tadora u otra con un sistema operativo u otro.

— Rutinas de biblioteca. Hay una gran cantidad de bibliotecas con funciones pre-
creadas.

(Para más información sobre el Lenguaje C, consulte el Anexo I de este


mismo tema).

6-37
Desarrollo de sistemas

4.3. El lenguaje C++


C++ es un subconjunto de C que mantiene todas las características de este y su flexi-
bilidad para el trabajo en el tratamiento de la interfaz hardware/software, su programación
del sistema a bajo nivel, sus expresiones, etc., pero todo ello dentro de la programación
orientada a objetos.
Este lenguaje combina las construcciones del lenguaje procedimental estándar y el
modelo orientado a objetos. Se trata pues de una nueva forma de pensar.
C++ se desarrolló originariamente para resolver simulaciones conducidas por sucesos.
Fue utilizado en 1983 y aún en 1987 se encontraba en fase de evolución. En su evolución
siempre se ha procurado preservar la integridad de los programas escritos en otros lenguajes
al intentar exportarlos a C++.
Diferencias entre C y C++:
— Trabajo con clases. Frente al trabajo con estructuras definido en C.
— Constructores de clases y encapsulación de datos.
— La clase struct. Esta clase puede contener tanto datos como funciones.
— Constructores y destructores. Se usan para garantizar la inicialización y destruc-
ción de los datos.
— Mensajes. Los objetos se manipulan enviándoles mensajes.
— Funciones afines. Se permite acceder a los métodos y datos de una clase privada.
— Sobrecarga de operadores. Se puede hacer sobrecarga de operadores por número
de argumentos o por su tipo.
— Clases derivadas. Una subclase de una clase específica.
— Polimorfismo. El objeto determina qué clase o subclase recibe un mensaje.
— Biblioteca de flujos. Permitiendo que las operaciones de entrada y salida de datos
desde un terminal o un archivo sean más accesibles.
Existen otras diferencias menos notorias como:
— Su sintaxis en algunos aspectos puntuales como son los comentarios y variables
enumeradas.
— Conversiones de tipo explícitas.
— Sobrecarga de funciones.
— Argumentos por referencia.
— Punteros de tipo void.
— Funciones inline, etc.

6-38
Arquitectura Java EE y plataforma .NET

Ejemplo de programa en C++:

/* Comentario creado para los estudiantes de TAI, mucha suerte a


todos */
# include <stdio.h>
int main()
{
printf(“C++ es guay”);
return (0);
}
Este código fuente ha de ser guardado con extensión *.c, luego será compilado para
poder ejecutarlo.

Existen entornos gráficos para el desarrollo de programas en C y en C++ que incluyen


los compiladores correspondientes y facilitan visualmente la labor del programador. En la
imagen vemos el Visual C++ de Microsoft que permite escribir programas C o C++.

(Para más información sobre el Lenguaje C++, consulte el Anexo II de este mismo
tema).

4.4. El lenguaje JAVA


JAVA es un lenguaje de programación desarrollado por un grupo de ingenieros de Sun
Microsystems (1991); en principio está destinado a electrodomésticos, está basado en C++
y se diseñó para ser un lenguaje sencillo con códigos de tamaño muy reducido. Posterior-
mente (1995) se comienza a utilizar como lenguaje para computadores; Netscape Naviga-
tor incorpora un intérprete JAVA en su versión 2.0 siendo la base para JavaScript. El rápido
crecimiento de Internet y el uso de JAVA para dar dinamismo a las páginas de HTML,
lo convierten en un medio popular de crear aplicaciones para Internet. Si bien su uso se
destaca en el web y sirve para crear todo tipo de aplicaciones (locales, Intranet o Internet).

En la actualidad es un lenguaje muy completo (la versión JAVA 1.0 tenía 12 paquetes
(packages), JAVA 1.1 tenía 23 y JAVA 1.2 o JAVA 2 tiene 59). El haber sido diseñado en una
época muy reciente y por un único equipo le confieren unas características que facilitan su
aprendizaje y utilización a los usuarios; JAVA incorpora muchos aspectos que en cualquier
otro lenguaje son extensiones propiedad de empresas de software o fabricantes de ordena-
dores (threads, ejecución remota, componentes, seguridad, acceso a bases de datos, etc.).

La importancia de JAVA es su utilización como nexo de unión de los usuarios con la


información, ya sea en el ordenador local, en un servidor de web, en una base de datos o
en cualquier otro lugar.

JAVA es un lenguaje potente que resuelve los problemas que se plantean


al acceder a una base de datos, en la programación de redes, la distribuida,

6-39
Desarrollo de sistemas

etc.; tiene muchas posibilidades de utilización como aplicación independiente (Standalone


Application), programación a través de los applets, ejecución como servlet, etc. Un applet
es un programa que corre bajo un navegador o browser (por ejemplo Netscape Navigator
o Internet Explorer) y es descargado como parte de una página HTML desde un servidor
web. El applet se descarga desde el servidor y no requiere instalación en el ordenador donde
se encuentra el browser. Un servlet es una aplicación sin interface gráfica que se ejecuta en
un servidor de Internet.

Es un lenguaje orientado a objetos, ha sido concebido como tal a diferencia de otros


lenguajes como C++ que son lenguajes modificados para poder trabajar con objetos.

4.4.1. ¿Qué entendemos por objeto?


Podemos decir que todo puede verse como un objeto. Un objeto es una pieza de
software que cumple con ciertas características:

— Encapsulamiento: el objeto es autocontenido, es la integración de sus datos


(atributos) y los procedimientos (métodos) que actúan sobre él. Al utilizar la pro-
gramación orientada a objetos, se definen clases (objetos genéricos) y la forma
en que interactúan entre ellos, a través de mensajes. Dado que los programas no
modifican al objeto, este se mantiene independiente del resto de la aplicación; si
necesitamos modificar un objeto lo hacemos sin tocar el resto de la aplicación.
— Herencia: se pueden crear nuevas clases que comparten características (atribu-
tos) y comportamientos (métodos) de otras ya preexistentes, relacionadas por
una relación jerárquica, simplificando la programación.
JAVA es independiente de la plataforma, puede hacerse funcionar con cualquier ordena-
dor. Al compilar un programa Java, lo que se genera es un pseudocódigo definido por Sun,
para una máquina genérica; el software de ejecución java interpreta las instrucciones, emu-
lando a dicha máquina. Por supuesto esto no es muy eficiente, por lo que tanto Netscape
como Hot JAVA o Explorer, al ejecutar el código por primera vez, lo van compilando (median-
te un JIT: Just In Time compiler), de modo que al crear, por ejemplo, la segunda instancia de
un objeto, el código ya está compilado específicamente para la máquina huésped.

4.4.2. Compilador de Java, JAVA Virtual Machine


Existen distintos programas comerciales que permiten desarrollar código Java. Sun dis-
tribuye gratuitamente el JDK (JAVADevelopment Kit); el JDK es un conjunto de programas
y librerías que permiten desarrollar, compilar y ejecutar programas en Java.

El Compilador de JAVA realiza un análisis de sintaxis del código escrito en los fiche-
ros fuente de Java (con extensión *.java). Si no encuentra errores en el código genera los
ficheros compilados (con extensión *.class). En otro caso muestra la línea o
líneas erróneas. Incorpora además la posibilidad de ejecutar parcialmente el
programa, deteniendo la ejecución en el punto deseado y estudiando en cada
momento el valor de cada una de las variables.

6-40
Arquitectura Java EE y plataforma .NET

Los IDEs (Integrated Development Environment-entornos de desarrollo integrados),


permiten en un mismo programa escribir el código Java, compilarlo y ejecutarlo sin tener
que cambiar de aplicación. Estos entornos integrados permiten desarrollar las aplicaciones
de forma mucho más rápida, incorporando en muchos casos librerías con componentes ya
desarrollados, los cuales se incorporan al proyecto o programa. Como inconvenientes se
pueden señalar algunos fallos de compatibilidad entre plataformas y ficheros resultantes de
mayor tamaño que los basados en clases estándar.

La existencia de distintos tipos de procesadores y ordenadores resalta la importancia


de contar con un software que no dependa del tipo de procesador utilizado. Esto llevó
a los ingenieros de Sun a desarrollar un código capaz de ejecutarse en cualquier tipo de
máquina. Al ser compilado el código fuente no necesita ninguna modificación al cambiar
de procesador o al ejecutarlo en otra máquina; esto se debe a que se ha desarrollado un
código neutro el cual estuviera preparado para ser ejecutado sobre una máquina hipotética
o virtual, denominada JAVA Virtual Machine (JVM)). La JVM interpreta el código neutro
y lo convierte en el código particular de la CPU utilizada, evitando tener que realizar un
programa diferente para cada CPU o plataforma.

Nota. JDK, por tanto, es necesario si queremos crear applets o aplicaciones en lenguaje
JAVA y JVM es necesario si queremos visualizarlos. JDK, no obstante, es un kit de desarrollo que
lleva integrado JVM.

4.4.3. Estructura de un programa JAVA


La estructura de un programa realizado en cualquier lenguaje orientado a objetos
(Object Oriented Programming) (OOP-POO), y en particular en el lenguaje JAVA, es una
clase.

En JAVA todo forma parte de una clase, es una clase o describe cómo funciona una
clase. El conocimiento de estas es fundamental para poder entender los programas Java.
Todas las acciones de los programas JAVA se colocan dentro del bloque de una clase o un
objeto. Todos los métodos se definen dentro del bloque de la clase, JAVA no soporta fun-
ciones o variables globales.

En todo programa nos encontramos con una clase que contiene el programa principal
y algunas clases de usuario (las específicas de la aplicación que se está desarrollando) que
son utilizadas por el programa principal.

Los ficheros fuente tienen la extensión *.java, mientras que los ficheros compilados
tienen la extensión *.class. Un fichero fuente (*.java) puede contener más de una clase,
pero solo una puede ser publico El nombre del fichero fuente debe coincidir con el de la
clase public (con la extensión *.java). Si, por ejemplo, en un fichero aparece la declara-
ción (public class MiClase {...}) entonces el nombre del fichero deberá ser MiClase.java.
Es importante que coincidan mayúsculas y minúsculas ya que MiClase.JAVA
y miclase.JAVA serían clases diferentes para Java. Si la clase no es public, no
es necesario que su nombre coincida con el del fichero. Una clase puede ser
public o package (default), pero no private o protected.

6-41
Desarrollo de sistemas

En general una aplicación está constituida por varios ficheros *.class. Cada clase realiza
unas funciones particulares, permitiendo construir las aplicaciones con gran modularidad e
independencia entre clases. Las clases de Java se agrupan en packages, que son librerías de
clases. Si las clases no se definen como pertenecientes a un package, se utiliza un package
por defecto (default) que es el directorio activo.

Es necesario entender y dominar la sintaxis utilizada en la programación; observemos


nuestro primer programa en Java y un breve comentario de las partes que lo componen:

/* lolo.JAVA
Escribe en pantalla “¡Dedicado a Maria Luz!” */
class lolo
{
public static void main(String args [ ])
{
System.out.println(“ ¡Dedicado a Maria Luz!”) ;
}
}
Con JAVA se pueden crear dos tipos de programas: aplicaciones y applets. Una apli-
cación es un programa que se ejecuta en una computadora utilizando el sistema operativo
de esa computadora. Se trata pues de un programa normal como podría haber sido en C
o C++ pero en el lenguaje Java. En este aspecto la funcionalidad de JAVA no es diferente
a la de cualquier otro lenguaje orientado a objetos. Una applet es una aplicación diseñada
para ser transmitida por Internet y ejecutada en un navegador web compatible con Java.
Un applet es realmente un pequeño programa que se transfiere dinámicamente a través de
la red, como si fuese una imagen, un archivo de sonido o de vídeo. La diferencia principal
es que una applet es un programa que puede reaccionar ante las acciones del usuario y
cambiar dinámicamente.

Vamos a detallar algunos de los aspectos (cualidades) que han hecho de JAVA uno de
los lenguajes más populares:

• Simple

JAVA es un lenguaje relativamente fácil de aprender una vez que se comprenden los
conceptos básicos de la programación orientada a objetos. Además, para la realización de
una determinada acción existen siempre varios caminos por los cuales podamos programar.

• Seguro

Esta cualidad hace que los applets sean ideales para la transmisión por
Internet sin violar la vulnerabilidad de los sistemas.

6-42
Arquitectura Java EE y plataforma .NET

• Portable

El código ejecutable generado por JAVA es adaptable a cualquier tipo de plataforma


con cualquier tipo de sistema operativo.

• Orientado a objetos

JAVA junto con C++ es el máximo exponente de la programación orientada a objetos.


Esta cualidad le brinda de todas las ventajas de esta programación.

• Robusto

Ya que JAVA se ejecuta en multitud de plataformas, esta cualidad le permite satisfacer


con éxito su deber en todas ellas.

• Multihilo

JAVA permite que se ejecuten varios hilos al mismo tiempo (cada hilo representa una
tarea a desarrollar). Esta cualidad es la que le ha hecho ideal para trabajo en redes. Además
permite la sincronización de cada una de esas tareas y su comunicación.

• Arquitectura neutral

Esta cualidad le permite que un programa JAVA se pueda ejecutar en un sistema ope-
rativo actual y en las actualizaciones que puedan surgir de ese sistema operativo. Lo único
que necesitamos es la JVM (máquina virtual de Java).

• Interpretado

Una vez compilado un programa este se convierte en código binario que es interpre-
tado por un intérprete de Java. Este intérprete debe ser optimizado para que la conversión
al código máquina sea de buen rendimiento.

• Distribuido

A través del protocolo TCP/IP podemos distribuir programas JAVA en Internet. JAVA
dispone además de RMI (Invocación de Método Remoto) que permite ejecutar procedi-
mientos de forma remota. Otra característica es la programación cliente/servidor.

Existen entornos gráficos para el desarrollo de programas en JAVA que incluyen los
compiladores correspondientes y facilitan visualmente la labor del programador.

(Para más información sobre el Lenguaje Java, consulte el Anexo III de


este mismo tema).

6-43
Desarrollo de sistemas

4.5. Lenguajes de .NET


Realmente .NET no es un lenguaje de programación, sino un framework para el desa-
rrollo de aplicaciones y un entorno de ejecución para su ejecución. De hecho, acualmente
se admiten más de 20 lenguajes distintos para el desarrollo de aplicaciones y componentes
.NET. Aunque los más destacados son cuatro:

— C# como lenguaje avanzado orientado a objetos. Es una evolución de C, más


cercana a Java que a C++.

— F# como lenguaje de tipo funcional. Admite también código tradicional y orien-


tado a objetos, pero en dicho paradigma no ofrece ninguna mejora respecto a C#.
— VB.NET, evolución de Visual Basic para la plataforma .NET. Su principal ventaja
es su sencillez.
— ASP.NET, no es propiamente un lenguaje sino la integración en un mismo recur-
sos de código .NET (C#, F#, VB.NET, etc.) junto con etiquetas HTML para la
generación dinámica de páginas web.

6-44