Acabo de aprender el marco SpringMVC recientemente, y siente que de hecho es mucho más conveniente y reduce mucho código redundante. Hice un pequeño proyecto para practicar. Este es un proyecto básico de aplicación SpringMVC. Mybatis no se usa. Las funciones del proyecto son bastante completas, y las funciones básicas de suma, eliminación, modificación y búsqueda se realizan.
Entorno del proyecto:
-Sistema: Win10
-NULBIENTO DE DESARROLLO: EclipseOxyGenReleaseCandidate3 (4.7)
-JDK Versión: Java1.8 (121)
-mysql: 5.7
-Spring: 4.0
-Tomcat: 8.5
Técnicas utilizadas:
springmvcspringjspjdbcjavabeanjsjstl
Dirección de acceso: http: // localhost: 8080/su nombre de proyecto/todo
Declaración: Soy solo un novato que acaba de comenzar, e inevitablemente hay algún error en el código que escribí. Si lo encuentra, por favor, señale, gracias a todos.
El proceso detallado se publica a continuación
1. Primero cree un proyecto web (DynamicWebProject)
Escribí el nombre del proyecto yo mismo, no más detallado
2. Esta es mi estructura de proyecto completa
Acabo de usar la función y no usé la interfaz. Solo usé tres clases simples, la clase de entidad en el paquete Bean, la clase de acceso a la base de datos DAO y la clase de control de interfaz de la capa del controlador.
Todos los paquetes JAR referenciados están en la carpeta/WebContent/Web-Inf/Lib, que es diferente de los proyectos Java ordinarios.
3. Código de Java específico
1. Clase estudiantil, la clase de entidad primero necesita escribir un Javabean. El mío es estudiante como Javabean. El código detallado es el siguiente:
paquete bean; estudiante de clase pública {ID de entero privado; // ID de estudiante Nombre de cadena privada; // Nombre del alumno Doble Javascore; // Java Score Double HTMLSCORE privado; // HTML Puntuación Private Double CSSSCORE; // CSS Score Doble TotalScore privado Doble Totalscore; public Integer getId () {return id; } public void setid (ID de entero) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } public doble getJavascore () {return javascore; } public void setJavascore (doble javascore) {this.javascore = javascore; } public doble gethtmlscore () {return htmlscore; } public void sethtmlscore (doble htmlscore) {this.htmlscore = htmlscore; } public Double GetCSSSSCORE () {return cssscore; } public void setCSSSCORE (doble cssscore) {this.cssscore = cssscore; } public doble getTotalScore () {return TotalScore; } public void settotalScore (doble totalcore) {this.totalScore = totalScore; }}2. Studentdao, la clase de operación de acceso a la base de datos es entonces el código de la capa DAO, es decir, la capa de acceso de datos. Aquí hay una clase encapsulada por Spring (JDBCTemplate), que contiene algunos métodos para operar la base de datos. No hay necesidad de escribir mucho código repetido usted mismo, solo escriba declaraciones SQL. Aquí está el código específico:
paquete dao; import java.sql.ResultSet; import java.sql.sqlexception; import java.sql.types; import java.util.list; import og.springframework.jdbc.core.jdbctemate; import og.springframework.jdbc.core.rowmapper; StudentDao { / ** * @fields jdbctemplate: toDo * / private jdbctemplate jdbctemplate; / ** * Clase proporcionada por Spring * * @param jdbctemplate * Tipo de valor de retorno: void * @author Janinus */ public void setjdbctemplate (jdbctemplate jdbctemplate) {this.jdbctemplate = jdbctemplate; } / ** * Consulta a todos los estudiantes * * @return Tipo de valor de retorno: Lista <deudante> * @author Janinus * / Public List <deude> QUIERYALL () {String sql = "Seleccionar id, nombre, javascore, htmlscore, cssscore de student"; // asigna el resultado de la consulta en la clase de estudiante, agrégalo a la lista y devuelve return jdbctemplate.query (sql, new studentMapper ()); } / ** * consulta por nombre * * @param name * @return Tipo de valor de retorno: list <deuding> * @author Janinus * / public List <deude> QueryByName (name de cadena) {String sql = "Seleccionar id, nombre, Javascore, htmlscore, csssscore from Student Where Name como '%" + Name + "%'";;; return jdbctemplate.query (SQL, new StudentMapper ()); } / ** * Agregar estudiante * * @param Student * @return Tipo de valor de retorno: boolean * @author Janinus * / public boolean AddStu (estudiante estudiante) {String sql = "Insertar en estudiante (id, nombre, javascore, htmlscore, cssscore) valores (0,?,?,,?)"; return jdbctemplate.update (sql, nuevo objeto [] {student.getName (), student.getJavasCore (), student.gethtmlscore (), student.getcssssssscore ()}, new int [] {tipos.varchar, tipos.doble, tipos.dovers, tipos.dovers, tipos.doble}) == 1; } / ** * Eliminar alumno * * @param id * @return Tipo de valor de retorno: boolean * @author Janinus * / public boolean deletestu (ID entero) {String sql = "Eliminar del estudiante donde id =?"; return jdbctemplate.update (sql, id) == 1; } / ** * Actualizar información del estudiante * * @param Student * @return Tipo de valor de retorno: boolean * @author Janinus * / public boolean UpdateStu (estudiante estudiantil) {String sql = "actualizar set name =?, Javascore =?, Htmlscore =?, Csssscore =? Donde id =?"; Objeto stuobj [] = nuevo objeto [] {student.getName (), student.getjavascore (), student.gethtmlscore (), student.getcsssssssssssssscore (), student.getid ()}; return jdbctemplate.update (sql, stuobj) == 1; } /** * Return the total score of the top n students* * @param num * @return Return value type: List<Student> * @author janinus */ public List<Student> topNum(int num) { String sql = "select id,name,javaScore+htmlScore+cssScore from student order by javaScore+htmlScore+cssScore desc ,name asc limit ?"; return jdbctemplate.query (SQL, New RowMapper <deudent> () {@Override Public Student Maprow (ResultSet RS, int Rownum) lanza SQLException {// TODO Generado automático Método STUB Student = New Student (); Student.SetId (Rs.getInt (1)); Student.setName (Rs.getString (2); Student.settotalscore (rs.getDouble (3)); } / ** * * Mapeo de la base de datos de StudentMapper * * @classname studentMapper * @author Janinus * @Date 27 de junio de 2017 * @version v1.0 * / class StudentMapper implementos RowMapper <deudent> {@Override Public Student Maprow (Resultsetset Rs, int Alumno(); student.setid (rs.getInt (1)); student.setName (rs.getString (2)); Student.SetJavascore (Rs.GetDouble (3)); student.sethtmlscore (rs.getDouble (4)); student.setcsssscore (rs.getDouble (5)); Estudiante de regreso; }}}3. StudentController, la clase de interacción front-end es finalmente la clase de controlador estudiantil de control relacionada con la interacción del usuario. Esta clase se usa principalmente para combinar el front-end y el fondo para lograr una interacción completa. Aquí está el código específico:
controlador de paquete; import org.springframework.context.applicationContex org.springframework.web.bind.annotation.requestmapping; import.student; import dao.studentdao; @ControllerPublic Class StudentController { / ** * * Obtenga toda la información del estudiante de la base de datos y devuelva los datos al índice de página de inicio, JSP * * @param model * @return Tipo de valor: String * @author * = "/All") public String Queryall (modelo modelo) {ApplicationContext context = new ClassPathXMLApPlicationContext ("ApplicationContext.xml"); // Obtener dao studentdao dao = (studentdao) context.getBean ("dao"); Model.addattribute ("Estudiantes", dao.queryall ()); Model.addattribute ("tops", dao.topnum (3)); return "index.jsp"; }/** * Encuentre a los estudiantes por nombre, use la búsqueda difusa y devuelva el resultado a index.jsp * * @param name * @param modelo * @return Tipo de valor de retorno: cadena * @author janinus */@requestmapping (valor = "/querybyname") public string queryByName (nombre de cadena, modelo modelo) {Aplicación Contexto de texto = nuevo context = new NewnEn ClasspathxmLapplicationContext ("ApplicationContext.xml"); // Obtener Dao del Container de Contenedor IOC Dao = (StudentDao) context.getBean ("Dao"); Model.addattribute ("Students", dao.queryByName (nombre)); Model.addattribute ("tops", dao.topnum (3)); return "index.jsp"; } /** * Add new student and return the result to the all page, forwarded from all to the home page* @param name * @param javaScore * @param htmlScore * @param cssScore * @param model * @return Return value type: String * @author janinus */ @RequestMapping(value = "/add") public String addStu(String name, String javaScore, String htmlscore, String CSSSCORE, Model Model) {ApplicationContext context = new ClassPathXMLApPlicationContext ("ApplicationContext.xml"); Studentdao dao = (studentdao) context.getBean ("dao"); Estudiante estudiante = nuevo estudiante (); student.setName (nombre); Student.SetJavascore (doble. PARSEDOBLE (Javascore)); student.sethtmlscore (doble.parsedOuble (htmlscore)); student.setcssscore (doble.parsedOuble (cssscore)); Resultado booleano = dao.addstu (estudiante); if (resultado) modelo.addattribute ("msg", "<script> alert ('agregado con éxito!') </script>"); else modelo.addattribute ("msg", "<script> alert ('agregado con éxito!') </script>"); devolver "todo"; }/** * Eliminar estudiante por id * @param id * @param modelo * @return Tipo de valor de retorno: cadena * @author janinus */@requestmapping (valor = "/deletybyid") public String deletyByById (ID de cadena, modelo modelo) {application Context = new ClassPathXMlaPPlicationContext ("applicationContext.xml"); Studentdao dao = (studentdao) context.getBean ("dao"); Resultado booleano = dao.deletestu (integer.parseInt (id)); if (resultado) modelo.addattribute ("msg", "<script> alert ('eliminar con éxito!') </script>"); else modelo.addattribute ("msg", "<script> alert ('eliminar con éxito!') </script>"); devolver "todo"; } /** * * @param id * @param name * @param javaScore * @param htmlScore * @param cssScore * @param model * @return Return value type: String * @author janinus */ @RequestMapping(value = "/update") public String updateStu(String id, String name, String javaScore, String htmlScore, String cssScore, Model model) {AplacationContext context = new ClassPathXMLApPlicationContext ("ApplicationContext.xml"); Studentdao dao = (studentdao) context.getBean ("dao"); Estudiante estudiante = nuevo estudiante (); student.setId (integer.parseInt (id)); student.setName (nombre); Student.SetJavascore (doble. PARSEDOBLE (Javascore)); student.sethtmlscore (doble.parsedOuble (htmlscore)); student.setcssscore (doble.parsedOuble (cssscore)); Resultado booleano = dao.updatestu (estudiante); if (resultado) modelo.addattribute ("msg", msg ("modificado correctamente")); else modelo.addattribute ("msg", msg ("modificación fallida")); devolver "todo"; }/** * Mensaje de página para aparecer * @param msg * @return Tipo de valor de retorno: String * @author Janinus */public String msg (String msg) {return "<script> alert ('" + msg + "') </script>"; }}Se ha completado todo el código Java, y solo la configuración XML específica y la página frontal se dejan a continuación.
4. Página front-end
Dado que es un pequeño proyecto simple, mi JS y CSS están todos en la misma página, no separados, solo dos páginas,
1.index.jsp
Página de inicio, captura de pantalla
editar
Código detallado:
<%@ page lenguaje = "java" contentType = "text/html; charset = utf-8" PageEncoding = "utf-8"%> <%@ taglib prefix = "fn" uri = "http://java.sun.com/jsp/jstl/function uri = "http://java.sun.com/jsp/jstl/core" %> <! Doctype html> <html lang = "en"> <lEd> <meta charset = "utf-8"> <title> gestión estudiantil </title> </head> <syle tipo = "text/css"> cuerpo {text-align: centro; } .all {ancho: 40%; margen: 20px 100px; Text-Align: Center; Altura: 300px; flotante: izquierda; } tabla {ancho: 80%; Margen: 20px Auto; tamaño de fuente: 14px; desbordamiento: auto; } #tab02 {ancho: 80%; Margen: 20px Auto; tamaño de fuente: 14px; } tabla th, tabla td {border-bottom: 1px #000 sólido; Línea de altura: 23px; } #Edit_comm {ancho: 500px; Margen: 20px Auto; Border-izquierda: 3px Solid #000; Pantalla: ninguno; } #add_comm {ancho: 500px; Margen: 20px Auto; Border-izquierda: 3px Solid #000; } #All_comm {altura: 600px; } .Edit_stu {ancho: 200px; Altura: 30px; Antecedentes: #fff; Font-Family: "Microsoft Ya Black Light", "Arial Black"; tamaño de fuente: 18px; borde: ninguno; Border-Bottom: 1px Solid #000; margen: 20px 10px; } </style> <script src = "http://code.jquery.com/jquery-latest.js"> </script> <script type = "text/javascript"> $ (function () {$ ("#cancelar"). click (function () {$ ("#add_comm"). femadin (); $ ("#edit_comm"). $ ("Entrada"). AddClass ("edit_stu"); } function add_reg () {var name = $ ("#add_edit_name"). val (); var javascore = $ ("#add_edit_java"). val (); var htmlscore = $ ("#add_edit_html"). val (); var cssscore = $ ("#add_edit_css"). val (); var namenot = name! = null && name! = ''; var javascorenot = javascore! = null && javascore! = ''; var htmlscorenot = htmlscore! = null && htmlscore! = ''; var cssscorenot = cssscore! = null && cssscore! = ''; if (namenot & javascorenot && htmlscorenot && cssscorenot) return true; else devuelve falso; } function delete_stu (id) {var resultado = confirmar ("¿se eliminará?"); if (resultado) window.location.href = "deletybyid? id =" rel = "externo nofollow" +id; } function edit_stu (id) {var name = $ ("#name"+id) .Text (); var java = $ ("#java"+id) .Text (); var html = $ ("#html"+id) .Text (); var css = $ ("#css"+id) .Text (); $ ("#edit_id"). val (id); $ ("#edit_name"). val (nombre); $ ("#edit_java"). Val (Java); $ ("#edit_html"). Val (html); $ ("#edit_css"). Val (CSS); $ ("#add_comm"). fadeout (); $ ("#edit_comm"). fadein (); } </script> <body> $ {msg} <h1 align = "centro"> gestión de estudiantes </h1> <div id = "all_comm"> <h2> Todos los estudiantes </h2> <table id = "elementos"> <tr> <td> id </td> <td> name </td> <td> java score </td> <td> html <td> css score </td> <td> operación </td> </td> </tr> <c: elementos de foreach = "$ {students}" var = "student"> <tr> <td id = "id $ {student.id}"> $ {student.id} </td> <td id = "name $ {student.id}"> $ {{{{ <td id = "java $ {student.id}"> $ {student.javascore} </td> <td id = "html $ {student.id}"> $ {student.htmlscore} </td> <td id = "css $ {student.id}"> $ {student.cssscore} </td> <T <td> <T <At <A <a <a <a <a <a <a <a <a <a <a <a <a <td> onClick = "delete_stu ($ {student.id})"> delete </a> | <a onClick = "edit_stu ($ {student.id})"> editar </a> </td> </tr> </c: foreach> </table> <table id = "tab02"> <h2> top tres </h2> <tr> <TD> Ranking </td </td </td </td </td </td </td </td td. <td> id </td> <td> nombre </td> <td> puntaje total </td> </tr> <c: foreach elementos = "$ {tops}" var = "estudiante" varstatus = "i"> <tr> <td> $ {i.index+1} nombre </td> <td id = "id $ {student.id} t" t " } </td> <td> $ {student.name} </td> <td id = "name $ {student.id} t"> $ {student.totalscore} </td> </tr> </c: foreach> </table> si no se muestra: <a enlaz = "reenviar ()" <H2> Find Student </h2> <form de acción = "QueryByName" Method = "Post"> <input type = "Text" PlaceHolder = "Student Name" Name = "Name"> <input type = "Subt" Value = "Buscar alumno"> </form> <h2 id = "edit_title"> Agregar estudiante </h2> <formul name = "name" /> <input type = "text" placeHolder = "java score" name = "javascore" /> <input type = "text" placeholder = "html score" name = "htmlscore" /> <input type = "text" lexter = "css score" name "name =" cssssssssssssssion " /> <input type =" subt "value =" confirma a agregar " /" CSS "name" name = "cssscore" /> <input type = "subsit" valor = "Confirma a agregar" /"CSS" Nombre "name =" csssssssson " /> <input type =" subsit "value =" confirmar " </form> </div> <div id = "edit_comm"> <h2 id = "edit_title"> editar estudiante </h2> <form de action = "update" método = "post"> <input type = "text" placeholder = "id a ser modificado es" id = "edit_id" name = "id" value = "el id a modificado para ser" lectura = "Readonly"/> <> <BROT> TIEM PLADELIGHER = "Student Name" id = "edit_name" name = "name" /> <input type = "text" placeholder = "java score" id = "edit_java" name = "javascore"> <input type = "text" lexter = "html store" id = "edit_html" name = "htmlscore" /> <<put type = "texting standing" cepsing "ceps" ceps " id = "edit_css" name = "csssscore"/> <input type = "subt" value = "confirmar modificación"/> <input type = "button" value = "cancelar modificación" id = "cancelar"/> </form> </div> </body> </html>2. Login.jsp
<%@ page lenguaje = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! DocType html público "-// w3c // dtd html 4.01 transición // en" " "http://www.w3.org/tr/html4/loose.dtd"><html><head><meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <title> title aquí </title> </head> <body> <h1 align" Center "> <A href =" todo " rel = "nofollow externo" rel = "nofollow externo"> Ingrese la página de inicio </a> </h1> </body> </html>
5. Configuración detallada del archivo
1. ApplicationContext.xml
Este es el archivo de configuración del contenedor IOC de Spring, utilizado para implementar la inyección de dependencia. El siguiente es el código específico:
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" "" "" xmlns: context = "http://www.springframework.org/schema/context" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: aoP = "http://www.springframework.org/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/contextExt http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd "default-autewire =" byNnEdly-lazy-init = "true"> <!-Configuración de la fuente de datos de la base de datos-> <<<rupiñera de bean id " Clase-> <Property Name = "DriverClassName" value = "com.mysql.jdbc.driver"> </sperty> <!-Dirección de acceso a la base de datos-> <propiedad name = "url" value = "jdbc: mysql: // localhost: 3306/test"> </propiedad> < <!-Contraseña de acceso a la base de datos-> <Property Name = "Password" Value = "123123"> </property> </bean> <!-Gestión de transacciones de la base de datos proporcionada por Spring-> <bean id = "txmanager"> <Property name = "dataSource" ref = "dataSource"> </spertity> </ bean> <tx: anotation-driven-manager = "txManager/" txManager/"txManager/" <! Javabean Entity Class-> <bean id = "studentBean"> <!-Configuración automática de atributos-> </bean> <!-Clase de operación de acceso a la base de datos proporcionada por spring-> <bean id = "jdbctemplate"> </ bean> <!-dao layer class-> <bean id = "dao"> </aan> < name = "Dao" ref = "dao"> </property> </bean> </beans>
2. SpringMVC-Servlet.xml, Spring MVC Class,
Hemos implementado la mayor parte del código de servlet para nosotros, y solo necesitamos escribir una implementación comercial. A continuación se muestra el código específico
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" "" "" xmlns: p = "http://www.springframework.org/schema/P" xmlns: context = "http://www.springframework.org/schema/context" http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframwork.org/schema/context/spring-context-3.0.0.xsd "<! Escanee automáticamente la clase en el paquete especificado-> <context: component-scan base-paquete = "controlador" /> < /beans>
3. Web.xml
Este es el archivo de configuración del proyecto web, y el siguiente es el código principal:
<? xml versión = "1.0" encoding = "utf-8"?> <web-app xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" "" "" "" "" "" xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><!--confige filtros de encodificación de caracteres, proporcionados por la tensión-> <filter> <Tilter-Class> org.springframework.web.filter.CharacterIncodingFilter </filter-class> <Init-Param> <amamname> codificación </param-name> <amam-value> utf-8 </param-value> </initparam> </filtre> <!-Configure bienvenido interface <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file></welcome-file-list><!-- Configure springmvc servlet --><servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <OAD-ONSTARTUP> 1 </load-on-startup> </servlet> <ervlet-mapping> <ervlet-name> springmvc </servlet-name> <url-pattern>/</sl-pattern> </servlet-mapping> </web-app>
6. Resumen del proyecto y apéndice
Este proyecto es mi programa de práctica diaria. Para ser más competente, revisé el proceso completo nuevamente y me familiaricé mucho con él.
Apéndice al paquete JAR utilizado para el proyecto:
Además del paquete de primavera, también están el paquete jar mysql-jbdc y el paquete jstl jar
Dirección de descarga:
Spring Framework Jar Package (versión opcional): Sitio web oficial de Spring
mysql-jdbc.jar (versión opcional): sitio web oficial de MySQL
jstl.jar (versión opcional): dirección oficial de Maven
Lo anterior es todo el contenido de este artículo sobre el ejemplo completo de Spring MVC que implementa la adición, eliminación, modificación y búsqueda de la base de datos MySQL. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a este sitio:
Explicación detallada de la configuración del módulo web en primavera
SpringMVC REST Style Introducción e ejemplo de código de implementación
SpringMVC Interceptor implementa el inicio de sesión único
Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!