struts2.0(90-100)

    </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>

 -->

 

 

<validators>

    <field name="user">

       <field-validator type="visitor">

           <param name="context">user</param>

           <param name="appendPrefix">true</param>

           <message>user's </message>

       </field-validator>

    </field>

</validators>

 

 

 第二種校驗vistor

在上面文件只顯示申明

<?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">//校驗類型

           <param name="context">user</param>//指定具體校驗文件驗證user屬性

           <param name="appendPrefix">true</param>//指定前綴 user‘s

           <message>user's </message>//每一條信息都以他開頭

       </field-validator>

    </field>

</validators>

  

 在校驗文件寫法:在user類下建立驗證校驗文件User-user-validation.xml類名,context和標準名來命名<param name="context">user</

 

 <?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>

注意驗證struts2是單例,多次點擊驗證就出問題:多次重複的錯誤信息

簡單測試:

action下驗證

    @SuppressWarnings("unchecked")

    public void validate()

    {

       Map map = this.getFieldErrors();

       Set set = map.keySet();

 

       for (Iterator iter = set.iterator(); iter.hasNext();)

       {

           System.out.println(map.get(iter.next()));

       }

    }

}

測試出是單例:

解決辦法:全部用scope="prototype">

 

<bean id="saveUserAction" class="com.test.action.user.SaveUserAction" scope="prototype">

    <property name="service" ref="userService"></property>

</bean>

 

刪除實現:

刪除action

package com.test.action.user;

 

import com.opensymphony.xwork2.ActionSupport;

import com.test.bean.User;

import com.test.service.UserService;

 

public class RemoveUserAction extends ActionSupport

{

    private User user;

    private UserService service;

   

    public User getUser()

    {

       return user;

    }

    public void setUser(User user)

    {

       this.user = user;

    }

    public UserService getService()

    {

       return service;

    }

    public void setService(UserService service)

    {

       this.service = service;

    }

   

    @Override

    public String execute() throws Exception

    {

       this.service.delete(user);

      

       return SUCCESS;

    }

   

}

配置struts.xml等不寫:

 

更新的編寫spring標準連接池的配置:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> // 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>

    <property name="maxIdle" value="30"></property>

    <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>

 

 

Springpoi-2.5.1.jaroffice的表格支持

第一步生成excel文件

第二步在瀏覽器瀏覽信息

service服務方法中:

package com.test.service;

 

public interface UserService

{

    public InputStream getInputStream();//返回輸入流

}

服務類的實現

package com.test.service.impl;

 

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.List;

 

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

 

import com.test.bean.User;

import com.test.dao.UserDAO;

import com.test.service.UserService;

 

public class UserServiceImpl implements UserService

{

    private UserDAO userDao;

 

    public UserDAO getUserDao()

    {

       return userDao;

    }

 

    public void setUserDao(UserDAO userDao)

    {

       this.userDao = userDao;

    }

 

    public List<User> findAll()

    {

       return this.userDao.findAllUsers();

    }

 

    public InputStream getInputStream()

    {

       HSSFWorkbook wb = new HSSFWorkbook();//創建對象

       HSSFSheet sheet = wb.createSheet("sheet1");//創建sheet

 

       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);//輸出到文件

           os.close();

       }

       catch (Exception e)

       {

           e.printStackTrace();

       }

 

       InputStream is = null;

       try

       {

           is = new FileInputStream(file);//建立輸入流

       }

       catch (FileNotFoundException e)

       {

           e.printStackTrace();

       }

 

       return is;

 

    }

 

}

 

Action 的編寫:

package com.test.action.user;

 

import java.io.InputStream;

 

import com.opensymphony.xwork2.ActionSupport;

import com.test.service.UserService;

 

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配置一樣

    {

       return this.service.getInputStream();

    }

   

    @Override

    public String execute() throws Exception

    {

       return SUCCESS;

    }

}

 

Struts.xml的配置:

<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>

 

配置spring

<bean id="generateExcelAction" class="com.test.action.user.GenerateExcelAction" scope="singleton"> singleton//表明是無狀態的

    <property name="service" ref="userService"></property>

</bean>

頁面顯示:

<s:a href="generateExcel.action">生成excel</s:a>

 

tomcatbin下會有文件:test.xls

 

這樣產生的線程安全問題:

要用產生的輸出流轉化成輸入流,不用設置臨時文件

第一種解決辦法,生成隨機文件,並刪除

建立字符生成幫助類

package com.test.util;

 

import java.util.Random;

 

public class CharacterUtils

{

    public static String getRandomString(int length)//第一種方法傳入長度

    {

       String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

       Random random = new Random();//生成隨機數

       StringBuffer sb = new StringBuffer();

 

       for (int i = 0; i < length; ++i)

       {

           int number = random.nextInt(62);//生成061

 

           sb.append(str.charAt(number));//生成字符

       }

 

       return sb.toString();

    }

 

    public static String getRandomString2(int length)//第二種方法傳入長度

    {

       Random random = new Random();

       StringBuffer sb = new StringBuffer();

 

       for (int i = 0; i < length; ++i)

       {

           int number = random.nextInt(3);

           long result = 0;

          

           switch (number)

           {

              case 0:

                  result = Math.round(Math.random() * 25 + 65);//生成025douber類型取四捨五入整

                  sb.append(String.valueOf((char)result));

                  break;

              case 1:

                  result = Math.round(Math.random() * 25 + 97);

                  sb.append(String.valueOf((char)result));

                  break;

              case 2:

                  sb.append(String.valueOf(new Random().nextInt(10)));

                  break;

           }

       }

      

       return sb.toString();

    }

 

    public static void main(String[] args)

    {

       System.out.println(getRandomString2(10));

    }

}

 

調用類:

    //String fileName = CharacterUtils.getRandomString(10);//調用自己的方法

      

       String fileName = RandomStringUtils.randomAlphanumeric(10);//調用Apache的方法

      

       fileName = new StringBuffer(fileName).append(".xls").toString();

      

       File file = new File(fileName);

 

問題是在調用和打開文件的時候,查詢語句被調用了兩次

得修改struts.xml文件,同時關閉迅雷,要不又打開兩次了

<action name="generateExcel" class="generateExcelAction">

           <result name="success" type="stream">

              <param name="contentType">application/vnd.ms-excel</param>

              <param name="contentDisposition">attachment;filename="AllUsers.xls"</param>/

發佈了30 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章