前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于模版的内容网站开发(更新版)

基于模版的内容网站开发(更新版)

作者头像
顾翔
发布2024-09-18 13:46:18
530
发布2024-09-18 13:46:18
举报
文章被收录于专栏:啄木鸟软件测试

前几天发布的《基于模版的内容网站开发》在RepeatFile.java存在一些问题,进行了修改。另外加了一个Paper类,用于与数据库数据进行交互。此外刚还加了个summary字符,用于存储文章的概要,现修改如下:

对于内容网站形成于上个世纪九十年代,Web1.0时代开发的网站大多数都是基于内容网站,比如新闻类。开发这类的网站可以采用ASP、JSP、PHP技术,但是基于这类开发出来的网站,内容都是在阅读的时候实时的从数据库中读取的,对于搜索引擎网站,比如百度、Google的排行榜上排名往往很低,只有做成静态的HTML,才可以被搜索引擎加大排名。本文以一个内容发布网站来介绍基于模版的内容网站开发。

1.建立数据库

代码语言:javascript
复制
create database sec;
use sec
create table paper(
   id INT NOT NULL AUTO_INCREMENT,
   title VARCHAR(200) NOT NULL,
   summary VARCHAR(2000) NOT NULL,
   content TEXT NOT NULL,
   PRIMARY KEY (id)
)AUTO_INCREMENT = 71;
  • title 文章标题
  • summary文章概要
  • content文章内容

由于系统改造,以前的文章不收入现有数据库,所以编号从71开始。

2.建立后台数据收集系统

用Tomcat + jsp开发

输入页面:index.html

代码语言:javascript
复制
<!DOCTYPE HTML>
<html>
  <head>
    <title>文件输入</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
  <form action="index.jsp" method="post" >
  <p>课程标题:<br><input type="text" name="title" size="100" maxlength="200"></p>
  <p>课程概要:<br><textarea id="summary" name="summary" rows="20" cols="100">
     课程适合人群:


     本课程重点解答&解决:


    本课程亮点+核心价值介绍:


    课长:

  </textarea></p>
  <p>课程内容:<br><textarea id="content" name="content" rows="30" cols="100">
  </textarea></p>
   <p><input type="submit" value="提交"></p>
  </form>
  <body>
 <body

将内容存储到数据库中

index.jsp

代码语言:javascript
复制
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page language="java" %>
<%@ page import="java.sql.*" %>
<%@ page import="com.jerry.MySQLAccess" %>
<%@ page import="com.jerry.Paper" %>

<% 
//设置字体
request.setCharacterEncoding("UTF-8");
//获取标题
String title = request.getParameter("title"); 
//获取概要
String summary = request.getParameter("summary"); 
//获取内容
String content = request.getParameter("content"); 
//建立Paper对象
Paper paper = new Paper();
paper.SetTitle(title);
paper.SetSummary(summary);
paper.SetContent(content);
//建立MySQLAccess对象
MySQLAccess mysql = new MySQLAccess();
try {
    //建立数据库连接
Connection conn = mysql.connect();
//插入数据库
mysql.insert(conn, paper);
//断开链接
    mysql.disconnect(conn);
} catch (SQLException e1) {
    e1.printStackTrace();
}
%>

<!DOCTYPE HTML>
<html>
  <head>
    <title>文件输入</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
  输入成功
   </body>
</html>

改用Paper类存储

3. Bean端开发

MySQLAccess对象通过Eclipse开发

pom.xml

代码语言:javascript
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.jerry</groupId>
  <artifactId>MySQL</artifactId>
  <version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>9.0.0</version>
</dependency>
</dependencies> 
</project>

版本用最新的9.0.0,由于下载速度很慢,可以通过浏览器从https://repo.maven.apache.org/maven2/下载,下载完毕放在.m2的相应目录下。

准备Paper.java用于与数据库交互

代码语言:javascript
复制
package com.jerry;
           
public class Paper {    
       int id;
       String title;
       String summary;
       String content;
       public int GetId(){
              return this.id;
       }
       public String GetTitle(){
              return this.title;
       }
       public String GetSummary(){
              return this.summary;
       }
       public String GetContent(){
              return this.content;
       }
       public void SetId(int id){
              this.id=id;
       }
       public void SetTitle(String title){
              this.title=title;
       }    
       public void SetSummary(String summary){
              this.summary=summary;
       }
       public void SetContent(String content){
              this.content=content;
       }
}

MySQLAccess .java

代码语言:javascript
复制
package com.jerry;
           
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
           
public class MySQLAccess {
       private static final String url = "jdbc:mysql://localhost:3306/sec";
       private static final String user = "root";
       private static final String password = "123456";    
       private static Statement stmt = null;
       private static ResultSet rs;
    
       //建立链接
       public Connection connect() throws SQLException  {
              try {
            //新版本改为"com.mysql.cj.jdbc.Driver"
                     Class.forName("com.mysql.cj.jdbc.Driver"); 
            Connection conn = DriverManager.getConnection(url, user, password);
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            return conn;
              } catch (ClassNotFoundException e) {
            System.out.println("JDBC 驱动未找到: " + e.getMessage());
        } catch (SQLException e) {
            System.out.println("数据库连接失败: " + e.getMessage());
        }
              return null;
       }
           
       //断开连接
       public void disconnect(Connection conn) {
              try {
                     if (rs != null) {
                            rs.close();
                     }
                     stmt.close();
               conn.close();
              }catch (Exception e) {
            e.printStackTrace();
        }
       }
       
       //插入数据
       public boolean insert(Connection conn,Paper paper) throws SQLException {
              String insertString = "INSERT INTO paper (title, summary, content) VALUES (?, ?, ?);";
        try { 
               PreparedStatement pstmt= conn.prepareStatement(insertString);
            // 设置参数    
            pstmt.setString(1, paper.GetTitle());
            pstmt.setString(2, paper.GetSummary());
            pstmt.setString(3, paper.GetContent());
            // 执行插入操作
            int affectedRows = pstmt.executeUpdate();
            if (affectedRows == 1) {
                   return true;
            }else {
                   return false; 
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
              return false;
       }
       
       //查询数据
       public Paper[] query(String Query) throws SQLException {
              ResultSet rs = stmt.executeQuery(Query);
              int number=0;
              while (rs.next()) {
                     number++;    
              }
              rs.beforeFirst();
              Paper[] paper = new Paper[number]; 
              int i=0;
              while (rs.next()) {
                     paper[i] = new Paper(); 
                     paper[i].SetId(rs.getInt("id"));
                     paper[i].SetTitle(rs.getString("title"));
                     paper[i].SetSummary(rs.getString("Summary"));
                     paper[i].SetContent(rs.getString("content"));
                     i++;
              }
              return paper;
       }
       
       //打印查询数据
       public void print(Paper[] paper) throws SQLException {
              int length = paper.length;
              for (int i=0;i
                     System.out.print("Id:"+paper[i].GetId());
                     System.out.print("Title:"+paper[i].GetTitle());
                     System.out.print("Summary:"+paper[i].GetSummary());    
            System.out.println("Content:"+paper[i].GetContent());
        }
       }
}

由于包名为"com.jerry",在Tomcat使用,将MySQLAccess.class放在%TOMECAT_HOME%\webapps\sec\WEB-INF\classes\com\jerry目录下。

4.开发模版替换程序

准备模版文件:

  • index_web.html:WEB首页,展示文件标题。
  • index_phone.html:手机首页,展示文件标题。
  • class_web.html:WEB首页,展示文件所有标题。
  • class_ phone.html:手机首页,展示文件所有标题。
  • content_ phone.html:WEB页,显示具体文件内容。
  • content_web.html:WEB页,显示具体文件内容。

把这些文件放在项目主目录.\source\下

RepeatFile.java

代码语言:javascript
复制
package com.jerry;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.FileWriter;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RepeatFile {
  private static FileInputStream fileInputStream = null;
  private static InputStreamReader inputStreamReader = null;
  
  //获取模版文件
  public BufferedReader getFile(String myFile) {
    try {
      File file = new File(myFile);
      fileInputStream = new FileInputStream(file);
      inputStreamReader = new InputStreamReader(fileInputStream);
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
      return bufferedReader;
    } catch (FileNotFoundException e) {
            System.out.println("文件未找到: " + e.getMessage());
    }
    return null;
  }
  
  //读取模版文件
  public void readFile(BufferedReader bufferedReader) throws IOException {
    String line;
    while ((line = bufferedReader.readLine()) != null) {
          System.out.println(line);
        }
  }
  //关闭模版文件
  public void closeFile(BufferedReader bufferedReader) throws IOException {
    bufferedReader.close();
        inputStreamReader.close();
        fileInputStream.close();
  }

  //替换HTML特殊字符,也为了防止XSS注入
  public String repleatHTML(String sourceString) {
    sourceString = sourceString.replaceAll("<", "&lt;");
    sourceString = sourceString.replaceAll(">", "&gt;");
    sourceString = sourceString.replaceAll(" ", "&nbsp;");
    sourceString = sourceString.replaceAll("\t", "&nbsp;&nbsp;&nbsp;&nbsp;");
    sourceString = sourceString.replaceAll("\n", "<br>");
    sourceString = sourceString.replaceAll("\"", "&quot;");
    sourceString = sourceString.replaceAll("’", "&apos;");
    return sourceString;
  }
  
  //替换概要信息
  public String repleatSummary(String sourceString) {
    sourceString = "<li>"+sourceString+"</li>";
    sourceString = sourceString.replaceAll("<br>", "</li><br><li>");
    sourceString = sourceString.replaceAll("<li>&nbsp;&nbsp;</li>","");
    sourceString = sourceString.replaceAll("</li><br><li>","</li><li>");
    sourceString = sourceString.replaceAll("</li><br>","</li>");
    sourceString = sourceString.replaceAll("<p></p>","");
    sourceString = sourceString.replaceAll("</b><br>","</b>");
    String[] regex = new String[4];
    regex[0] = "课程适合人群:";
    regex[1] = "本课程重点解答&解决:";
        regex[2] = "本课程亮点\\+核心价值介绍:";
        regex[3] = "课长:";
        for (int i=0;i<4;i++) {
          sourceString = convertLiToBold(regex[i],sourceString);
        }
    return sourceString;
  }
  
  public static String convertLiToBold(String replearChar,String input) {
        // 使用正则表达式匹配特定的 <li> 内容并替换
        Pattern pattern = Pattern.compile("<li>"+replearChar+".*?</li>", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(input);
        StringBuilder result = new StringBuilder();
        int lastEnd = 0;
        while (matcher.find()) {
            // 将匹配前的内容添加到结果中
            result.append(input, lastEnd, matcher.start());
            // 获取匹配的内容
            String matched = matcher.group();
            // 替换 <li> 和 </li> 标签
            String replaced = matched.replaceAll("<li>", "<b>")
                                      .replaceAll("</li>", "</b>")
                                      .replaceAll("\\s+", " ")
                                      .trim();
            // 将替换后的内容添加到结果中
            result.append(replaced);
            lastEnd = matcher.end();
        }
        // 添加最后一个匹配后的内容
        result.append(input, lastEnd, input.length());
        return result.toString();
    }

  //从数据库中获取数据
  public Paper[] getDataFromDB() throws IOException {
    Paper[] paper=null;
    try {
      MySQLAccess mysql = new MySQLAccess();
      //SQL查询语句    
      String Query = "select id,title,Summary,content from paper";
            //查询结果
      paper=mysql.query(Query);
    }catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    return paper;
  }
  
  //根据文件名把文件分为非内容文件(一般文件)和内容文件
  public String[][] putRecordInVar(String File,Paper[] paper) {
    int number = paper.length;
        //初始化将查询记录放入字符串数组
    String[][] var = new String[number][4];
    for (int i=0;i<number;i++) {
            //将查询记录放入字符串数组内
      String id = paper[i].GetId()+"";
      var[i][0] = (id);
      var[i][1] = repleatHTML(paper[i].GetTitle());
      var[i][2] = repleatHTML(paper[i].GetSummary());
      var[i][2] = repleatSummary(var[i][2]);
      var[i][3] = repleatHTML(paper[i].GetContent()); 
    }
    return var;
  }
  
  //根据文件名把文件分为非内容文件(一般文件)和内容文件
  public void classificationFile(String File,Paper[] paper,String[][] var) {  
    if ((File.equals("index_web.html"))||(File.equals("index_phone.html"))||(File.equals("class_web.html"))||(File.equals("class_phone.html"))) {
      getTargetFileForNormalFile(File,paper,var);
    }else if ((File.equals("content_web.html"))||(File.equals("content_phone.html"))) {
      getTargetFileForContentFile(File,paper,var);
    }
  }
  
  //获得普通文件的目标文件名
  public void getTargetFileForNormalFile(String File,Paper[] paper,String[][] var) {
    //替换后的目标文件
        String destFile="";
        //标题替换后的字符串
        String replaceTitle = "";
        int lenth = paper.length;
        for (int i=0;i<lenth;i++) {
          switch(File) {
            case("index_web.html"):{
              destFile = ".\\web\\index.html";
              replaceTitle += "<a href=\"class/c"+var[i][0]+".html\"target=\"_blank\">《"+var[i][1]+"》</a>";
              break;
            }
            case("index_phone.html"):{
              destFile = ".\\phone\\index.html";
              replaceTitle += "<a href=\"class/c"+var[i][0]+".html\">《"+var[i][1]+"》</a><br>";
              break;
            }
            case("class_web.html"):{
              destFile = ".\\web\\class.html";
              replaceTitle += "<li><a href=\"../class/c"+var[i][0]+".html\" target=\"_blank\">《"+var[i][1]+"》;</a></li>";
              break;
            }
            case("class_phone.html"):
            {
              destFile = ".\\phone\\class.html";
              replaceTitle += "<li><a href=\"class/c"+var[i][0]+".html\">《"+var[i][1]+"》</a></li>";
              break;
            }default:
              System.out.println("普通文件名不对");
          }
        }
        replaceFile(File,destFile,replaceTitle,"","");
  }
  
  public void getTargetFileForContentFile(String File,Paper[] paper,String[][] var) {
    //替换后的目标文件
        String destFile="";
        //标题替换后的字符串
        String replaceTitle = "";
        //概要替换后的字符串
        String replaceSummary = "";
        //内容替换后的字符串
        String replaceContent = "";
        int lenth = paper.length;
        for (int i=0;i<lenth;i++) {
          switch(File) {
        case("content_web.html"):{
          destFile = ".\\web\\c"+var[i][0]+".html";
          break;
        }
        case("content_phone.html"):{
          destFile = ".\\phone\\c"+var[i][0]+".html";
          break;
        }default:
          System.out.println("普通文件名不对");
      }
          replaceTitle = var[i][1];
      replaceSummary = var[i][2];
      replaceContent = var[i][3];
      replaceFile(File,destFile,replaceTitle,replaceSummary,replaceContent);
        }
  }
  
  public void replaceFile(String File,String destFile,String replaceTitle,String replaceSummary,String replaceContent) {
    File = ".\\source\\"+File;
    //获取模本文件的bufferedReader 
    BufferedReader bufferedReader= getFile(File);
    //替换结果文件放入result,进行叠加
    String result="";
    String line="";
    try {
      while ((line = bufferedReader.readLine()) != null) {
        if ((line.equals("课程适合人群:"))||line.equals("本课程重点解答&解决:")||line.equals("本课程亮点+核心价值介绍:")||line.equals("课长:")) {
          line ="<b>"+line+"</b>";
        }
         //将当前读取行的最后加上回车
         line = line+"\n";
         //标题的替换标识符
         String regex1 = "###1";
         //概要的替换标识符
         String regex2 = "###2";
         //内容的替换标识符
         String regex3 = "###3";
         //进行正则替换标题
         line = line.replaceAll(regex1, replaceTitle);
         //进行正则替换概要
         line = line.replaceAll(regex2, replaceSummary);
         //进行正则替换内容
         result = result+line.replaceAll(regex3, replaceContent);
      }
    } catch (IOException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    }      
    //将替换后的内容写入目标文件
    //打开目标文件
    try (FileWriter writer = new FileWriter(destFile)) {
           //写入目标文件
           writer.write(result);
           //关闭目标文件
           writer.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
    //关闭模本文件
    try {
      closeFile(bufferedReader);
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  
    //处理文件
  public void dealFile(String File) throws IOException {
    //从数据库中获取数据
    Paper[] paper = getDataFromDB();
    //把记录放入单个数组中
    String[][] var = putRecordInVar(File,paper);
    //根据文件名把文件分为非内容文件(一般文件)和内容文件
    classificationFile(File,paper,var);    
  }

  //主函数
  public static void main(String[] args) throws SQLException {
    try {
      //建立MySQLAccess对象变量
      MySQLAccess mysql = new MySQLAccess();
      //建立RepeatFile()对象变量
      RepeatFile rf = new RepeatFile();
      //建立数据库连接
      Connection conn = mysql.connect();
      //将要处理的模版文件名放在字符串数组内
      String[] Files= {"index_web.html","index_phone.html","class_web.html","class_phone.html","content_web.html","content_phone.html"};
      //遍历要处理的模版文件名的字符串数组
      for (int i = 0; i < Files.length; i++) {
        //处理文件
        rf.dealFile(Files[i]);
      }
      //断开链接
      mysql.disconnect(conn);
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    System.out.println("生成成功");
  }
}

现在数据库中有两条数据

模版文件

某个模版文件中的替换标识

代码语言:javascript
复制
…
<li><a href="../class/c63.html" target="_blank">《探索式软件测试》</a></li>
<li><a href="../class/c66.html" target="_blank">《JMeter从入门到精通》</a></li>
<li><a href="../class/c33.html" target="_blank">《APP软件专项测试》</a></li>
###1
…

形成的Web文件

形成的手机文件

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档