温馨提示:您的每一次转载,体现了我写此文的意义!!!烦请您在转载时注明出处http://www.blogjava.net/sxyx2008/谢谢合作!!!

雪山飞鹄

温馨提示:您的每一次转载,体现了我写此文的意义!!!烦请您在转载时注明出处http://www.blogjava.net/sxyx2008/谢谢合作!!!

BlogJava 首页 新随笔 联系 聚合 管理
  215 Posts :: 1 Stories :: 674 Comments :: 0 Trackbacks

#

        之前了,在blog上发了FusionCharts的一些demo,后来好多朋友加Q发email给我,要求发一些资料,作为学习参考。现将资料提供出来。有需要的可以直接下载。大家有事发mail,不要加Q了,加Q有可能我不能及时回复你。
        点我下载FusionCharts Free中文开发指南.pdf
posted @ 2010-07-26 08:39 雪山飞鹄 阅读(1693) | 评论 (2)编辑 收藏

        近期在项目中使用到了大量的报表开发,需要将html页面中的表格内容导出到pdf word excel和图片,前三者都比较好实现。唯独后者生成图片使用ImageIo操作时生成的图片有点惨不忍睹。经过大量google后发现,pdfbox这个组件不错,可以将pdf文件轻松生成图片。这不问题解决了,但在使用过程中不然,受到了很多致命性的打击。pdfbox在处理中文pdf的时候就会表现的比较脆弱点。但对英文版的pdf导出图片,那是杠杠的。尽管这样,还是记录一下,毕竟这方面的资料很少。我几乎搜遍了整个google,baidu才搜集到那么一点点资料。这里跟大家分享下。
        所依赖的JAR:
        commons-logging-1.1.1.jar
        fontbox-1.2.1.jar
        pdfbox-1.2.1.jar
        示例代码:
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      
http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 
*/

package com.future.pdfbox.image;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;

public class ExtractImages 
{
    
public static void main(String[] args) throws IOException 
        PDDocument doc 
= PDDocument.load("F:\\1.pdf");
        
int pageCount = doc.getPageCount(); 
        System.out.println(pageCount); 
        List pages 
= doc.getDocumentCatalog().getAllPages(); 
        
for(int i=0;i<pages.size();i++){
            PDPage page 
= (PDPage)pages.get(i); 
            BufferedImage image 
= page.convertToImage(); 
            Iterator iter 
= ImageIO.getImageWritersBySuffix("jpg"); 
            ImageWriter writer 
= (ImageWriter)iter.next(); 
            File outFile 
= new File("C:/"+i+".jpg"); 
            FileOutputStream out 
= new FileOutputStream(outFile); 
            ImageOutputStream outImage 
= ImageIO.createImageOutputStream(out); 
            writer.setOutput(outImage); 
            writer.write(
new IIOImage(image,null,null)); 
        }

        doc.close(); 
        System.out.println(
"over"); 
    }


}


        
posted @ 2010-07-23 08:46 雪山飞鹄 阅读(11304) | 评论 (7)编辑 收藏

        之前,在项目中一直用jfreechart,感觉jfreechart做的挺不错的.唯一遗憾的是文档收费.再者图片乃静态的不能满足客户端与图片进行动态交互.为了满足客户的需求,所以不得不寻求更好的报表解决方案.本人在项目中收藏了以下几种报表.总的来说效果还是很满意的.上手操作也很简单,这里贴出效果图.借mop中最流行的一句话来说就是:无图无真相.呵呵废话不多说,直接上图.在最后我会针对每种图传上demo.供大家快速上手,本来实地项目中的效果远比贴出来的图漂亮逼真,但为了数据安全性,本人就针对每种图单独做了小demo.大家可以参考下.呵呵
    演示视频:  本打算录制成swf格式的直接传到blog上,结果发现blogjava不支持插入flash,汗,由于文件格式是swf,所以大家可以使用浏览器或者adobe的flash player观看 文件大小 8M多
    演示视频下载
    第一组图:
    FusionCharts  
    官方主页:http://www.fusioncharts.com/
    文档:http://www.fusioncharts.com/docs/
    来自国外的flash图,效果极其棒,极力推荐大家使用,遗憾的是官方给的免费版会在生成的图片上带上超链接.可喜的是绝顶聪明的国人破解了它,在随后会为大家提供破解过的flash文件.废话不多说,上图,无图无真相
 
        注:在以上每个报表左上角大家都会看到一个google的logo,其实我要表达的意思是在此处可以设置一个公司或者其他的logo什么的.希望没有误导大家
        第二组图:
        一款来自小日本小巧的js报表组件,俺不通日语,所以也不晓得他叫什么名字.所以废话不多数直接上图
        
         第三组图:
        构建与jquery之上的jscharts,感觉很不错,虽然没以上图花哨,但js能做到这般田地已经不错了
 
 
            附件下载:
            fusionchart       破解文件:fusionchart破解文件

            来自日本的报表组件

            jscharts 

            演示视频下载
posted @ 2010-07-21 21:34 雪山飞鹄 阅读(2693) | 评论 (1)编辑 收藏

 

1@Entity(name="EntityName")

必须,name为可选,对应数据库中一的个表

 

2@Table(name="",catalog="",schema="")

可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息

name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名

catalog:可选,表示Catalog名称,默认为Catalog("").

schema:可选,表示Schema名称,默认为Schema("").

 

3@id

必须

@id定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键.置于getXxxx().

 

4@GeneratedValue(strategy=GenerationType,generator="")

可选

strategy:表示主键生成策略,AUTO,INDENTITY,SEQUENCE TABLE 4,分别表示让ORM框架自动选择,

根据数据库的Identity字段生成,根据数据库表的Sequence字段生成,以有根据一个额外的表生成主键,默认为AUTO

generator:表示主键生成器的名称,这个属性通常和ORM框架相关,例如,Hibernate可以指定uuid等主键生成方式.

示例:

    @Id

    @GeneratedValues(strategy=StrategyType.SEQUENCE)

    public int getPk() {

       return pk;

    }

 

5@Basic(fetch=FetchType,optional=true)

可选

@Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法,默认即为@Basic

fetch: 表示该属性的读取策略,EAGERLAZY两种,分别表示主支抓取和延迟加载,默认为EAGER.

optional:表示该属性是否允许为null,默认为true

示例:

    @Basic(optional=false)

    public String getAddress() {

       return address;

    }

 

6@Column

可选

@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用.

name:表示数据库表中该字段的名称,默认情形属性名称一致

nullable:表示该字段是否允许为null,默认为true

unique:表示该字段是否是唯一标识,默认为false

length:表示该字段的大小,仅对String类型的字段有效

insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为true

updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true.对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段.

columnDefinition:表示该字段在数据库中的实际类型.通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP.此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOBTEXT字段类型,该属性非常有用.

示例:

    @Column(name="BIRTH",nullable="false",columnDefinition="DATE")

    public String getBithday() {

       return birthday;

    }

 

7@Transient

可选

@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.

如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic

示例:

    //根据birth计算出age属性

    @Transient

    public int getAge() {

       return getYear(new Date()) - getYear(birth);

    }

 

8@ManyToOne(fetch=FetchType,cascade=CascadeType)

可选

@ManyToOne表示一个多对一的映射,该注解标注的属性通常是数据库表的外键

optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true

fetch:表示抓取策略,默认为FetchType.EAGER

cascade:表示默认的级联操作策略,可以指定为ALL,PERSIST,MERGE,REFRESHREMOVE中的若干组合,默认为无级联操作

targetEntity:表示该属性关联的实体类型.该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity.

示例:

    //订单Order和用户User是一个ManyToOne的关系

    //Order类中定义

    @ManyToOne()

    @JoinColumn(name="USER")

    public User getUser() {

       return user;

    }

 

9@JoinColumn

可选

@JoinColumn@Column类似,介量描述的不是一个简单字段,而一一个关联字段,例如.描述一个@ManyToOne的字段.

name:该字段的名称.由于@JoinColumn描述的是一个关联字段,ManyToOne,则默认的名称由其关联的实体决定.

例如,实体Order有一个user属性来关联实体User,Orderuser属性为一个外键,

其默认的名称为实体User的名称+下划线+实体User的主键名称

示例:

    @ManyToOne

 

10@OneToMany(fetch=FetchType,cascade=CascadeType)

可选

@OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段.

fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存

cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除

例如:实体UserOrderOneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除

示例:

    @OneTyMany(cascade=ALL)

    public List getOrders() {

       return orders;

    }

 

11@OneToOne(fetch=FetchType,cascade=CascadeType)

可选

@OneToOne描述一个一对一的关联

fetch:表示抓取策略,默认为FetchType.LAZY

cascade:表示级联操作策略

示例:

    @OneToOne(fetch=FetchType.LAZY)

    public Blog getBlog() {

       return blog;

    }

 

12@ManyToMany

可选

@ManyToMany 描述一个多对多的关联.多对多关联上是两个一对多关联,但是在ManyToMany描述中,中间表是由ORM框架自动处理

targetEntity:表示多对多关联的另一个实体类的全名,例如:package.Book.class

mappedBy:表示多对多关联的另一个实体类的对应集合属性名称

示例:

    User实体表示用户,Book实体表示书籍,为了描述用户收藏的书籍,可以在UserBook之间建立ManyToMany关联

    @Entity

    public class User {

       private List books;

       @ManyToMany(targetEntity=package.Book.class)

       public List getBooks() {

           return books;

       }

       public void setBooks(List books) {

           this.books=books;

       }

    }

   

    @Entity

    public class Book {

       private List users;

       @ManyToMany(targetEntity=package.Users.class, mappedBy="books")

       public List getUsers() {

           return users;

       }

       public void setUsers(List users) {

           this.users=users;

       }

    }

两个实体间相互关联的属性必须标记为@ManyToMany,并相互指定targetEntity属性,

需要注意的是,有且只有一个实体的@ManyToMany注解需要指定mappedBy属性,指向targetEntity的集合属性名称

利用ORM工具自动生成的表除了UserBook表外,还自动生成了一个User_Book,用于实现多对多关联

 

13@MappedSuperclass

可选

@MappedSuperclass可以将超类的JPA注解传递给子类,使子类能够继承超类的JPA注解

示例:

    @MappedSuperclass

    public class Employee() {

       ....

    }

   

    @Entity

    public class Engineer extends Employee {

       .....

    }

    @Entity

    public class Manager extends Employee {

       .....

    }

 

14@Embedded

可选

@Embedded将几个字段组合成一个类,并作为整个Entity的一个属性.

例如User包括id,name,city,street,zip属性.

我们希望city,street,zip属性映射为Address对象.这样,User对象将具有id,nameaddress这三个属性.

Address对象必须定义为@Embededable

示例:

    @Embeddable

    public class Address {city,street,zip}

    @Entity

    public class User {

       @Embedded

       public Address getAddress() {

           ..........

       }

    }

 

Hibernate验证注解

注解

 适用类型

 说明

 示例

 

@Pattern

 String

 通过正则表达式来验证字符串

 @attern(regex=”[a-z]{6}”)

 

@Length

 String

 验证字符串的长度

 @length(min=3,max=20)

 

@Email

 String

 验证一个Email地址是否有效

 @email

 

@Range

 Long

 验证一个整型是否在有效的范围内

 @Range(min=0,max=100)

 

@Min

 Long

 验证一个整型必须不小于指定值

 @Min(value=10)

 

@Max

 Long

 验证一个整型必须不大于指定值

 @Max(value=20)

 

@Size

 集合或数组

 集合或数组的大小是否在指定范围内

 @Size(min=1,max=255)

 

以上每个注解都可能性有一个message属性,用于在验证失败后向用户返回的消息,还可以三个属性上使用多个注解

posted @ 2010-07-20 10:13 雪山飞鹄 阅读(18060) | 评论 (2)编辑 收藏

            环境:myeclipse8.5+flex4+blazeds
            描述:flex4中httpservice与服务器端交互的值传递问题
            方式一:通过<s:request/>标签进行交互,在该标签内部以要传递的参数名作为该标签内的子标签,值作为内容进行传递,服务端接受数据采用request.getParmeter("参数名")获取数据.
            示例代码:
            flex中的代码:
<!--定义HttpService发送请求-->
        
<s:HTTPService id="service" 
                       url
="http://localhost:8080/testhttpservice/testHttpServiceServlet" 
                       useProxy
="false" 
                       fault
="service_faultHandler(event)" 
                       result
="service_resultHandler(event)">
            
<!--第一种传值方式-->
            
            
<s:request >
                
<!--参数名称作标签,中间填充参数值-->
                
<username>{txtusername.text}</username>
                
<password>{txtpassword.text}</password>
            
</s:request>
            
        
</s:HTTPService>
        后台接受参数的代码:
        //获取flex传递的参数 username password
        String username=request.getParameter("username");
        
//get方式处理乱码
        
//username=new String(username.getBytes("ISO-8859-1"),"utf-8");
        String password=request.getParameter("password");
        
//password=new String(password.getBytes("ISO-8859-1"),"utf-8");
        方式二:第二种传值方式通过send()方法传值send方法中传递参数 ,服务端接受数据采用request.getParmeter("参数名")获取数据.
        示例代码:
                //第二种传值方式 通过send()方法传值 send方法中传递参数 
                //定义一object对象
                var val:Object=new Object();
                //分别将文本框username,password的值传递到后台
                //object对象.参数名=值   传值操作
                val.username=txtusername.text;
                val.password=txtpassword.text;
                service.send(val);
        贴出完整的代码:
        服务器端:
package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 功能描述:flex httpservice与java交互参数传递探讨<br>
 * 
@author sxyx2008<br>
 * @date 2010-07-19
 *
 
*/

@SuppressWarnings(
"serial")
public class TestHttpServiceServlet extends HttpServlet {
    
    @Override
    
protected void service(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        
//处理post方式乱码
        request.setCharacterEncoding("utf-8");
        
//设置浏览器输出字符编码
        response.setCharacterEncoding("utf-8");
        PrintWriter writer
=response.getWriter();
        
//获取flex传递的参数 username password
        String username=request.getParameter("username");
        
//get方式处理乱码
        
        
//username=new String(username.getBytes("ISO-8859-1"),"utf-8");
        String password=request.getParameter("password");
        
//password=new String(password.getBytes("ISO-8859-1"),"utf-8");
        
        
//构建一个list存放一些数据用来模拟用户是否存在这一功能
        List<String> list=new ArrayList<String>();
        list.add(
"张三");
        list.add(
"李四");
        list.add(
"王五");
        list.add(
"曹操");
        list.add(
"孙权");
        list.add(
"刘备");
        
//检验用户
        if(list.contains(username)){
            writer.print(
"存在:"+username+"客户端传递的密码是:"+password);
        }
else{
            writer.print(
"找不到:"+username+"客户端传递的密码是:"+password);
        }

        
    }

}

        flex代码:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s
="library://ns.adobe.com/flex/spark" 
               xmlns:mx
="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    
<fx:Script>
        
<![CDATA[
            import mx.controls.Alert;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;

            //调用失败
            protected function service_faultHandler(event:FaultEvent):void
            {
                Alert.show("失败了:"+event.message,"提示");
            }

            //调用成功
            protected function service_resultHandler(event:ResultEvent):void
            {
                Alert.show("成功了:"+event.result as String,"提示");
            }
    
            //调用
            protected function button1_clickHandler(event:MouseEvent):void
            {
                //第一种传值方式                
                //service.send();
                
                //第二种传值方式 通过send()方法传值 send方法中传递参数 
                //定义一object对象
                var val:Object=new Object();
                //分别将文本框username,password的值传递到后台
                //object对象.参数名=值   传值操作
                val.username=txtusername.text;
                val.password=txtpassword.text;
                service.send(val);
            }

        
]]>
    
</fx:Script>
    
<fx:Declarations>
        
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
        
<!--定义HttpService发送请求-->
        
<s:HTTPService id="service" 
                       url
="http://localhost:8080/testhttpservice/testHttpServiceServlet" 
                       useProxy
="false" 
                       fault
="service_faultHandler(event)" 
                       result
="service_resultHandler(event)">
            
<!--第一种传值方式-->
            
            
<s:request >
                
<!--参数名称作标签,中间填充参数值-->
                
<username>{txtusername.text}</username>
                
<password>{txtpassword.text}</password>
            
</s:request>
            
        
</s:HTTPService>
        
        
    
</fx:Declarations>
    
<s:TextInput x="332" y="196" id="txtusername"/>
    
<s:TextInput x="332" y="256" id="txtpassword" displayAsPassword="true"/>
    
<s:Button x="357" y="311" label="发送" click="button1_clickHandler(event)"/>
    
<s:Label x="290" y="206" text="用户名:"/>
    
<s:Label x="297" y="266" text="密码:"/>
</s:Application>
        工程文件:
        点我下载工程文件
posted @ 2010-07-19 17:31 雪山飞鹄 阅读(11462) | 评论 (10)编辑 收藏

     摘要:         flex4出来一段时间了,去年看了一段时间flex3,后来由于暂时没有项目需求.所以flex遗忘了很多.这次使用flex4+myeclipse8.5录制了一个视频.以免时间长了遗忘.         软件环境:window...  阅读全文
posted @ 2010-07-17 02:57 雪山飞鹄 阅读(21195) | 评论 (90)编辑 收藏

        各位大牛,小弟打算把自己写的一些代码提交到google code交给google提供的svn进行管理.下午折腾了一下午也没通过svn提交上去.郁闷的很.目前google code好像只支持文件上传,svn托管好像用不了.很郁闷,在公司折腾了一下午,还没搞定,心里很不爽.晚上回家后接着整,咨询了下群友,大家说需要翻墙,找了网上大名鼎鼎的"张生翻墙"还是未果.不知道大家的google code好着了么?知道的告诉俺一声.先谢过了(目前我的问题是连不上SVN,但是可以通过文件上传的方式上传文件)
        QQ:184675420
        Email:sxyx2008@163.com
posted @ 2010-07-15 23:19 雪山飞鹄 阅读(2642) | 评论 (15)编辑 收藏

     摘要:         功能描述:平常在项目中使用xfire来写webservice返回值大都为字符串,今天无意间查看了xfire的官方文档,发现用xfire来编写返回值为list的web服务也很简单。但步骤稍微繁琐一点。怕遗忘,特此记录一番。       &nbs...  阅读全文
posted @ 2010-07-14 11:05 雪山飞鹄 阅读(8950) | 评论 (4)编辑 收藏

        需求描述:任何程序都会存在bug,虽然项目经过反复测试,已经上线运行了,但难免会遇到各种错误,在这里轻松配置log4j实现错误消息的email通知.
        两个文件:web.xml log4j.properties
        web.xml
        在web.xml中添加如下代码

<!-- 设置上下文参数 -->
    
<context-param>
        
<!-- log4j配置文件位置 -->
        
<param-name>log4jConfigLocation</param-name>
        
<param-value>/WEB-INF/classes/log4j.properties</param-value>
    
</context-param>
    
<context-param>
        
<param-name>log4jRefreshInterval</param-name>
        
<param-value>6000</param-value>
    
</context-param>
    
<!-- log4j监听器 -->
    
<listener>
        
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    
</listener>
        log4j.properties
## ROOT
log4j.rootLogger=INFO,CONSOLE,MAIL

## CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=INFO
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
#log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.CONSOLE.layout.ConversionPattern=[\u8C03\u8BD5\u4FE1\u606F]%-5p %c %x - %m%n

## File
log4j.appender.A_default=org.apache.log4j.RollingFileAppender
log4j.appender.A_default.Threshold=INFO
log4j.appender.A_default.File=e\:/logs/log4j.log
log4j.appender.A_default.MaxFileSize=4000KB
log4j.appender.A_default.MaxBackupIndex=10
log4j.appender.A_default.layout=org.apache.log4j.PatternLayout
log4j.appender.A_default.layout.ConversionPattern=[\u8C03\u8BD5\u4FE1\u606F]%-5p %c %x - %m%n

## MAIL
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
# 日志的错误级别
log4j.appender.MAIL.Threshold=ERROR
# 缓存文件大小,日志达到512K时发送Email
log4j.appender.MAIL.BufferSize=10
# 发送邮件的服务器
log4j.appender.MAIL.SMTPHost=smtp.163.com
# 邮件的标题
log4j.appender.MAIL.Subject=\u6D4B\u8BD5log4j\u8F93\u51FA\u9519\u8BEF\u4FE1\u606F\u5230\u65E5\u5FD7
# 用户名
log4j.appender.MAIL.SMTPUsername=你的用户名
# 密码
log4j.appender.MAIL.SMTPPassword=你的密码
# 发件人地址
log4j.appender.MAIL.From=xxxxx@163.com
# 日志邮件的接收者
log4j.appender.MAIL.To=xxx@qq.com
# 日志PatternLayout
log4j.appender.MAIL.layout=com.quartz.demo.Loger4JHTMLLayOut
# 日志的格式
log4j.appender.MAIL.layout.ConversionPattern=[ErrorMessage] %d - %c -%-4r [%t] %-5p %c %x - %m%n

        注:在以上log4j.properties文件中配置了自己的自定义layout,由于log4j默认采用的纯文本方式.这样不便于我们在邮件中查看,因此覆盖它的layout,自定义属于我们自己的layout
        自定义类com.quartz.demo.Loger4JHTMLLayOut完成了该功能
package com.quartz.demo;

import org.apache.log4j.HTMLLayout;

public class Loger4JHTMLLayOut extends HTMLLayout{
    
    @Override
    
public String getContentType() {
        
return "text/html;charset=utf-8"
    }

}

        即:只需设置contentType为text/html即可
        效果图:

            log4j.properties
posted @ 2010-07-14 01:44 雪山飞鹄 阅读(8403) | 评论 (2)编辑 收藏

        功能描述:刚开始接触Quartz,试着用Quartz整合spring实现每隔一分钟发送一封邮件连续发送10次
        核心jar:
                    邮件发送:commons-email-1.2.jar mail.jar(必须的)
                    quartz:quartz-all-1.8.3.jar quartz-all-1.8.3/lib/下所有jar
                    spring:spring-context-support.ajr(必须的)
        只贴出核心代码:
        Email发送:使用apache commons-email跟mail
package com.ssh.commonsemail;

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

import javax.mail.internet.InternetAddress;

import org.apache.commons.mail.SimpleEmail;

/**
 * 功能描述:此代码主要实现邮件发送功能
 * 
@author coder
 *
 
*/

public class SendSimplEmail {
    
    
    
public static void sendMail()throws Exception{
        List
<InternetAddress> list=new ArrayList<InternetAddress>();
        list.add(
new InternetAddress("313698683@qq.com"));
        list.add(
new InternetAddress("184675420@qq.com"));
        SimpleEmail email
=new SimpleEmail();
        email.setFrom(
"184675420@163.com");
        email.setCharset(
"utf-8");
        email.setSentDate(
new Date());
        email.setSubject(
"测试Quartz");
        email.setHostName(
"smtp.163.com");
        email.setAuthentication(
"xxxx""xxxx");
        email.setTo(list);
        email.setContent(
"<h1>Hello,把凤姐许配给你,你看咋样?</h1>""text/html;charset=utf-8");
        email.send();
    }

    
    
}

        定义调度工作任务:继承自org.springframework.scheduling.quartz.QuartzJobBean次类在spring-context-support.jar中
package com.ssh.quantz;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import com.ssh.commonsemail.SendSimplEmail;

/**
 * 发送email任务
 * 
@author coder
 *
 
*/

public class SendEmailJob extends QuartzJobBean{
    
    @Override
    
protected void executeInternal(JobExecutionContext context)
            
throws JobExecutionException {
        
try {
            
//调用邮件发送代码
            SendSimplEmail.sendMail();
        }
 catch (Exception e) {
            e.printStackTrace();
        }

    }


    

}

        spring核心配置文件
<!-- 定义调度工作任务 -->
    
<bean id="quantzjobBean" class="org.springframework.scheduling.quartz.JobDetailBean">
        
<property name="jobClass">
            
<!-- 实现了org.springframework.scheduling.quartz.QuartzJobBean的JobBean -->
            
<value>com.ssh.quantz.SendEmailJob</value>
        
</property>
        
<!-- 调用业务逻辑 -->
        
<!--  
        <property name="jobDataAsMap">
            <map>
                <entry key="biz">
                    <ref bean="users"/>
                </entry>
            </map>
        </property>
        
-->
    
</bean>

    
<!-- 触发任务条件 -->
    
<bean id="simpletriggerbean" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        
<property name="jobDetail" ref="quantzjobBean"></property>
        
<!-- 延迟一分钟启动 -->
        
<property name="startDelay">
            
<value>60000</value>
        
</property>
        
<!-- 每隔2分钟调用一次 -->
        
<property name="repeatInterval">
            
<value>60000</value>
        
</property>
        
<!-- 执行10次 -->
        
<property name="repeatCount">
            
<value>10</value>
        
</property>
        
    
</bean>
    
    
<!-- 启动调度 -->
    
<bean id="startQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        
<property name="triggers">
            
<list>
                
<ref bean="simpletriggerbean"/>
            
</list>
        
</property>
    
</bean>


                        
posted @ 2010-07-13 18:03 雪山飞鹄 阅读(6205) | 评论 (2)编辑 收藏

仅列出标题
共22页: First 上一页 12 13 14 15 16 17 18 19 20 下一页 Last