He estado en contacto con el desarrollo web relacionado con .NET antes, pero ahora todavía estoy muy incómodo usando Javaweb.
1. Hablando sobre la arquitectura del proyecto <Br /> Primero entré en contacto con el desarrollo relacionado con .NET, por lo que estoy bastante familiarizado con el desarrollo relacionado con .NET, pero aprendí Java en la escuela y planeo combinar estas dos plataformas. Levántate, usa Java como backend, es decir, el proveedor de servicios, complete toda la lógica comercial en la plataforma Java y use .NET con el que estoy más familiarizado para el desarrollo web. De esta manera, habrá aplicaciones y lados de la web de Android. El cliente llama al servicio de manera uniforme a través de un marco distribuido. Después de buscar mucho tiempo, finalmente elegí HProse, una ligera, cruzada, multiplataforma, no invasiva, de alto rendimiento, un objeto remoto dinámico que llama la biblioteca de motores. La razón por la que lo elegí es por el bajo costo de aprendizaje, y por otro lado, su llamada multiplataforma es muy fácil y eficiente, ¡porque necesitamos usar .NET para hacer la web para llamar a los servicios publicados por Java! Después de mirar aproximadamente la documentación HProse, descubrí que usar el servicio de liberación HProseServlet incorporado es más rápido y simple de desarrollar, por lo que planeo usar este método para publicar el servicio. Pero el problema es que la arquitectura SSH tradicional se siente un poco pesada, y voy a usar .NET para desarrollar el lado web, por lo que siento que no hay necesidad de integrar puntales, por lo que es una arquitectura Hibernate+Spring+HProse .
2. Diseño de base de datos
Es una pequeña librería en línea, por lo que aún falta el diseño, y es principalmente práctico, principalmente practicando el desarrollo de Java ~~. Así que usé Navicat para diseñarlo brevemente, pero no había una correlación de la tabla de diseño.
De hecho, puede ver la correlación de la tabla de un vistazo ~~, lo siguiente es Hibernate algunas asignaciones y también usar complementos para generar modelos y archivos de mapeo.
Es así con una ligera modificación-
3. Spring3+Hibernate4 Configuración <Br /> Debido a que el modelo y los archivos de mapeo se generan automáticamente, es mejor configurarlos un poco. modelo compuesto. Por ejemplo, el tipo de clave principal compuesto de la tabla de revisión del producto :
paquete com.book.model; // Generado 2015-11-2 9:07:06 por Hibernate Tools 4.0.0.FinalMort java.util.date;/** * Commentsid generado por HBM2Java */Publi C Classspk implementa . .commentsdate = comentarios date; usuario) {this.user = user; == OTRO)) return true; Castother.getBook ()) || ) == Castother.getUser ()) || .getcom mentsdate () == Castother.getCommentsDate ()) || ; == nulo? 0: this.getuser (). Hashcode ()); Modelo de tabla de revisión del producto :
paquete com.book.model; // Generado 2015-10-30 14:56:21 por Hibernate Tools 4.0.0.FinalMort java.sql.date;/** * Comentarios generados por HBM2Java */Comentarios de clase pública Implementa Java. io.serializable {Contenido de cadena privada; } public String getPic () {return Pic; ; contenido = contenido; El archivo de asignación de hibernado correspondiente:
<? Xml versión = "1.0"?> < . "Comentarios" catalog = "bookstore"> <composite-id name = "id"> <key-mmany-ooe name = "book"> <column name = "bookid" /> < /key-many-to- One> <Key-Many-To-One name = "User"> <columna name = "userId" /> </ key-many-to-oe> <key-property name = "comentarios date" type = "timestamp"> <column name = "CommentsDate" longitud = "19"/> </key-property> </popite-id> <propiedad name = "content" type = "string"> <column name = "content" longitud = "65535 " /> </property> <Property name =" pic "type =" string "> <column name =" pic "longitud =" 65535 " /> </propiety> <Property name =" Client "type =" java. lan g .integer "> <columna name =" Client "/> </property> </sclass> </hibernate-mapping>
Debido a que hay dos claves extranjeras en la tabla de revisión del producto, se usa la etiqueta clave-to-uno.
Dado que se usa Spring3.2+Hibernate4.1, la forma de obtener SessionFactory se limita a SessionFactory.getCurrentSession (); pero las cosas deben estar habilitadas:
<bean id = "transaccionManager"> <Property name = "sessionFactory" ref = "sessionFactory" /> < /bean> <!-Características de propagación de transacciones-> <tx: consejo id = "txadvice" transacta-ganager = "TransActionManager"> <tx: Attributes> <tx: Method name = "add*" propagation = "requerido" /> <tx: método name = "eliminar*" propagation = "requerido" /> <tx: método name = " modificar*"propagation =" required " /> <!-Hibernate4 debe configurarse para habilitar las transacciones, de lo contrario getCurrentSession () no se puede obtener-> <tx: método name ="*"propagation =" requerido "ly = "True"/> </tx: atributes> </tx: consejo>
Los anteriores son los problemas que ocurrieron cuando lo configuré. Aquí está el archivo de configuración de Spring:
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.orgg /2001/xmlschema-instance "xmlns: aop =" http://www.springframework.org/schema/aop "xmlns: context =" http://www.springframework.org/schema/ context "xmlns: tx =" http://www.springframework.org/schema/tx "xsi: schemalocation =" http://www.springframework.org/schema/beans http://www.springfframework.org/schema/behuss/treing-beans-- 3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http: //www.springframewor k.org/schema/ contexto http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/tx http: //www.springframework. -TX-3.2.XSD "> <!-Enable Soporte de anotación de Spring-> <Context: Annotation-Config /> <Bean ID =" DataSource "Destroy-Method =" Close "> <Property Name =" DriverClassnam E " value = "com.mysql.jdbc.driver"/> <propiedad name = "url" value = "jdbc: mysql: //127.0.0.1/bookstore? UseUnicode = true & caracterSencoding = utf-8"/> <name de propiedad = " UserName "Value =" Root " /> <Property Name =" Password "Value =" Yangyang " /> </ Bean> <!-Puede agregar la configuración del caché secundario-> <bean id =" sessionFactory " > <Property name = "DataSource" ref = "dataSource"/> <Property name = "MappingDirectoryLocations"> <List> <valor> classpath: config </alue> </list> </property> <propiedad = "HibernateProperties "> <props> <prop key =" hibernate.dialect "> org.hibernate.dialect.mysqldialect </rp> <prop key =" hibernate.show_sql "> true </pr> <prop key =" hibernate.show_sql "" > verdadero </prop> <prop key = "Hibernat E.Hbm2ddl.auto"> update </prop> <prot key = "hibernate.temp.use_jdbc_metadata_defaults"> false </pr> <prop key = "centre_session_context_class"> Thread </prop> </props> </property> </ bean> <!-Configuration Transaction Manager-> <bean id = "transaccionManager"> <propiedad name = "sessionFactory" ref = "sessionFactory"/> </> </> Bean> <!-Características de propagación de las transacciones-> <tx: consejo id = "txadvice" transaccion-ganager = "transaccionManager"> <tx: atributos> <tx: método name = "add*" propagation = "requerido" /> <tx: método name = "delet e*" propagation = "requirido" /> <tx: método name = "modificar*" propagation = "requerido" /> <!-hibernate4 debe configurarse para habilitar las transacciones, de lo contrario GetCurrentSession () no se puede obtener-> <tx: método name = "*" propagation = "requerido" lectura = "true"/> </tx: atributas> </tx: consejo> <!-esas clases y los métodos usan transacciones-> <aop: config> <!-Solo las transacciones se implementan para la capa lógica de negocios-> <aop: pointCut id = "Allmanagermethod" Expression = "Execution (* com.book.test.* .*(..)) " /> <aop: Advisor PointCut-Ref =" Allmanagermethod "adv Ice-ref =" txadvice " /> < /aop: config> <bean name =" basado en basado " /> <bean name = "OrderDao" /> < /beans>
Después de que todo esté listo, usamos la prueba de servlet:
<Servlet> <Servlet-name> test </servlet-name> <ervlet-class> com.book.test.test </servlet-class> </servlet> <servlet-mapping> <ervlet-name> test </ Servlet-Name> <URL-Pattern>/index </url-Pattern> </servlet-mapping>
Solicitud de doget void protegida (httpservletRequest, httpservletResponse respuesta) lanza ServletException, ioException {// TODO Auto Generated Method stub Be Factor = WebApplicationContextUtil.getRequiredWebApplicationContext (request.getSession (). OrderDao.Debido a que no usamos estructuras, necesitamos encontrar la fábrica de beans de la primavera para obtener Dao Bean.
Resultados de ejecución:
Tabla de pedido cargado con éxito orden 1 Artículo Cantidad de pedido.
Después de todo, es la primera vez que usa Java para desarrollar tales proyectos.