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
Adjunto | Tamaño |
---|---|
Nueva carpeta.zip | 403.75 KB |
- Inicie sesión o regístrese para enviar comentarios
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.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
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)
<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
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).
☺
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
Tenemos el uso de jstl core que te proporciona un iterador
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! ;-)
~~~
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
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
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)
<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
Muy bien se ve mejor
Muy bien se ve mejor cierto?
Bueno yo te aporto otra opinion en tu clase modelo tienes:
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:
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
Y para el servlet pudiera
Y para el servlet pudiera ser
//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);
}
Y ya andando entrados en esto
Y ya andando entrados en esto :)
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;
}
id_banda = rs.getInt(1);
nombre = rs.getString(2);
pais = rs.getString(3);
genero = rs.getString(4);
}
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
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
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.
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
tutorial
tutorial http://programandoointentandolo.com/2013/05/como-crear-un-pool-de-conexi...
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.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 :)
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.
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
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 :)
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
.Excelente
Gracias por tus buenos consejos mi estimado, ahora me queda mas claro que es el Singleton, tienes mucha razón, seguiré probando :)