如何实现Hibernate_Struts 数据库应用程序

如何实现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);

修改成:

m_Test.setUserID(java.lang.Integer.parseInt(expression,10)); 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值