公司要做一个内部的新闻发布系统。要求用流的形式生成静态页,例如:out.println("html");以这种形式将发布的新闻内容输出成静态页。但是不同新闻类型的格式不一样,如:今日资讯的格式是:<div>
<div class="AnewsIpic marr5">
新闻图片1
</div>
<div class="AnewsIpic">
栏目内容1
</div>
<div class="clear_float">
</div>
</div>
<div class="AnewsIli">
<div>
栏目标题1
</div>
</div>
而新开楼盘的格式为:
<div>
<div class="newsIpic">
新闻图片1
</div>
<div class="newsIinfo">
栏目内容1
</div> <div class="clear_float">
</div>
</div>
<div class="newsIli">
<div class="line">
栏目标题1
</div>
<div>
栏目标题1
</div> <div class="clear_float">
</div>
</div>
现在的问题是:比如我发了一个今日资讯的新闻。后台该如何去调用今日资讯的格式生成静态页。如果我发的是新开楼盘的新闻。去调用新开楼盘的格式去生成静态页。
<div class="AnewsIpic marr5">
新闻图片1
</div>
<div class="AnewsIpic">
栏目内容1
</div>
<div class="clear_float">
</div>
</div>
<div class="AnewsIli">
<div>
栏目标题1
</div>
</div>
而新开楼盘的格式为:
<div>
<div class="newsIpic">
新闻图片1
</div>
<div class="newsIinfo">
栏目内容1
</div> <div class="clear_float">
</div>
</div>
<div class="newsIli">
<div class="line">
栏目标题1
</div>
<div>
栏目标题1
</div> <div class="clear_float">
</div>
</div>
现在的问题是:比如我发了一个今日资讯的新闻。后台该如何去调用今日资讯的格式生成静态页。如果我发的是新开楼盘的新闻。去调用新开楼盘的格式去生成静态页。
_________________________________out.println(...)这种样子的还是动态页面啊,所谓的静态页面就是纯HTML页面。
一般采用程序通过模板写入HTML文件中,需要生成一个HTML文件,用户只访问这个HTML。
不管你用什么生成静态,原理都是
模板-->内容填充-->生成静态
流程就是这样.
写好模板,然后用流自己往里面填内容不就好了.
<title>##title##</title>
<body>##body##</body>
把内容换成你要替换的内容不就行了.
从数据库取回内容,然后生成HTML页面,也就是静态页面,
如果你的分类名称更改了,那么生成的静态页面上的分类名称什么的肯定不会自动更改,除非你再重新生成一次.
删除道理也一样,删除分类的时候,查询出这个分类下有多少文章或者页面,然后自动删除这些页面.
这点,你可以看下当前流行的一些PHP和ASP的CMS系统,大部分都有生成静态功能,
他们的处理方式一般都是生成静态后,如果更改某些内容,则重新生成才可以.
至于你说那个表里的字段不是固定的,这个没怎么明白什么意思.
感觉理解方向好像有问题.或者我没听懂你认为的问题在哪里.:)
1、在新闻发布页面(jsp页面),发布一条新闻。然后插入至数据库中。
2、根据新闻发布页面的新闻类型,调用不同的新闻类型格式(具体的新闻类型格式可以看1楼。各个新闻类型的格式是不同的)生成静态页(html页)。
3、在首页,用shtml的包含命令将生成的新闻类型静态页包含至相应位置
现在的问题是出在第2步。如何根据新闻类型,去调用不同的新闻类型格式并生成静态页。比如说我判断如果发布的新闻是今日资讯的。我如何去调今日资讯的格式去生成静态页(不用模板。而是用out.println方法,将文字部分替换完后直接输出HTML页面)。我后台已经根据新闻类型实现成了不同的方法,问题是如果根据发布页的新闻类型去调用相应的方法。前提是新闻发布页的新闻类型是不固定的(因为它取自数据库嘛).
这样的话,你应该有个字段是区分新闻的吧?
这样的话,你在生成的时候取判断这个字段是属于哪个类型,然后生成2:不同类型的新闻放到不同表中
取哪个表的数据生成哪个类型的新闻只要数据库里面有字段能区分出来你这个新闻是属于哪个类型的,你就能按照类型的不同选择不同的模板去生成.PS:你所说的"不用模板。而是用out.println方法,将文字部分替换完后直接输出HTML页面"
就算out.println,你也要有个页面模板吧?没有模板你替换那个页面?不知道这样对不对,我感觉楼主想复杂了.
String content = "content" //假定这个content是从数据库中取出的数据
out.println("<html>");
out.println("<body>");
out.println(content);
out.println("</body>");
out.println("</html>")
这样的话,不就生成了html页面了?
干嘛非得用模板?还有,我是用你说的第一个模式做的。所有的类型都放在一个表中。那么,当我的新闻类型表内的内容更改的话,比如:把ID为1的今日资讯改为ID为1的新开楼盘。那如果按你说的生成静态页的话,就会出现问题了。不知我说的对不对?
如果直接采用out.println的方式,得输出一大堆的东西,而且很容易出错。而使用模板可以将需要替换的地方做上模板的标记,再在程序中往里面压入变量、集合啊什么的,一切
都交给模板引擎去处理,而且可以根据传进去的参数来判断哪些地方要输出,哪些地方不要输出。采用out.println的方式有一点是不好的,像新闻类的页面,样式可能会变化的,如果样式一变化,这个
out.println等于重写。
实际上静态页面就是把东态页面里所有可能的展现及数据组合存储在磁盘上,比如你就1个jsp,里面有个行的表格,数据库中有1000条记录,那么静态页面就是100张,每张存储十条数据,用户访问的时候就避免调用controller层,只是在本地磁盘的普通文件传输,把web应用程序变成一次性的页面生成工具,服务器效率大大增加,当然静态化有两个问题:1、需要更多大量空间存储所有组合的页面;2、在内容变化的时候需要从新增量静态化,此时服务器要关闭,用户不能访问。
你会发现后期如果网页改动,会巨巨巨麻烦的.
你为什么不把
out.println(" <html> ");
out.println(" <body> ");
out.println(content);
out.println(" </body> ");
out.println(" </html> ")
打印的这些东西写到一个文件里面,然后读入这个文件再替换,我认为这样要比你那样写好的多吧?
<html><body>content</body></html>
然后读入这些内容再替换content?那个在你后期维护的时候会好些?而不用直接去修改你的源码?
而且这样对于解决你说的问题应该比较好理解一些,做两个页面,
a.模板,b.模板,如果是类型1,读入a.模板进行替换,否则,读入b.模板进行替换.------------
当我的新闻类型表内的内容更改的话,比如:把ID为1的今日资讯改为ID为1的新开楼盘。那如果按你说的生成静态页的话
------------
文件内容修改的话,对于静态页面来说,要重新生成的.
也就是说,你对静态页面内动态的内容进行更改以后,每次更改都要重新生成一次的,自动或者手动.网上的一个简单的例子:
1.buildhtml.jsp
<%@ page contentType="text/html; charset=gb2312" import="java.util.*,java.io.*"%>
<%
try{
String title="jsp生成静态html文件";
String content="小样,还搞不定你?";
String editer="hpsoft";
String filePath = "";
filePath = request.getRealPath("/")+"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(templateContent);
templateContent=templateContent.replaceAll("###title###",title);
templateContent=templateContent.replaceAll("###content###",content);
templateContent=templateContent.replaceAll("###author###",editer);//替换掉模块中相应的地方
out.print(templateContent);
// 根据时间得文件名
Calendar calendar = Calendar.getInstance();
String fileame = String.valueOf(calendar.getTimeInMillis()) +".html";
fileame = request.getRealPath("/")+fileame;//生成的html文件保存路径
FileOutputStream fileoutputstream = new FileOutputStream(fileame);//建立文件输出流
byte tag_bytes[] = templateContent.getBytes();
fileoutputstream.write(tag_bytes);
fileoutputstream.close();
}
catch(Exception e){
out.print(e.toString());
}%>模板文件2. template.htm
<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>
<table width="500" border="0" align="center" cellpadding="0" cellspacing="2">
<tr>
<td align="center">###title###</td>
</tr>
<tr>
<td align="center">作者:###author### </td>
</tr>
<tr>
<td>###content###
</td>
</tr>
</table>
</body>
</html>