(二十六)Struts2 Hibernate集成

Hibernate是一个高性能的对象/关系留存和查询服务,它是根据开源GNU宽通用公共许可证(LGPL)许可的,可以免费下载。在这一章。 我们将学习如何实现Struts2 与Hibernate的集成。

数据库设置

对于本教程,我们将使用“struts2_tutorial”MySQL数据库,使用用户名“root”连接到机器上的这个数据库,不设密码。首先,你需要运行以下脚本。此脚本创建一个名为student的新表,并在此表中创建少量记录:

CREATE TABLE IF NOT EXISTS `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(40) NOT NULL,
  `last_name` varchar(40) NOT NULL,
  `marks` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);

--
-- Dumping data for table `student`
--

INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
  VALUES(1, ‘George‘, ‘Kane‘, 20);
INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
  VALUES(2, ‘Melissa‘, ‘Michael‘, 91);
INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
  VALUES(3, ‘Jessica‘, ‘Drake‘, 21);

  

Hibernate配置

接下来让我们创建hibernate.cfg.xml,它是hibernate配置文件。

<?xml version=‘1.0‘ encoding=‘utf-8‘?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
   <property name="hibernate.connection.driver_class">c
      om.mysql.jdbc.Driver
   </property>
   <property name="hibernate.connection.url">
      jdbc:mysql://www.w3cschool.cn/struts_tutorial
   </property>
   <property name="hibernate.connection.username">root</property>
   <property name="hibernate.connection.password"></property>
   <property name="hibernate.connection.pool_size">10</property>
   <property name="show_sql">true</property>
   <property name="dialect">
      org.hibernate.dialect.MySQLDialect
   </property>
   <property name="hibernate.hbm2ddl.auto">update</property>
   <mapping class="cn.w3cschool.hibernate.Student" />
</session-factory>
</hibernate-configuration>

  

让我们过一下hibernate配置文件。首先,我们声明使用MySQL驱动程序。然后我们声明了jdbc url用于连接到数据库。接着我们声明连接的用户名,密码和池大小。我们还指出希望通过将“show_sql”打开为true来查看日志文件中的SQL。

环境搭建

这个项目需要很多jar文件,以下的是所需的JAR文件的完整列表的屏幕截图:

大多数JAR文件可以作为struts分发的一部分获取。如果你有安装一个应用程序服务器,如glassfish,websphere或jboss,那么你可以从appserver的lib文件夹中获取大多数剩余的jar文件。如果没有,你可以单独下载文件:

其余的文件,你应该能够从struts2 中分配。

Hibernate类

现在让我们为hibernate集成创建所需的java类。按照Student.java的内容:

package cn.w3cschool.hibernate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="student")
public class Student {

   @Id
   @GeneratedValue
   private int id;
   @Column(name="last_name")
   private String lastName;
   @Column(name="first_name")
   private String firstName;
   private int marks;
   public int getId() {
    return id;
   }
   public void setId(int id) {
    this.id = id;
   }
   public String getLastName() {
      return lastName;
   }
   public void setLastName(String lastName) {
      this.lastName = lastName;
   }
   public String getFirstName() {
      return firstName;
   }
   public void setFirstName(String firstName) {
      this.firstName = firstName;
   }
   public int getMarks() {
      return marks;
   }
   public void setMarks(int marks) {
      this.marks = marks;
   }
}

  

这是一个POJO类,根据Hibernate规范表示的student表。它具有对应于student表列名的属性id,firstName和lastName。接下来让我们创建StudentDAO.java文件,如下所示:

package cn.w3cschool.hibernate;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.googlecode.s2hibernate.struts2.plugin.
                     annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.
                     annotations.TransactionTarget;

public class StudentDAO {

   @SessionTarget
   Session session;

   @TransactionTarget
   Transaction transaction;

   @SuppressWarnings("unchecked")
   public List<Student> getStudents()
   {
      List<Student> students = new ArrayList<Student>();
      try
      {
         students = session.createQuery("from Student").list();
      }
      catch(Exception e)
      {
         e.printStackTrace();
      }
      return students;
   }

   public void addStudent(Student student)
   {
      session.save(student);
   }
}

  

StudentDAO类是Student类的数据访问层。它有方法来列出所有学生,然后保存一个新的学生记录。

Action类

下面的文件AddStudentAction.java定义了我们的action类。我们在这里有两个action方法:execute()和listStudents()。execute()方法用于添加新的学生记录。我们使用dao的save()方法来实现这一点。另一种listStudents()方法用于列出学生。我们使用dao的列表方法来获取所有学生的列表。

package cn.w3cschool.struts2;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import cn.w3cschool.hibernate.Student;
import cn.w3cschool.hibernate.StudentDAO;

public class AddStudentAction extends ActionSupport
            implements ModelDriven<Student>{

   Student student  = new Student();
   List<Student> students = new ArrayList<Student>();
   StudentDAO dao = new StudentDAO();
   @Override
   public Student getModel() {
      return student;
   }

   public String execute()
   {
      dao.addStudent(student);
      return "success";
   }

   public String listStudents()
   {
      students = dao.getStudents();
      return "success";
   }

   public Student getStudent() {
      return student;
   }

   public void setStudent(Student student) {
      this.student = student;
   }

   public List<Student> getStudents() {
      return students;
   }

   public void setStudents(List<Student> students) {
      this.students = students;
   }

}

  

你会注意到我们正在实现ModelDriven接口。这是在你的action类处理一个具体的模型类(如Student)而不是个别的属性(如firstName,lastName)时使用。ModelAware接口需要你实现一个方法来返回模型。在我们的例子中,我们返回“student”对象。

创建视图文件

现在创建包含以下内容的student.jsp视图文件:

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Hello World</title>
<s:head />
</head>
<body>
   <s:form action="addStudent">
   <s:textfield name="firstName" label="First Name"/>
   <s:textfield name="lastName" label="Last Name"/>
   <s:textfield name="marks" label="Marks"/>
   <s:submit/>
   <hr/>
   <table>
      <tr>
         <td>First Name</td>
         <td>Last Name</td>
         <td>Marks</td>
      </tr>
      <s:iterator value="students">
         <tr>
            <td><s:property value="firstName"/></td>
            <td><s:property value="lastName"/></td>
            <td><s:property value="marks"/></td>
           </tr>
      </s:iterator>
   </table>
   </s:form>
</body>
</html>

  

student.jsp非常简单。在上面部分,我们有一个提交到“addStudent.action”的表单。它接受firstName,lastName和marks。因为addStudent action绑定到ModelAware的“AddSudentAction”,所以将自动创建一个学生bean,其值自动填充为firstName,lastName和marks。
在下面部分,我们浏览学生列表(参见AddStudentAction.java),并在表中显示firstname,lastname和marks的值。

Struts配置

让我们使用struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name="struts.devMode" value="true" />

   <package name="myhibernate" extends="hibernate-default">

      <action name="addStudent" method="execute"
         class="cn.w3cschool.struts2.AddStudentAction">
         <result name="success" type="redirect">
               listStudents
         </result>
      </action>

      <action name="listStudents" method="listStudents"
         class="cn.w3cschool.struts2.AddStudentAction">
         <result name="success">/students.jsp</result>
      </action>

</package>

</struts>

  

要注意的要点是,我们的包“myhibernate”扩展了名为“hibernate-default”的struts2默认包。然后我们声明两个action:addStudent和listStudents。addStudent调用AddStudentAction类的execute(),然后在成功时调用listStudents方法。listStudent方法调用AddStudentAction类上的listStudents(),并使用student.jsp作为视图。

现在,右键单击项目名称,然后单击“Export”> “WAR File”以创建WAR文件。然后在Tomcat的webapps目录中部署WAR文件。最后,启动Tomcat服务器并尝试访问URL http://localhost:8080/HelloWorldStruts2/student.jsp,将显示以下界面:

在上面部分,我们得到一个表单,输入新学生记录的值,下面部分列出数据库中的学生。继续添加一个新的学生记录,然后按提交。屏幕将刷新,并在每次单击提交时向你显示更新了的列表。

时间: 2024-10-09 06:29:09

(二十六)Struts2 Hibernate集成的相关文章

二十六:Struts2 和 spring整合

二十六:Struts2 和 spring整合 将项目名称为day29_02_struts2Spring下的scr目录下的Struts.xml文件拷贝到新项目的scr目录下 在新项目的WebRoot---->WEB-INF目录下新建一个目录lib,用于存放jar包(Struts2和spring整合所需jar包) 将项目名称为day29_02_struts2Spring,WebRoot---->WEB-INF下的lib目录下的所有jar包拷贝到新项目对应的位置,同时将spring的配置文件appl

二十六、Jcreator使用初步

摘自http://blog.csdn.net/liujun13579/article/details/7751464 二十六.Jcreator使用初步 Jcreator是一个小巧灵活的Java开发工具,它可将Java的程序的编写.编译.运行和调试集成进自身的环境中直接进行开发,且无需进行环境变量的设定.我们可以直接在JCreator中编辑Java源文件,选择相应的菜单和点击对应的按钮就可以完成Java程序的编译.运行等工作,十分方便 由于Jcreator集成了编辑源文件.编译.运行调试为一体,所

Powershell管理系列(二十六)PowerShell操作之批量导出&导入邮箱

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包,QQ:185426445.电话18666943750 项目中有时候做跨林邮箱迁移的时候,条件不成熟,比如安全考虑或者其他考虑,不能做双林信任,这样就提出了一个问题,历史邮件需要使用的话怎么办,一个简单高效的解决办法就是从源森林批量导出邮件为.pst文件,在批量导入到目的域森林,具体操作如下: 1.赋予管理账号邮件导入导出权限,命令如下: cls whoami New-Manageme

攻城狮在路上(叁)Linux(二十六)--- linux文件系统的特殊查看与操作

一.boot sector 与 super block的关系: 1.boot sector用于存放引导装载程序,占用1024个字节. 2.super block的大小也为1024字节. 3.若block大小为1k,则boot sector和super block各占一个block. 4.若block大于1K(2K/4K)时,则两者都位于第一个block中. 二.磁盘空间的浪费问题:暂不考虑. 三.利用GUN的parted命令进行分区行为: 因为fdisk不支持高于2TB的分区. 命令格式: pa

第一百二十六节,JavaScript,XPath操作xml节点

第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准DOM去查找XML中的节点方式,大大降低了查找难度,方便开发者使用.但是,DOM3级以前的标准并没有就XPath做出规范:直到DOM3在首次推荐到标准规范行列.大部分浏览器实现了这个标准,IE则以自己的方式实现了XPath. 一.IE中的XPath 在IE8及之前的浏览器,XPath是采用内置基于A

企业搜索引擎开发之连接器connector(二十六)

连接器通过监视器对象DocumentSnapshotRepositoryMonitor从上文提到的仓库对象SnapshotRepository(数据库仓库为DBSnapshotRepository)中迭代获取数据 监视器类DocumentSnapshotRepositoryMonitor在其构造方法初始化相关成员变量,这些成员属性都是与数据获取及数据处理逻辑相关的对象 /** This connector instance's current traversal schedule. */ pri

【Unity 3D】学习笔记二十六:unity游戏脚本(六)

在3D游戏世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组件,并且该组件是无法删除的,也不应该删除.在unity中,Transform面板一共有3个属性: Position  (位置) Rotation(旋转) Scale(缩放) 这三个值都是用来调整游戏对象在游戏界面中的位置,状态等相关参数. Position  (位置) 任何一个游戏对象的三维坐标都保存在Vector3容器中,该容器记录对象在X轴,Y轴,Z轴的坐标.一旦Vector33容器中的坐标发生变化,那么Sce

每日算法之二十六:Substring with Concatenation of All Words

变相的字符串匹配 给定一个字符串,然后再给定一组相同长度的单词列表,要求在字符串中查找满足以下条件的起始位置: 1)从这个位置开始包含单词列表中所有的单词,且每个单词仅且必须出现一次. 2)在出现的过程中不能出现其他的干扰单词. 3)出现的位置可能有多个. 4)单词的出现顺序不做要求. 下面是一个例子: S:"barfoothefoobarman" L:"foo","bar" 位置0是出现位置,:两个单词均出现仅出现一次,且没有干扰.同样位置9也

【管理心得之二十六】职场中的“武功”

场景再现==================={放学路上}同学A:最近<天龙八部>看没?我喜欢那里的虚竹,因为他武功最高.同学B:什么呀?才不是虚竹呢,是段誉武功最高.他不仅会"六脉神剑",还会"一阳指"和"北冥神功".同学A:虚竹厉害,他有天山童姥等三人最强内力,后期又习得"降龙十八掌".同学B:这些都没有"六脉神剑"厉害.同学A:..................同学B:...... ==

winform学习日志(二十六)----------控件treeview使用

一:实现功能,获得选中节点,在选中节点下添加节点,折叠,展开,删除,得到选中节点下checked项,选中根节点其下节点也选中,图标.上图 二:相关代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windo