汉字URL编码

2008.10.15 / 标签: ,,,,,, / 分类: J2EE技术

这是本次项目的最后一个问题了,把这个问题解决了,项目就彻底竣工了。先说说要达到的效果:点击一个关键字,使用URL重写传值给Servlet,然后从数据库中查出所有包含这个关键字的文章。
然而在JSP中我们点击这样一个超级链接:http://localhost:8080/wwwroot/tagservlet?tag=数据库
可是这样传递的值我们在Servlet中是没法获取到的,我们需要对这里的汉字进行URL编码,这样我们才能够在Servlet中使用request.getParameter("tag")获得我们传递过来的值。为此,我们需要导入java.net.URLEncoder这个包,接下来使用URLEncoder.encode("数据库")来将“数据库”这三个字进行转码得到的结果是“%CA%FD%BE%DD%BF%E2”,如此一来我们的链接就变为了:http://localhost:8080/wwwroot/tagservlet?tag=%CA%FD%BE%DD%BF%E2
然而,当用request.getParameter("tag")获取这个值并将其输出,你会发现是一堆“?”,这里还得在转码才能得到汉字:
String tag = request.getParameter("tag");
tag = new String(tag.getBytes("ISO-8859-1"),"GBK");
这下终于好了,为什么汉字总是这么麻烦,老要转来转去的,老外的字母就没有问题…

ResultSet读取ntext类型数据乱码

2008.10.14 / 标签: ,,, / 分类: J2EE技术

项目终于快搞定了,就差最后那么一点点了…从开工到现在一直都有数据乱码的问题存在,起初也没太在意,先把整体搞定了再慢慢研究研究这个,现在是时候了!
数据是从我现在用的这个博客的ACCESS数据库转到MSSQL中的,有些文章显示一切正常,有些则全部是乱码,经过再三查看,我确定所有原来是以FCK模式发布的文章都没有问题,唯独UBB模式的都是乱码。先来试试读取的时候直接对数据转码看看:
article.setContent(new String(rs.getBytes(6), "GBK"));
结果是:转成GBK、GB2312以及iso-8859-1之后显示还是乱码。无奈之下只好百度了。
看到某人也碰到了和我同样的遭遇,同样也是一个接一个的测试,最后用utf-16le读取出来正常了。
晕倒~我这还真是头一次听到还有个utf-16le编码格式,这下长见识了。

pager-taglib分页标签使用方法

2008.10.09 / 标签: ,,,,,,,, / 分类: J2EE技术

以前写的那个[jsp中实现分页显示数据] 方法不通用,得找个分页标签。关于pager-taglib的使用方法网上虽说一大堆,但是同样费我不少脑细胞去看。有的代码不齐全,有的根本就是错误的,有的写的很潦草,看的我是云里雾里的,经过本人耗费大量的脑细胞奋战N个小时终于搞出了点猫腻。
想明白了,写出来运行成功了,我才发现其实用法很简单,没那些人写的那么麻烦。
首先当然还是要导pager-taglib.jar包了,可以去http://jsptags.com/tags/navigation/pager/index.jsp下载,从下载下来的war文件中找到pager-taglib.jar包以及pager-taglib.tld文件。将pager-taglib.tld文件放在WEB-INF目录下,将pager-taglib.jar放在WEB-INF/lib目录下(JBuilder中的导入方法可以参考[Servlet中实现文件上传] )。
新建一个bean文件定义如下两个方法(不一定非要这个样子):

 
  1. /**
  2.      * 该方法用于获得数据总数
  3.      * @return int
  4.      */
  5. public int getArticlesCount() {
  6.         String sql = "SELECT COUNT(*) FROM blog_Article";
  7.         dbc = new DataSource();
  8.         stmt = dbc.getPreparedStatement(sql);
  9.         rs = dbc.getResultSet(stmt);
  10.         int count = 0;
  11.         try {
  12.             if(rs.next()){
  13.               count = rs.getInt(1);
  14.             }
  15.         } catch (SQLException ex) {
  16.             ex.printStackTrace();
  17.         } finally {
  18.             dbc.closeConnection();
  19.         }
  20.         return count;
  21.     }
  22.     
  23.     /**
  24.      * 该方法用于数据分页
  25.      * @param begin int
  26.      * @param end int
  27.      * @return ArrayList
  28.      */
  29. public ArrayList getArticlesAll(int begin,int end) {
  30.         String sql = "select top "+end+" * from blog_Article where (log_ID <= (select min(log_ID) from (select top "+begin+" log_ID from blog_Article order by log_PostTime desc) as t)) order by log_PostTime desc";
  31.         ArrayList list = new ArrayList();
  32.         dbc = new DataSource();
  33.         stmt = dbc.getPreparedStatement(sql);
  34.         rs = dbc.getResultSet(stmt);
  35.         try {
  36.             while (rs.next()) {
  37.                 ArticleBean article = new ArticleBean();
  38.                 article.setId(rs.getInt(1));
  39.                 //赋值操作…
  40.                 article.setTag(rs.getString(10));
  41.                 article.setIsTop(rs.getByte(11));
  42.                 list.add(article);
  43.             }
  44.         } catch (SQLException ex) {
  45.             ex.printStackTrace();
  46.         } finally {
  47.             dbc.closeCon
    nection();
  48.         }
  49.         return list;
  50.     }

 

接下来新建一个JSP页面(需要JSTL):

 
  1. <%@ page contentType="text/html; charset=GBK" import="java.util.*,com.nkblog.bean.ArticleBean,com.nkblog.dbc.*" %>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. <%@ taglib uri="WEB-INF/pager-taglib.tld" prefix="pg" %>
  4. <%
  5. request.setCharacterEncoding("GBK");
  6. String offset = request.getParameter("pager.offset");//pager.offset为此分页标签内置变量用于传递页数
  7.         int page = 0;
  8.         if(offset == null){
  9.         //若offset为null则是第一次访问,所以显示第一页
  10.             page= 1;
  11.         }else{
  12.         //反之,则按照传递来的页数来分
  13.             page = Integer.parseInt(offset)+1;
  14.         }
  15. //获取数据总数        
  16. int dataTotal = ArticleManager.getArticlesCount();
  17. //查询分页数据,10为每页要显示的数据量,可自定义
  18. ArrayList articles = ArticleManager.getArticlesAll(page,10);
  19. %>
  20. <%
  21. for(int i=0;i<articles.size();i++)
  22. {
  23. //输出取出的10条数据…
  24. }
  25. %>
  26. <pg:pager scope="request" maxIndexPages="5" index="center" maxPageItems="10" url="index.jsp" items="<%=dataTotal%>" %>" export="currentPageNumber=pageNumber">
  27.         <pg:first><a href="${pageUrl}">首页</a></pg:first>
  28.         <pg:prev><a href="${pageUrl}">前页</a></pg:prev>
  29.   <pg:page>
  30.   </pg:page>
  31.         <pg:pages>
  32.             <c:choose>
  33.             <c:when test="${pageNumber eq currentPageNumber }">
  34.             <font color="red">${pageNumber }</font>
  35.             </c:when>
  36.             <c:otherwise>
  37.             <a href="${pageUrl }">${pageNumber}</a>
  38.             </c:
    otherwise>
  39.             </c:choose>
  40.    </pg:pages>
  41.         <pg:next><a href="${pageUrl}">下页</a></pg:next>
  42.         <pg:last><a href="${pageUrl}">尾页</a></pg:last>
  43. </pg:pager>

接下来具体说明上面的分页标签<pg:pager>
maxIndexPages为分页条个数,形如:< << 1 2 3 4 5 >> >
maxPageItems为每页要显示的数据量
url为处理分页请求的文件,可以是JSP或Servlet。当程序运行起来后,会以index.jsp?pager.offset=5的形式传递页数。
items为数据总数,pager-taglib会自动根据以上参数进行分页。
需要进行修改的也就上面这几个参数,起初看别人写的方法,我以为只要导入这个标签然后给定一个List数据集合,它就完全自动的跟也并显示数据了,汗~~也不知道我这么写会有几个看得懂的,估计懂的人有,但是能看明白我写的就少了…我发现原来代码写起来简单,但是要给别人将明白了真的好难啊。

 

Servlet中实现文件上传

2008.10.08 / 标签: ,, / 分类: J2EE技术

很久以前写的那个[文件上传] 是在JSP页面中实现的,此次我们来要在Servlet中实现文件的上传处理,两种方法的代码是不一样的,我看到有很多人说在Servlet中要使用commons-fileupload.jar的话还需要commons-io.jar提供支持而在JSP中不需要,经过我的测试,MS在Servlet中也是不需要这个commons-io.jar。
下面我们开始实现Servlet处理文件上传,首先我们需要去下载上面提到的两个jar包,下载地址分别为:
http://commons.apache.org/fileupload
http://commons.apache.org/io/
然后将这两个包导入到你的Web工程下的WEB-INF中的lib目录中去,没有lib的话请自建。另外如果你使用的是JBuilder来做的话,这样放进去是没有用的,使用的时候会提示DOES NOT EXIST。需要按照如下方法导入:
1.选则菜单栏中的“Tools”->“Configure”->“Libraies”。
2.点击“New”,Name这里随便输入(例如:CommonsFileUpload),最好是见其名知其意,Location这里可以不管他。
3.点击“Add”,将那两个包都导入进来,最后一路“OK”。
4.在你的工程命(例如:Neeke.jpx)上右键并选择“Properties”进入“Properties for ‘Neeke.jpx’”对话框,选择“Required Libraries”项,选择“Add”,找到你刚才新建的那个“CommonsFileUpload”然后一路“OK”。
现在就可以正常使用了,且JBuilder会自动将这两个包放在lib下。
新建一个upload.jsp,其代码如下:

<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
upload
</title>
</head>
<body>
<form action="../uploadservlet" method="POST" enctype="Multipart/form-data">
<input type="file" name="file" /><input type="submit" value="上传" />
</form>
</body>
</html>

需要注意的是表单form的enctype属性一定要写“Multipart/form-data”,没有什么为什么!
接下来我们新建一个Servlet为UploadServlet(要有DOPOST方法)并导入如下几个包:
org.apache.commons.fileupload.*;
org.apache.commons.io.*;
org.apache.commons.fileupload.servlet.ServletFileUpload;
org.apache.commons.fileupload.disk.DiskFileItemFactory;
由于在JBuilder中doPost()调用了doGet()方法,所以我们可以直接改写doGet()方法,具体代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws
             ServletException, IOException {
        response.setContentType(CONTENT_TYPE);
        PrintWriter out = response.getWriter();
        DiskFileItemFactory fac = new DiskFileItemFactory();
        //设置缓存文件大小
        fac.setSizeThreshold(1024*1024);
        //缓存文件位置,这里取的是默认的位置
        fac.setRepository(fac.getRepository());
        ServletFileUpload upload = new ServletFileUpload(fac);
        //设置最大允许上传的文件大小,这里是5MB
        upload.setFileSizeMax(1024*1024*5);
        List fileList = null;
        try {
            fileList = upload.parseRequest(request);
        } catch (FileUploadException ex) {
            response.sendRedirect("admin/upload.jsp?result=size");
            ex.printStackTrace();
            return;
        }
        Iterator iter = fileList.iterator();
        while(iter.hasNext()){ i>
            FileItem fileItem = (FileItem)iter.next();
            if(!fileItem.isFormField()){
                String name = fileItem.getName();
                String fileSize = new Long(fileItem.getSize()).toString();
                if(name == null || name.equals("") || fileSize.equals("0"))
                    continue;
                //截取出纯文件名
                name = name.substring(name.lastIndexOf("\\")+1);
                //存储文件
                File saveFile = new File("d:\\upload\\"+name);
                try {
                    fileItem.write(saveFile);
                } catch (Exception ex1) {
                    ex1.printStackTrace();
                    return;
                }
            }
        }
        out.close();
}

这样这个Servlet就能够实现对文件的上传了,这里文件的缓存大小及文件大小限制都可以动态的设置,我想这个问题具体就不需要我写了吧,嘿嘿。

Java读取XML文件

2008.10.07 / 标签: ,,, / 分类: J2EE技术
Sofa

前天做了那个[JSP网站RSS的实现] ,此乃用Java写XML文件,学东西我们要学全(尽可能的全),不能只知其一不知其二,今天来实现在Java中对XML类型文件的读取。
在Java中要实现对XML文件的读取,首先,我们要导入一下几个包。
javax.xml.parsers.DocumentBuilder;
相关解释:
定义 API, 使其从 XML 文档获取 DOM 文档实例。使用此类,应用程序员可以从 XML 获取一个 Document。
javax.xml.parsers.DocumentBuilderFactory;
相关解释:
定义工厂 API,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器。
org.w3c.dom.Document;
相关解释:
Document 接口表示整个 HTML 或 XML 文档。从概念上讲,它是文档树的根,并提供对文档数据的基本访问。
org.w3c.dom.NodeList;
相关解释:
NodeList 接口提供对节点的有序集合的抽象,没有定义或约束如何实现此集合。DOM 中的 NodeList 对象是活动的。
NodeList 中的项可以通过从 0 开始的整数索引进行访问。
了解了这些知识,我们就可以在Java中像写JavaScript一样获得XML文件中的数据了。
下面是一个具体的方法用于读取前天创建的RSS文件:

 
  1. public static void getArticleList(String fpath){
  2.         try{
  3.             DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
  4.             DocumentBuilder db=dbf.newDocumentBuilder();
  5.             Document doc=db.parse(fpath);
  6.             NodeList nodeList=doc.getElementsByTagName("item");
  7.             for(int i=0;i<nodeList.getLength();i++){
  8.                 String title=doc.getElementsByTagName("title").item(i).getFirstChild().getNodeValue();
  9.                 String author=doc.getElementsByTagName("author").item(i).getFirstChild().getNodeValue();
  10.                 String pubDate=doc.getElementsByTagName("pubDate").item(i).getFirstChild().getNodeValue();
  11.                 String description=doc.getElementsByTagName("description").item(i).getFirstChild().getNodeValue();
  12.                 String category=doc.getElementsByTagName("category").item(i).getFirstChild().getNodeValue();
  13.                 
  14.                 System.out.println(title);
  15.                 System.out.println(author);
  16.                 System.out.println(pubDate);
  17.                 System.out.println(description);
  18.                 System.out.println(category);
  19.             }
  20.         }catch(Exception e){
  21.             System.out.println(e.getMessage());
  22.         }
  23.     }

JSP网站RSS的实现

2008.10.05 / 标签: ,, / 分类: J2EE技术

RSS(也叫聚合内容,Really Simple Syndication)现在用的已经很广啦,最初的RSS要追溯到1995年,当Ramanathan V. Guha和其他在苹果电脑公司的高级技术组开发了一个测试的内容框架。更多有关RSS的资料可查看这里,下面我们来为我们的JSP网站生成RSS。

首先我们来看看最基本的RSS结构:

 
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"  
  3. xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"  
  4. xmlns:wfw="http://wellformedweb.org/CommentAPI/"  
  5. xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  6. </rss>

其实就是一个XML文件!在<rss></rss>之间我们可以自由配置自己要发布的RSS的格式。例如此次我们要发布的RSS是这样的:

 
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" x
  3. mlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" 
  4. xmlns:wfw="http://wellformedweb.org/CommentAPI/" x
  5. mlns:slash="http://purl.org/rss/1.0/modules/slash/">
  6. <channel>
  7. <item>
  8. <title>JSP网站RSS的实现</title>
  9. <author>neeke</author>
  10. <pubDate>2008-10-04</pubDate>
  11. <description>这是来自尼克技术博客博客的RSS</description>
  12. <category>J2EE技术</category>
  13. </item>
  14. </channel>
  15. </rss>

 

了解了它的结构实现起来就容易了。我们创建IO流,并从数据库中获取到我们要发布的RSS资源的集合,然后按照它的格式与结构一行一行的写入到一个RSS.XML文件中即可。

 
  1. public static void publishRss(String rssPath)
  2.     {
  3.       &
    nbsp; 
    //获得要发布的RSS数据集合
  4.         ArrayList rssArticle = ArticleManager.getArticlesAll();
  5.         try {
  6.             //创建输入输出流
  7.             FileWriter fw = new FileWriter(rssPath);
  8.             BufferedWriter bw = new BufferedWriter(fw);
  9.             //开始按照格式写入数据
  10.             bw.write(
  11.                     "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n");
  12.             bw.write("<?xml-stylesheet type=\"text/xsl\" href=\"CSS/rss.xslt\"?>");
  13.             bw.write("<rss version=\"2.0\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:trackback=\"http://madskills.com/public/xml/rss/module/trackback/\" xmlns:wfw=\"http://wellformedweb.org/CommentAPI/\" xmlns:slash=\"http://purl.org/rss/1.0/modules/slash/\">\r\n");
  14.             bw.write("<channel>\r\n");
  15.             for (int i = 0; i < rssArticle.size(); i++) {
  16.                 ArticleBean article = (ArticleBean) rssArticle.get(i);
  17.                 bw.write("<item>\r\n");
  18.                 bw.write("<title>" + article.getTitle() + "</title>\r\n");
  19.                 bw.write("<author>" + article.getAuthorId() + "</author>\r\n");
  20.                 bw.write("<pubDate>" + article.getPostTime() + "</pubDate>\r\n");
  21.                 bw.write("<description>" + article.getIntro() +
  22.                          "</description>\r\n");
  23.                 bw.write("<category>" + article.getCateId() + "</category>\r\n");
  24.                 bw.write("</item>\r\n");
  25.             }
  26.             bw.write("</channel>\r\n");
  27.             bw.write("</rss>");
  28.             //关闭流,RSS发布完毕。
  29.             bw.close();
  30.             fw.close();
  31.         } catch (IOException ex) {
  32.             ex.printStackTrace();
  33.         }
  34.     }

发布完毕,经过我的测试打开后会提示出错,用记事本打开生成的源文件,然而我们的RSS文件是一点问题都没有的哇,怎么可能呢?接着又用JBuilder打开这个XML文件,晕倒~汉字全是乱码,立刻意识到问题出在了哪里了。在哪呢?其实就是文件的编码问题!将原先
bw.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n");该行代码中的UTF-8改为GBK,重新跑一次程序,一切OK!

读写HTML代码类型配置信息的思考

2008.10.03 / 标签: ,,, / 分类: J2EE技术

昨天写了那个 [自定义配置文件] ,今天就又碰到问题了。如果我们定义的这个配置信息要能够支持HTML代码呢?比如要能够直接支持保存超级链接,统计代码啦诸如此类,那可就会爆出问题来。
例如,我们现在要保存一段51啦的统计代码:
<scrip tlanguage="javascript" type="text/javascript" src="http://js.users.51.la/1642363.js"></script>
<noscript>
<a href="http://www.51.la/?1642363" target="_blank"><img alt="&#x6211;&#x8981;&#x5566;&#x514D;&#x8D39;&#x7EDF;&#x8BA1;" src="http://img.users.51.la/1642363.asp" style="border:none" /></a>
</noscript>
将它保存的时候是不会出错的,保存到配置文件中会是这样的:

Const ZC_BLOG_COPYRIGHT="<scrip tlanguage="javascript"
type="text/javascript"src="http://js.users.51.la/1642363.js"></script><noscript><a href="http://www.51.la/?1642363" target="_blank"><img alt="&#x6211;&#x8981;&#x5566;&#x514D;&#x8D39;&#x7EDF;&#x8BA1;" src="http://img.users.51.la/1642363.asp" style="border:none" /></a></noscript>";

当我们第二次读取它的时候,按照我们上次的方法(截取“=”号和“;”之间部分)就出错啦。来看看它给我们截出来的是什么吧,先找到“=”紧接着找第一个“;”,然后把它们之间的截取出来,那就是:

<scrip tlanguage="javascript" type="text/javascript" src="http://js.users.51.la/1642363.js"></script>
<noscript><a href="http://www.51.la/?1642363" target="_blank"><img alt="&#x621

这不就完全错了吗,根本就不是我们想要得到的那段代码。怎么办?
首先,从“=”开始截取我们不用修改,我们要让它截取到该行的最后一个“;”,这样以来截取出来的就是我们想要的了,代码只需将int end = line.indexOf(";");修改为:int end = line.lastIndexOf(";");这样就OK了。
接下来还有一个问题,我们的配置文件的格式这这样的Const ZC_BLOG_COPYRIGHT="HTML代码";如果直接将“HTML代码”替换成上面的统计代码,虽然在我们修改读取的时候不会有问题,但是如果在网页的脚本中需要用的话那就出错了,为什么呢?因为统计代码中有“"”。
这个又要如何修改呢?也很简单,我们在写入代码到配置文件中之前先使用
copyRight = copyRight.replace(‘\"’,'\”);
将其中所有的双引号都替换为单引号,而取值修改的时候我们再反过来
copyRight = copyRight.replace(‘\”,’\"’);
把读取出来的代码中的所有单引号替换为双引号,这样用户在修改的时候看到的就和原来的一样了,而实际上的配置文件中却不是这样的,有点障眼法的意思,呵呵。

JSP读取自定义配置文件

2008.10.02 / 标签: ,,,, / 分类: J2EE技术

在J2EE的Web开发中(其他的也有),有时我们需要存储一些常量类型的配置信息,而这些信息是在不查询数据库的时候就要能够使用的,我就只想到了两个方法。
一个是存储在XML文件中,使用的时候用AJAX来获取,可是这样需要在客户端写大量的JavaScript代码,如果我们在写Jsp脚本的时候也需要这些信息呢?AJAX也没办法了吧?而且,XML文件是可以直接从URL来访问查看的,虽说不一定是重要的信息,但是能够被人随意看那也不好吧。
第二个方法就是,写在Jsp脚本里面,读取的时候我们可以通过
<%@ include file="" %>这样的[JSP指令] 或者<jsp:include flush="" page="" />[标准动作] 把它包含进当前脚本页即可直接访问它的值。需要修改的时候那就只能用IO流来写进去了。
经过再三斟酌,我决定使用第二个方法。那么,既然是配置信息,那就必须有它的规则(格式),若随便写,那读取起来就不好办了。这里举个实例,比如尼克技术博客使用这个ZBLOG程序,在它的根目录下就有一个类似这样的配置文件c_custom.asp,其代码如下:

 
  1. <%
  2. ‘网站基本设置
  3. Const ZC_DATABASE_PATH="data/#%206438769b7b43fa552613.mdb"
  4. Const ZC_BLOG_HOST="http://localhost/"
  5.  
  6. ‘——————————————————————–
  7. Const ZC_BLOG_TITLE="Your Blog"
  8. Const ZC_BLOG_SUBTITLE="Good Luck To You!"
  9. Const ZC_BLOG_NAME="你的Blog名称"
  10. Const ZC_BLOG_SUB_NAME="欢迎使用Z-Blog,有问题或意见请到Zblogger.BBS社区反馈,谢谢您的参与使用。"
  11. Const ZC_BLOG_CSS="default"
  12. Const ZC_BLOG_COPYRIGHT="Copyright xxxx-xxxx Your WebSite. Some Rights Reserved."
  13. Const ZC_BLOG_MASTER="neeke"
  14. ‘——————————————————————–
  15.  
  16. Const ZC_BLOG_THEME="default"
  17.  
  18. %>

 

我们看到它的定义是这样的:

数据类型 关键字名称 = "配置信息"

那么我我们也可以相应的写一个自己的配置文件。

 
  1. <%@ page contentType="text/html; charset=GBK" %>
  2. <%
  3. String NK_BLOG_TITLE="Your Blog";
  4. String NK_BLOG_SUBTITLE="Good Luck To You!";
  5. String NK_BLOG_NAME="你的Blog名称";
  6. String NK_BLOG_SUB_NAME="欢迎使用NK-Blog!";
  7. String NK_BLOG_COPYRIGHT="Copyright xxxx-xxxx Your WebSite. Some Rights Reserved.";
  8. %>

如果在Jsp脚本中需要用他们的时候,我们可以在页头使用<%@ include file="" %>包含这个文件,之后我们就可以直接使用<%=NK_BLOG_TITLE %>来输出“Your Blog”这条信息。修改的时候我们可以使用IO流每次读取其中一行若该行包含有NK_BLOG_TITLE这样的关键字则截取它对应的值,如何截取呢?找每行都有的特征出来,最容易看出来的应该就是双引号啦(""),不过我们不这样截,我们从等号(=)开始截取到分号(;)完,然后替换成新的数据再写入到文件中就OK了!下面就来写具体的实现代码。

读取配置信息:

 
  1. public static BlogSetting getBaseSetting(String custom) {
  2.         BlogSetting bset = new BlogSetting();
  3.         //用于存放每行的信息
  4.      &nbs
    p;  String line = 
    "";
  5.         //用于存储配置信息
  6.         String[] lines = new String[5];
  7.         try {
  8.             //开始读取配置信息
  9.             FileReader fr = new FileReader(custom);
  10.             BufferedReader br = new BufferedReader(fr);
  11.             while ((line = br.readLine()) != null) {
  12.                 //keyWords为预定义的特征字符数组
  13.                 for (int i = 0; i < keyWords.length; i++) {
  14.                     if (line.contains(keyWords[i])) {
  15.                         int begin = line.indexOf("=");
  16.                         int end = line.indexOf(";");
  17.                         //截取配置信息
  18.                         String key = line.substring(begin + 2, end - 1);
  19.                         //存储
  20.                         lines[i] = key;
  21.                     }
  22.                 }
  23.             }
  24.             //关闭文件流
  25.             br.close();
  26.             fr.close();
  27.         } catch (FileNotFoundException ex) {
  28.             ex.printStackTrace();
  29.         } catch (IOException ex) {
  30.             ex.printStackTrace();
  31.         }
  32.         bset.title = lines[0];
  33.         bset.subTitle = lines[1];
  34.         bset.name = lines[2];
  35.         bset.subName = lines[3];
  36.         bset.copyRight = lines[4];
  37.         return bset;
  38.     }

存储配置信息:

 
  1. public span> boolean BaseSettingSave(String custom) {
  2.         boolean ok = true;
  3.         //待保存的配置信息
  4.         String[] Words = new String[] {this.title, this.subTitle, this.name,
  5.                             this.subName,
  6.                             this.copyRight};
  7.         try {
  8.             //开始读取原配置信息
  9.             FileReader fr = new FileReader(custom);
  10.             BufferedReader br = new BufferedReader(fr);
  11.             String line = "";
  12.             String lines = "";
  13.             while ((line = br.readLine()) != null) {
  14.                 for (int i = 0; i < keyWords.length; i++) {
  15.                     //keyWords为预定义好的特特征字符数组
  16.                     if (line.contains(keyWords[i])) {
  17.                         int begin = line.indexOf("=");
  18.                         int end = line.indexOf(";");
  19.                         //截取出要替换掉的配置信息
  20.                         String key = line.substring(begin + 2, end - 1);
  21.                         //开始替换
  22.                         line = line.replaceAll(key, Words[i]);
  23.                     }
  24.                 }
  25.                 //新的配置信息字符串
  26.                 lines += line+"\r\n";//*****需要换行符
  27.             }
  28.             //关闭文件流
  29.             br.close();
  30.             fr.close();
  31.             //开始写入新的配置信息
  32.             FileWriter fw = new FileWriter(custom);
  33.             BufferedWriter bw = new BufferedWriter(fw);
  34.             bw.write(lines);
  35.             bw.flush();
  36.             //关闭文件流
  37.             bw.close();
  38.             fw.close();
  39.         } catch (FileNotFoundException ex) {
  40.             ok = false;
  41.             ex.printStackTrace();
  42.         } catch (IOExc
    eption ex) {
  43.             ok = false;
  44.             ex.printStackTrace();
  45.         }
  46.         return ok;
  47.     }

为什么要写这个呢?因为这个也是我这次J2EE项目中的一部分,JAVA真的忘得差不多了,想到了方法但是如何使用IO流就给忘了,结果翻书找到…温故而知新,写完后读取成功,修改成功,再读取就失败了~ – -!怎么回事呢?因为我修改写入的时候规则丢了,直接用bw.write(lines)写到一行了,第二次读取的时候它找不到规则当然错啦,然后给加上换行符搞定("\r\n")。贴出来以备将来书丢了的时候用,O(∩_∩)O哈哈~

 

为什么需要J2EE

2008.07.27 / 标签: ,, / 分类: J2EE技术
Sofa

JSP的弊端
在我们所编写的JSP代码中,显示代码和业务逻辑混淆在一起,彼此嵌套,难以对项目进行有效的维护和扩展。当业务需求发生变化的时候,对于程序员和美工都是一个很重的负担。
那么我们程序员应该如何解决这个问题呢?
为了程序的易维护性和可扩展性,这就需要我们使用JavaEE技术来进行项目开发。
什么是J2EE
首先让我们对Java语言的平台进行一个了解:
目前,Java平台有3个版本:适合于小型设备和智能卡的JavaME(Java Platform Micro Edition,Java微型版)、适用于桌面系统的JavaSE(Java Platform Micro Edition,Java标准版)和适用于企业及应用的JavaEE(Java Platform Enterprise Edition,Java企业版)。
关于JavaSE,大家都已经比较熟悉,那么什么是JavaEE呢?
JavaEE是一个开发分布式企业及应用的规范和标准。
JavaEE包括的技术
JavaEE应用程序是由组建构成的。J2EE组件是具有独立功能的单元,他们通过相关的类和文件组装成JavaEE应用程序,并与其他组件交互。
以下是作为初学者需要掌握的:
Struts、Hibernate、Spring、JSP、Servlet、JSF、EJB、JavaBean、JDBC、JNDI、XML

无觅相关文章插件,快速提升流量