Struts+hibernate应用实现页面操作数据库

在Struts+hibernate框架的结合应用中,这两种框架本身提供了操作的思路和对Java J2EE原先一些对servlet,bean的应用的简化和封装。

整合Struts和hibernate,基本思路就是把MVC中的Model模型部分使用hibernate来做:
Struts+hibernate应用实现页面操作数据库_第1张图片

这里先说一下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框架。

下面直接给最终的实现页面和源码:
Struts+hibernate应用实现页面操作数据库_第2张图片
最终效果图如上:提供三个连接可以进行修改,删除,和编辑,并且在提交操作后立刻刷新查询页面。

运行环境: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:




<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:




<hibernate-configuration>

    <session-factory>
        
        <property name="connection.driver_class">com.mysql.jdbc.Driverproperty>
        <property name="connection.url">jdbc:mysql://localhost:3306/freestyle?characterEncoding=GBKproperty>
        <property name="connection.username">rootproperty>
        <property name="connection.password">123456property>
        
        <property name="dialect">org.hibernate.dialect.MySQLDialectproperty>
        <property name="current_session_context_class">threadproperty>
        <property name="show_sql">trueproperty>
        <property name="hbm2ddl.auto">updateproperty>
        <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 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 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 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 listProduct() {
        List 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>struts2filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        filter-class>
    filter>

    <filter-mapping>
        <filter-name>struts2filter-name>
        <dispatcher>FORWARDdispatcher>
        <dispatcher>REQUESTdispatcher>        
        <url-pattern>/*url-pattern>
    filter-mapping>

web-app>

拦截后按照struts.xml的逻辑执行:
分别为增加,删除,获取,修改,查询配置Action
为了便于理解,这里没有使用通配符,可以查看struts的通配符匹配简化配置
struts.xml:




<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">listProductresult>
        action>
        <action name="deleteProduct" class="com.how2java.action.ProductAction"
            method="delete">
            <result name="list" type="redirect">listProductresult>
        action>
        <action name="editProduct" class="com.how2java.action.ProductAction"
            method="edit">
            <result name="edit">/product/edit.jspresult>
        action>
        <action name="updateProduct" class="com.how2java.action.ProductAction"
            method="update">
            <result name="list" type="redirect">listProductresult>
        action>
        <action name="listProduct" class="com.how2java.action.ProductAction"
            method="list">
            <result name="listJsp">/product/list.jspresult>
        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 products;

    public List getProducts() {
        return products;
    }

    public void setProducts(List 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和Productproduct,在为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>idtd>
        <td>nametd>
        <td>pricetd>
        <td>edittd>
        <td>deletetd>
    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}">edita>td>
            <td><a href="deleteProduct?product.id=${p.id}">deletea>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包

你可能感兴趣的:(java学习过程)