</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>
Spring中poi-2.5.1.jar对office的表格支持
第一步生成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>
在tomcat的bin下会有文件: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);//生成0到61
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);//生成0到25的douber类型取四舍五入整
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>/