oa_07

引入Ant和Xdoclet的支持,创建实体类的hibernate映射文件以及配置文件


<?xml version="1.0" encoding="GBK"?>
<project name="OA系统构建脚本" default="生成Hibernate配置文件" basedir=".">

<property name="src.dir" value="${basedir}/src"/>
<property name="xdoclet.home" value="D:/share/13_oa/xdoclet-plugins-1.0.3"/>

<!-- Build classpath -->
<path id="xdoclet.task.classpath">
<fileset dir="${xdoclet.home}/lib">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${xdoclet.home}/plugins">
<include name="**/*.jar"/>
</fileset>
</path>
<taskdef
name="xdoclet"
classname="org.xdoclet.ant.XDocletTask"
classpathref="xdoclet.task.classpath"
/>

<target name="生成Hibernate配置文件">
<xdoclet>
<fileset dir="${src.dir}/com/bjsxt/oa/model">
<include name="**/*.java"/>
</fileset>
<component
classname="org.xdoclet.plugin.hibernate.HibernateConfigPlugin"
destdir="${src.dir}"
version="3.0"
hbm2ddlauto="update"
jdbcurl="jdbc:mysql://127.0.0.1/oa"
jdbcdriver="com.mysql.jdbc.Driver"
jdbcusername="root"
jdbcpassword="bjsxt"
dialect="org.hibernate.dialect.MySQLDialect"
showsql="true"
/>
</xdoclet>
</target>
<target name="生成hibernate映射文件">
<xdoclet>
<fileset dir="${src.dir}/com/bjsxt/oa/model">
<include name="**/*.java"/>
</fileset>
<component
classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin"
version="3.0"
destdir="${src.dir}"
/>
</xdoclet>
</target>
</project>



[quote]Ant是什么?
Ant是一个构建工具,它可以帮助我们将项目开发过程中需要完成的各种步骤组织起来,通过一个简易的方式来构建整个项目。Ant究竟能做什么呢?这取决于Ant的任务(Task),Ant有哪些任务,就能完成哪些工作!一些典型的任务是:编译java源代码、运行java程序、拷贝文件或目录、将编译完成的类打包等等。
当然,Ant是一个开放的架构,任何人,都可以按照自己的方式,添加自己的任务(Task),这需要遵守Ant的一些规范。
如何开始使用Ant?
1、 确保你的机器已经安装了JDK,确保你的path环境变量中包含有java虚拟机的运行程序,确保你的环境变量中有JAVA_HOME变量
2、 下载ant并解压
3、 设置ANT_HOME环境变量,指向ant解压根目录
4、 在path环境变量中,添加ANT_HOME\bin目录
5、 打开控制台,运行:ant
6、 如果能够运行ant(忽略这些异常:Buildfile: build.xml does not exist!),而不是出现诸如命令无法解释的错误,那么你的ant就安装成功了
Ant 的基本概念
Ant的运行,靠的是一个构建脚本,默认的名称叫build.xml,如果你在任何目录下运行ant命令,Ant将自动查找当前目录下有没有build.xml文件,如果有这个文件,就读取这个文件,并运行其中的默认target。
解释一下以上话的意思:
构建脚本
Ant根据构建脚本的描述来执行任务!构建脚本是一个xml格式的文件。最简单的构建脚本是:
<?xml version="1.0" encoding="GBK"?>
<project name="测试脚本" default="copyfile" basedir=".">
<target name="copyfile">
<copy file=”d:/a.txt” todir=”c:/temp” overwrite=”true”/>
</target>
</project>
如果把以上内容放到一个build.xml文件中,然后运行ant命令,Ant将执行拷贝文件的任务!
从这个最简单的构建脚本中,我们可以知道脚本的基本编写方法:
1、 脚本的根元素是:<project>
2、 所有的任务,必须通过一个<target>标签包围,一个<target>标签,可以包含多个任务。
3、 <copy>标签描述了一个任务,这些任务必须放到一个<target>标签的内部,Ant都可以使用哪些任务呢?请参考Ant的相关文档
4、 <project>中可以包含多个<target>,如果不指定运行哪个任务(即直接运行ant命令),那么,将使用<project>标签中指定的default属性的target。
构建脚本的命名
默认命名是build.xml,如果你的构建脚本的名称是build.xml,那么你可以直接运行ant命令,如果是其它的名称,如:mybuild.xml,那么,你的命令行应该改为:ant –f mybuild.xml。
运行特定任务?
运行:ant copyfile,将运行的是被命名为copyfile的target。
Ant的路径模式?
再看下面的ant构建脚本:
<?xml version="1.0" encoding="GBK"?>
<project name="测试脚本" default="copyfile" basedir=".">
<target name="copyfile">
<copy todir=”c:/temp” overwrite=”true”>
<fileset dir=”d:”>
<include name=”*.txt”/>
</fileset>
<copy>
</target>
</project>
有没有注意到这个文件,跟第一个文件的变化?没错,<copy>任务的file属性变了,现在是*.txt,可能你已经意识到,这个的意思是拷贝d:盘下所有的以txt为扩展名的文件到c:/temp目录中。完全正确!但是,究竟包不包含子目录下的txt文件呢?这就需要我们了解ant中的路径模式。Ant中的路径模式非常重要,很多地方都会用到,所以,我们首先来学习的就是ant的路径模式!

你可以查看ANT_HOME/docs/manual/dirtasks.html#patterns下的文档描述!里面有最详细的说明。

简单归纳一下:

*符号,代表0个或若干个字符。?符号,代表一个字符。
**代表一颗目录树。

Ant任务
Ant 有很多内置的(即你安装完ant之后就可以直接使用的任务)任务,但是也可以添加自己定义的任务。如果你编写了自己的任务,或者你要引入一些不是ant自带的任务时,我们需要使用<taskdef>标签来定义:

比如:
<path id="xdoclet.task.classpath">
<fileset dir="${xdoclet.home}/lib">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${xdoclet.home}/plugins">
<include name="**/*.jar"/>
</fileset>
</path>
<taskdef
name="xdoclet"
classname="org.xdoclet.ant.XDocletTask"
classpathref="xdoclet.task.classpath"
/>
在这段文本里,包含了很多内容:
1、<path>元素,是用来定义一个路径的,通常是定义classpath,因为classpath可以包括众多的jar包,也可以包括众多的目录,所以可以使用<fileset>标签或<pathelement>等标签来定义这些路径。
2、这些标签总体上来说都是轻易便能够看懂的。无需过多的解释。那个<include>标签中的name属性,正是一个路径模式,表示包括本目录(即dir 属性定义的目录。)下的所有子目录中的jar文件。

定义完任务之后,就可以来使用它了,如:

<target name="生成Hibernate配置文件">
<xdoclet>
<fileset dir="${src.dir}/com/bjsxt/oa/model">
<include name="**/*.java"/>
</fileset>
<component
classname="org.xdoclet.plugin.hibernate.HibernateConfigPlugin"
destdir="${src.dir}"
version="3.0"
hbm2ddlauto="update"
jdbcurl="jdbc:mysql://127.0.0.1/oa_200706"
jdbcdriver="com.mysql.jdbc.Driver"
jdbcusername="root"
jdbcpassword="mysql"
dialect="org.hibernate.dialect.MySQLDialect"
showsql="true"
/>
</xdoclet>
</target>
具体如何使用,请参考关于这个task的相关说明文档。[/quote]


[quote]Xdoclet基本概念
我们可以在java代码中使用类似于javadoc的注释,来表达更多的内容。这些额外的注释,通过使用xdoclet工具,我们可以将它们转换为我们需要的各种配置文件。先看一个简单的例子:
比如有一个java文件的源代码如下:
/**
* @hibernate.class
* table="T_Party"
*/
public class Party {

/**
* @hibernate.id
* generator-class="native"
*/
private int id;

/**
* @hibernate.many-to-one
* column="parentid"
*/
private Party parent;

/**
* @hibernate.set
* @hibernate.key
* column = "parentid"
* @hibernate.one-to-many
* class = "com.bjsxt.oa.model.Party"
*/
private Set children;

/**
* @hibernate.property
* column="thename"
*/
private String name;

/**
* @hibernate.property
*/
private String sn;

/**
* @hibernate.property
*/
private String description;

/**
*
* @return
*/
public Set getChildren() {
return children;
}
public void setChildren(Set children) {
this.children = children;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}

/**
*/
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}


public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Party getParent() {
return parent;
}
public void setParent(Party parent) {
this.parent = parent;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
}


通过xdoclet,我们可以得到关于这个类的Hibernate映射文件,如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class table="T_Party" name="com.bjsxt.oa.model.Party">
<id name="id">
<generator class="native"/>
</id>
<many-to-one column="parentid" name="parent"/>
<set name="children">
<key column="parentid"/>
<one-to-many class="com.bjsxt.oa.model.Party"/>
</set>
<property name="name" column="thename"/>
<property name="sn"/>
<property name="description"/>
</class>
</hibernate-mapping>


如何开始使用Xdoclet?
Xdoclet不是单独可以运行的工具(不像Ant工具),它可以与其它工具一起配合运行,如Ant。我们下面的例子就是基于Ant和xdoclet的。

1、 首先需要保证ant是可用的
2、 下载并解压xdoclet的包(我们现在使用的是xdoclet2,具体版本是xdoclet-plugins-1.0.3)。
3、 在ant构建工具中定义xdoclet任务,并使用:
<?xml version="1.0" encoding="GBK"?>
<project name="OA系统构建脚本" default="生成Hibernate配置文件" basedir=".">

<property name="src.dir" value="${basedir}/src"/>
<property name="build.dir" value="${basedir}/bin"/>
<property name="webapp.dir" value="${basedir}/src/webapp"/>
<property name="xdoclet.home" value="D:/opensources/xdoclet/xdoclet-plugins-1.0.3"/>

<!-- Build classpath -->
<path id="xdoclet.task.classpath">
<fileset dir="${xdoclet.home}/lib">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${xdoclet.home}/plugins">
<include name="**/*.jar"/>
</fileset>
</path>
<taskdef
name="xdoclet"
classname="org.xdoclet.ant.XDocletTask"
classpathref="xdoclet.task.classpath"
/>

<target name="生成Hibernate配置文件">
<xdoclet>
<fileset dir="${src.dir}/com/bjsxt/oa/model">
<include name="**/*.java"/>
</fileset>
<component
classname="org.xdoclet.plugin.hibernate.HibernateConfigPlugin"
destdir="${src.dir}"
version="3.0"
hbm2ddlauto="update"
jdbcurl="jdbc:mysql://127.0.0.1/oa_200706"
jdbcdriver="com.mysql.jdbc.Driver"
jdbcusername="root"
jdbcpassword="mysql"
dialect="org.hibernate.dialect.MySQLDialect"
showsql="true"
/>
</xdoclet>
</target>
<target name="生成hibernate映射文件">
<xdoclet>
<fileset dir="${src.dir}/com/bjsxt/oa/model">
<include name="**/*.java"/>
</fileset>
<component
classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin"
version="3.0"
destdir="${src.dir}"
/>
</xdoclet>
</target>
</project>


以上就是一个完整的可运行的ant构建脚本。我们努力来理解这个文件把:

1、<property>标签定义一些变量,这些变量可以通过${变量名}的方式引用
2、<path>标签定义了类路径
3、<taskdef>标签定义了xdoclet任务(因为ant本身肯定是不包含xdoclet任务的)
4、我们在下面的两个<target>中,使用了<xdoclet>标签,这个标签正是我们自己定义的。

Xdoclet可以干什么?
Xdoclet实际上就是一个自动代码生成的工具,它可以生成各种各样的代码或配置文件(如果你很清楚xdoclet,你也可以对它进行扩展)。在默认的情况下,xdoclet已经给我们提供了很多的解决方案。这些解决方案叫做plugin,即插件。在xdoclet的官方网站上:http://xdoclet.codehaus.org,我们可以获得关于它支持的所有的plugin的情况。

Xdoclet通过plugin来支持代码的自动生成。我们要使用xdoclet,可以将它定义为ant的一个任务(如上所述)。然后就可以使用xdoclet了。在<xdoclet>标签内部使用xdoclet。由于xdoclet通常用来对源文件进行扫描,并读取源文件中的注释,然后再根据这些注释生成相应的配置文件,所以,通常我们需要定义让xdoclet扫描哪些源代码文件。对于这个需要,我们通过<fileset>标签来满足!

通过<component>标签,我们可以来使用xdoclet的众多plugin。上述例子,我们使用了xdoclet对hibernate支持的plugin。
具体如何使用这些plugin,请参考这些plugin的使用手册!![/quote]


package com.bjsxt.oa.model;

import java.util.Set;

/**
*
* @author Administrator
* @hibernate.class table="T_Organization"
*/
public class Organization {

/**
* @hibernate.id generator-class="native"
*/
private int id;

/**
* @hibernate.property
*/
private String name;

/**
* @hibernate.property
*/
private String sn;

/**
* @hibernate.property
*/
private String description;

/**
* @hibernate.many-to-one column="pid"
*/
private Organization parent;

/**
* @hibernate.set lazy="extra" inverse="true"
* @hibernate.key column="pid"
* @hibernate.one-to-many class="com.bjsxt.oa.model.Organization"
*/
private Set children;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Organization getParent() {
return parent;
}
public void setParent(Organization parent) {
this.parent = parent;
}
public Set getChildren() {
return children;
}
public void setChildren(Set children) {
this.children = children;
}
}



package com.bjsxt.oa.web;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import com.bjsxt.oa.SystemContext;

public class PagerFilter implements Filter {

public void destroy() {
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest httpRequest = (HttpServletRequest)request;

SystemContext.setOffset(getOffset(httpRequest));
SystemContext.setPagesize(getPagesize(httpRequest));

try{
chain.doFilter(request, response);
}finally{
SystemContext.removeOffset();
SystemContext.removePagesize();
}
}

private int getOffset(HttpServletRequest request){
int offset = 0;
try {
offset = Integer.parseInt(request.getParameter("pager.offset"));
} catch (Exception ignore) {
}
return offset;
}

private int getPagesize(HttpServletRequest request){
return 10;
}

public void init(FilterConfig arg0) throws ServletException {
}

}



<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>


<!-- Standard Action Servlet Configuration (with debugging) -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>


<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

<context-param>
<param-name>contextConfigLocation</param-name>
<!--
<param-value>classpath*:applicationContext-*.xml,/WEB-INF/applicationContext-*.xml</param-value>
-->
<param-value>classpath*:applicationContext-*.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<filter>
<filter-name>Spring character encoding filter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Spring character encoding filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
<filter-name>pagerFilter</filter-name>
<filter-class>com.bjsxt.oa.web.PagerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>pagerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值