proyecto:armar_la_aplicacion_inicial
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| proyecto:armar_la_aplicacion_inicial [2025/06/23 16:46] – ahogan | proyecto:armar_la_aplicacion_inicial [2026/11/11 00:23] (current) – Armar la Aplicación: correcciones para Debian 13 (PHP 8.4, Django 6 en venv, Tomcat 10) y servlet-test.zip actualizado semorale | ||
|---|---|---|---|
| Line 3: | Line 3: | ||
| ===== Objetivo ===== | ===== Objetivo ===== | ||
| - | La idea de la aplicación es tener una interfaz HTML donde el usuario | + | La idea de la aplicación es tener una interfaz HTML donde se puede ingresar algo (como en un " |
| * Como fue mencionado antes, hay que tener al menos tres consultas demostrando una mezcla de rasgos de SQL, es decir, joins, consultas anidadas, agregación, | * Como fue mencionado antes, hay que tener al menos tres consultas demostrando una mezcla de rasgos de SQL, es decir, joins, consultas anidadas, agregación, | ||
| - | * Al menos dos de las consultas deberían incluir uno o más parámetros ingresados | + | * Al menos dos de las consultas deberían incluir uno o más parámetros ingresados |
| * No es necesario tener todos los rasgos en todas las consultas. La idea es que se demuestren los rasgos en alguna consulta. Se puede empezar con una consulta simple. | * No es necesario tener todos los rasgos en todas las consultas. La idea es que se demuestren los rasgos en alguna consulta. Se puede empezar con una consulta simple. | ||
| * Es importante usar indices, vistas, etc., para optimizar las consultas. | * Es importante usar indices, vistas, etc., para optimizar las consultas. | ||
| - | * Si uno quiere usar una vista, y si la complejidad está en la vista (es decir, si la vista maneja la agregación o los joins, etc.), está bien tener una consulta más simple. O sea, si hay una vista con los rasgos mencionados, | + | * Si se quiere usar una vista, y si la complejidad está en la vista (es decir, si la vista maneja la agregación o los joins, etc.), está bien tener una consulta más simple. O sea, si hay una vista con los rasgos mencionados, |
| * Se pueden armar varias interfaces (una página diferente para cada consulta) o una interfaz con varios formularios (una página para todas las consultas). | * Se pueden armar varias interfaces (una página diferente para cada consulta) o una interfaz con varios formularios (una página para todas las consultas). | ||
| * Es importante usar métodos seguros, especialmente contra inyección. | * Es importante usar métodos seguros, especialmente contra inyección. | ||
| Line 31: | Line 31: | ||
| </ | </ | ||
| - | ... y después usar '' | + | ... y después usar '' |
| Hay que tener cuidado con consultas como: | Hay que tener cuidado con consultas como: | ||
| Line 48: | Line 48: | ||
| ===== Servidor Web ===== | ===== Servidor Web ===== | ||
| - | Hay que eligir | + | Hay que elegir |
| - | La primera opción (PHP) es de un nivel más bajo, y uno puede empezar rápidamente con ejemplos simples usando PHP. | + | La primera opción (PHP) es de un nivel más bajo, y se puede empezar rápidamente con ejemplos simples usando PHP. |
| La segunda opción (Django+Python) es un ejemplo de framework // | La segunda opción (Django+Python) es un ejemplo de framework // | ||
| Line 56: | Line 56: | ||
| La tercera opción (Java Servlets) queda un poco desactualizada, | La tercera opción (Java Servlets) queda un poco desactualizada, | ||
| - | Se puede eligir | + | Se puede elegir |
| **Nota 1**: Durante el tutorial se pedirá usar: | **Nota 1**: Durante el tutorial se pedirá usar: | ||
| Line 106: | Line 106: | ||
| sudo apt-get update | sudo apt-get update | ||
| sudo apt-get install apache2 | sudo apt-get install apache2 | ||
| + | </ | ||
| + | |||
| + | La máquina trae nginx, otro servidor web, que ya ocupa el puerto 80. Si al instalar aparece '' | ||
| + | |||
| + | < | ||
| + | sudo systemctl disable --now nginx | ||
| + | sudo systemctl start apache2 | ||
| </ | </ | ||
| Line 120: | Line 127: | ||
| PHP (PHP: Hypertext Preprocessor) es un lenguaje para crear scripts que se ejecutan en el servidor (al contrario de Javascript, por ejemplo, que se ejecuta normalmente en el lado del cliente). | PHP (PHP: Hypertext Preprocessor) es un lenguaje para crear scripts que se ejecutan en el servidor (al contrario de Javascript, por ejemplo, que se ejecuta normalmente en el lado del cliente). | ||
| - | Para instalar PHP con soporte para apache2 y postgres (ojo que si no hay la versión | + | Para instalar PHP con soporte para apache2 y postgres (sin número de versión, se instala la que trae Debian, que es la 8.4): |
| - | < | + | < |
| Ahora, tenemos que reiniciar Apache: | Ahora, tenemos que reiniciar Apache: | ||
| Line 174: | Line 181: | ||
| </ | </ | ||
| - | Este formulario le mandará a '' | + | Este formulario le mandará a '' |
| < | < | ||
| Line 183: | Line 190: | ||
| <?php | <?php | ||
| $name = $_GET[' | $name = $_GET[' | ||
| - | echo "El mensaje es: $name"; | + | echo "El mensaje es: " . htmlspecialchars($name); |
| ?> | ?> | ||
| </ | </ | ||
| Line 227: | Line 234: | ||
| === Debugear / Logs === | === Debugear / Logs === | ||
| - | Si tu aplicación PHP no está funcionado, y en particular si ves "'' | + | Si su aplicación PHP no está funcionando, y en particular si ven "'' |
| < | < | ||
| - | Al final del archivo habrá los errores más recientes. | + | Al final del archivo habrá los errores más recientes. |
| Si el error no es de Apache2 + PHP, puede tratarse de Postgres. Para ver los logs hay que abrir: | Si el error no es de Apache2 + PHP, puede tratarse de Postgres. Para ver los logs hay que abrir: | ||
| - | < | + | < |
| Y ver al final del archivo el posible error. | Y ver al final del archivo el posible error. | ||
| Line 250: | Line 257: | ||
| La idea de Django es proveer una abstracción Modelo/ | La idea de Django es proveer una abstracción Modelo/ | ||
| - | Django tiene un costo inicial muy alto, pero después uno tendrá una abstracción más limpia, la cual es útil, en particular, para aplicaciones complejas. Si ustedes quieren hacer algo más simple y rápido, PHP sería la mejora opción. Si ustedes quieren aprender algo de un framework usado bastante en la práctica, Django es una buena opción PERO aquí sólo se dará la información suficiente para instalar y configurar una aplicación básica. No será un tutorial completo (el enfoque del curso es bases de datos, no aplicaciones web). Aquí puede encontrar más información útil: desde tutoriales hasta documentación: | + | Django tiene un costo inicial muy alto, pero después uno tendrá una abstracción más limpia, la cual es útil, en particular, para aplicaciones complejas. Si ustedes quieren hacer algo más simple y rápido, PHP sería la mejora opción. Si ustedes quieren aprender algo de un framework usado bastante en la práctica, Django es una buena opción PERO aquí sólo se dará la información suficiente para instalar y configurar una aplicación básica. No será un tutorial completo (el enfoque del curso es bases de datos, no aplicaciones web). Aquí pueden |
| === Instalar Python === | === Instalar Python === | ||
| Line 267: | Line 274: | ||
| </ | </ | ||
| - | Considerar que la versión de Python 3 instalada puede variar, en este caso se trabajó con la versión '' | + | Considerar que la versión de Python 3 instalada puede variar, en este caso se trabajó con la versión '' |
| - | (Por defecto, | + | (En Debian 13 no existe el comando |
| === Instalar Django === | === Instalar Django === | ||
| - | Usaremos PIP (un instalador para packages de Python) para instalar la versión más reciente de Django | + | Usaremos PIP (un instalador para packages de Python) para instalar la versión más reciente de Django. Debian no deja instalar paquetes con '' |
| < | < | ||
| - | sudo apt-get install python3-pip | + | sudo apt-get install python3-venv |
| + | mkdir / | ||
| + | cd / | ||
| + | python3 -m venv venv | ||
| </ | </ | ||
| - | Ahora, instalamos Django usando '' | + | Para usar el entorno virtual hay que activarlo: |
| < | < | ||
| - | sudo pip3 install | + | source / |
| </ | </ | ||
| - | También tenemos | + | La línea de comandos empieza ahora con '' |
| + | |||
| + | Ahora, instalamos Django, junto con el soporte para Postgres: | ||
| < | < | ||
| - | sudo apt-get | + | pip install |
| - | sudo pip3 install psycopg2 | + | |
| </ | </ | ||
| Line 298: | Line 309: | ||
| </ | </ | ||
| - | En este tutorial se instalo | + | En este tutorial se instaló |
| - | + | ||
| - | < | + | |
| - | django-admin.py Command no found | + | |
| - | </ | + | |
| - | + | ||
| - | Tenemos que darle el camino correcto al administrador de '' | + | |
| - | + | ||
| - | < | + | |
| - | sudo vi / | + | |
| - | </ | + | |
| - | + | ||
| - | ... y cambiar el camino aquí: | + | |
| - | + | ||
| - | < | + | |
| - | if command -v python3 > /dev/null && test -e / | + | |
| - | </ | + | |
| - | + | ||
| - | ... por: | + | |
| - | + | ||
| - | < | + | |
| - | if command -v python3 > /dev/null && test -e / | + | |
| - | </ | + | |
| - | + | ||
| - | (agregando '' | + | |
| === Crear un proyecto === | === Crear un proyecto === | ||
| - | Ahora que tenemos todo instalado, podemos crear un proyecto inicial en Django. Crearemos una carpeta | + | Ahora que tenemos todo instalado, podemos crear un proyecto inicial en Django, en la carpeta |
| < | < | ||
| - | mkdir / | ||
| cd / | cd / | ||
| </ | </ | ||
| Line 349: | Line 335: | ||
| < | < | ||
| - | sudo python3 / | + | python3 / |
| </ | </ | ||
| Line 356: | Line 342: | ||
| (//Dos cosas que haremos aquí que no se deberían hacer en un sistema de producción: | (//Dos cosas que haremos aquí que no se deberían hacer en un sistema de producción: | ||
| - | Ahora, podemos intentar iniciar un servidor de desarrollo en el puerto 80: | + | Ahora, podemos intentar iniciar un servidor de desarrollo en el puerto 80. Como '' |
| < | < | ||
| - | sudo python3 / | + | sudo / |
| </ | </ | ||
| - | (Si hay un error "'' | + | (Si hay un error "'' |
| < | < | ||
| - | sudo service | + | sudo systemctl disable --now nginx |
| - | sudo service tomcat7 stop | + | sudo systemctl disable --now apache2 |
| + | sudo systemctl disable --now tomcat10 | ||
| </ | </ | ||
| Line 435: | Line 422: | ||
| < | < | ||
| - | sudo python3 / | + | sudo / |
| </ | </ | ||
| Line 469: | Line 456: | ||
| < | < | ||
| - | sudo python3 / | + | python3 / |
| </ | </ | ||
| Line 514: | Line 501: | ||
| { | { | ||
| ' | ' | ||
| - | ' | + | ' |
| ' | ' | ||
| ' | ' | ||
| Line 531: | Line 518: | ||
| < | < | ||
| - | STATIC_ROOT = os.path.join(BASE_DIR, ' | + | STATIC_ROOT = BASE_DIR |
| STATICFILES_DIRS = [ | STATICFILES_DIRS = [ | ||
| - | | + | BASE_DIR / ' |
| ] | ] | ||
| </ | </ | ||
| Line 546: | Line 533: | ||
| < | < | ||
| - | """ | + | """ |
| + | URL configuration for cc3201 project. | ||
| The `urlpatterns` list routes URLs to views. For more information please see: | The `urlpatterns` list routes URLs to views. For more information please see: | ||
| - | https:// | + | https:// |
| Examples: | Examples: | ||
| Function views | Function views | ||
| 1. Add an import: | 1. Add an import: | ||
| - | 2. Add a URL to urlpatterns: | + | 2. Add a URL to urlpatterns: |
| Class-based views | Class-based views | ||
| 1. Add an import: | 1. Add an import: | ||
| - | 2. Add a URL to urlpatterns: | + | 2. Add a URL to urlpatterns: |
| Including another URLconf | Including another URLconf | ||
| - | 1. Import the include() function: from django.conf.urls import | + | 1. Import the include() function: from django.urls import |
| - | 2. Add a URL to urlpatterns: | + | 2. Add a URL to urlpatterns: |
| """ | """ | ||
| - | import os | ||
| - | |||
| from django.conf import settings | from django.conf import settings | ||
| from django.conf.urls.static import static | from django.conf.urls.static import static | ||
| Line 720: | Line 706: | ||
| </ | </ | ||
| - | Ahora, tenemos una vista pero tenemos que mapear un URL a la vista. Para eso, crearemos un archivo nuevo '' | + | Ahora, tenemos una vista pero tenemos que mapear un URL a la vista. Para eso, crearemos un archivo nuevo '' |
| < | < | ||
| Line 748: | Line 734: | ||
| < | < | ||
| - | from django.conf.urls import include, url | + | from django.urls import include |
| </ | </ | ||
| Line 786: | Line 772: | ||
| ' | ' | ||
| ' | ' | ||
| - | ' | + | ' |
| } | } | ||
| } | } | ||
| Line 796: | Line 782: | ||
| DATABASES = { | DATABASES = { | ||
| ' | ' | ||
| - | ' | + | ' |
| ' | ' | ||
| ' | ' | ||
| Line 842: | Line 828: | ||
| </ | </ | ||
| - | Estas corresponden a tablas que usa Django para diversas funcionalidades como manejo de usuarios o permisos. | + | Estas corresponden a tablas que usa Django para diversas funcionalidades como manejo de usuarios o permisos. Django las crea en el primer esquema del '' |
| === Crear un modelo para la base de datos === | === Crear un modelo para la base de datos === | ||
| - | Crearemos | + | Crearemos una tabla para probar la funcionalidad, en el esquema de su proyecto (en '' |
| < | < | ||
| - | CREATE | + | CREATE |
| - | + | ||
| - | ALTER USER cc3201 SET search_path TO test, public; | + | |
| - | </code> | + | |
| - | + | ||
| - | Notar que es importante poner el path público para que Django puede reconocer este nuevo esquema. Ahora creamos la tabla de prueba: | + | |
| - | + | ||
| - | < | + | |
| - | CREATE TABLE test.mes( | + | |
| nombre varchar(255) PRIMARY KEY, | nombre varchar(255) PRIMARY KEY, | ||
| numero int | numero int | ||
| ); | ); | ||
| - | INSERT INTO test.mes VALUES (' | + | INSERT INTO < |
| - | INSERT INTO test.mes VALUES (' | + | INSERT INTO < |
| </ | </ | ||
| Line 887: | Line 865: | ||
| Cada clase refleja una relación en la base de datos con sus atributos y algunas restricciones básicas. Una instancia de esa clase representará una tupla en la relación. | Cada clase refleja una relación en la base de datos con sus atributos y algunas restricciones básicas. Una instancia de esa clase representará una tupla en la relación. | ||
| - | Escribiremos el modelo a un archivo en la carpeta de la aplicación (en este caso '' | + | Escribiremos el modelo |
| < | < | ||
| - | python3 / | + | python3 / |
| </ | </ | ||
| - | Una complicación aquí es que hay que poner un límite al número de caracteres en cada campo del tipo '' | + | Si tienen más tablas, se pueden |
| - | + | ||
| - | < | + | |
| - | | + | |
| - | </ | + | |
| - | + | ||
| - | ... cambiarla por: | + | |
| - | + | ||
| - | < | + | |
| - | models.TextField(max_length=255, | + | |
| - | </ | + | |
| - | + | ||
| - | ... con las opciones que aplican. | + | |
| - | + | ||
| - | :( | + | |
| === Consultar el modelo con Python === | === Consultar el modelo con Python === | ||
| - | Dado un modelo, Django tiene [[https:// | + | Dado un modelo, Django tiene [[https:// |
| < | < | ||
| Line 962: | Line 926: | ||
| === Consultar a la base de datos usando SQL === | === Consultar a la base de datos usando SQL === | ||
| - | En el proyecto, pueden hacer consultas por el modelo de Django o pueden [[https:// | + | En el proyecto, pueden hacer consultas por el modelo de Django o pueden [[https:// |
| - | Crearemos una vista nueva para ejemplificar la funcionalidad: | + | Crearemos una vista nueva para ejemplificar la funcionalidad |
| < | < | ||
| Line 985: | Line 949: | ||
| def consultar_mes(mes): | def consultar_mes(mes): | ||
| with connection.cursor() as cursor: | with connection.cursor() as cursor: | ||
| - | cursor.execute(" | + | cursor.execute(" |
| results = namedtuplefetchall(cursor) | results = namedtuplefetchall(cursor) | ||
| return results | return results | ||
| Line 1029: | Line 993: | ||
| </ | </ | ||
| - | Crearemos un formulario para pedirle al usuario | + | Crearemos un formulario para pedir el nombre de un mes: |
| < | < | ||
| Line 1045: | Line 1009: | ||
| </ | </ | ||
| - | La acción dice que vamos a mandar la información entregada | + | La acción |
| Ahora, podemos usar Django para definir los detalles del formulario (para reemplazar '' | Ahora, podemos usar Django para definir los detalles del formulario (para reemplazar '' | ||
| Line 1111: | Line 1075: | ||
| def consultar_mes(mes): | def consultar_mes(mes): | ||
| with connection.cursor() as cursor: | with connection.cursor() as cursor: | ||
| - | cursor.execute(" | + | cursor.execute(" |
| results = namedtuplefetchall(cursor) | results = namedtuplefetchall(cursor) | ||
| return results | return results | ||
| Line 1146: | Line 1110: | ||
| === Eso === | === Eso === | ||
| - | Con el ejemplo previo, y por fin, tienen todos los ingredientes para armar su aplicación usando Django. Un recordatorio: | + | Con el ejemplo previo, y por fin, tienen todos los ingredientes para armar su aplicación usando Django. Un recordatorio: |
| ==== Opción 3: Java Servlets ==== | ==== Opción 3: Java Servlets ==== | ||
| Line 1157: | Line 1121: | ||
| La opción de Java Servlets es una opción legada que tenía relevancia cuando el lenguaje usado en el curso Introducción a Programación fue Java. En vez de borrar la opción, la hemos mantenido acá, pero en general, no es una opción recomendada, | La opción de Java Servlets es una opción legada que tenía relevancia cuando el lenguaje usado en el curso Introducción a Programación fue Java. En vez de borrar la opción, la hemos mantenido acá, pero en general, no es una opción recomendada, | ||
| - | === Instalar | + | === Instalar |
| - | Hay que instalar '' | + | Hay que instalar '' |
| < | < | ||
| sudo apt-get update | sudo apt-get update | ||
| - | sudo apt-get install | + | sudo apt-get install |
| </ | </ | ||
| - | === Configurar | + | (Desde Tomcat 10, los servlets usan los paquetes '' |
| + | |||
| + | === Configurar | ||
| Tenemos que poner un usuario " | Tenemos que poner un usuario " | ||
| < | < | ||
| - | sudo nano /etc/tomcat9/ | + | sudo nano /etc/tomcat10/ |
| </ | </ | ||
| Line 1177: | Line 1143: | ||
| < | < | ||
| - | < | + | < |
| </ | </ | ||
| </ | </ | ||
| Line 1184: | Line 1150: | ||
| < | < | ||
| - | < | + | < |
| <user username=" | <user username=" | ||
| </ | </ | ||
| Line 1191: | Line 1157: | ||
| ... y guardar el archivo. | ... y guardar el archivo. | ||
| - | Por defecto, | + | Por defecto, |
| < | < | ||
| - | sudo nano /etc/tomcat9/server.xml | + | sudo nano /etc/tomcat10/server.xml |
| </ | </ | ||
| Line 1209: | Line 1175: | ||
| </ | </ | ||
| - | ... y guardar el archivo. | + | ... y guardar el archivo. El servicio |
| - | + | ||
| - | Ahora ... | + | |
| - | + | ||
| - | < | + | |
| - | sudo nano / | + | |
| - | </ | + | |
| - | + | ||
| - | Hay que cambiar: | + | |
| - | + | ||
| - | < | + | |
| - | # | + | |
| - | </ | + | |
| - | + | ||
| - | por (ojo: hay que borrar el gato): | + | |
| - | + | ||
| - | < | + | |
| - | AUTHBIND=yes | + | |
| - | </ | + | |
| - | + | ||
| - | ... y guardar el archivo. | + | |
| - | + | ||
| - | El próximo paso es deshabilitar IPv6 porque | + | |
| - | + | ||
| - | < | + | |
| - | sudo nano / | + | |
| - | </ | + | |
| - | + | ||
| - | Hay que poner: | + | |
| - | + | ||
| - | < | + | |
| - | export CATALINA_OPTS=" | + | |
| - | </ | + | |
| - | + | ||
| - | Después, en: | + | |
| - | + | ||
| - | < | + | |
| - | sudo nano / | + | |
| - | </ | + | |
| - | + | ||
| - | Hay que comentar la primera línea aquí y agregar la segunda: | + | |
| - | + | ||
| - | < | + | |
| - | # exec " | + | |
| - | exec authbind --deep " | + | |
| - | </ | + | |
| - | + | ||
| - | Por fin, está lista la configuración del puerto | + | |
| - | Finalmente, hay que darle a Tomcat acceso al controlador de Postgres: | + | Finalmente, hay que darle a Tomcat acceso al controlador de Postgres |
| < | < | ||
| - | sudo apt-get install | + | sudo apt-get install |
| - | cd /usr/share/tomcat9/lib/ | + | sudo ln -s /usr/share/java/postgresql.jar |
| - | sudo wget https://jdbc.postgresql.org/download/postgresql-9.4.1212.jre6.jar | + | |
| </ | </ | ||
| Ahora se puede usar JDBC para consultar a Postgres desde Tomcat. | Ahora se puede usar JDBC para consultar a Postgres desde Tomcat. | ||
| - | === Correr el servidor de tomcat9 | + | === Correr el servidor de tomcat10 |
| - | En el caso de que Apache esté instalado y corriendo, hay que deshabilitarlo (si no está instalado, se puede saltar | + | La máquina trae nginx, que ya ocupa el puerto 80, así que hay que deshabilitarlo. |
| < | < | ||
| - | sudo / | + | sudo systemctl disable --now nginx |
| + | sudo systemctl disable --now apache2 | ||
| </ | </ | ||
| - | Está lista la configuración así que tenemos que reiniciar | + | Está lista la configuración así que tenemos que reiniciar |
| < | < | ||
| - | sudo service | + | sudo service |
| </ | </ | ||
| Line 1285: | Line 1204: | ||
| < | < | ||
| - | http:// | + | http://grupoXX.cc3201.dcc.uchile.cl/ |
| </ | </ | ||
| Line 1292: | Line 1211: | ||
| === Un ejemplo de un Java Servlet === | === Un ejemplo de un Java Servlet === | ||
| - | (//Una confesión: en el ejemplo | + | (//Una confesión: en el ejemplo, |
| Efectivamente, | Efectivamente, | ||
| - | Descargar | + | Descargar |
| En '' | En '' | ||
| Line 1306: | Line 1225: | ||
| En '' | En '' | ||
| - | En '' | + | En '' |
| - | Tenemos que crear un paquete '' | + | Tenemos que crear un paquete '' |
| Ahora hay que refrescar el proyecto: hacer clic en la carpeta del proyecto y presionar '' | Ahora hay que refrescar el proyecto: hacer clic en la carpeta del proyecto y presionar '' | ||
| - | Tenemos que subir el archivo '' | + | Tenemos que subir el archivo '' |
| < | < | ||
| - | sudo chown -R tomcat9:tomcat9 | + | sudo chown -R tomcat:tomcat |
| - | sudo chmod -R g+r /var/lib/tomcat9/conf | + | sudo chmod -R g+r /var/lib/tomcat10/conf |
| - | sudo chmod -R g+w /var/lib/tomcat9/conf | + | sudo chmod -R g+w /var/lib/tomcat10/conf |
| - | sudo chmod -R g+w /var/lib/tomcat9/logs | + | sudo chmod -R g+w /var/lib/tomcat10/logs |
| - | sudo chmod -R g+w /var/lib/tomcat9/webapps | + | sudo chmod -R g+w /var/lib/tomcat10/webapps |
| - | sudo chmod -R g+w /var/lib/tomcat9/work | + | sudo chmod -R g+w /var/lib/tomcat10/work |
| - | sudo chmod -R g+s /var/lib/tomcat9/conf | + | sudo chmod -R g+s /var/lib/tomcat10/conf |
| - | sudo chmod -R g+s /var/lib/tomcat9/logs | + | sudo chmod -R g+s /var/lib/tomcat10/logs |
| - | sudo chmod -R g+s /var/lib/tomcat9/webapps | + | sudo chmod -R g+s /var/lib/tomcat10/webapps |
| - | sudo chmod -R g+s /var/lib/tomcat9/work | + | sudo chmod -R g+s /var/lib/tomcat10/work |
| - | sudo usermod -a -G tomcat9 | + | sudo usermod -a -G tomcat |
| </ | </ | ||
| - | Después, [[https:// | + | (El grupo nuevo corre desde la próxima vez que entren por SSH, así que hay que salir con '' |
| + | |||
| + | Después, [[https:// | ||
| Ir a: | Ir a: | ||
| Line 1338: | Line 1259: | ||
| Aquí se pueden ver tres ejemplos simples de aplicaciones que pueden adaptar para su aplicación. | Aquí se pueden ver tres ejemplos simples de aplicaciones que pueden adaptar para su aplicación. | ||
| - | OJO: ¡es importante usar métodos seguros contra inyección! | + | OJO: ¡es importante usar métodos seguros contra inyección! |
| - | Si hay un problema con el servlet, el log está aquí: | + | Si hay un problema con el servlet, el log se puede ver así: |
| < | < | ||
| - | sudo more / | + | sudo journalctl -u tomcat10 |
| </ | </ | ||
| + | |||
| + | (y también en los archivos de ''/ | ||
| ... el error más común es un problema con la contraseña/ | ... el error más común es un problema con la contraseña/ | ||
| Line 1356: | Line 1279: | ||
| ... pero no podremos ofrecerles soporte si hay problemas. | ... pero no podremos ofrecerles soporte si hay problemas. | ||
| - | ====== Conexión Externa ===== | + | ====== Conexión Externa |
| Finalmente, se deben configurar los puertos de modo que la aplicación web quede disponible para acceder a través de una URL. Puede encontrar instrucciones de como hacerlo visitando [[proyecto: | Finalmente, se deben configurar los puertos de modo que la aplicación web quede disponible para acceder a través de una URL. Puede encontrar instrucciones de como hacerlo visitando [[proyecto: | ||
proyecto/armar_la_aplicacion_inicial.txt · Last modified: by semorale
