struts2.0(90-100)

来源:互联网 发布:哈尔滨知间艺术书坊 编辑:程序博客网 时间:2024/05/18 00:46

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