很多网站,像 阿里巴巴(http://china.alibaba.com/) 等等,网站里的所有数据页都是静态html 的页,最起码链接(.html)是这样的,是不是做的假象就不清楚了, 那如果都真的是静态页的话,那都是怎么生成的呢,大家谈谈,也可以指教指教~~
解决方案 »
- jsp 不能获取文本框中的中文字符
- org.apache.jasper.JasperException: An exception occurred processing JSP page 。。。
- jsp连接mysql Connection refused: connect有源代码,跪求高手帮忙
- 又是字符集的问题,GBK->UTF-8页面提交
- 关于读取文件行数的问题请各位指教一下!!
- 高分求用XML管理系统权限的例子。
- 那位大虾,可以告诉我在windows平台下建立JSP运行环境所需要的文件下栽地址?
- ■■网页中读取外部word文件作为页面显示内容应当怎么做呢?高分请教!■■
- jsp怎样才能使从数据库读出来的表格信息以表格形式全部输出到浏览器上呢?
- jsp中文显示的问题!!各位老大进来帮忙看一下!!!
- 求教一个java dom解析XML的问题
- 怎么让数据在编辑区不可见
可能是伪静态的哦。
不过如果要生成静态的应该也没问题啊,不过我还没想到一个更好的办法。
没什么复杂
或者
url重写
象搜索什么的,都有自己独立的服务器.
与上面有冲突有,比如,BBS,blog的,这就是靠服务器数量、程序取胜了.然后是有很多编辑在盯首着。
通过上面,应该明白小型网站与大型门户网站相比,不同的不止是的程序。而是很多很多因素。
生成静态页面,这样的技术都一样的。
前段时间做自己社区的论坛,在jive 的基础上做一个页面显示所有论坛的帖子,可以称
之为总版,模仿forum 类的接口做个superforum 并且实现cachable,不过因为这个页面
刷新量比较大,虽然被cache 了,我还是想办法进行页面的缓存,感觉用jsp 产生的html
静态内容当缓存,页面访问速度应该有所提高。
首先想到的一种办法,是采用java.net 的urlconnection 把服务器上的jsp 抓过来做缓
存,不过我觉得这样做太见外了,自己服务器上的东西,为何要用http 去访问.于是想另外一
个办法,把jsp 的out 对象的输出控制到自己希望的地方.比如输出到静态文件,又或者保存
成全局的字符串变量.这样的话,浏览就不需要执行jsp,只是浏览该html 了.仅仅在数据有更
新的时候进行一次update 操作,把jsp 重新输出为html.
我觉得,浏览事件比数据插入或更新发生的次数多的时候.不妨试试这个办法来提高页
面访问速度.
整件事情有点像把jsp 当作模板,生成静态的html 页面.
将如下代码写入web-xml
<filter>
<filter-name>filecapturefilter</filter-name>
<filter-class>com.junjing.filter.filecapturefilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filecapturefilter</filter-name>
<url-pattern>/latest.jsp</url-pattern>
</filter-mapping>
latest.jsp 是我要cache 的页面
java 源码代码如下
/** * start file filecapturefilter.java */
package com.junjing.filter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class filecapturefilter implements filter
{
private string protdirpath;
public void init(filterconfig filterconfig)
throws servletexception
{
protdirpath = filterconfig.getservletcontext().getrealpath("/");
}
public void dofilter(servletrequest request,servletresponse response,filterchain
chain)
throws ioexception, servletexception
{
string filename = protdirpath + "forum/lastest.html";
printwriter out = response.getwriter();
filecaptureresponsewrapper responsewrapper = new
filecaptureresponsewrapper((httpservletresponse)response);
chain.dofilter(request, responsewrapper);
// fill responsewrapper up
string html = responsewrapper.tostring();
//得到的html 页面结果字符串
// responsewrapper.writefile(filename);
// dump the contents 写成html 文件,也可以保存在内存
//responsewrapper.writeresponse( out );
// back to browser
//responsewrapper.sendredirect("lastestthread.jsp");
}
public void destroy() {}
}
/** * end file filecapturefilter.java */
/** * start file filecaptureresponsewrapper.java */
package com.junjing.filter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class filecaptureresponsewrapper
extends httpservletresponsewrapper
{
private chararraywriter output;
public string tostring()
{
return output.tostring();
}
public filecaptureresponsewrapper(httpservletresponse response)
{
super(response);
output = new chararraywriter();
}
public printwriter getwriter()
{
return new printwriter(output);
}
public void writefile(string filename)
throws ioexception
{
filewriter fw = new filewriter(filename);
fw.write( output.tochararray() );
fw.close();
}
public void writeresponse(printwriter out)
{
out.print( output.tochararray() );
}
}
/** * end file filecaptureresponsewrapper.java */
附件源代码
不过采用resin 服务器的话,以上代码会失效。因为resin 没有实现getwriter 方法,而
是采用getoutputstream 取而代之,所以必须修改些代码来迎合resin 运行环境:
/** * start file filecaptureresponsewrapper.java */
package com.junjing.filter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class filecaptureresponsewrapper
extends httpservletresponsewrapper
{
private chararraywriter output;
public string tostring()
{
return output.tostring();
}
public filecaptureresponsewrapper(httpservletresponse response)
{
super(response);
output = new chararraywriter();
}
public printwriter getwriter()
{
return new printwriter(output);
}
public void writefile(string filename)
throws ioexception
{
filewriter fw = new filewriter(filename);
fw.write( output.tostring());
fw.close();
}
public servletoutputstream getoutputstream()
throws java.io.ioexception
{
return new servletoutputstream();
}
public void write(int b)
throws ioexception
{
output.write(b);
}
public void write(byte b[])
throws ioexception
{
output.write(new string(b,"gbk"));
}
public void write(byte b[], int off, int len)
throws ioexception
{
output.write(new string(b, off, len));
}
};
} public void writeresponse(printwriter out)
{
out.print(output.tochararray());
}
}
/** * end file filecaptureresponsewrapper.java */
.转自:http://www.comsonic.com.cn/software/p28/A283410.shtml
...所有的动态页面,都是要被变成静态html,才能访问到的...
也可以直接生成静态页面 比如用freeer velocity
你说的那个统一的模版,是事先编程好的,自己的技术团队开发的吗,还是什么别的模板?27 L 的大哥,怎么说的那么简单,查看下网页的源代码文件,你能看出来什么??还是希望高手们继续赐教 ...
下载实例 : http://www.lifeispig.cn/article.asp?id=165
说实话,这里面的东西我看不懂!!!
增加过滤器,过滤所有 html ,将被请求的 HTML 路径修改为对应的 JSP
(应该也可以指向对应的 action,未测试)经测试,
用 request.getParamater getAttribute, session.getAttribute 等,同样可以得到传递的参数另外,因为是服务器端跳转,所以浏览器中的路径看到的是 *.html关键代码如下:public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
String uri = request.getRequestURI();
String projectPath = request.getContextPath();
if(uri.endsWith(".html")){
uri = uri.replaceAll("^\\" + projectPath, "");// 去掉工程路径
uri = uri.replaceAll("\\.html$", ".jsp");// 修改被请求页为对应的JSP
request.setAttribute("attr", "abc");
request.getSession().setAttribute("attr2", "def");
request.getRequestDispatcher(uri).forward(arg0, arg1);
return;
}
arg2.doFilter(arg0, arg1);
}
<filter>
<filter-name>FilterURL</filter-name>
<filter-class>com.test.filter.FilterURL</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterURL</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
现则这个网页肯定是静态的。
所谓的模板就是试先写好的网页,当页面需要发生变化时,只要找到在服务器中找到这个网页,然后插入要添加的信息,再生成新的html文件。可以查看一下源代码
<form name="form1" method="post" action="ReplyT.aspx?forumID=8b327318-2c42-4a49-8aed-ef8c33697e7f&topicID=c8a4b4cd-7185-4202-882d-aa6a8eeac8f2&postDate=2009-08-26+14%3a40%3a56&v=13" id="form1">
forumID应该就是当前浏览的网页。如果你回复了一条信息后,forumID肯定又变化了。PS:不可能通过修改文件的后缀名而得到html文件的,直接将'.JSP'改成'.html'???!!!太不可思议了
不过要实时生成,估计就要个filter拦截数据了
不过隔一段时间,内容不太会变的时候,一般会调用静态化程序,生成正的html文件。
<!--页头Begin-->
<div class="top cbody">
<div class="toplogo"><a href=""><img src="${root}/default/article/img/logo.gif" alt="" /></a></div>
<div class="topbanner"> </div>
<div class="toplink">
<ul>
<li><a href="#">高级搜索</a></li>
<li><a href="javascript:void(0);" onclick="javascript:window.external.AddFavorite('http://www.JEECMS.com','JEECMS - 国内专业、开源、免费的JAVA (JSP)版网站管理系统');">收藏本站</a></li>
<li><a href="/">联系我们</a></li>
<li><a href="javascript:void(0);" onclick="this.style.behavior='url(#default#homepage)';this.setHomePage(location.href)">设为首页</a></li>
</ul>
</div>
</div>
<!--页头End--> <!--导航栏Begin-->
<div class="topmenu cbody1">
<ul>
<li class="thisclass"><a href="${base}/">首 页</a> [@cms.ChnlList id='' inner='1';c]</li>
<li class="thisclass"><a href="${c.url}">${c.name}</a> [/@cms.ChnlList]</li>
<li class="thisclass"><a href="${base}/jeecms/Guestbook.jspx" target="_blank">留言板</a></li>
</ul>
</div>
<!--导航栏End-->这是jeecms的一段代码,文件也是html格式的,里面明显可以看出用了@cms标签,动态生成导航栏。
应该说静态的html里面加了自定义标签,形成动态。
这是刚刚发言之前的路径
现在路径一样了。参数不一样。求真解?