struts 2中的doubleselect 实现了级联操作,本文通过一个简单的是实例,说明怎样对数据库中的表进行级联。
希望对初学者有点滴的帮助。
本文给出了完整的实现过程,并有源代码下载。
本文参考了http://opas.iteye.com/blog/183518 向作者表示谢意
注意:用IE来看本文,要不然贴图看不到
首先建立数据库
CREATE DATABASE JPETSTORE;
USE JPETSTORE;
create table category (
catid varchar(10) not null,
name varchar(80) null,
descn varchar(255) null,
constraint pk_category primary key (catid)
);
create table product (
productid varchar(10) not null,
category varchar(10) not null,
name varchar(80) null,
descn varchar(255) null,
constraint pk_product primary key (productid),
constraint fk_product_1 foreign key (category)
references category (catid)
);
INSERT INTO category VALUES ('FISH','Fish','<image src="../images/fish_icon.gif"><font size="5" color="blue"> Fish</font>');
INSERT INTO category VALUES ('DOGS','Dogs','<image src="../images/dogs_icon.gif"><font size="5" color="blue"> Dogs</font>');
INSERT INTO category VALUES ('REPTILES','Reptiles','<image src="../images/reptiles_icon.gif"><font size="5" color="blue"> Reptiles</font>');
INSERT INTO category VALUES ('CATS','Cats','<image src="../images/cats_icon.gif"><font size="5" color="blue"> Cats</font>');
INSERT INTO category VALUES ('BIRDS','Birds','<image src="../images/birds_icon.gif"><font size="5" color="blue"> Birds</font>');
INSERT INTO product VALUES ('FI-SW-01','FISH','Angelfish','<image src="../images/fish1.gif">Salt Water fish from Australia');
INSERT INTO product VALUES ('FI-SW-02','FISH','Tiger Shark','<image src="../images/fish4.gif">Salt Water fish from Australia');
INSERT INTO product VALUES ('FI-FW-01','FISH', 'Koi','<image src="../images/fish3.gif">Fresh Water fish from Japan');
INSERT INTO product VALUES ('FI-FW-02','FISH', 'Goldfish','<image src="../images/fish2.gif">Fresh Water fish from China');
INSERT INTO product VALUES ('K9-BD-01','DOGS','Bulldog','<image src="../images/dog2.gif">Friendly dog from England');
INSERT INTO product VALUES ('K9-PO-02','DOGS','Poodle','<image src="../images/dog6.gif">Cute dog from France');
INSERT INTO product VALUES ('K9-DL-01','DOGS', 'Dalmation','<image src="../images/dog5.gif">Great dog for a Fire Station');
INSERT INTO product VALUES ('K9-RT-01','DOGS', 'Golden Retriever','<image src="../images/dog1.gif">Great family dog');
INSERT INTO product VALUES ('K9-RT-02','DOGS', 'Labrador Retriever','<image src="../images/dog5.gif">Great hunting dog');
INSERT INTO product VALUES ('K9-CW-01','DOGS', 'Chihuahua','<image src="../images/dog4.gif">Great companion dog');
INSERT INTO product VALUES ('RP-SN-01','REPTILES','Rattlesnake','<image src="../images/snake1.gif">Doubles as a watch dog');
INSERT INTO product VALUES ('RP-LI-02','REPTILES','Iguana','<image src="../images/lizard1.gif">Friendly green friend');
INSERT INTO product VALUES ('FL-DSH-01','CATS','Manx','<image src="../images/cat2.gif">Great for reducing mouse populations');
INSERT INTO product VALUES ('FL-DLH-02','CATS','Persian','<image src="../images/cat1.gif">Friendly house cat, doubles as a princess');
INSERT INTO product VALUES ('AV-CB-01','BIRDS','Amazon Parrot','<image src="../images/bird2.gif">Great companion for up to 75 years');
INSERT INTO product VALUES ('AV-SB-02','BIRDS','Finch','<image src="../images/bird1.gif">Great stress reliever');
项目贴图:
数据库操作代码
package petstore.dbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DataBaseConnection {
private String DBDRIVER = "com.mysql.jdbc.Driver";
private String DBURL = "jdbc:mysql://localhost:3306/jpetstore?characterEncoding=gbk";
private String DBUSER = "root";
private String DBPASSWORD = "";
private Connection conn = null;
public DataBaseConnection() {
try {
Class.forName(DBDRIVER);
this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
} catch (ClassNotFoundException e) {
System.out.println("驱动程序不存在或名字写错");
System.out.println(e.getMessage());
} catch (SQLException e) {
System.out.println("数据库操作错误");
System.out.println(e.getMessage());
}
}
public Connection getConnection() {
return this.conn;
}
public void close() {
try {
this.conn.close();
} catch (Exception e) {
}
}
};
用到的实体类
package petstore.model;
import java.io.Serializable;
public class Category implements Serializable {
private String categoryId;
private String name;
private String description;
public String getCategoryId() {
return categoryId;
}
public void setCategoryId(String categoryId) {
this.categoryId = categoryId.trim();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
package petstore.model;
import java.io.Serializable;
public class Product implements Serializable {
private String productId;
private String categoryId;
private String name;
private String description;
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId.trim();
}
public String getCategoryId() {
return categoryId;
}
public void setCategoryId(String categoryId) {
this.categoryId = categoryId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String toString() {
return getName();
}
}
dao类:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package petstore.dao;
import petstore.dbc.DataBaseConnection;
import petstore.model.Category;
import java.sql.* ;
import java.util.* ;
public class CategoryDao
{
// 增加操作
// 查询全部
public List<Category> findAll() throws Exception
{
List <Category>all = new ArrayList<Category>() ;
String sql = "SELECT CatId,name,descn FROM Category" ;
PreparedStatement pstmt = null ;
DataBaseConnection dbc = null ;
dbc = new DataBaseConnection() ;
try
{
pstmt = dbc.getConnection().prepareStatement(sql) ;
ResultSet rs = pstmt.executeQuery() ;
while(rs.next())
{
Category Category = new Category() ;
Category.setCategoryId(rs.getString(1)) ;
Category.setName(rs.getString(2)) ;
Category.setDescription(rs.getString(3)) ;
all.add(Category) ;
}
rs.close() ;
pstmt.close() ;
}
catch (Exception e)
{
System.out.println(e) ;
throw new Exception("操作中出现错误!!!") ;
}
finally
{
dbc.close() ;
}
return all ;
}
// 模糊查询
};
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package petstore.dao;
import petstore.dbc.DataBaseConnection;
import petstore.model.Product;
import java.sql.* ;
import java.util.* ;
public class ProductDao
{
// 增加操作
// 查询全部
public List findAll() throws Exception
{
List all = new ArrayList() ;
String sql = "SELECT productId,categoryId,name,description FROM Product" ;
PreparedStatement pstmt = null ;
DataBaseConnection dbc = null ;
dbc = new DataBaseConnection() ;
try
{
pstmt = dbc.getConnection().prepareStatement(sql) ;
ResultSet rs = pstmt.executeQuery() ;
while(rs.next())
{
Product Product = new Product() ;
Product.setProductId(rs.getString(1)) ;
Product.setCategoryId(rs.getString(2)) ;
Product.setName(rs.getString(3)) ;
Product.setDescription(rs.getString(4)) ;
all.add(Product) ;
}
rs.close() ;
pstmt.close() ;
}
catch (Exception e)
{
System.out.println(e) ;
throw new Exception("操作中出现错误!!!") ;
}
finally
{
dbc.close() ;
}
return all ;
}
public List findProductByCategoryId(String id) throws Exception
{
List all = new ArrayList() ;
String sql = "SELECT productId,category,name,descn FROM Product where category=? " ;
PreparedStatement pstmt = null ;
DataBaseConnection dbc = null ;
dbc = new DataBaseConnection() ;
try
{
pstmt = dbc.getConnection().prepareStatement(sql) ;
pstmt.setString(1, id);
ResultSet rs = pstmt.executeQuery() ;
while(rs.next())
{
Product product = new Product() ;
product.setProductId(rs.getString(1)) ;
product.setCategoryId(rs.getString(2)) ;
product.setName(rs.getString(3)) ;
product.setDescription(rs.getString(4)) ;
all.add(product);
}
rs.close() ;
pstmt.close() ;
}
catch (Exception e)
{
System.out.println(e) ;
throw new Exception("操作中出现错误!!!") ;
}
finally
{
dbc.close() ;
}
return all;
}
// 模糊查询
};
Struts 2的action:
package petstore.action.redirect;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import petstore.dao.CategoryDao;
import petstore.dao.ProductDao;
import petstore.model.Category;
import petstore.model.Product;
public class ItemAddRedirectAction extends ActionSupport {
private static final long serialVersionUID = 1L;
public static final String GLOBAL_CATEGORY = "global_category_list"; // 宠物大类列表
public static final String GLOBAL_DOUBLE_LIST = "global_double_list"; // 宠物类列表
private ProductDao productDao=new ProductDao();
private CategoryDao categoryDao=new CategoryDao() ;
private List<Category> categorys;
@SuppressWarnings("unchecked")
private Map doubleMap = new HashMap();
public List<Category> getCategorys() {
return categorys;
}
public void setCategorys(List<Category> categorys) {
this.categorys = categorys;
}
@SuppressWarnings("unchecked")
public Map getDoubleMap() {
return doubleMap;
}
@SuppressWarnings("unchecked")
public void setDoubleMap(Map doubleMap) {
this.doubleMap = doubleMap;
}
public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
public void setCategoryDao(CategoryDao categoryDao) {
this.categoryDao = categoryDao;
}
@SuppressWarnings("unchecked")
@Override
public String execute() throws Exception {
//优化数据库性能
categorys = (List) ActionContext.getContext().getSession().get(
GLOBAL_CATEGORY);
if (categorys == null) {
categorys = categoryDao.findAll();
ActionContext.getContext().getSession().put(GLOBAL_CATEGORY,
categorys);
}
for (int i = 0; i < categorys.size(); i++) {
List<Product> products = productDao
.findProductByCategoryId(categorys.get(i).getCategoryId());
List c = new LinkedList();
for (int j = 0; j < products.size(); j++) {
c.add(products.get(j));
}
doubleMap.put(categorys.get(i), c);
}
return SUCCESS;
}
}
itemAdd.jsp文件:
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title><s:text name="additem_page" /></title>
</head>
<body>
<s:actionerror />
<p id="title">
增加宠物
</p>
<s:form action="itemAddAction" enctype="multipart/form-data" name="itemAdd" id="itemAdd">
<s:doubleselect name="category" list="categorys" doubleName="product"
doubleList="doubleMap.get(top)"></s:doubleselect>
<s:submit key="submit"></s:submit><s:reset key="reset"></s:reset>
</s:form>
</body>
</html>
需要注意:
<s:doubleselect name="category" list="categorys" doubleName="product"
doubleList="doubleMap.get(top)"></s:doubleselect>
doubleselect中的list属性是一个Arraylist doublelist属性是一个HashMap
和ItemAddRedirectAction类中的下列代码对应
private List<Category> categorys;
private Map doubleMap = new HashMap();
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> <include file="struts-default.xml"/> <package name="struts2" extends="struts-default"> <action name="directItemAdd" class="petstore.action.redirect.ItemAddRedirectAction"> <result>/itemAdd.jsp</result> </action> </package> </struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
运行图片:用iE才能看到