2010年12月26日 星期日

JSP 教學 - 讀取HTML並輸出至網頁及亂碼處理

問題描述:
在部落格的自動建站中,如果使用者需要申請並建立部落格,可以將已經寫好的HTML
進行讀取並替換標籤的元素或是樣式等,並寫成一個 JSP 檔案,供使用者在網頁上瀏覽

首先先必須準備好你的HTML樣板並建立一個專們處理上述問題的類別

在使用者建立之後在後台進行呼叫,以下為 HomePageReplace.java
//import the class that you need...
public class HomePageReplace
{
    private HttpSession sess;
    private HttpServletRequest request;

    public HomePageReplace(){}
    //傳入HttpServletRequest及HttpSession 以便取得相關參數或路徑....等
    public HomePageReplace(HttpSession sess, HttpServletRequest request){
        //this.realPath = realPath;
        this.sess = sess;
        this.request = request;
    }
    //......some method

建立物件之後 以下以我專案的例子為例(固路徑或是檔名可能不同)

首先把在根目錄下的 template 資料夾下的 template1.html 進行讀取並寫出的動作

可以透過 request.getRealPath("template/template1.html");
取得該檔案的實際路徑


並在 HomePageReplace 類別中新增讀取該檔案的方法 getContent()
private String getContent() throws IOException
    {
        //檔案處理盡量使用 byte 形式處理
        FileInputStream fis = new FileInputStream(request.getRealPath("template/template1.html"));
        byte[] TmpByte = new byte[fis.available()];
        String content = "";
        int s = 0;
        while((s = fis.read(TmpByte)) != -1){
            //以下轉碼記得使用 UTF-8 
            content = content + new String(TmpByte, "UTF-8"); //Use new String(byte[], encode)
        }
        fis.close();
        return content;
    }

而我的 template1.html 的邊碼處理大致如下

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="fsc.wby.molde.dbOperator" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>        

<html>
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link rel="stylesheet" type="text/css" href="style/template.css" />
        <title>###TITLE###</title>
</head>
.......


以上的  title 標籤中的 ###TITLE###
主要是要進行使用者部分的替換,譬如部落格建立時 使用者自行輸入網站的名稱
之後在後台進行處理時針對 ###TITLE### 在替換成使用者所輸入的 title
進行這部份處理以及JSP輸出的方法為  replaceContent


public boolean replaceContent() throws IOException
    {
        FileOutputStream fos = null;
        String content = getContent();
        String tmpPath = request.getRealPath("/");   //取得 本專案的路徑
        String userPath = tmpPath + "/" + (String)sess.getAttribute("domain");   //將本專案路徑加上 使用者輸入的 domain name 當作使用者的根目錄
        content = content.replaceAll("###TITLE###", (String)sess.getAttribute("title"));
        content = content.replaceAll("###MANAGER###", (String)sess.getAttribute("name"));
        content = content.replaceAll("###INTRODUCE###", (String)request.getParameter("aboutSite"));
        content = content.replaceAll("###SITENAME###", (String)sess.getAttribute("sitename"));
        content = content.replaceAll("###logo###", "images/logo1.jpg");
        content = content.replaceAll("###user_photo###", "images/home1.jpg");
        content = content.replaceAll("<!--###content###-->", getScriptlet("/template/scriptlet.txt"));  //取代網頁中的 scriptlet 程式
        File tmpFile = new File(userPath);  //建立使用者 的根目錄
        if(!tmpFile.exists()){
            tmpFile.mkdir();
        }
        fos = new FileOutputStream(userPath + "/index.jsp");  //首頁為 index.jsp
        
        byte[] writeByte = content.getBytes("UTF-8");  
        fos.write(writeByte);   //輸出
        fos.close();
        return true;
    }
在邊碼處理上面記得在 head 標籤內加上meta


<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


如果忘記這行的話,那嚜在以上程式的輸出中,就不能將 content 的指定邊碼指定為UTF-8


以上即可達到以某一個HTML檔案,進行複製、取代、並輸出成 JSP 或 HTML 了

沒有留言:

張貼留言