精彩的人生

好好工作,好好生活

BlogJava 首页 新随笔 联系 聚合 管理
  147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks

#

今天需要读取xml文件.
以前几乎没有做过xml文件的解析(在一个面试的测试题中做过一道xml解析的题),觉得xml解析挺容易的.上网找了找,资料还挺多,下面就是一篇很不错的文章,原文地址为http://www.jdon.com/idea/xml.htm

Java和XML是黄金组合,网上已经有很多文章介绍,XML作为电子商务中数据交换,已经有其不可替代的作用,但是在平时系统开发中,我们不一定都用到数据交换,是不是无法使用XML了?

当然不是,现在已经有一个新趋势,java程序的配置文件都开始使用XML格式,以前是使用类似windows的INI格式.(Java中也有Propertiesy这样的类专门处理这样的属性配置文件).使用XML作为Java的配置文件有很多好处,从Tomcat的安装配置文件和J2ee的配置文件中,我们已经看到XML的普遍应用,让我们也跟随流行趋势用XML武装起来.

现在关键是如何读取XML配置文件?有好几种XML解析器:主要有DOM和SAX ,这些区别网上文章介绍很多.

apache的XML项目组中,目前有Xerces Xalan Cocoon几个开发XML相关技术的project.Tomcat本身使用的是 Sun 的 JAXP,而其XSL Taglib project中使用Xerces解析器.

好了,上面都是比较烦人的理论问题,还是赶快切入XML的配置文件的读取吧.

在我们的程序中,通常要有一些根据主机环境确定的变量.比如数据库访问用户名和密码,不同的主机可能设置不一样.只要更改XML配置文件,就可以正常运行.

<myenv>

<datasource>
<dbhost>localhost</dbhost>
<dbname>sqlname</dbname>
<dbuser>username</dbuser>
<dbpassword>password</dbpassword>
</datasource>

</myenv>

 

 

上面这个myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目录下.

我们编制一个Java程序直接读取,将dbhost dbuser dbpassword提取出来供其他程序访问数据库用.

目前使用SAX比较的多,与DOM主要区别是 SAX是一行一行读取XML文件进行分析,适合比较大文件,DOM是一次性读入内存,显然不能对付大文件.这里我们使用SAX解析,由于SAX解析器不断在发展,网上有不少文章是针对老版本的.如果你使用JDK1.4 ,可以参考 使用SAX处理XML文档 一文.这里的程序是根据其改进并且经过实践调试得来的.

对上面myenv.xml读取的Java程序:


import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;

import java.util.Properties;

//使用DefaultHandler的好处 是 不必陈列出所有方法,
public class ConfigParser extends DefaultHandler {

////定义一个Properties 用来存放 dbhost dbuser dbpassword的值
private Properties props;

private String currentSet;
private String currentName;
private StringBuffer currentValue = new StringBuffer();

//构建器初始化props
public ConfigParser() {

this.props = new Properties();
}

public Properties getProps() {
return this.props;
}



//定义开始解析元素的方法. 这里是将<xxx>中的名称xxx提取出来.
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
currentValue.delete(0, currentValue.length());
this.currentName =qName;




}

//这里是将<xxx></xxx>之间的值加入到currentValue

public void characters(char[] ch, int start, int length) throws SAXException {

currentValue.append(ch, start, length);

}

//在遇到</xxx>结束后,将之前的名称和值一一对应保存在props中

public void endElement(String uri, String localName, String qName) throws SAXException {

props.put(qName.toLowerCase(), currentValue.toString().trim());
}

}

上面的这个解析程序比较简单吧? 其实解析XML就是这么简单.

现在我们已经将dbhost dbuser dbpassword的值localhost sqlname username password提取了出来.但是这只是在在解析器内部,我们的程序还不能访问.需要再编制一个程序.

 

import java.util.Properties;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.net.URL;

public class ParseXML{

//定义一个Properties 用来存放 dbhost dbuser dbpassword的值
private Properties props;

//这里的props
public Properties getProps() {
return this.props;
}

public void parse(String filename) throws Exception {

//将我们的解析器对象化
ConfigParser handler = new ConfigParser();

//获取SAX工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);

//获取SAX解析
SAXParser parser = factory.newSAXParser();

//得到配置文件myenv.xml所在目录. tomcat中是在WEB-INF/classes
//下例中BeansConstants是用来存放xml文件中配置信息的类,可以自己代替或定义
URL confURL = BeansConstants.class.getClassLoader().getResource(filename);

try
{
//将解析器和解析对象myenv.xml联系起来,开始解析
parser.parse(confURL.toString(), handler);
//获取解析成功后的属性 以后 我们其他应用程序只要调用本程序的props就可以提取出属性名称和值了
props = handler.getProps();
}finally{
factory=null;
parser=null;
handler=null;
}

}

}

由于我们的XML文件是使用最简单的形式 ,因此解析器相对简单,但是这已经足够对付我们的配置文件了.

判断一个程序系统的先进性,我们先看看他的配置文件,如果还在使用老套的xxx=123 这样类似.ini的文件,
我们也许会微微一笑,他又落伍了.....

 

posted @ 2005-12-05 14:44 hopeshared 阅读(463) | 评论 (0)编辑 收藏

        由于工作需要,要做一个项目打包的功能. 原则上,项目打包应该写一个ant脚本,然后在代码中执行它,反正很复杂.
        一个朋友推荐我用fatjar试试, 我上网搜到了这篇文章,转过来保存.




        今天启动tomcat发现特别慢,得等1分多钟才启动完,这才想起来,我把WEB-INFO/lib/struts.jar , pager-tag.jar都删除了,取而代之的是他们的源码,tomcat启动的时候因为找不到jar文件就要重新编译,所以特别地慢。因此,我把struts.jar拷贝到WEB-INFO/lib下了,现在缺pager-tag.jar了。(其实pager-tag的源码编译不慢,主要是struts源码编译比较慢)我找了一下把程序打包的工具,其实eclipse自己带了一个export工具可以打包,你的项目=〉export=>jar file=>然后挨个选择你需要的包=〉写好目标jar文件名=〉写好目标目录=〉就生成新jar了。

        其实这样已经能够满足我的要求了,查看Eclipse如何打包的过程中我发现有个fatjar插件功能更强些,可以把需要的资源打进一个jar里。所以下载了一个,下载地址:http://sourceforge.net/project/showfiles.php?group_id=115990&package_id=125924 解压缩后是一个.../plugins/(net...)把plugins下面的(net..)文件夹拷贝到eclipse的plugins下,重新启动Eclipse3.1,Windows=>prefernce=>fat jar preference看到他就说明已经安装成功了。如果没有看到,没有关系,删除D:\eclipse310\configuration\org.eclipse.update\platform.xml文件(此文件可以自动生成)不用担心以前的插件会因此而消失,没事。

        刚开始找不到如何使用它,后来看到你的项目=〉Export..=>向导里有fat jar =>使用起来真的很方便。

总结:
一般把src打包export=>Jar File 即可。
想把src附属的资源一起打包,必须使用FatJar => export..=>FatJar.


原文引用通告地址: http://blog.csdn.net/srx/services/trackbacks/492760.aspx
posted @ 2005-11-30 09:39 hopeshared 阅读(19212) | 评论 (6)编辑 收藏

这里用到了一个开源的包commons-fileupload.jar,事实证明这个包十分好用

 

uploadPhoto.jsp:
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
upload
</title>


</head>
<body bgcolor="#ffffff">
<h1>
<%
if(request.getAttribute("msg")==null)
{//提示信息
}
else{
%>
<%=(String)request.getAttribute("msg")%>
<%
}

%>
</h1>
<form action="photoImg.jsp" id="frm" encType="multipart/form-data"  method="post">
<br/><br/>
  
<input type="FILE" name="FILE1" id="myFilename" size="50"/>
<input type="submit" name="Submit" value="Submit" />
<input type="reset" value="Reset"/>
</form>
</body>
</html>

注意:这个form必须写上encType="multipart/form-data" 来表明上传文件。并且,这个form中不能用隐藏变量来传递参数。就是说写一个<input type = hidden name=tmp>在下一个页面或者action中用request.getParameter是取不到的。

 

 

photoImg.jsp:

<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<%@ page import="java.awt.*" %>
<html>
<head>
<title>
upload
</title>
</head>
<body bgcolor="#ffffff">

<%
        GPhoto photo 
= new GPhoto();
        request 
= photo.uploadImage(request);
%>

<jsp:forward page="uploadPhoto.jsp">
</jsp:forward>
</body>
</html>

uploadImage()是这样实现的:
public static HttpServletRequest uploadImage(HttpServletRequest request)
            
throws Exception {

        DiskFileUpload fileUpload 
= new DiskFileUpload();

        
//设置允许用户上传文件大小,单位:字节
        fileUpload.setSizeMax(8388608);

        
//设置最多允许在内存中存储的数据,单位:字节
        fileUpload.setSizeThreshold(1024000);

        
//设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
        
//在进行文件上传的时候文件先存再内存中,然后才会存到server上,但是如果内存放不下那么大的文件
        
//就必须用硬盘上的 一个临时文件夹来保存这个文件的部分,然后转存
        
//现在默认的文件存储的路径是
        String tmp = “c:/temp/”;

        
//设置上传文件的存储路径,如果不设置这个路径,这个文件将保存在
//server的根目录下(如tomcat或者resin的根目录)
        String uploadPath = “c:/”;

        fileUpload.setRepositoryPath(tmp);

        String strType 
= "";

        
try {
            List fileItems 
= fileUpload.parseRequest(request);

            Iterator iterator 
= fileItems.iterator();

            
while(iterator.hasNext()) {

                FileItem fileItem 
= (FileItem)iterator.next();

                
//文件域的表单信息
                if (!fileItem.isFormField()) {
                    String strName 
= fileItem.getName();

                    
long size = fileItem.getSize();
                    
if((strName==null||strName.equals("")) && size==0)
                        
continue;

                        File savedFile 
= new File(uploadPath + strName);

                        fileItem.write(savedFile);

                        request.setAttribute(
"msg","save file successful!");
                }

            }

            
if(request.getAttribute("msg")== null)
            
{
                request.setAttribute(
"msg","save file failed!");
            }

        }
 catch (Exception ex) {
            request.setAttribute(
"msg","save file failed!");
        }

        
return request;
    }


OK,文件保存了

 

我在windows下传文件很正常,但是在linux下,当文件过大,需要使用临时文件夹的时候出现问题,可能是文件路径的问题。
posted @ 2005-11-27 12:56 hopeshared 阅读(7555) | 评论 (1)编辑 收藏

java中的图片处理是很让人头疼的一件事情。目前java api中的imageIO可以将gif图片转换成png图片,jpg图片可以正常转换。据说gifjpg也是有办法的,但是将jpg转成gif,我费了很大的工夫才找到一个很好的解决方案。

 

首先介绍的是一段很好的缩放图片的代码::
public static BufferedImage resize(BufferedImage source, int targetW, int targetH) {
    
// targetW,targetH分别表示目标长和宽
        int type = source.getType();
        BufferedImage target 
= null;
        
double sx = (double) targetW / source.getWidth();
        
double sy = (double) targetH / source.getHeight();

        
//这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
        
//则将下面的if else语句注释即可
        if(sx>sy)
        
{
            sx 
= sy;
            targetW 
= (int)(sx * source.getWidth());
        }
else{
            sy 
= sx;
            targetH 
= (int)(sy * source.getHeight());
        }


        
if (type == BufferedImage.TYPE_CUSTOM) //handmade
            ColorModel cm = source.getColorModel();
            WritableRaster raster 
= cm.createCompatibleWritableRaster(targetW, targetH);
            
boolean alphaPremultiplied = cm.isAlphaPremultiplied();
            target 
= new BufferedImage(cm, raster, alphaPremultiplied, null);
        }
 else
            target 
= new BufferedImage(targetW, targetH, type);
        Graphics2D g 
= target.createGraphics();
        
//smoother than exlax:
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);


        g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
        g.dispose();
        
return target;
    }


接下来是将InputStream保存为jpg文件
public static void saveImageAsJpg (InputStream in, File saveFile,int width,int hight)    
            
throws Exception {
        BufferedImage srcImage;

        srcImage 
= ImageIO.read(in);

        
if(width > 0 || hight > 0)
        
{
             srcImage 
= resize(srcImage, width, hight);
        }


        ImageIO.write(srcImage, 
"JPEG", saveFile);
        in.close();
    }


参数解释:

in::是一个jpg图片的InputStream

saveFile::目标文件

width::目标宽度,如果不需要缩放则置0

hight::目标高度,如果不需要缩放则置0

 

 

然后是将InputStream保存为gif文件:
private static void saveImageAsGif(InputStream in, File fileToSave,int width, int hight)
            
throws Exception {
        BufferedImage srcImage;

        srcImage 
= ImageIO.read(in);

        
if(width>0 && hight >0)
        
{
             srcImage 
= resize(srcImage, width, hight);
        }


        FileOutputStream out 
= new FileOutputStream(fileToSave);
        GifEncoder encoder 
= new GifEncoder(srcImage, out);
        encoder.encode();

        in.close();
    }


参数解释:

in::是一个jpg或者gif图片的InputStream

saveFile::目标文件

width::目标宽度,如果不需要缩放则置0

hight::目标高度,如果不需要缩放则置0

 

GifEncoder这个类是java api中没有的,也是我找寻了很久的一个东西。它是Acme.JPM.Encoders.GifEncoder,只要找到这个包,将jpg转为gif就不是问题了。

 

 

Jpg图片使用的是24-bit的编码,pngpng-24png-8两种,但是gif8-bit的编码。如果强行将jpg图片信息流按字节拆开,转换成gif图片,即使使用标准256色,也会出现严重的失真。

 

我曾经使用了gif4j_light_trial_1.0.jar这个包,但是这个包让我很失望。尽管它可以将多张图片合成一个动态的gif图片,但是它是付费的,免费使用期只有一个月。并且,在使用它将jpg图片转换成gif图片之后中间会有一条白色的横线,不知道这是系统的缺陷还是在费用包中做的手脚。

posted @ 2005-11-27 12:53 hopeshared 阅读(5035) | 评论 (17)编辑 收藏

     摘要: 这里,我用pop3连126.com的邮箱取到邮件,解析邮件附件。我的工作是取到jpg或gif图片并保存。   说明:这是我的在工作中写的代码,是可用的。但是有部分代码被截取出来,比如有些参数我觉得没有必要,就删除了,没有测试。可能会有bug,但是肯定是小bug。  连接到邮箱: public static void connectMail(...  阅读全文
posted @ 2005-11-27 12:50 hopeshared 阅读(588) | 评论 (0)编辑 收藏

仅列出标题
共30页: First 上一页 22 23 24 25 26 27 28 29 30 下一页