如何实现Hibernate_Struts 数据库应用程序
[目标]
本例的目标是实现一个简单的Struts 数据库应用程序。其功能是从SQL Server 2000中读取数据,并以表格的形式在输出页中显示出来。
定义一个名为“Test”表的字段:
录入一些测试数据:
[效果]
(1)全部显示:
输入页面:
输出页面:
(2)查询显示:
[背景知识]
[步骤]
1、打开Visual Struts开发环境:
从桌面JavaWebStudio快揵或BIN目录下的JavaWebStudio.exe文件启动JavaWebStudio的Visual Struts开发环境。
2、建立一个“空的Hibernate_Struts项目模板”应用程序:
选择菜单“文件”—“新建”—“新建项目”,弹出新建项目对话框,如图3-1所示:
在对话框中选择“空的Struts数据库应用模板”,在项目名称中输入“MyHibernate”,package (包名)和位置(项目的路径)采用默认的值就行,当然也可以根据需要改变。最后点击“确定”按钮完成新项目的建立。
从文件管理器中可看出MyHibernate项目的文件结构如下:
在MyHibernate项目根目录下包含四个子目录和两个文件,这是JavaWebStudio项目的标准结构,最好不要改变它们默认的名称,否则会出现问题。
3、利用Struts数据库应用文件向导建立新的应用:
在JavaWebStudio文件管理器内点击鼠标右键,在弹出的菜单中选择“Hibernate”—“Hibernate_Struts文件向导”进入Struts文件向导对话框,也可以选择菜单“文件向导”—“ Hibernate_Struts文件向导”进入Hibernate文件向导对话框。如下图所示:
(1)输入文件名:
(2)从数据源中导入SQL语句及数据表的字段信息(字段名和字段类型):
(3)从数据据表中选择所需的表“Test”。
需要特别注意的是,这里的“从数据源中导入SQL语句及数据表的字段信息”及“从数据据表中选择所需的表”仅仅是为了自动生成SQL语句及读取字段信息,这里完成可以直接手工输入,与该项目的数据库连接池的配置无关,下面第(4)点将另行配置数据库连接池。
DAO文件、输入JSP文件、ActionForm文件、Action文件等选择默认就行了,主要是设置一下JSPOut文件,让它自动分页、每页显示4条记录,选择删除、编辑、链接和添加新记录功能。
接下来配置数据库连接池,其它属性页可采用默认的就行了,下面直接转去数据连接配置属性页即可。
(4)配置数据库连接池:
这里要特别注意的是Hibernate的数据库连接池配置文件是Hibernate.properties,并且dialect类名是org.hibernate.dialect.SQLServerDialect。
4、项目文件结构
项目目录结构分析见《如何实现最简单的Struts程序》,这次Hibernate文件向导自动生成了八个文件,其中web目录下是输入、输出两个JSP文件,src目录下是Java文件。除了文件名是我们输入之外,所有程序源代码都是文件向导自动生成的,所有的配置也是自动完成的。
刷新JavaWebStudio文件管理器,这时发现web目录下自动生成了两个文件,分别是Test.jsp.jsp、TestInsert.jsp和TestOut.jsp.jsp,分别是查询条件输入JSP文件、新记录添加JSP文件和表格输出JSP文件;src//emptyprj目录下自动生成了五个文件,分别是TestAction.java和TestForm.java,前者是Action文件,后者是FormAction文件;还有是数据库操作文件Test.java和TestDAO.java,前者用于保存数据表记录的Bean,后者是数据库操作DAO文件;还要特别注意的是还有一个xml文件,就是Test.hbm.xml,用于Hibernate对象与数据库的映射。
Test.jsp文件:
TestInsert.jsp文件:
TestOut.jsp文件:
5、编译、启动服务器、运行:
通过工具条上的按键分别编译项目及启动服务器,然后把开Test.jsp并通过工具条上的“运行”按键运行Test.jsp。
这里将采用调试状态下的运行方式:
(1) 显示调试工具条:
注:单步执行可跟踪进原函数执行;单过程执行按语句跟踪,一般选择单过程执行即可。
(2)选择调试状态下的“编译”:
输出栏中输出如下提示信息:
C://Documents and Settings//Administrator//桌面>F:
F://>cd F://JavaWebStudio//JavaWebStudioWorkDir//MyHibernate
F://JavaWebStudio//JavaWebStudioWorkDir//MyHibernate>ant -buildfile build.xml
Buildfile: build.xml
prepare:
[copy] Copying 1 file to F://JavaWebStudio//jakarta-tomcat-5.5.4//webapps//MyHibernate//WEB-INF//classes
compile:
[javac] Compiling 5 source files to F://JavaWebStudio//jakarta-tomcat-5.5.4//webapps//MyHibernate//WEB-INF//classes
[javac] F://JavaWebStudio//JavaWebStudioWorkDir//MyHibernate//src//emptyprj//TestAction.java:68: setUserID(int) in emptyprj.Test cannot be applied to (java.lang.String)
[javac] m_Test.setUserID(expression);
[javac] ^
[javac] 1 error
BUILD FAILED
F://JavaWebStudio//JavaWebStudioWorkDir//MyHibernate//build.xml:34: Compile failed; see the compiler error output for details.
Total time: 9 seconds
出现一个错误,原因是因为前面我们设置userID为整数类型,而这里的expression是字符串类型,所以要修改一下TestAction.java文件:
package emptyprj;
import emptyprj.TestDAO;
import java.lang.reflect.InvocationTargetException;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.util.ModuleException;
import org.apache.struts.util.MessageResources;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
public final class TestAction extends Action
{
// 变量定义:
private Log log = LogFactory.getLog("org.apache.struts.webapp.Example");
public TestAction() {
}
//函数定义:
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception
{
// Extract attributes and parameters we will need
Locale locale = getLocale(request);
MessageResources messages = getResources(request);
HttpSession session = request.getSession();
TestForm m_TestForm = (TestForm) form;
TestDAO m_TestDAO = TestDAO.getInstance(); //定义Hibernate__DAO对象,用于实现数据库的各种操作
String action=request.getParameter("action"); //动作类型
String search=request.getParameter("search"); //数据库查找方式
String expression=request.getParameter("expression"); //参数,这里用于保存记录(行)的ID数据
if(action==null)action="find";
if(search==null)search="UNsearch";
if(expression==null)expression="";
expression=toChinese(expression); //处理中文问题,实现编码转换
/
if("delete".equals(action)) //删除记录操作
{
Test m_Test= new Test();
//<delete>
m_Test.setUserID(expression);
//</delete>
m_TestDAO.removeID(m_Test);
}
if("update".equals(action)||"insert".equals(action)) //更新、添加记录操作
{
Test m_Test= new Test();
//<update>
m_Test.setUserID(m_TestForm.getUserID());
m_Test.setUsername(m_TestForm.getUsername());
m_Test.setPassword(m_TestForm.getPassword());
m_Test.setRole(m_TestForm.getRole());
//</update>
if("update".equals(action)) //调用DAO对象更新记录
m_TestDAO.update(m_Test,expression);
if("insert".equals(action)) //调用DAO对象添加记录
m_TestDAO.create(m_Test);
}
///HQL_查找数据库
String sql="from emptyprj.Test Test";
SQL字符处理,主要是加入查询条件,如果是全部显示,可把这部分代码删除。
if("search".equals(search))
{
String selectsql;
//<search>
sql+=" where ";
sql+="userID";
sql+="=";
if("NULL".equals(expression)||"".equals(expression))
{
sql+=m_TestForm .getUserID();
}
else
{
sql+=expression;
}
sql+="";
//</search>
}
//<分页>
m_TestDAO.setLength(4);//设置每页显示记录数
int ipage;//当前页
try
{
String page=request.getParameter("page");//分页参数,读取请求的当前页
ipage=java.lang.Integer.parseInt(page,10);
}
catch (Exception e)
{
ipage=m_TestForm.getPage();
}
if(ipage<1)ipage=1;
Collection col = m_TestDAO.findSQL("select Test "+sql,"select count(Test) "+sql,ipage);//通过DAO对象查询数据
request.setAttribute("Test",col); //保存数据
String pagestr=m_TestDAO.getPagestr(ipage);//分页字符串,分页内容
String s_find,str;
if(!"search".equals(search)) //查找和全部显示两个不同的操作,其分页字符串不同,在此进行处理。如果是全部显示则去掉"search=search&"
{
s_find="search=search&";
while(pagestr.indexOf(s_find)!=-1)
{
str=pagestr.substring(0,pagestr.indexOf(s_find));
str+=pagestr.substring(pagestr.indexOf(s_find)+s_find.length(),pagestr.length());
pagestr=str;
}
}
m_TestForm.setPagestr(pagestr);
m_TestForm.setAction(action);
request.setAttribute("TestForm",m_TestForm);
//</分页>
return mapping.findForward("success");
}
public String toChinese(String ss) {
//处理中文问题,实现编码转换
if (ss != null) {
try {
String temp_p = ss;
byte[] temp_t = temp_p.getBytes("ISO8859-1");
ss = new String(temp_t);
}
catch (Exception e) {
System.err.println("toChinese exception:" + e.getMessage());
System.err.println("The String is:" + ss);
}
}
return ss;
}
}
把上述TestAction.java文件第68行:
m_Test.setUserID(expression);
修改成: