posts - 1,  comments - 0,  trackbacks - 0

          1:添加hibernate3.2的支持
          選擇hibernate3.2 Annotations 和core Libraries的勾打上
            hibernate.cfg.xml放到src下
          去掉勾 specify database connection details 交給spring去管理
          去掉勾 create SessionFactory class

          2:添加Spring2.0的支持
          添加如下前4個jar文件和1個
            AOP, Core, Persistence Core,Persistence jdbc
            Spring2.0 Web Libraries
          WEB-INF下生成一個applicationContext.xml
          去掉勾 create Spring SessionFactory that references

          3:添加struts2的支持
            src下放struts.xml文件
           
          4:創建一個users表
          自動有id firstname lastname age;

          5:index.jsp
          <s:a href="save.jsp">save user</s:a><br/>

          <s:a href="listUser.action">List User</s:a><br/>

          6:save.jsp(可以考慮國際化)
          <s:form action="saveUser">
           <s:textfield name="user.firstname" label="firstname"></s:textfield>
           <s:textfield name="user.lastname" label="lastname"></s:textfield>
                  <s:textfield name="user.age" label="age"></s:textfield>
           <s:submit></s:submit>
          </s:form>

          7:package com.test.bean
          public class User{
            private Integer id;
            private String firstname;
            private String lastname;
            private int age;
          }
          建立User.hbm.xml文件
          <hibernate-mapping>
           <class name="com.test.bean.User" tables="users">
             <id name="id" type="java.lang.Integer" column="id">
           <generator class="increment"></generator>
             </id>
             <property name="firstname" type="string" length="50"/>
             <property name="lastname" type="string" length="50"/>
              <property name="age" type="java.lang.Integer"/>
           </class>
          </hibernate-mapping>


          8:com.test.action.user
          public class SaveUserAction extends ActionSupport implements ModelDriven{
            private User user=new User();
            //生成getters,setters方法
            public String execute() throws Exception{
           
            }
          }

          9:save.jsp添加國際化支持
           src下建立一個struts.properties,內容如下
          #國際化資源文件的前綴 globalMessages
           struts.custom.i18n.resources=globalMessages
          定義2個國際化文件
           src下新建globalMessages_en.properties 英文的國際化文件
            firstname=firstname
            lastname=lastname
            age=age
          src下新建globalMessages_zh.properties 中文的國際化文件
           firstname=姓的ascii
            lastname=名的ascii
            age=年齡的ascii
           然后修改save.jsp(getText方法可以得到國際化文件中的值)
           <s:form action="saveUser">
           <s:textfield name="user.firstname" label="%{getText('firstname'}"></s:textfield>
           <s:textfield name="user.lastname" label="%{getText('lastname'}"></s:textfield>
                  <s:textfield name="user.age" label="%{getText('age'}"></s:textfield>
           <s:submit></s:submit>
          </s:form>
           重新啟動項目,看看國際化起不起作用


          10:SaveUserAction 中要調用業務層的保存方法,業務層的保存方法要調用數據層
           所以要寫業務層與數據訪問層的代碼

          11:package com.test.dao
             public interface UserDAO{
           public void saveUser(User user);
           public viod removeUser(User user);
           public User findUserById(Integer id);
           public List<User> findAllUsers();   
           public void updateUser(User user);
          }

          12:package com.test.dao.impl//(沒有使用事務,因為就操作數據庫一次)
          public class UserDAOImpl extends HibernateDaoSupport implements UserDAO{
           public void saveUser(User user){
             this.getHibernateTemplate().save(user);
           }
           public viod removeUser(User user){
             this.getHibernateTemplate().delete(user);
           }
           public User findUserById(Integer id){
             User user=(User)this.getHibernateTemplate().get(User.class,id);
             return user;
           }
           @SuppressWarnings("unchecked")
           public List<User> findAllUsers(){
             String hql="from User user order by user.id desc";
             return (List<User>)this.getHibernateTemplate().find(hql);
           }   
           public void updateUser(User user){
             this.getHibernateTemplate().update(user);
           }
          }


          13:package com.test.service
             public interface UserService{
              public void save(User user);
           public viod delete(User user);
           public User findById(Integer id);
           public List<User> findAll();   
           public void update(User user);
          }

          14:package com.test.service.impl
            public class UserServiceImpl implements UserService{
           private UserDAO userDao;//生成setters方法
           public void save(User user){
             userDao.saveUser(user);//在saveUser方法上ctrl+t
           }
           public viod delete(User user){
             this.userDao.removeUser(user);
           }
           public User findById(Integer id){
             return userDao.findUserById(id);
           }
           public List<User> findAll(){
            return userDao.findAllUsers();
           }   
           public void update(User user){
            this.userDao.updateUser(user);
           }
          }

          15:回到SaveUserAction中
           private UserService service;//生成setters方法,
           public String execute() throws Exception{
            this.service.save(user);
            return SUCCESS;
           }
          16:現在代碼已經編寫玩了,但是還不能運行
             因為我們還沒有寫配置文件,里面要寫依賴關系與注入關系

          17:struts.xml
             <struts>
           <package name="user" extends="struts-default">
            <action name="saveUser" class="saveUserAction"> //saveUserAction 為spring中配置文件里面的id
             <result name="success" type="redirect">listUser</result>
             <result name="input">/save.jsp</result>
            </action>
           </package>
             </struts>


          18:applicationContext.xml
          <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
           <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
           <property name="url" value="jdbc:mysql://localhost:3306/mytest"></property>
           <property name="username" value="root"></property>
           <property name="password" value="root"></property>
           <property name="maxActive" value="100"></property>連接池中最大100個連接
           <property name="maxIdle" value="30"></property>連接池最大有30個空閑的連接
           <property name="maxWait" value="500"></property>
           <property name="defaultAutoCommit" value="true"></property>每執行完一次數據操作就執行事務
          </bean>

          <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
           <property name="dataSource" ref="dataSource"></property>
           <property name="hibernateProperties">
            <props>
             <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
             <prop key="hibernate.show_sql">true</prop>
            </props>
           </property>
           <property name="mappingResources">
            <list>
             <value>com/test/bean/User.hbm.xml</value>
            </list>
           </property>
          </bean>

          對于沒有狀態的bean bean設置為singleton(單例)
          spring中的singleton 對于ioc容器只生成一個實例
          <bean id="userDao" class="com.test.dao.impl.UserDAOImpl" scope="singleton">
           <property name="sessionFactory">
            <ref bean="sessionFactory"/>
           </property>
          </bean>

          <bean id="userService" class="com.test.service.impl.UserServiceImpl">
           <property name="userDao" ref="userDao"></property>
          </bean>
          對于有狀態的bean bean設置為prototype
          <bean id="saveUserAction" class="com.test.action.user.SaveUserAction" scope="prototype">
           <property name="service" ref="userService"></property>
          </bean>

          <bean id="listUserAction" class="com.test.action.user.ListUserAction" scope="prototype">
           <property name="service" ref="userService"></property>
          </bean>

          <bean id="removeUserAction" class="com.test.action.user.RemoveUserAction" scope="prototype">
           <property name="service" ref="userService"></property>
          </bean>
          19:運行項目 會報錯
            說沒有這樣的方法的異常。這是原因是jar的沖突
            把asm-2.2.3.jar 這個jar包刪除
             再運行項目,應該就不會報錯了
          20:完成ListUserAction 顯示所有用戶
           public class ListUser Action extends ActionSupport implements RequestAware{
           private Map<String,Object> request;//有setters方法
           private UserService service;//生成setters方法,
           public String execute() throws Exception{
            //this.service.findAll();
             request.put("list",this.service.findAll());
           return SUCCESS;
           }
          }

          21:寫list.jsp 顯示所有的用戶信息
          <s:iterator value="#request.list" id="us">
               <tr>
                <td><s:property value="#us.id"/>
                </td>
                
                <td><s:property value="#us.firstname"/>
                </td>
                
                <td><s:property value="#us.lastname"/>
                </td>
                
                <td><s:property value="#us.age"/>
                </td>
                
                <td><s:a href="deleteUser.action?user.id=%{#us.id}" onclick="return del();">delete</s:a>
                </td>
                
                <td><s:a href="updatePUser.action?user.id=%{#us.id}">update</s:a>
                </td>
               
               
               
               </tr>
          </s:iterator>

          作業:

          1. 完成save user頁面的輸入校驗(姓不能為空,名不能為空,年齡不能為空且在1—150之間),采用代碼的方式完成(override validate方法),采用校驗框架的方式完成(有兩種辦法)

          2. 當校驗框架驗證失敗時,看看有什么情況發生。


          22:在save.jsp中 進行數據校驗SaveUserAction-validation.xml
            <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

          <validators>
           <field name="user.firstname">
            <field-validator type="requiredstring">
             <message>required first name</message>
            </field-validator>
           </field>
           
           <field name="user.lastname">
            <field-validator type="requiredstring">
             <message>required last name</message>
            </field-validator>
           </field>
           
           <field name="user.age">
            <field-validator type="required">
             <message>required age</message>
            </field-validator>
            <field-validator type="int">
             <param name="min">1</param>
             <param name="max">150</param>
             <message>age should be between ${min} and ${max}</message>
            </field-validator>
           </field>
           
          </validators>

          還可以寫第2種校驗方式
          SaveUserAction-validation.xml
            <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

          <validators>
           <field name="user">
            <field-validator type="visitor"> visitor 需要通過另外的文件進行校驗
             <param name="context">user</param>另外的文件的名字為user
             <param name="appendPrefix">true</param> 錯誤的前綴信息大部分都相同
             <message>user's </message> 錯誤的前綴
            </field-validator>
           </field>
          </validators>

          另外的校驗文件放在哪里呢?(我們這里要校驗User類,所以這個文件必須放在User.java相同的包名)
          取名為類名-context的名字-validation.xml 例如 User-user-validation.xml
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

          <validators>
           <field name="firstname">
            <field-validator type="requiredstring">
             <message>required first name</message>
            </field-validator>
           </field>

           <field name="lastname">
            <field-validator type="requiredstring">
             <message>required last name</message>
            </field-validator>
           </field>

           <field name="age">
            <field-validator type="required">
             <message>required age</message>
            </field-validator>
            <field-validator type="int">
             <param name="min">1</param>
             <param name="max">150</param>
             <message>age should be between ${min} and ${max}</message>
            </field-validator>
           </field>

          </validators>


          這2種校驗方式,建議采取第1種。


          當校驗框架驗證失敗時(如果什么都不填,肯定會出現錯誤信息),這時候,我反復提交,此時
          錯誤信息會隨著提交次數的增加,錯誤信息也會增加。
          怎么解決這個問題呢?
          原因:
          當我們客戶端每次請求action的時候,Action類都會產生一個實例,每個實例都是有狀態的。
          都會保存自己的狀態信息(錯誤信息)。但是現在的情況下,每次請求的時候,Action類只
          產生一個實例,所有請求都只對應一個實例,所以所有的錯誤信息都附加在這個實例上。
          所以會輸出很多錯誤信息的。
          因為是在spring中的設置形成的(這樣設置會每次請求都只會對應一個實例)
          <bean id="saveUserAction" class="com.test.action.user.SaveUserAction">
           <property name="service" ref="userService"></property>
          </bean>
          這樣設置就表示這個action 所有請求都只有一個實例

          所以要改成這樣(保證每次請求都會產生一個實例)
          <bean id="saveUserAction" class="com.test.action.user.SaveUserAction" scope="prototype">
           <property name="service" ref="userService"></property>
          </bean>


          23:刪除一個用戶

          24:更新用戶

          25:將用戶列表已excel的格式顯示出來
          需要用到poi組件
          要完成將用戶列表顯示在excel中,需要完成3步
          a:將數據讀出來
          b:把數據寫道excel中
          c:把這個excel文件在瀏覽器中可以下載

          在UserService接口中增加一個方法
          public InputStream getInputStream();
          在UserServiceImpl中實現上面的方法

          public InputStream getInputStream(){
           HSSFWorkbook wb = new HSSFWorkbook();
            //創建一個工作簿
            HSSFSheet sheet = wb.createSheet("sheet1");

            HSSFRow row = sheet.createRow(0);

            HSSFCell cell = row.createCell((short) 0);
            cell.setEncoding(HSSFCell.ENCODING_UTF_16);
            cell.setCellValue("序號");

            cell = row.createCell((short) 1);
            cell.setEncoding(HSSFCell.ENCODING_UTF_16);
            cell.setCellValue("姓");

            cell = row.createCell((short) 2);
            cell.setEncoding(HSSFCell.ENCODING_UTF_16);
            cell.setCellValue("名");

            cell = row.createCell((short) 3);
            cell.setEncoding(HSSFCell.ENCODING_UTF_16);
            cell.setCellValue("年齡");

            List<User> list = this.findAll();

            for (int i = 0; i < list.size(); ++i)
            {
             User user = list.get(i);

             row = sheet.createRow(i + 1);

             cell = row.createCell((short) 0);
             cell.setEncoding(HSSFCell.ENCODING_UTF_16);
             cell.setCellValue(i + 1);

             cell = row.createCell((short) 1);
             cell.setEncoding(HSSFCell.ENCODING_UTF_16);
             cell.setCellValue(user.getFirstname());

             cell = row.createCell((short) 2);
             cell.setEncoding(HSSFCell.ENCODING_UTF_16);
             cell.setCellValue(user.getLastname());

             cell = row.createCell((short) 3);
             cell.setEncoding(HSSFCell.ENCODING_UTF_16);
             cell.setCellValue(user.getAge());
            }

            File file = new File("test.xls");

            try
            {
             OutputStream os = new FileOutputStream(file);
             wb.write(os);//使用輸出流把數據寫道test.xls中
             os.close();
            }
            catch (Exception e)
            {
             e.printStackTrace();
            }

            InputStream is = null;
            try
            {
             is = new FileInputStream(file);
            }
            catch (FileNotFoundException e)
            {
             e.printStackTrace();
            }

            return is;
          }

          package com.test.action.user;
          //產生下載excel的action
          public class GenerateExcelAction extends ActionSupport
          {
           private UserService service;

           public UserService getService()
           {
            return service;
           }

           public void setService(UserService service)
           {
            this.service = service;
           }
           
           public InputStream getDownloadFile()//這個方法名必須與struts.xml中的inputName相同
           {
            return this.service.getInputStream();
           }
           
           @Override
           public String execute() throws Exception
           {
            return SUCCESS;
           }
          }

          struts.xml中配置
          AllUsers.xls的名字為準,前面的xls名字隨便取
          <action name="generateExcel" class="generateExcelAction">
             <result name="success" type="stream"> stream表示二進制
              <param name="contentType">application/vnd.ms-excel</param>
              <param name="contentDisposition">filename="AllUsers.xls"</param>
              <param name="inputName">downloadFile</param>
             </result>
          </action>
          在list.jsp中
          <s:a href="generateExcel.action">下載excel</s:a>

          posted on 2010-06-30 17:22 gjy 閱讀(398) 評論(0)  編輯  收藏 所屬分類: ssh心得筆記

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 泽普县| 嘉黎县| 台山市| 鹿泉市| 雷山县| 嘉荫县| 隆回县| 大兴区| 胶南市| 绵阳市| 锡林浩特市| 昌邑市| 定襄县| 金山区| 河东区| 黄龙县| 湘乡市| 绍兴县| 天门市| 盘山县| 博客| 大新县| 祁连县| 雅安市| 石楼县| 高台县| 上蔡县| 武安市| 邵东县| 视频| 新沂市| 惠水县| 佛教| 论坛| 铜梁县| 岑溪市| 香格里拉县| 忻州市| 云龙县| 荥经县| 南充市|