Struts+hibernate应用实现页面操作数据库
来源:互联网 发布:苹果mac下载输入法安装 编辑:程序博客网 时间:2024/06/12 09:43
在Struts+hibernate框架的结合应用中,这两种框架本身提供了操作的思路和对Java J2EE原先一些对servlet,bean的应用的简化和封装。
整合Struts和hibernate,基本思路就是把MVC中的Model模型部分使用hibernate来做:
这里先说一下POJO的简单概念:
POJO的名称有多种,pure old java object 、plain ordinary java object 等。
按照Martin Fowler的解释是“Plain Old Java Object”,从字面上翻译为“纯洁老式的java对象”,但大家都使用“简单java对象”来称呼它。
POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。
解释一下上面这个图的涵义:
Struts实现控制层,分别连接model层和view层,view层的实现方法可以通过JSP实现,或者像hibernate+spring框架那样使用html+javascript实现也可以,至于model层,可以直接使用hibernate或者mybatis框架。
下面直接给最终的实现页面和源码:
最终效果图如上:提供三个连接可以进行修改,删除,和编辑,并且在提交操作后立刻刷新查询页面。
运行环境:eclipse;
数据库:MySQL;
引用包(jar):Struts+hibernate,具体版本省略
首先看M层(Model层)的hibernate框架怎么实现:
1、 先创建个数据库:
Creat database freestyle;
2、 接下来创建pojo,也就是实体类对象product.java:
Product有id,name,price3个字段:
product.java:
package com.how2java.pojo;public class Product { private int id; private String name; private float price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; }}//如上,实体类的三个属性及其setter,getter方法;
接下来,处理hibernate框架两个核心问题:映射和数据库连接配置:
映射Product类对应数据库freestyle中的product_表,这个表不必自己创建,因为hibernate框架在设置了updata后会自己创建该表。
映射表:
Product.hbm.xml:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.how2java.pojo"> <class name="Product" table="product_"> <id name="id" column="id"> <generator class="native"> </generator> </id> <property name="name" /> <property name="price" /> </class></hibernate-mapping>
数据库配置文件:
hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/freestyle?characterEncoding=GBK</property> <property name="connection.username">root</property> <property name="connection.password">123456</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="current_session_context_class">thread</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <mapping resource="com/how2java/pojo/Product.hbm.xml" /> </session-factory></hibernate-configuration>
接下来,创建DAO层,DAO即是用来控制对象对数据库的访问,并且封装数据库操作的访问控制层,ta使得任何对数据库CRUD的操作都交由DAO对象进行操作控制,即我们需要通过new DAO的实例来实现数据库操作。
ProductDAO.java:
package com.how2java.dao;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import com.how2java.pojo.Product;public class ProductDAO { public void add(Product p) { List<Product> result = new ArrayList(); SessionFactory sf = new Configuration().configure() .buildSessionFactory(); Session s = sf.openSession(); s.beginTransaction(); s.save(p); s.getTransaction().commit(); s.close(); sf.close(); } public Product get(int id) { Product result = null; SessionFactory sf = new Configuration().configure() .buildSessionFactory(); Session s = sf.openSession(); result = (Product) s.get(Product.class, id); s.close(); sf.close(); return result; } public void delete(int id) { List<Product> result = new ArrayList(); SessionFactory sf = new Configuration().configure() .buildSessionFactory(); Session s = sf.openSession(); s.beginTransaction(); Product p = (Product) s.get(Product.class, id); s.delete(p); s.getTransaction().commit(); s.close(); sf.close(); } public void update(Product p) { List<Product> result = new ArrayList(); SessionFactory sf = new Configuration().configure() .buildSessionFactory(); Session s = sf.openSession(); s.beginTransaction(); s.update(p); s.getTransaction().commit(); s.close(); sf.close(); } public List<Product> listProduct() { List<Product> result = new ArrayList(); SessionFactory sf = new Configuration().configure() .buildSessionFactory(); Session s = sf.openSession(); Query q = s.createQuery("from Product p"); result = q.list(); s.close(); sf.close(); return result; }}
这里注意会话和线程服务的创建:
SessionFactory sf = new Configuration().configure() .buildSessionFactory(); Session s = sf.openSession(); s.beginTransaction();
如果有BaseDAO层则可以把这里写入更基本的BaseDAO层以减少代码的耦合度。
接下来交给Struts框架:
Struts框架主要用于传输过程中拦截和加工处理对象,其核心文件web.xml:
<web-app> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> <url-pattern>/*</url-pattern> </filter-mapping></web-app>
拦截后按照struts.xml的逻辑执行:
分别为增加,删除,获取,修改,查询配置Action
为了便于理解,这里没有使用通配符,可以查看struts的通配符匹配简化配置
struts.xml:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"><struts> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <package name="basicstruts" extends="struts-default"> <action name="addProduct" class="com.how2java.action.ProductAction" method="add"> <result name="list" type="redirect">listProduct</result> </action> <action name="deleteProduct" class="com.how2java.action.ProductAction" method="delete"> <result name="list" type="redirect">listProduct</result> </action> <action name="editProduct" class="com.how2java.action.ProductAction" method="edit"> <result name="edit">/product/edit.jsp</result> </action> <action name="updateProduct" class="com.how2java.action.ProductAction" method="update"> <result name="list" type="redirect">listProduct</result> </action> <action name="listProduct" class="com.how2java.action.ProductAction" method="list"> <result name="listJsp">/product/list.jsp</result> </action> </package></struts>
Struts核心部分是action,那action的作用是什么?
1、可以进行一些表单数据的检查,这里面的检查一般和页面的检查是不一样的,页面的检查都是客户端的一些数据格式规范的检查,这里的检查而与业务相关的检查一般放到这里面检查,比如与JavaBean相关的一些操作。也可以说它是一个业务逻辑的管理分发的地方。
2、执行必要的业务逻辑,不如存取数据库,调用实体bean等。它会直接调用业务逻辑层的javabean去处理数据库的操作,比如增删改查等。
3、根据处理的结果决定程序的去向,并以ActionForward对象的形式传递给ActionServlet,这样ActionServlet通过配置文件,决定返回的数据到达那个页面。
4、Action是一个抽象类,必须实现以后才能执行,执行的方法是execute方法。
接下来需要对action准备对应的方法:
ProductAction.java:
package com.how2java.action;import java.util.List;import com.how2java.dao.ProductDAO;import com.how2java.pojo.Product;public class ProductAction { ProductDAO pdao = new ProductDAO(); Product product; List<Product> products; public List<Product> getProducts() { return products; } public void setProducts(List<Product> products) { this.products = products; } public Product getProduct() { return product; } public void setProduct(Product product) { this.product = product; } public String add() { pdao.add(product); return "list"; } public String edit() { product =pdao.get(product.getId()); return "edit"; } public String delete() { pdao.delete(product.getId()); return "list"; } public String update() { pdao.update(product); return "list"; } public String list() { products = pdao.listProduct(); return "listJsp"; }}//先初始化Product product和Product<list>product,在为Action 准备对应的方法并返回string
接下来需要用jsp编写页面显示,注意jsp作为一种网页显示技术可同时嵌套Java和html;
我们先编写list.jsp提供增加和显示功能以及删除和修改的超链;
list.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%><%@ taglib prefix="s" uri="/struts-tags"%><html><body><table align="center" border="1" cellspacing="0" width="500px"> <tr> <td>id</td> <td>name</td> <td>price</td> <td>edit</td> <td>delete</td> </tr> <s:iterator value="products" var="p"> <tr> <td>${p.id}</td> <td>${p.name}</td> <td>${p.price}</td> <td><a href="editProduct?product.id=${p.id}">edit</a></td> <td><a href="deleteProduct?product.id=${p.id}">delete</a></td> </tr> </s:iterator></table><br/><form action="addProduct" method="post"><table align="center" border="1" cellspacing="0"> <tr> <td> name: </td> <td> <input type="text" name="product.name" value=""> </td> </tr> <tr> <td> price: </td> <td> <input type="text" name="product.price" value="0"> </td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="submit"> </td> </tr></table></form></body></html>
然后在编写edit.jsp用于编辑列表信息:
edit.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%><%@ taglib prefix="s" uri="/struts-tags"%><html><body><form action="updateProduct" method="post"><table align="center" border="1" cellspacing="0"> <tr> <td> name: </td> <td> <input type="text" name="product.name" value="${product.name}"> </td> </tr> <tr> <td> price: </td> <td> <input type="text" name="product.price" value="${product.price}"> </td> </tr> <tr> <td colspan="2" align="center"> <input type="hidden" name="product.id" value="${product.id}"> <input type="submit" value="submit"> </td> </tr></table></form></body></html>
最后创建Index.jsp:用于跳转:
index.jsp:
<jsp:forward page="listProduct"/>
注意这个程序并没有用到客户端的跳转传参,而是用type=”redirect”直接进行客户端的跳转,在每次修改或添加时重新跳转到list.jsp并且使用STRUTS特有标签S:Interator进行遍历输出,这样是有区别与AJAX的即时显示,在每次进行操作时都会与数据库交互一次,并且在list.jsp更新输出。
关于数据从页面传入数据库,Struts本身可以通过new productdao创建实体类DAO层对象,并且在方法中直接调用赋值的方法进行页面和通过更新跳转list.jsp的方式进行数据库表内容的即时显示。
PS:最后,如果要实现运行需要导入正确的jar包
- Struts+hibernate应用实现页面操作数据库
- Struts+hibernate+Spring 实现批量操作
- 整合Struts+Hibernate+Spring应用开发 Hibernate hql操作详解
- 为struts+spring+hibernate增加显示数据库操作语句功能
- Struts+Hibernate应用实例
- ssh(struts+spring+hibernate)实现简单的插件化应用
- 用Struts,Spring和hibernate实现登录操作
- 在Hibernate应用中实现批量操作
- 在Hibernate应用中实现批量操作
- struts+spring+hibernate实现数据库记分页显示
- struts+spring+hibernate实现数据库记分页显示
- struts spring hibernate实现数据库记分页显示
- Struts + Hibernate 实现 分页
- Struts+Hibernate 分页实现
- struts+hibernate分页实现
- Struts+Hibernate 实现添加
- Struts+Hibernate实现分页
- Struts+Hibernate实现分页
- 新相亲时代:2亿人及其背后家庭组成的“擂台”
- [RK3288][Android6.0] 调试笔记 --- Ubuntu下重新签名apk方法
- YTU.3129: 进阶递归之全排列
- 用js写一个简单的计算器
- PullPullToRefreshListView的下拉刷新,上拉加载
- Struts+hibernate应用实现页面操作数据库
- shell变量(系统变量和环境变量)
- nlp语义理解的一点儿看法
- C++——左值引用和右值引用
- 阿里、百度、搜狐、优土等互联网公司面试经验总结
- android自定义控件手势密码
- JavaScript基础之Node.js基本模块
- The user operation is waiting for ... "..." to complete
- Base64加密解密