JAVA Hibernate 3.3 +Struts2.2 制作搜索功能

今天在项目中需要加入一个搜索功能,由于项目是jsp的,且有16个页面之多。16个页面还都是关联到数据库中的。因此对应16个不同的页面对应的16张数据表,制作16个搜索页显然不靠谱。
于是决定制作一个通用搜索功能,使得每个页面仅仅需要传入一个带有少量参数的超链接,就能获取对应的结果集。
难点部分是 由于每张数据表的数据字段个数不同,且每张表的具体字段对于搜索模块本身是不可知的。因此在输出Resultset 结果集的时候,还需要知道对应该结果集的所有字段名称。 因此其思路为:1.通过类名,得出所有类字段 2.通过类名获取该类的数据集 3.循环数据集并遍历类字段获取所有的数据结果

数据库操作类
SearchDAO.java
[cc lang=”java” nowrap=”false”]
package com.sun_hr.action;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**搜索模块
*
* @author DreamFairy
*Date:2012-1-10
*/

public class SearchDAO {
//需要过滤的数据类型
private final String typeInteger=”class java.lang.Integer”;
private final String typeDouble=”class java.lang.Double”;
private final String typeShort=”class java.lang.Short”;
private final String typeString=”class java.lang.String”;

private String _tableName;
private String _className;
private String _searchString;
private int _searchNum;
private String _searchField;
private String _sql;
private List _fieldStrings;

//重构函数,支持数值和字符串2中参数的构造函数
public SearchDAO(String tableName,String searchString,String searchField)
{
_className=”com.sun_hr.pojo.”+tableName;
_tableName=tableName;
_searchString=searchString;
_searchField=searchField;
getFieldName();
_sql=”select * from “+_tableName+” where “+_searchField+”='”+_searchString+”‘”;
getResult();
}

public SearchDAO(String tableName,int searchNum,String searchField)
{
_className=”com.sun_hr.pojo.”+tableName;
_tableName=tableName;
_searchNum=searchNum;
_searchField=searchField;
getFieldName();
_sql=”select * from “+_tableName+” where “+_searchField+”=”+_searchNum;
System.out.println(_sql);
getResult();
}

//获取结果集
public ResultSet getResult()
{
try {
//创建连接oracle数据库的驱动
Class ojdbcClass=Class.forName(“oracle.jdbc.driver.OracleDriver”);
try {
Connection con=DriverManager.getConnection(“jdbc:oracle:thin:@192.168.2.64:1521:orcl”,”sun”,”admin”);
Statement stmt = con.createStatement();
ResultSet rs=stmt.executeQuery(_sql);
//返回数据查找结果集
return rs;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}

//获取字段集
private void getFieldName()
{
Class _class = null;
try {
//通过反射来获取传入的类名所对应的实体类
_class = Class.forName(_className);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将反射出的实体类中反射出所有字段并存入一个数组中
Field[] fields=_class.getDeclaredFields();
_fieldStrings=new ArrayList();
for(int i=0;i get_fieldStrings() {
return _fieldStrings;
}

public void set_fieldStrings(List fieldStrings) {
_fieldStrings = fieldStrings;
}

}
[/cc]

Struts 的Action类
SearchAction.java
[cc lang=”java” nowrap=”false”]
package com.sun_hr.action;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class SearchAction {
private List listmap;
private String[] valueArr;
private String key;
private String[] fields;

private String searchtableName;
private String searchString;
private int searchNum;
private int isNaN;
private String searchfield;

public String execute()
{
listmap=new ArrayList();

SearchDAO sa = null;
//判断传入的查询数据是否为数值型,之后判断调用DAO具体的构造函数
if (isNaN == 1) {
try {
//对传入的数据进行解码,防止jsp页面传入的数据出现乱码
searchString = URLDecoder.decode(URLDecoder.decode(searchString, “utf-8″),”utf-8”);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sa = new SearchDAO(searchtableName, searchString, searchfield);
} else {
sa = new SearchDAO(searchtableName, searchNum, searchfield);
}
ResultSet rSet=sa.getResult();

try {
while(rSet.next())
{
valueArr=new String[sa.get_fieldStrings().size()];
fields=new String[sa.get_fieldStrings().size()];
for(int i=0;i getListmap() {
return listmap;
}

public void setListmap(List listmap) {
this.listmap = listmap;
}

public String[] getValueArr() {
return valueArr;
}

public void setValueArr(String[] valueArr) {
this.valueArr = valueArr;
}
public String getKey() {
return key;
}

public void setKey(String key) {
this.key = key;
}
public String[] getFields() {
return fields;
}

public void setFields(String[] fields) {
this.fields = fields;
}
}
[/cc]

实际页面
test.jsp
[cc lang=”javascript” nowrap=”false”]
function search()
{
var searchdata=document.getElementById(“textfield2″);//获取搜索框中的数据
searchdata=encodeURI(encodeURI(searchdata.value,”utf-8″),”utf-8”); //对将要进行的传递的数据进行编码
//调用Action “GoTosearch” 传递3个参数 isNaN 是否为数值,searchtableName 要搜索的表名 searchfield 要搜索的字段 searchNum 要搜索的数据
location=”GoTosearch?isNaN=0&searchtableName=Employeecertificate&searchfield=cid&searchNum=”+searchdata;
}
[/cc]

发表评论

电子邮件地址不会被公开。 必填项已用*标注