摘自:http://hi.baidu.com/%B7%E7%D3%EA%B9%CA%C8%CB/blog/item/a1e2eb5146e8f2898c543031.html
    这个假期的课程设计是基于struts和hibernate做一个类似于taobao一样的网站,数据库是基于MySQL的,开发的IDE是eclipse和Myeclipse的插件,服务器当然是tomcat.
         
        学习阶段:切记:实践是学习的最佳途径
          步骤一、java的安装和tomcat与eclipse的配置集成
                  eclipse+myeclipse+tomcat的开发(感谢pony和他的名言"抄袭是一种美德")
http://www.cnblogs.com/pony/archive/2008/07/03/1234615.html

                 如果你希望对基于纯tomcat的web开发理解更深刻一点,强烈建议你学习一下这篇帖子
http://hi.baidu.com/%B7%E7%D3%EA%B9%CA%C8%CB/blog/item/f8170ffbf819f161024f5675.html

          步骤二、MySql的安装
                数据库的安装基本没有什么困难,特别把这个拿出来说是因为原版的MySql根本没有界面,这个对于像我这样的新手来说也照实迷茫了一小段时间,然后我就找到了"SQL-Front",这是个MySql的图形管理工具,http://search.gougou.com/search?search=SQL-Front&id=2上面有,这个链接是迅雷主站的链接,你可以选择一个中文版下下,我下的是英文版,主要是看网上有人说Mysql有中文字符问题,我力求简单,所以未雨绸缪了一下,下了个英文版本的。
          SQL-Front配置方法其实很简单,但是网上说的人很少,我就简单的说下:
          SQL-Front配置
      a、点击桌面的SQL-Front快捷方式
      b、弹出了一个对话框,你只需要在"General"的name中随便写点什么表示连接的名字(无所谓的),在"connection"中的Server 里面填上你需要连接的服务器的地址,我的服务器就是本机,所以我写上了"localhost",最后你只需要在Login里面写上登录数据库的密码(就是 你安装数据库的时候设置的密码),然后点击database选择你所需要连接的数据库,然后点击确定按钮即可。
    c、此时会出现一个对话框,上面有你建立好的连接名,选中,点击打开按钮就可以看到我们的Mysql的操作界面了。

         步骤三、struts、hibernate和spring与myeclipse的集成.
         http://hi.baidu.com/sukeqiu/blog/item/dceb93f49aa71e6adcc47403.html
         我觉得基本上没有比上面这篇帖子更好的网络资源了。(感谢Suker)
          按照上面的帖子做了做,基本能够将struts hibernate 和 spring的过程熟悉一遍,成不成功是另外一回事,我反正是没成功过,主要是时间不够,而且太粗心老是有些细节性的东西搞错了,没怎么成功过,但是之所 以介意这篇帖子,主要因为这篇帖子是目前网络上最新的,这篇帖子能够让你快速的熟悉环境,手把手教你配置。
          熟悉完上篇帖子后就可以看主题贴"struts和hibernate"的配置使用了。
          http://hi.baidu.com/googee/blog/item/62299044b82b6583b3b7dc71.html
         写的还不错,肯定是实践过的人写的,但是不详细,但是有了上面那帖子的沉淀,基本上能看明白这篇帖子了,这样基本上你就能写出你的第一个基于struts和hibernate的程序了.

         步骤四、找一两本专门写基于struts和hibernate应用的书来看看。里面最好有少量的理论和大量的实例,因为光靠上面的三个步骤,你只能写写login页面,再难的关于strtus的标签内的东东就搞不定了,包括在页面的循环输出的logical标签,只有参阅树上的实例才能了解,网上这方便的东西太少了。
         我用的是<<Struts+Hibernate开发web应用——从基础到实践>>||吴明晖 吴超 编著
                       <<Strtus+Hibernate使用教程>>||邬继成 编著


           如上就是我学习struts和hibernate所参考的若干资源,下面我将我在学习过程当中遇到的若干问题稍微阐述,共同学习。
            1、如何理解forward。
                基本上能够在两个地方看到forward,其一是在action中看到
                  mapping.findForward("testPage")
                另外一个是在配置文件strtuts-config.xml中看到
                  <forward>
               这样便不难理解了,action中的mapping是通过寻找配置文件当中的forward来定位所要返回的内容.forward基本上有两个范围,一个 是global-forwards 表示在任何一个action中都可以用这个forward,另外一个是在特定的action中的定义的forwards,表示只能在这个特定的 action中找到这个forwards

         2、利用链接直接定位到action的.do
               在web开发过程中我们不可能总也是利用提交按钮来跳转页面,有的时候我们需要利用超链接来定位到某个网页,并且超链接带有参数,所以希望在页面显示之前利用参数做些初始化,我就遇到了这样的问题,不知道如何的定位,具体的方法如下:
              <a href="login.do?mode=1">登录</a>
             这样就可以直接定位到loginAction里面了,可是这里有个注意点。看看配置文件:
            <action
                     attribute="showGoodsForm"
                     name="showGoodsForm"
                      <!-- input="/form/showGoods.jsp" -->
                       path="/showGoods"         {这个即为链接要定向的action}
                      scope="request"
                      type="com.shop.struts.action.ShowGoodsAction" />
             我利用相同的方式<a href="showGoods.do?mode=1" />刚开始的时候总是说请求无效,我以为定位错了,因为我用这个链接的地方是index.jsp(在根目录下)和用login.jsp(在根目录的 下一层)的层次不一样,后来才发现原来是配置文件中的"input"的问题,我把input注释掉了,结果就ok了,我分析大概是由于这个input限制 了只有showGoods.jsp才能发送请求,所以我在index中用超链接来定位就出问题了。

          3、关于循环条目的输出方法
             在程序设计当中我们经常希望从数据库当中读进多条记录显示在页面上,比如想浏览某一大类下的所有商品信息,在传统的jsp开发当中,我们利用的方法经常是
                  <% for(int i=0;i<{num}'i++)%>
                    <%out.println();%>
              的类似的方法,而有了struts框架,我们可以利用logic和bean标签来实现,这种方法非常类似于.net平台下的gridview的用法,只是struts没有可视化的控件来用。具体方法如下
           <table>
                <logic:notEmpty name="{formName}" property="{collection}">
                      <logic:iterate indexId="index" id="{itemname}" name="formName" property="{collection}">
                          <tr>
                              <td>
                                   <bean:write name="{itemname}" property="{属性名}">
                               </td>
                          </tr>
           </table>                     
           formName:是在struts-config中已定义的<form-beans>,切记整个struts只定义了一个form
           collection:是在form当中定义的一个具有iteratrable的容器,可以是vector等,并且需要提供get的显示方法(这两点是我自己猜想的,只有如此才有统一的接口)
             id:随便定义,类比于Java中的 for(type temp : collection)语法中的那个temp的意思
           property:就是你想要打印出来的那个实例的属性,必须提供get方法

            还有一个重要的问题,我是forward跳转到这个页面的,forward利用的方法是redirect,所以在这里由于scope是request于是就找不到对应的bean了,具体的情况请参考这篇帖子,讲得很好。
           http://hi.baidu.com/%D3%D2%CA%D6%C4%AA%D4%FA%CC%D8%B5%C4/blog/item/6829303618c20d340a55a985.html
                 
           4、条件输出—<logic:empty>和<logic:notEmpty>的一点发现
            今天希望做一个功能,就是当用户登录的时候在首页出现登录信息,如果没有登录则出现未登录信息。于是乎就发现了这样的做法:
               <logic:empty name="user">
                        <a href="#" class="">[免费注册]</a>
                        <a href="form/login.jsp" class="titlelink">[登录]</a>
               </logic:empty>
                <logic:notEmpty name="user">
                       欢迎您光临本站 <a href="#" class="">[注销]</a>
               </logic:notEmpty>
             稍微解释一下,我发现这个empty标签在寻找"user"的时候会在request和session两个scope内寻找,如果找到就输出第二条,如果 没有找到就输出第一条。这样当登录的时候我在action里面设置session的对象,如果点击注销则在action里面设置session的对象为 空。

          5、struts当中资源文件ApplicationResources.properties不能填写中文的方法
            http://hi.baidu.com/lyq32/blog/item/86fa37dd2a44cadc8d102987.html

          6、今天在用hibernate保存数据的时候用到下面一个方法
           session.save(tempUser); 这里我的tempUser是数据库当中的一张表User的表,我的表中的主键ID是让MySql数据库自动生成的,但是hibernate在帮我生成类的时候的配置文件当中是这样写的:
          <id name="userId" type="java.lang.Integer">
            <column name="userID" />
            <generator class="assigned" />
            </id>
           通过上网查阅了这篇帖子
          http://hi.baidu.com/llscompazz/blog/item/8f8d6529308246fb98250a6b.html
           我发现如果指定了assigned,则必须在程序当中指定ID的值,这个与我的设计完全不同,经过上面的帖子的说明,我将class的值变换为了identity,这样便可以成功的采用了session.save()方法了,否则会出现异常。

          7、理解action当中的name属性和attribute属性
          http://hi.baidu.com/mum0532/blog/item/abc5e833044ddf41ac4b5f59.html

          8、初始化<html:text>
          http://hi.baidu.com/dorachopper/blog/item/ee03c82a5eb9de3d5243c15b.html
           补充一句,我利用的是那个value="${}"的方法,但是和帖子上说的不完全一样,因为我在其他地方设置过了 session.setAttribute("address","nwpu"),所以这里我直接写上了value="${address}",就自动显 示出来了,很方便。