Cómo comparar horizontalmente las ventajas y desventajas de diferentes frameworks js
La diferencia esencial entre struts1 y struts2
1 Comparación en las clases de implementación Action: Struts 1 requiere que la clase Action continúe con una clase base abstracta. Un problema específico de Struts 1 es el uso; de programación de clases abstractas en lugar de una interfaz. La clase Action de Struts 2 puede implementar una interfaz Action u otras interfaces, lo que hace posibles servicios opcionales y personalizados. Struts 2 proporciona una clase base ActionSupport para implementar interfaces de uso común. Incluso si no es necesario implementar la interfaz de Acción, solo una clase POJO que contenga el método de ejecución se puede usar como Acción de Struts 2.
2 Comparación en modo subproceso: Struts 1 Action es un modo singleton y debe ser seguro para subprocesos, porque solo hay una instancia de Action para manejar todas las solicitudes. La estrategia singleton limita lo que Struts 1 Action puede hacer y debe desarrollarse con mucho cuidado. Los recursos de acción deben ser seguros para subprocesos o estar sincronizados; los objetos de acción de Struts 2 generan una instancia para cada solicitud, por lo que no hay problemas de seguridad de subprocesos.
3 Comparación de dependencias de Servlet: Struts 1 Action se basa en la API de Servlet, porque el método de ejecución de Struts 1 Action tiene métodos HttpServletRequest y HttpServletResponse. Struts 2 Action ya no depende de la API de Serzvlet, lo que permite que Action se ejecute fuera del contenedor web, lo que reduce la dificultad de probar Action. Por supuesto, si la Acción necesita acceso directo a los parámetros HttpServletRequest y HttpServletResponse, la Acción Struts 2 aún puede acceder a ellos. Sin embargo, la mayoría de las veces, Action no necesita acceder directamente a HttpServetRequest y HttpServletResponse, lo que brinda a los desarrolladores opciones más flexibles.
4 Comparación en capacidad de prueba: un problema importante al probar Struts 1 Action es que el método de ejecución depende de la API de Servlet, lo que hace que las pruebas de Action dependan del contenedor web. Para probar Struts 1 Action sin el contenedor web, debe utilizar una extensión de terceros: Struts TestCase, que contiene una serie de objetos simulados (que simulan objetos HttpServetRequest y HttpServletResponse), para que se pueda probar la clase Struts 1 Action. sin el contenedor web. Struts 2 Action se puede probar inicializando, configurando propiedades y llamando métodos.
5 Comparación de encapsulación de parámetros de solicitud: Struts 1 usa objetos ActionForm para encapsular los parámetros de solicitud del usuario. Todos los ActionForms deben continuar con una clase base: ActionForm. Los JavaBeans ordinarios no se pueden utilizar como ActionForms, por lo que los desarrolladores deben crear una gran cantidad de clases ActionForm para encapsular los parámetros de solicitud del usuario. Aunque Struts 1 proporciona ActionForm dinámico para simplificar el desarrollo de ActionForm, ActionForm aún debe definirse en el archivo de configuración; Struts 2 usa directamente atributos de Acción para encapsular los atributos de solicitud del usuario, evitando la molestia de que los desarrolladores necesiten desarrollar una gran cantidad de clases de ActionForm. De hecho, estas propiedades también pueden ser tipos de objetos enriquecidos que contienen subpropiedades.
Si los desarrolladores aún echan de menos el modo ActionForm de Struts 1, Struts 2 proporciona el modo ModelDriven, que permite a los desarrolladores usar un objeto Modelo separado para encapsular los parámetros de solicitud del usuario, pero el objeto Modelo no necesita heredar ninguna clase base de Struts 2 y es un POJO. , por lo tanto reduce la contaminación del código.
6 Comparación de lenguajes de expresión: Struts 1 integra JSTL, por lo que se puede utilizar el lenguaje de expresión JSTL. Este lenguaje de expresión tiene un recorrido básico de gráficos de objetos, pero no es sólido en el soporte de colecciones y propiedades indexadas. Struts 2 puede usar JSTL, pero integra un lenguaje de expresión más potente y flexible: OGNL (lenguaje de notación de gráficos de objetos), por lo tanto, la expresión. El lenguaje bajo Struts 2 es más poderoso.
7 Comparación de valores vinculantes con vistas: Struts 1 utiliza un mecanismo JSP estándar para vincular objetos a páginas de visualización; Struts 2 utiliza la tecnología "ValueStack" para permitir que las bibliotecas de etiquetas accedan a los valores sin necesidad de hacerlo. vincular objetos Vincular a la página de visualización.
8 Comparación de conversión de tipos: las propiedades de Struts 1 ActionForm suelen ser de tipo String. Struts 1 usa Commons-Beanutils para la conversión de tipos, con un convertidor para cada clase, y el convertidor no es configurable; Struts 2 usa OGNL para la conversión de tipos, lo que admite la conversión entre tipos de datos básicos y objetos comunes.
9 Comparación de verificación de datos: Struts 1 admite la verificación manual en el método de validación de reescritura de ActionForm o completa la verificación de datos integrando el marco de alidador Commons. Struts 2 admite la verificación reescribiendo el método de validación y también admite la integración del marco de verificación XWork para la verificación.
10 Comparación del control de ejecución de acciones: Struts 1 admite cada módulo correspondiente al procesamiento de una solicitud (es decir, el concepto de ciclo de vida), pero todas las acciones del módulo deben compartir el mismo ciclo de vida. Struts 2 admite la creación de diferentes ciclos de vida para cada acción a través de Interceptor Stacks. Los desarrolladores pueden crear pilas correspondientes según sea necesario para usarlas con diferentes acciones.
Ventajas de Hibernate
(1) Mapeo de bases de datos relacionales/objetos (ORM)
Al usarlo, solo necesita manipular objetos, lo que hace que el desarrollo sea más basado en objetos. orientado y abandonado el pensamiento centrado en la base de datos, pensamiento completo orientado a objetos
(2) Persistencia transparente (persistente)
Un objeto de un solo subproceso con estado persistente y funciones comerciales Este objeto El. el período de supervivencia es muy corto. Estos objetos pueden ser JavaBeans/POJO ordinarios. Este objeto no implementa un marco o interfaz de terceros. Lo único especial es que están asociados con (solo una) sesión. Una vez que se cierra la sesión, estos objetos se eliminan del estado persistente y pueden ser utilizados libremente por cualquier capa de la aplicación. (Por ejemplo, se utiliza como objeto de transferencia de datos para tratar con la capa de presentación).
(3) Transaction(org.hibernate.Transaction)
Utilizado por la aplicación para especificar el alcance del objeto de unidad de operación atómica, es de un solo subproceso y tiene un ciclo de vida corto. Utiliza la abstracción para aislar aplicaciones de transacciones JDBC, JTA y CORBA concretas subyacentes. En algunos casos, una sesión puede contener varios objetos de transacción. Aunque el uso de este objeto es opcional, ya sea que use la API subyacente o el objeto Transaction, la apertura y el cierre de los límites de la transacción es esencial.
(4) No es intrusivo, el llamado marco liviano
(5) La portabilidad será muy buena
(6) Mecanismo de almacenamiento en caché, Proporciona caché de primer nivel y caché de segundo nivel
(7) Programación HQL simple
Desventajas de Hibernate
(1) Hibernate tiene debilidades en el procesamiento de datos por lotes
(2) Hibernate es adecuado para adiciones, eliminaciones y modificaciones simples de un solo objeto. Sin embargo, Hibernate no es adecuado para modificaciones y eliminaciones por lotes. Esta también es una debilidad del marco OR; Se debe utilizar el mecanismo de la base de datos. A veces, no es adecuado utilizar Hibernate
Comparación de las ventajas y desventajas de Hibernate e iBATIS
(Nota: iBATIS es el predecesor de MyBATIS. , que es la versión 1.0)
Características de Hibernate:
Hibernate tiene funciones poderosas, buena independencia de la base de datos y sólidas capacidades de mapeo O/R. Hibernate proporciona una encapsulación relativamente completa de la estructura de la base de datos. El mapeo O/R de Hibernate realiza la conexión entre POJO y las tablas de la base de datos, y genera y ejecuta automáticamente SQL. Los programadores a menudo solo necesitan definir la relación de mapeo entre POJO y las tablas de la base de datos, y luego pueden completar las operaciones de la capa de persistencia a través de los métodos proporcionados por Hibernate. Los programadores ni siquiera necesitan dominar SQL. Hibernate/OJB generará automáticamente el SQL correspondiente de acuerdo con la lógica de almacenamiento especificada y llamará a la interfaz JDBC para su ejecución. La desventaja de Hibernate es que el umbral de aprendizaje no es bajo y el umbral de dominio es aún mayor. Además, cómo diseñar el mapeo O/R, cómo lograr un equilibrio entre el rendimiento y el modelo de objetos, y cómo hacer un buen uso. de Hibernate requiere que usted tenga una gran experiencia y capacidad. Eso está bien, pero Hibernate es ahora el marco principal de mapeo O/R. Por la riqueza de documentos, la integridad del producto y la velocidad de desarrollo de versiones, es más rápido que iBATIS. .
Características de iBATIS:
Es fácil comenzar con iBATIS y se puede utilizar de inmediato. Proporciona una función de enlace automático de objetos para consultas de bases de datos y continúa con una buena experiencia de uso de SQL. No tengo experiencia en el uso de iBATIS. Para proyectos con requisitos de modelo de objetos tan altos, es bastante perfecto. La desventaja de iBATIS es que el marco aún es relativamente simple y aún faltan funciones. Aunque el código de enlace de datos está simplificado, aún debe escribir toda la consulta de la base de datos subyacente, lo que requiere una carga de trabajo relativamente grande y no es fácil. para adaptarse a las rápidas modificaciones de la base de datos. Cuando el sistema es un desarrollo secundario y no puede controlar y modificar la estructura de la base de datos, la flexibilidad de iBATIS será más adecuada que Hibernate. El sistema tiene una gran cantidad de procesamiento de datos y requisitos de rendimiento extremadamente exigentes, lo que a menudo significa que debemos utilizar declaraciones SQL (o procedimientos almacenados) altamente optimizados para lograr los indicadores de diseño de rendimiento del sistema. En este caso iBATIS tendrá mejor controlabilidad y rendimiento.
Comparación del desarrollo real:
1. iBATIS requiere declaraciones SQL escritas a mano y también puede generar parte de ellas, mientras que Hibernate básicamente puede generarlas automáticamente y ocasionalmente escribir algo de Hql. Para los mismos requisitos, la carga de trabajo de iBATIS es mucho mayor que la de Hibernate. De manera similar, si se trata de la modificación de campos de la base de datos, Hibernate modificará muy pocos lugares, mientras que iBATIS modificará los lugares de mapeo SQL uno por uno.
2. iBatis puede realizar una optimización detallada.
Por ejemplo, tengo una tabla con varios o docenas de campos y necesito actualizar uno de los campos. simple, ejecute un sql UPDATE TABLE_A SET column_1=#column_1# WHERE id=#id# pero es más problemático usar Hibernate. De forma predeterminada, hibernate actualizará todos los campos.
Por supuesto, recuerdo que hibernar tiene una opción para controlar solo los campos modificados guardados, pero no estoy seguro de los efectos negativos de esta característica.
Por ejemplo: necesito enumerar parte del contenido de una tabla. Cuando uso iBatis, la ventaja es que puedo guardar una gran cantidad de datos de la base de datos y ahorrar tráfico. DÓNDE... En circunstancias normales, Hibernate seleccionará todos los campos. Por ejemplo, la tabla anterior tiene 8 campos, incluidos uno o dos campos relativamente grandes, varchar(255)/text. ¿Por qué los elegí en la escena de arriba? Si usa hibernación, no puede configurar estos dos campos innecesarios para que se carguen de forma diferida, porque todavía hay muchos lugares donde es necesario cargar todo el objeto del dominio a la vez. En este momento se pueden revelar los beneficios de ibatis. Si necesito actualizar un registro (un objeto), si uso hibernación, necesito seleccionar el objeto ahora y luego actualizarlo. Estos son solo dos SQL para la base de datos. Y iBatis solo necesita una actualización de sql. Reducir una interacción con la base de datos es muy importante para mejorar el rendimiento.
3. Desarrollo:
En términos de eficiencia de desarrollo, creo que los dos deberían ser más o menos iguales. En términos de mantenibilidad, creo que iBatis es mejor. Porque el sql de iBatis se guarda en un archivo separado. Hibernate puede guardar sql/hql en código java en algunos casos. En comparación con Hibernate "O/R", iBATIS es una implementación ORM de "Sql Mapping". (iBatis escribe SQL en el archivo de configuración, mientras que hibernate lo genera por sí mismo) El enfoque de iBATIS es la relación de mapeo entre POJO y SQL. En otras palabras, iBATIS no genera automáticamente la ejecución de SQL para los programadores en tiempo de ejecución. El programador debe escribir el SQL específico y luego los parámetros requeridos por el SQL y los campos de resultados devueltos se asignan al POJO especificado a través del archivo de configuración de asignación. Al utilizar el mecanismo ORM proporcionado por iBATIS, los implementadores de lógica empresarial se enfrentan a objetos Java puros. Esta capa es básicamente la misma que implementar ORM a través de Hibernate. Para operaciones de datos específicas, Hibernate generará automáticamente declaraciones SQL, mientras que iBATIS requiere que los desarrolladores escriban específicamente. Sentencias SQL. En comparación con Hibernate, iBATIS proporciona mayor libertad para el diseño del sistema al comprometer la carga de trabajo del desarrollo de SQL y la portabilidad de la base de datos.
4. Eficiencia de ejecución
Sin considerar el caché, iBatis debería ser un poco o mucho más rápido que hibernar.
Las ventajas y desventajas del marco Spring
Las ventajas de Spring son evidentes:
1. eficazmente. Un "pegamento" perfecto para el marco.
2. Adopta una estructura jerárquica y se puede introducir de forma incremental en el proyecto.
3. Propicio para el desarrollo de hábitos de programación orientados a interfaces.
4. Uno de los propósitos es escribir código que sea fácil de probar.
5. La dependencia de la aplicación no intrusiva en Spring API se puede reducir al mínimo.
6. Interfaz de acceso a datos consistente.
6. Una solución arquitectónica ligera
Las deficiencias también son obvias
1. Interrumpe la lógica de la aplicación y hace que el código no sea intuitivo. En este momento, es imposible comprender completamente todo el comportamiento de la aplicación únicamente desde la Fuente.
2. Configurar la lógica que se debe codificar aumenta la posibilidad de errores y una carga adicional.
3. El tiempo retrocede y se pierde el soporte IDE.
En la era actual de funciones IDE cada vez más poderosas, las acciones problemáticas como la refactorización de código en el pasado se están volviendo cada vez más fáciles. Además, el IDE también proporciona muchas funciones auxiliares potentes, lo que reduce considerablemente el umbral de programación. En términos generales, mantener el código es mucho más fácil que mantener los archivos de configuración o una combinación de archivos de configuración + código.
4. La etapa de depuración no es intuitiva y no es fácil determinar el problema en la etapa posterior de respuesta al error.
Las ventajas y desventajas de la arquitectura clásica S (Struts) SH
Hay una razón por la que Struts, Spring e Hibernate han sido populares durante tantos años. Cuando apareció J2EE por primera vez, generalmente adoptamos la arquitectura JSP + Servlet + JavaBean + EJB. Especialmente durante el período de 1998 a 2000, la burbuja de Internet creció y estalló con tanto impulso como en 2008. Al comienzo de la crisis económica, En esa época, si domina la tecnología de desarrollo EJB determinará directamente si su salario puede duplicarse o duplicarse varias veces. Sin embargo, Rod Johnson, el autor de Spring, escribió "Diseño y desarrollo J2EE experto uno a uno" en 2002 basándose en muchos años de experiencia, y luego publicó el famoso "Desarrollo J2EE experto uno a uno". sin EJB" "El libro ha cambiado por completo la arquitectura de desarrollo J2EE tradicional que domina el mundo. La arquitectura J2EE basada en Struts + Hibernate + Spring ha sido reconocida gradualmente por la gente e incluso ha comenzado a aplicarse en arquitecturas de proyectos a gran escala. Hablemos de las ventajas y desventajas de Spring, Struts e Hibernate respectivamente.
Spring es un framework de código abierto creado para resolver las complejidades del desarrollo de aplicaciones empresariales. Una de las principales ventajas del marco es su arquitectura en capas, que cambia la relación entre cada capa y entre clases desde la vinculación fuerte y el acoplamiento fuerte originales a la desvinculación y el acoplamiento flexible, y adopta directamente el principio de separación de diseño y programación. La implementación al extremo también ha tenido un profundo impacto en las pruebas unitarias. Antes de que apareciera Spring, todavía era difícil realizar pruebas unitarias de módulos individuales si un módulo no estaba completo. Spring también es un marco integrado para el desarrollo de aplicaciones J2EE. Debido a que J2EE enfatiza el concepto de capas, Spring aclara las funciones del módulo entre cada capa de J2EE.
Sin embargo, para el desarrollo de proyectos grandes, Spring ha transformado la fuerte relación de acoplamiento entre clases originalmente difícil de mantener en una configuración de archivo XML aún más difícil de mantener. Esta carga de trabajo también es muy grande. y Más propenso a errores. Además, a medida que se actualiza cada módulo de la aplicación, las versiones entre estos módulos no se actualizarán simultáneamente. Para el mismo componente público, algunos módulos pueden usar la versión 1.0, mientras que otro módulo funcional puede estar usando la versión 2.0. Es posible que la versión 1.0 y la 2.0 aún no sean compatibles. Spring no puede satisfacer estas necesidades. Por lo tanto, algunas personas dicen que Spring no es adecuado para el desarrollo de proyectos a gran escala, lo cual tiene sentido. Recientemente, Spring también ha agregado la implementación del estándar OSGI para poder solucionar estos problemas que existen entre diferentes versiones. Sin embargo, a medida que Spring agrega más y más funciones, Spring pierde las características de un marco de código abierto liviano y se vuelve cada vez más engorroso.
Aunque Spring ahora también admite la llamada configuración libre, puede vincularse a través de la etiqueta @Autowired y también puede cargar todos los objetos de Hibernate configurando el enlace automático, pero si hay cientos o docenas de estos Si algún objeto Entity no se carga, todo el servicio Spring no se iniciará. ¿En qué se diferencia esto de los EJB que son difíciles de implementar? Además, lo ridículo es que debido al uso de la etiqueta @Autowired, un número considerable de desarrolladores ya no programan para interfaces. Para instancias de Clase A, se dice que están sujetos a Spring, independientemente de la interfaz, o. la clase de implementación real. Bien, simplemente configúrelo en Spring.
El núcleo de Spring es la programación orientada a interfaz y el IOC. Sin programación orientada a interfaz, ¿qué hay de malo en usar A a=new A() para crear una instancia de una clase? Se escribió una línea de código menos y se introdujo un Spring pesado. ¿Por qué utilizar Spring?
La popularidad de Hibernate se debe a que los desarrolladores y clientes están extremadamente decepcionados con el tamaño inflado y las dificultades de implementación de Entity EJB (entidad EJB). Dado que es una solución liviana, la distribución no es opcional. Sin distribución, EJB será inútil. Por otra parte, Rod Johnson lanzó su propia solución Spring liviana hace unos años porque enfatizó que la mayoría de las aplicaciones empresariales no necesitan ser distribuidas. Pero el año pasado, con el auge de la arquitectura de computación en la nube, si la arquitectura admite la distribución se ha convertido en una necesidad. La selección de arquitectura técnica es como la moda en París, Francia. Las mangas cortas son populares este año y los dobladillos serán populares el próximo año. Es realmente una tendencia típica de Hedong dentro de diez años y de Hexi dentro de diez años. Por lo tanto, términos importantes como SOA, computación en la nube, SaaS e Internet de las cosas no solo traerán una gran confusión a los clientes, sino también a los programadores, analistas de sistemas, arquitectos de sistemas y directores técnicos. De la afirmación a la negación, y luego a la abnegación, está realmente en línea con la ley de desarrollo en espiral de la naturaleza.
En cuanto a Struts, una vez lanzado, derrotó a casi todos los competidores en ese momento. La grandeza de Struts radica en su vinculación dinámica de datos de páginas web. Aunque el enlace de datos no es un término nuevo, cuando Microsoft lanzó Visual Basic 1.0 en 1991, inventó creativamente el enlace de datos que los programadores de VB aman y odian. Sin embargo, para la programación web, Struts todavía vincula datos. primer tiempo. Permite a las personas obtener datos de páginas web en forma de Set y Get en lugar de un único request.getParameter() de cuadro negro, llevando así el valor de los datos de páginas web a la era orientada a objetos (OO).
Struts, Hibernate y Spring son frameworks bien diseñados, pero pueden no ser muy adecuados para la aplicación de sus propios productos y proyectos una vez integrados. Por ejemplo, en los sistemas MIS (Sistema de información de gestión) relacionados con bases de datos, las funciones de agregar, modificar, eliminar y consultar son las más básicas, comunes y esenciales. Para estas funciones más básicas, diferentes arquitectos tomarán decisiones diferentes. Algunos arquitectos eligen el concepto de generación automática, crean un generador de código automático, diseñan la estructura de la tabla de la base de datos, hacen clic en un script o usan un complemento de Eclipse para crear una interfaz de generación gráfica, generan automáticamente el marco SSH y completan la adición de la base de datos. operaciones de modificación, eliminación y consulta. La ventaja de esto es que cuando se modifica la base de datos, el código se genera automáticamente, por lo que los programadores ya no necesitan mantener estos códigos aburridos. Sin embargo, las fallas también son fatales. En primer lugar, con la actualización de Struts, Hibernate y Spring, esta herramienta debe actualizarse en consecuencia, y es posible que los programadores que crearon esta herramienta hayan abandonado la empresa hace mucho tiempo y las versiones posteriores no se puedan mantener. segundo, si hay La lógica empresarial se cruza con estos códigos generados. Después de cambiar la base de datos, los códigos no se pueden volver a generar. En tercer lugar, la arquitectura del sistema de la empresa está muy limitada a la arquitectura SSH y no se puede cambiar. Algunas personas pueden preguntar: incluso si se limita a estas tres arquitecturas, ¿cuál es la desventaja? Supongamos que un cliente pregunta: ¿su marco admite la computación en la nube? No se puede decir "Debido a que Struts, Hibernate y Spring no admiten la arquitectura de computación en la nube, yo tampoco la admito" para lograr la comprensión del cliente. Por lo tanto, las arquitecturas de productos que dependen de arquitecturas de terceros serán cada vez más restringidas con el tiempo.