分享
 
 
 

JSP生成静态页实践及其设计思想[1]

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

引子:

我们以两个大型网站为例作比较:

51job和智联招聘(先声明我不是为他们作广告,仅以他们为例作技术上的比较)

51job采用的是比较“先进”的php技术,而智联用的是比较落后的asp.但我们可能会明显的感觉到51job的反应速度相比智联招聘实在是太慢了,为什么会这样?细心的人可能会察觉到了。智联虽然用的是asp,但他采用了另一种更巧妙的技术--asp生成静态页技术。所有的动态页基本上都转换成了html静态页,不用访问数据库,当然反应快了。

下面我们讨论一下jsp怎么转换成html??

首先要做一个模板。后缀不限,但一般都用*.template例子

<html>

<head>

<title>#title#</title>

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

<LINK href="../css.css" rel=stylesheet type=text/css>

</head>

<body>

<P align="center">

#title#<BR><BR><BR>

作者:#author#<BR><BR>

<BR>

#content#<BR><BR><BR><BR>

</P>

</body>

</html>

做一个处理模板的类或者jsp文件、(为说明问题我们从简单入手以一个jsp文件为例)

filePath = request.getRealPath("/")+"WEB-INF/templates/template.htm";

out.print(filePath);

String templateContent="";

FileInputStream fileinputstream = new FileInputStream(filePath);//读取模块文件

int lenght = fileinputstream.available();

byte bytes[] = new byte[lenght];

fileinputstream.read(bytes);

fileinputstream.close();

templateContent = new String(bytes);

out.print("以下是模板内容:<br>"+templateContent+"<br> 以下是置换以后的html内容<br><hr>");

templateContent=templateContent.replaceAll("#title#",title);

templateContent=templateContent.replaceAll("#author#",editer);//替换掉模块中相应的地方

templateContent=templateContent.replaceAll("#content#",content);

// 根据时间得文件名

Calendar calendar = Calendar.getInstance();

String fileame = String.valueOf(calendar.getTimeInMillis()) +".html";

fileame = request.getRealPath("/")+fileame;//生成的html文件保存路径

out.print(templateContent);

FileOutputStream fileoutputstream = new FileOutputStream(fileame);//建立文件输出流

byte tag_bytes[] = templateContent.getBytes();

fileoutputstream.write(tag_bytes);

fileoutputstream.close();

嗯,核心技术就是这样了,如果大家要求的性能更高,可以改用freemarker做模板。

经过一翻调试,成功了。。呵

附上源码。。

JDK 1.5 +ECLIPSE +TOMCAT 5.0.28 + MYSQL 5.0

数据库TEST,表名news

字段:id int 自动增长, Title varchar(20) , Content varchar(200) , Author varchar(10)

makeFile.jsp

<%

Connection conn = DBconn.getConnection();

Statement stmt = conn.createStatement();

ResultSet Rs = stmt.executeQuery("select * from news");

System.out.println("success");

%>

<%

String filePath = request.getRealPath("/")+"template.htm";

System.out.println(filePath);

String templateContent;

FileInputStream fileinputstream = new FileInputStream(filePath);

int lenght = fileinputstream.available(); //available() 返回可以不受阻塞地从此文件输入流中读取的字节数。

byte bytes[] = new byte[lenght];

fileinputstream.read(bytes); //read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个字节数组中。

fileinputstream.close();

//templateContent = new String(bytes);

String title;

String content;

String author;

while(Rs.next())

{

templateContent = new String(bytes);//如果不用这句,则替换一次之后,templateContent中就没有#**#标志了。所以要重新生成

title = Rs.getString("Title");

content = Rs.getString("Content");

author = Rs.getString("Author");

out.println(title+"********"+content+"****"+author);

out.print("以下是模板内容:<br>"+templateContent+"<br> 以下是置换以后的html内容<br><hr>");

templateContent=templateContent.replaceAll("#title#",title);

templateContent=templateContent.replaceAll("#author#",author);//替换掉模块中相应的地方

templateContent=templateContent.replaceAll("#content#",content);

// 根据时间得文件名

Calendar calendar = Calendar.getInstance();

String fileame = String.valueOf(calendar.getTimeInMillis()) +".html";

fileame = request.getRealPath("/")+"Html/"+fileame;//生成的html文件保存路径

out.print(templateContent);

FileOutputStream fileoutputstream = new FileOutputStream(fileame);//建立文件输出流

byte tag_bytes[] = templateContent.getBytes();

fileoutputstream.write(tag_bytes);

fileoutputstream.close();

}

if(conn!=null)

{

conn.close();

}

if(stmt!=null)

{

stmt.close();

}

%>

//数据库连接文件

import java.sql.*;

public class DBconn {

public DBconn() {

// TODO Auto-generated constructor stub

}

public static Connection getConnection()

{

Connection conn = null;

try {

Class.forName("org.gjt.mm.mysql.Driver");

conn = DriverManager.getConnection("jdbc:mysql://" + "localhost" + "/" + "test" +

"?useUnicode=true&characterEncoding=GB2312","root","111111");

}

catch(Exception e)

{

e.printStackTrace();

}

return conn;

}

/*public static void main(String[] args) throws Exception

{

Connection con=getConnection();

System.out.println(con.isClosed());

}

*/

}

//模板文件

template.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

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

<title>#title#</title>

</head>

<body>

<table width="380" height="107" border="0" cellpadding="0" cellspacing="1" bgcolor="#FFCC99">

<tr>

<td height="16" bgcolor="#FFCC99"><div align="center">#title#</div></td>

</tr>

<tr>

<td bgcolor="#FFFFFF">#content#</td>

</tr>

<tr>

<td height="13" align="right" bgcolor="#FFFFFF">#author#</td>

</tr>

</table>

</body>

</html>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有