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 阅读(397) 评论(0)  编辑  收藏 所属分类: ssh心得笔记

只有注册用户登录后才能发表评论。


网站导航: