html y jsp

hola buenas noches soy novato en esto de programacion y tengo dudas espero me puedan ayudar actualmente estoy aprendiendo java resulta que me dejaron crear una pagina web donde se valide el formulario y lo codifique a jsp (servlets) ya logre validar el formulario pero no se como integrarlo a jsp para despues integrarlo a una base de datos espero me puedan ayudar ya que no tengo ni idea les dejo adjunto el codigo fuente

AdjuntoTamaño
Nueva carpeta.zip403.75 KB

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de hellocannibal

Podrías tomar esto como base.

Te puedo ayudar de cierta manera en la cual tu mejores este código que te dejare aquí y lo aportes, espero darte una pequeña idea :D
Este ejemplo es una consulta a tu BD

Inicias con tu Base de Datos

Creas un proyecto Web

Aquí puedes manejar una arquitectura 3 Capas
De la cuale tu controlador será tu Bean donde manejaras tus getter and setter de tus variables la siguiente sera tu model la cual contendrá tu conexión a la bd y todos los métodos que quieras que realice tu aplicación y tu vista sera el servlet la encargada de gestionar los procesos del usuario....

En tu clase model

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.sql.DataSource;

import com.hellocannibal.bean.Bandas;

public class ModelO {
        private static Connection conn;

       
        public static Connection getConnection() throws Exception{
                if(conn != null)
                        return conn;
                else{
                        try{
                        Class.forName("oracle.jdbc.OracleDriver");
                        String dbUrl = "jdbc:oracle:thin:@localhost:1521/xe";
                        conn = DriverManager.getConnection(dbUrl, "OracleDB", "toor");
                        return conn;
                        }
                        catch(Exception e){e.printStackTrace();}
                }
                return conn;
        }
        public static ArrayList<Bandas> getNombres(String nombre)throws Exception{
                 ArrayList<Bandas> list = new ArrayList<>();
               
                    ResultSet rs=null;
                        conn=ModelO.getConnection();
                        PreparedStatement ps=null;
                       
                        try{
                    ps = conn.prepareStatement("SELECT id_banda, nombre, pais, genero FROM Bandas WHERE nombre=?");
                        ps.setString(1, nombre);
                        rs=ps.executeQuery();
                                while (rs.next()) {
                                        Bandas bs= new Bandas();
                                        bs.setId_banda(rs.getInt(1));
                                        bs.setNombre(rs.getString(2));
                                        bs.setPais(rs.getString(3));
                                        bs.setGenero(rs.getString(4));
                                        list.add(bs);
                                }
                        } catch (SQLException e) {
                            e.getCause();
                        }
                 return list;
                 }
         
}

En el Bean

 
package com.hellocannibal.bean;

public class Bandas {
       
        private int id_banda;
        private String nombre;
        private String pais;
        private String genero;
       
        public int getId_banda() {
                return id_banda;
        }
        public void setId_banda(int id_banda) {
                this.id_banda = id_banda;
        }
        public String getNombre() {
                return nombre;
        }
        public void setNombre(String nombre) {
                this.nombre = nombre;
        }
        public String getPais() {
                return pais;
        }
        public void setPais(String pais) {
                this.pais = pais;
        }
        public String getGenero() {
                return genero;
        }
        public void setGenero(String genero) {
                this.genero = genero;
        }
       
       
}

En tu Servlet

String nombre = request.getParameter("nombre");
               
                if(nombre != null){
                       
                ArrayList<Bandas> lista= new ArrayList<>();
                try{
                        lista=ModelO.getNombres(nombre);
                        if(lista.isEmpty()){
                                request.getRequestDispatcher("Error.jsp").forward(request, response);
                        }else{
                                request.setAttribute("lista", lista);
                                request.getRequestDispatcher("Resultados.jsp").forward(request, response);
                        }
                }catch(Exception e){e.printStackTrace();
               
                }

Y por ultimo tu JSP de entrada (Puede ser JSP o un HTLM es lo mismo)

<form action="Gestion.com" method="post">
        <label>Nombre de la Banda: <input type="text" id="nombre" name="nombre" required/></label>
        <input type="submit" value="Consultar"/>
</form>

Este es el JSP donde pintas tus resultados

<% ArrayList<Bandas> lista=(ArrayList) request.getAttribute("lista");
Iterator it= lista.iterator();
while(it.hasNext()){
        Bandas bs= (Bandas) it.next();
       
%>
<label>ID: <%= bs.getId_banda() %></label>
<br>
<label>Nombre de la Banda: <%= bs.getNombre() %></label>
<br>
<label>País de Origen: <%= bs.getPais() %></label>
<br>
<label>Genero: <%= bs.getGenero() %></label>

<%} %>

Espero sea útil lo que te muestro, échale ganas yo igual voy iniciando en esto del desarrollo web.
Saludos

Vide(it)?o ;)

 

http://youtu.be/JwVyDSolD6I

▲ Aquí hay un video (MySQL 5.1 + NetBeans 7.2 + Glassfish 3.1 + JPA 2 + Servlet 3).

Imagen de arterzatij

JSP buena practica

En los JSP es mucho mejor si puedes llegar a omitir la incrustacion de codigo JAVA, se puede hacer pero las buenas practicas es que no lo hagas :)

Para eso tenemos los taglibs :)

En el caso de la iteracion que tienes

Este es el JSP donde pintas tus resultados

<% ArrayList<Bandas> lista=(ArrayList) request.getAttribute("lista");
Iterator it= lista.iterator();
while(it.hasNext()){
        Bandas bs= (Bandas) it.next();
       
%>
<label>ID: <%= bs.getId_banda() %></label>
<br>
<label>Nombre de la Banda: <%= bs.getNombre() %></label>
<br>
<label>País de Origen: <%= bs.getPais() %></label>
<br>
<label>Genero: <%= bs.getGenero() %></label>
<%} %>

Tenemos el uso de jstl core que te proporciona un iterador

Imagen de hellocannibal

Hey @arterzatij

Si, ya lo habia escuchado y visto en otra parte eso de tratar de redicir a lo minimo el codigo java en un jsp :P
Ahorita checo los link que me dejaste para mejirar esta parte con los taglibs Gracias

 ¡Psst! Oye, Eduardo...

 

¡Psst! Oye, Eduardo... Tal vez quieras ver este libro sobre JSTL. ¡Excelente recurso! ;-)

~~~

Imagen de hellocannibal

Bien @Jpaul !

Si eh por que solo habia aplicado los taglibs con struts pero nunca lo maneje en una simple practica como la aquí mostre siempre lo maneje de esa manera usando codigo java dentro del jsp seria bueno que aprenda a usar estos taglibs para pintar mis resultados de mi proceso servlet :D Gracias

Imagen de hellocannibal

JSTL (mi primer intento)

Hola aquí les dejo la modificación del código al momento de arrojar los resultados al JSP, si tienen alguna mejora de esto estaría genial que me lo mencionaran para ir perfeccionando mi entorno de desarrollo :D

Mi modificación fue también fue a mi servlet (solo una linea) y quedo así...
Servlet

String nombre = request.getParameter("nombre");
               
                if(nombre != null){
                       
                ArrayList<Bandas> lista= new ArrayList<>();
                try{
                        lista=ModelO.getNombres(nombre);
                        if(lista.isEmpty()){
                                request.getRequestDispatcher("Error.jsp").forward(request, response);
                        }else{
                               
                                request.getSession().setAttribute("lista", lista);  // lo agregado fue request.getSession()
                       
                               
                                request.getRequestDispatcher("Resultados.jsp").forward(request, response);
                        }
                }catch(Exception e){e.printStackTrace();
               
                }

Y aquí mi JSP con con el uso de taglibs JSTL
Agregando el jstl-1.2.jar a la carpera lib del proyecto (Si usas tomcat 7 de lo contrario cambiaría la versión del jstl)

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<body>

<h1>Resultados</h1>
<c:forEach items="${sessionScope.lista}" var="lista">
    ID:  ${lista.id_banda} <br/>
    Nombre:  ${lista.nombre}<br/>
    Pais:  ${lista.pais}<br/>
    Genero:  ${lista.genero}<br/>
</c:forEach>
 

</body>

Bueno espero y lo haya echo de la mejor manera y si no háganme lo saber por favor. Gracias

Imagen de arterzatij

Muy bien se ve mejor

Muy bien se ve mejor cierto?

Bueno yo te aporto otra opinion en tu clase modelo tienes:

class ModelO
 public static Connection getConnection() throws Exception{
                if(conn != null)
                        return conn;
                else{
                        try{
                        Class.forName("oracle.jdbc.OracleDriver");
                        String dbUrl = "jdbc:oracle:thin:@localhost:1521/xe";
                        conn = DriverManager.getConnection(dbUrl, "OracleDB", "toor");
                        return conn;
                        }
                        catch(Exception e){e.printStackTrace();}
                }
                return conn;
        }

Yo la modificaria a lo siguiente:

class ModelO
public static Connection getConnection () {  //Removemos el throws ya que tenemos un bloque try

    if ( conn == null ) { // La verificacion la realizamos a null si es null creamos la conexion

        try {

            Class.forName("oracle.jdbc.OracleDriver");
            String dbUrl = "jdbc:oracle:thin:@localhost:1521/xe";
            conn = DriverManager.getConnection(dbUrl, "OracleDB", "toor");

        } catch ( Exception e ) {

            e.printStackTrace(); // Aqui sugiero que hagas alguna otra cosa que solo
                                                // pintar el stack puedes enviar un runtime exception
                                               //por ejemplo que lo cache una capa mas arriba y muestres un error o algo.

        }
       
    }

   return conn; // asi solo tenemos un solo punto de salida del metodo y ayuda al debbug

}  

Tomar en cuenta

Imagen de arterzatij

Y para el servlet pudiera

Y para el servlet pudiera ser

Cambios al servlet
String nombre = request.getParameter("nombre");

//Validar que nombre no sea null o que al quitar los espacios no sea una cadena vacia
if( nombre != null && nombre.trim() != "" ) {
       
        List<Bandas> lista = null; //Inicializamos a null ya que la clase ModelO nos brindara el objeto construido y utilizar List la interface
        String view = "Error.jsp"; // Si todo va bien esta vista cambiara a Resultados

        try{
                lista = ModelO.getNombres( nombre );

                if( ! lista.isEmpty() ) { //Si la lista no esta vacia

                        request.getSession().setAttribute("lista", lista);
                        view = "Resultados.jsp";
                       
                }
        } catch (Throwable e) { // Con esto cacharas todas las runtime exceptions y exceptions que se te hayan pasado
                e.printStackTrace();
                //En caso de un error no se si estas mostrando resultados jsp si no asi como esta te muestra error jsp
        }

        request.getRequestDispatcher( view ).forward(request, response);

}

Imagen de arterzatij

Y ya andando entrados en esto

Y ya andando entrados en esto :)

getNames @ ModelO
// Es bueno tener el query fuera para mejorar la lectura del codigo
private final static String FIND_BANDS_BY_NAME = "SELECT id_banda, nombre, pais, genero FROM Bandas WHERE nombre=?";

public static List<Bandas> getNombres(String nombre) { //Utilizamos List y removemos el throws

    List<Bandas> list = new ArrayList<Bandas>();
    PreparedStatement ps = null;
    ResultSet rs = null;

    //getConnection es un metodo de clase asi que puedes invocarla sin anteponer el nombre de la clase
    // podemos evitar la declaracion de conn en este bloque y hacer uso directo del metodo
    //conn=ModelO.getConnection();  
 
    // Te recomiendo que la obtencion de la conexion sea un metodo privado

    try{
       
        ps = getConnection().prepareStatement( FIND_BANDS_BY_NAME );
       
        ps.setString(1, nombre);
       
        rs = ps.executeQuery();
       
        while ( rs.next() ) {
            // Podemos delegarle la construccion y asignacion de valores
            // al constructor de Bandas haciendo uso del resultSet
            list.add( new Bandas( rs ) );
        }
    } catch (SQLException e) {
        e.getCause();
    }
   
    return list;
}

Constructor de bandas usando el resultset
public Bandas( ResultSet rs ) {
 
    id_banda = rs.getInt(1);
    nombre = rs.getString(2);
    pais = rs.getString(3);
    genero = rs.getString(4);
}
Imagen de hellocannibal

Bien !!! @arterzatij

Concuerdo y atenderé lo comentado, para próximos post solo que mi duda que me inquieta es la de método de conexión como lo menciona @ezamudio y tratare de investigar más a fondo sobre ese tema pues lo que busco es una forma no del modo de tratar de ahorra lineas de código ni de ahorrar tiempo solo busco la forma mas efectiva y productiva de generar una método de conexión a una base de datos cual quiera que esta sea sin el uso de dependencias. Y no digo que sea malo el uso de ellas pero hay que iniciar de lo primero y claro por que no posteriormente ir utilizándolas. Gracias @arterzatij ah sido muy oportuno tus comentarios y observaciones me pondré a practicar eh ir subiendo un poco mas el nivel no sé tal ves con Struts2 que es lo que eh visto un poco más. Y por que no ah usar Template de conexión a base de datos más PRO jajaja

SALUDOS

Imagen de arterzatij

Bueno la cuestion con la conn

Bueno la cuestion con la conn es que la estas dejando abierta y ahorita tal vez no lo veas pero si ya hay mas concurrencia "usuarios" tendras un problema con la conexion a la DB, por eso si no se utilizan cosas como las que enlisto nuestro buen ezamudio, hay que usar minimamente los bloques try con recursos que ya utilizaste previamente aqui

Imagen de arterzatij

Por otro lado tu sigue como

Por otro lado tu sigue como vas :), has codigo, practica codigo postea tu codigo y vendran las opiniones, todos tenemos diferentes metodos de programar y otras que seran mas estandares asi que solo es cuestion tuya :)

Y otra sugerencia utiliza bitbucket o github para que cuelgues ahi tu codigo y puedas compartir tus practicas :) y veas la evolucion de tu codigo con forme llegan los comentarios.

Imagen de hellocannibal

Vale haber si subo algo en

Vale haber si subo algo en estos días. Y si, cuento con GitHub :P
Ahí cuento con mi primer sistema (mini sistemas de consultas) que hice a nivel semi-profecional. Por eso la otra ves pedía ayuda para el código de Auto-completar

Imagen de arterzatij

tutorial

Imagen de chicowed

Por no cerrar las conexiones

Por no cerrar las conexiones te puede pasar lo que ami xD

Pero bueno ya lo solucione de momento, aunque no fue la mejor opcion "Singleton"

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Josue
 */

public class Conexion {

    public static Conexion instance;//Singleton
    private Connection cn;

    private Conexion() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            cn = DriverManager.getConnection("jdbc:mysql://localhost/agenda", "dbejemplo", "");
        } catch (SQLException | ClassNotFoundException ex) {
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
   
    public synchronized static Conexion comprobarEstado() {
        if (instance == null) {
            instance = new Conexion();
        }
        return instance;
    }

    public Connection getCn() {
        return cn;
    }
   
    public void cerrarConexion() {
        Conexion.instance = null;
    }
}

Seguire las recomendasiones de ezamudio de usar JdbcTemplate de Spring :)

Imagen de ezamudio

mal

Ese códgio está mal, no se cierra la conexión en ningún lado... y eso de "cerrarConexion" simplemente elimina la referencia al supuesto singleton, de modo que si un componente lo está usando, otro lo puede eliminar, no entiendo qué pretendías hacer con ese código pero no creo que funcione en la práctica.

Imagen de chicowed

Lo probe y con una aplicacion

Lo probe y con una aplicacion de escritorio y funciono al menos para lo que la ocupaba era algo sencillo, según yo cerraba la conexion con un finally

PreparedStatement ps;
        try {
            ps = cn.getCn().prepareStatement(sqlDelete);
            ps.setString(1, key.toString());

            if (ps.executeUpdate() > 0) {
                return true;
            }
        } catch (SQLException e) {
            Logger.getLogger(ContactoDAO.class.getName()).log(Level.SEVERE, null, e);
        } finally {
            cn.cerrarConexion();
        }
        return false;

con el finally eliminaba la referencia al singleton como dices, seguire estudiando para mejorar mi programación gracias :)

Imagen de ezamudio

pero

OK invocas el método cerrarConexion en un finally. Y eso qué? Ese método solamente elimina la referencia a la instancia que tenías de un singleton, cosa que nunca debería pasar. Un singleton es una instancia única, debe ser siempre la misma. Tu implementación de un singleton no es ni singleton, ni son instancias privadas. Si un componente llama getCn() después de que otro llamó cerrarConexion, le va a salir una NPE.

Si vas a implementar un singleton, asegúrate que siempre le pases la misma instancia a todo mundo y nunca se puede eliminar ni crear otra. Ese patrón ya ha sido analizado hasta la muerte en un montón de post en este sitio, búscalos para no estar inventando el hilo negro con la manera correcta de implementar un singleton.

Si no quieres un singleton, quita los métodos estáticos de Conexion y deja que mejor cada componente que necesite una conexión haga una nueva instancia usando new.

Imagen de chicowed

Excelente

Gracias por tus buenos consejos mi estimado, ahora me queda mas claro que es el Singleton, tienes mucha razón, seguiré probando :)