`

例子:自动生成可以保存数据的HTML页面

阅读更多

其实这是一个很简单的技术,在新闻网站中应用的很普遍。原理是将数据保存为硬盘文件,直接通过URL访问,用来减轻数据库访问的压力。


数据库与表:

mysql> use mysecondnews;
Database changed
mysql> desc news;
+---------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+----------------+
| id | int(10) | | PRI | NULL | auto_increment |
| title | varchar(240) | | | | |
| path | varchar(240) | | | | |
| content | text | | | | |
| addtime | timestamp(14) | YES | | NULL | |
+---------+---------------+------+-----+---------+----------------+

Database.java://定义数据库

package org.eleaf.firstnews.database;

import java.sql.ResultSet;
public interface Database {
String DATABASE = "mysecondnews";
String USERNAME = "bitan";
String PASSWORD = "bitan";
String URL_PREFIX = "jdbc:mysql://localhost/" + DATABASE;
String DRIVER = "org.gjt.mm.mysql.Driver";

int doUpdate(String sql);
ResultSet doSelect(String sql);
}

TouchDatabase.java://自定义JDBC接口类。为简单起见,未处理close()方法。
package org.eleaf.firstnews.database;

import java.sql.*;
public class TouchDatabase implements Database {
private Connection conn;
private Statement stmt;
private PreparedStatement prepstmt;

private void init() throws SQLException, ClassNotFoundException {
stmt = null;
prepstmt = null;

Class.forName(DRIVER);
conn = DriverManager.getConnection(URL_PREFIX, USERNAME,
PASSWORD);
}

/**
* Constructor for Statement.
*
*/
public TouchDatabase() {
try {
this.init();
stmt = conn.createStatement();
} catch (SQLException sqle) {
sqle.printStackTrace();
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
}

/**
* Constructor for PreparedStatement.
* @param sql Pre-compile SQL string.
*/
public TouchDatabase(String sql) {
try {
this.init();
prepstmt = conn.prepareStatement(sql);
} catch (SQLException sqle) {
sqle.printStackTrace();
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
}


public int doUpdate(String sql) {
// TODO 自动生成方法存根
try {
return stmt.executeUpdate(sql);
} catch (SQLException sqle) {
sqle.printStackTrace();
return 0;
}
}


public ResultSet doSelect(String sql) {
// TODO 自动生成方法存根
try {
return stmt.executeQuery(sql);
} catch (SQLException sqle) {
sqle.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

public void setField(int index, String field) {
try {
prepstmt.setString(index, field);
} catch (SQLException sqle) {
sqle.printStackTrace();
}
}

public ResultSet doPrepareSelect() {
try {
return prepstmt.executeQuery();
} catch (SQLException sqle) {
sqle.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

News.java://新闻文章的数据结构
package testnews;
public class News {
private String id;
private String title;
private String path;
private String content;
private String addtime;
/**
* @return 返回 addtime。
*/
public String getAddtime() {
return addtime;
}
/**
* @param addtime 要设置的 addtime。
*/
public void setAddtime(String addtime) {
this.addtime = addtime;
}
/**
* @return 返回 content。
*/
public String getContent() {
return content;
}
/**
* @param content 要设置的 content。
*/
public void setContent(String content) {
this.content = content;
}
/**
* @return 返回 id。
*/
public String getId() {
return id;
}
/**
* @param id 要设置的 id。
*/
public void setId(String id) {
this.id = id;
}
/**
* @return 返回 path。
*/
public String getPath() {
return path;
}
/**
* @param path 要设置的 path。
*/
public void setPath(String path) {
this.path = path;
}
/**
* @return 返回 title。
*/
public String getTitle() {
return title;
}
/**
* @param title 要设置的 title。
*/
public void setTitle(String title) {
this.title = title;
}
}

DoneNews.java://通过JDBC接口类操作数据库
package testnews;

import java.util.*;
import java.sql.*;
import org.eleaf.firstnews.database.*;
public class DoneNews {
public Vector getAllNews() {
Vector vNews = new Vector();
String sql = "SELECT * FROM news";
TouchDatabase tdata = new TouchDatabase();
ResultSet rs = tdata.doSelect(sql);
try {
while (rs.next()) {
News news = new News();
news.setId(rs.getString("id"));
news.setTitle(rs.getString("title"));
news.setPath(rs.getString("path"));
news.setContent(rs.getString("content"));
news.setAddtime(rs.getString("addtime"));
vNews.addElement(news);
}
} catch (SQLException sqle) {
sqle.printStackTrace();
}
return vNews;
}
public boolean addNews(News news) {
boolean success = false;
if (news != null) {
String sql = "INSERT news (title,path,content) VALUES('" +
news.getTitle() + "','" + news.getPath() + "','" +
news.getContent() + "')";
TouchDatabase tdata = new TouchDatabase();
success = (0 != tdata.doUpdate(sql));
}
return success;
}
}

WriteNews.java://写数据流到硬盘。并调用DoneNews.addNews()方法。
package testnews;

import java.io.*;
import java.util.*;
public class WriteNews {
private final String MIDDLE_DIR = "";//可自定义衔接目录。
private final String FILE_SUFFIX = ".html";//可自定义文件后缀名。
public boolean write(News news, String realPathPrefix, Calendar calendar) {
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
String fileName = calendar.getTimeInMillis() + FILE_SUFFIX;
String realPath = realPathPrefix + MIDDLE_DIR + year + "\\" + month +
"\\" + dayOfMonth + "\\";
try {
if (!mkDirs(realPath)) {
//throw new IOException("make dir('" + realPath + "') unsuccessfully!");
}

FileOutputStream fos = new FileOutputStream(new File(realPath + fileName));
byte[] conBytes = news.getContent().getBytes();
fos.write(conBytes);
fos.close();
} catch (IOException ioe) {
ioe.printStackTrace();
return false;
}

String newsPath = year + "/" + month + "/" + dayOfMonth + "/" + fileName;
news.setPath(newsPath);
return new DoneNews().addNews(news);
}
private boolean mkDirs(String realPath) {
boolean success = false;
File path = new File(realPath);
if(!path.exists()) {
success = path.mkdirs();
}
return success;
}
}

form.jsp://输入表单

<%@ page language="java" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<FORM METHOD=POST ACTION="save.jsp">
<INPUT TYPE="text" NAME="title"><BR>
<TEXTAREA NAME="content" ROWS="10" COLS="50"></TEXTAREA><BR>
<INPUT TYPE="submit">
</FORM>
</body>
</html>

save.jsp://保存数据.为简单起见,这里未对输入数据做任何字符过滤或转化工作。

<%@ page language="java" %>
<%@ page import="java.util.*,testnews.*" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<%
String title = request.getParameter("title");
String content = request.getParameter("content");
if (title == null | content == null) {
response.sendRedirect("form.jsp");
return;
}
News news = new News();
news.setTitle(title);
news.setContent(content);
String realPathPrefix = application.getRealPath("/");
Calendar calendar = Calendar.getInstance();
boolean success = new WriteNews().write(news, realPathPrefix, calendar);
String message = "";
if (success) {
message = "Add the news successfully. Please return.";
} else {
message = "Add the news unsuccessfully. Please return.";
}
%>
<%=message%><br>
<a href="form.jsp">return to form.jsp</a><br>
<a href="show.jsp">go to show.jsp</a><br>
</body>
</html>

show.jsp://显示链接

<%@ page language="java" %>
<%@ page import="java.util.*,testnews.*" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<%
Vector vNews = new DoneNews().getAllNews();
if (vNews != null) {
for (int i=0; i<vNews.size(); i++) {
News news = (News) vNews.elementAt(i);
%>
` <a href="<%=request.getContextPath()%>/<%=news.getPath()%>"><%=news.getTitle()%></a><br>
<%
}
}
%>
</body>
</html>

然后就可以以类似如下的网址访问文章了:
http://localhost:2000/secondnews/2004/10/31/1099234459546.html

分享到:
评论

相关推荐

    单个生成静态页面例子

    总的来说,单个生成静态页面的例子涉及了前端开发、后端开发、数据库操作、服务器配置和自动化流程等多个IT领域的知识。通过学习和实践这一过程,开发者不仅可以提升网站性能,还能深入理解Web开发的全貌。

    php自动创建html

    "PHP自动创建HTML"这个主题涉及到如何利用PHP动态生成HTML页面,这在很多应用场景中非常常见,例如构建动态网站、自动生成报表或邮件模板等。下面我们将详细探讨这个知识点。 1. **PHP基础** PHP(Hypertext ...

    asp.net生成静态页面源码例子打包下载

    在这个"asp.net生成静态页面源码例子打包下载"中,我们可以探讨一些核心的ASP.NET技术以及静态页面生成的相关知识点。 1. **ASP.NET Web Forms**: ASP.NET Web Forms是ASP.NET框架的一部分,它提供了一种基于控件...

    freemarker生成静态HTML例子

    本示例将详细介绍如何使用Freemarker生成静态HTML页面。 1. **Freemarker基本概念** - **模板**: Freemarker的核心是模板,它定义了输出文件的结构和样式,其中包含了一系列指令和变量。 - **数据模型**: 数据...

    生成静态页面实例

    本实例聚焦于如何通过编程方式自动生成静态HTML页面,帮助开发者理解这一过程。 静态页面与动态页面的区别在于,静态页面的内容在用户请求之前就已经存在于服务器上,而动态页面则是在接收到请求后实时生成。生成...

    java页面自动跳转

    页面自动跳转可以通过多种方式来实现,包括但不限于使用JavaScript定时器、HTML的`&lt;meta&gt;`标签以及服务器端响应头设置。接下来,我们将详细介绍这几种方法及其具体实现细节。 ### 使用JavaScript实现自动跳转 这种...

    生成静态页例子

    3. **文件保存**:最后,将生成的HTML内容保存到磁盘上,以`.html`或类似扩展名命名,这样就创建了一个静态页面。这通常在用户访问页面后立即进行,或者通过计划任务定期自动完成。 这种静态页生成方法有助于提高...

    C#生成静态html

    例如,你可以这样构建一个简单的HTML页面: ```csharp string htmlContent = $@" &lt;!DOCTYPE html&gt; &lt;html lang='zh-CN'&gt; 我的静态页面 欢迎来到我的网站 这是使用C#生成的静态HTML页面。 &lt;/html&gt;"; ``` ...

    基于jsp的验证码自动生成

    在JSP页面中,我们可以通过JavaScript或者AJAX获取服务器生成的验证码,并将其显示在页面上的适当位置。同时,我们还需要在服务器端存储这个验证码,以便用户提交表单时进行验证。这通常通过将验证码作为...

    ASP.NET页面静态化例子,纯静态

    ASP.NET页面静态化是一种优化网站性能的技术,它将动态生成的网页转换为静态HTML文件,以便用户可以直接从服务器上下载,而无需通过复杂的服务器端处理。这样可以减少服务器的负担,提高网页加载速度,尤其对搜索...

    PDF生成例子,AIR

    在本例中,"PDF生成例子,AIR" 提供了一个使用Adobe AIR技术自动生成PDF文件的示例。 Adobe AIR(Adobe Integrated Runtime)是一个跨平台的应用程序运行时环境,它允许开发者使用HTML、CSS、JavaScript以及...

    c# .net 生成静态页

    通过Override这个方法,我们可以控制HTML的生成,将其保存为静态HTML文件。 4. **动态转静态**:这个过程中,我们可能需要在用户请求动态内容时,实时生成对应的静态页。或者,也可以定期运行一个后台任务,批量...

    asp.net生成静态新闻系统

    在这个特定的场景中,"asp.net生成静态新闻系统"指的是利用ASP.NET技术来创建一个能自动生成静态HTML页面的新闻发布系统。这种系统在发布新闻时,会将动态内容转化为静态网页,从而提高网站的访问速度和SEO优化。 ...

    提交信息生成个人简历

    在这个例子中,控制器可能包含一个处理简历提交的Action方法,该方法将接收到的模型数据保存或验证,然后可能重定向用户到显示简历的页面。 5. **HTML**:HTML(HyperText Markup Language)用于创建网页内容的结构...

    jQuery+HTML5实现的随机密码生成器特效源码.zip

    4. **AJAX请求**:虽然不常见,但若项目涉及服务器通信,jQuery的`$.ajax()`或`$.get()`, `$.post()`可能用于发送数据到服务器验证或保存生成的密码。 在生成随机密码的逻辑上,源代码可能包含了以下算法: 1. **...

    C# Web版本的自动生成PDF文档

    在这个场景中,我们将探讨如何在asp.net Web应用中自动生成PDF文档。 首先,我们需要了解PDF(Portable Document Format)是一种由Adobe Systems公司开发的文件格式,用于无损地传输和展示文档,包括文本格式和图像...

    java-根据word模板生成word-freemarker-完整示例

    它的主要优点在于分离了业务逻辑和视图设计,使得开发者可以专注于数据处理,而设计师可以专注在页面布局上。 2. **模板语言**: Freemarker使用一种简单的模板语言,该语言由控制结构(如`&lt;#if&gt;`、`&lt;#foreach&gt;`)...

    生成html文件源码模板和UrlAsp.net编写

    视图是用于呈现数据的模板,它可以是HTML代码,其中嵌入了C#或VB.NET代码块,这些代码块可以在运行时动态生成内容。例如,你可以使用Razor语法创建一个视图: ```html @{ Layout = null; } &lt;!DOCTYPE html&gt; &lt;html&gt;...

    将动态页面静态化的一个程序

    对于需要频繁更新的内容,可能需要定期重新生成静态页面,或者在数据变化时自动触发静态化过程。这可以通过定时任务或监听数据库更改来实现。 8. **安全考虑**: 虽然静态化可以提高性能,但也需注意静态页面不能...

Global site tag (gtag.js) - Google Analytics