没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2009-11-12 10:11:15.000|阅读 2256 次
概述:我们可能都已经注意到了,访问诸如新浪这样的大型站点的新闻时,我们会发现每一篇文章都会对应一个静态的页面,以此方式在大量并发访问时减小数据库服务器的负担。刚开始做web应用程序时,对于这类需求感觉非常之难,且不知从何处着手。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
我们可能都已经注意到了,访问诸如新浪这样的大型站点的新闻时,我们会发现每一篇文章都会对应一个静态的页面,以此方式在大量并发访问时减小数据库服务器的负担。刚开始做web应用程序时,对于这类需求感觉非常之难,且不知从何处着手。偶然的机会看到一个论坛上实现介绍这类应用实现原理的讨论,突然大悟,就试着实现了该应用,现在正是我工作还没着落的最不如意的时期,正好边学习,边整理曾经的学习笔记,避免以后用得着的时候笔记又丢失的无影无踪。
原理倒也简单:在页面中以编程的方式访问一篇文章,通过拦截响应内容并写入html文件。
使用方法:只需要在添加完文章代码之后:设置相关属性(加背景色的代码需要的属性),并且使用元素或具有相同功能的代码访问servlet即可
注意:使用了文字背景的部分,使用时注意查看访问该servlet时是否设置了相关属性,否则servlet可能不能正常执行。
servlet 代码如下:
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class toHtml extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("GBK");
//测试表明:通过REFERER 可以在服务器段获得发送请求的页面完整的路径信息
String send_req_url =request.getHeader("REFERER");
//获取应用程序在服务器端文件系统的绝对路径
ServletContext context=getServletContext();
String rootRealPath=context.getRealPath("/");
String foldPath="/m/fy/fmd";//模板文件的目录结构
String modelName="/m_article.jsp";//模板文件的名字
//构造rootPath,形如:"http://localhost:8080/AjaxTrip"
String contextStr=request.getContextPath();
String urlStr=request.getRequestURL().toString();
String rootPath=urlStr.substring(0, urlStr.indexOf(contextStr))+contextStr;//"http://localhost:8080/AjaxTrip"
String htmlId=(String)request.getAttribute("htmlId");
String action=(String)request.getAttribute("action");
String queryStr=null;
//构造访问模板文件的url
String sourceUrl=rootPath+foldPath+modelName;
if("addArticle".equals(action)){
queryStr=(String)request.getAttribute("queryStr");
}
if(queryStr!=null){
sourceUrl=sourceUrl+"?"+queryStr;
}
/* JspToHtml :自定义类,实现依据当期日期生成响应的目录结构和文件:如:n/2009/1108/htmlId.html
* 并且提供了将响应内容写入文件的方法:
* */
JspToHtml jth=new JspToHtml();
jth.setUrl(rootRealPath);//设置io操作的绝对路径
//使用URL对象通过编程的方式访问指定的文章,读取响应内容保存到sTotalString中
String sCurrentLine="";
String sTotalString="";
InputStream l_urlStream ;
URL l_url=new URL(sourceUrl);
HttpURLConnection l_conn=(HttpURLConnection)l_url.openConnection();
l_conn.connect();
l_urlStream=l_conn.getInputStream();
BufferedReader l_reader=new BufferedReader(new InputStreamReader(l_urlStream,"utf-8"));
while((sCurrentLine=l_reader.readLine())!=null){
sTotalString+=sCurrentLine;
}
/*
* 向浏览器发送数据时,输出内容使用的默认字符集也不支持中文, 避免出现乱码,必须
* 在发送数据之前调用下面的方法设置响应内容的编码方式
* */
response.setContentType("text/html;charset=utf-8");
if(null!=htmlId){
//JspToHtml 调用相应方法创建html文件
boolean bool=jth.createHtml(sTotalString,htmlId);
request.setAttribute("htmlReady", "ok");
}else{
System.out.println("htmlId is null");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request,response);
}
}
===下面是辅助类:JspToHtml.java源代码
package com.java.yanjie.translate;
import java.util.*;
import java.io.*;
import java.text.*;
/*
* 使用该类注意事项:功能:封装对目录和文件的相关操作。
* 2:必须先调用setUrl()方法设置文件和目录操作的绝对路径,然后调用createHtml(String content,String id)
* 创建指定名称和内容的文件。创建的文件保存在如下格式的路径下:根目录/n/year/monthday/*.html
* 如:在2009-10-31 创建的文件位于:/n/2009/1031/id.html
*
*
* */
public class JspToHtml {
private String baseUrl="D:\\java_workspace\\AjaxTrip\\WebContent";
private String prefixFold="\\n";
private String foldUrl;
/*
* 类的功能:封装对目录和文件的操作
* */
public JspToHtml(){
}
/*
* name:setUrl
* function:设置目录和文件操作的时使用的根路径(web应用程序的根文件夹的绝对路径)
* */
public void setUrl(String baseUrl){
this.baseUrl=baseUrl;
}
private String getBaseUrl(){
return baseUrl;
};
/*
* name:setFoldUrl
* function:设置文件目录结构字符串
* */
private void setFoldUrl(String fileUrl){
this.foldUrl=fileUrl;
}
private String getFoldUrl(){
return foldUrl;
}
private String getPrefixFold(){
return prefixFold;
}
/*
* name;createHtml
* function:创建html文件,内容是content,名称是id.html
*
* */
public boolean createHtml(String content,String id){
boolean bool=false;
String cont=content;
String id1=generateFileNameStr();
String fileName=id+".html";
FileWriter toFile;
BufferedWriter out;
try{
if(formatUrl()){
toFile=new FileWriter(getFoldUrl()+"\\"+fileName);
out=new BufferedWriter(toFile);
out.write(cont,0,cont.length());
out.close();
toFile.close();
bool=true;
}
}
catch(IOException ioe){
ioe.printStackTrace();
}
return bool;
}//createHtml
/*
* name:deleteHtml
* function:删除指定id(文件名称去除后缀)的html文件
*
* */
public boolean deleteHtml(String htmlId){
boolean bool=false;
String name=htmlId;
if(htmlId==null){
return bool;
}
String yearStr=htmlId.substring(0, 4);
String monthDayStr=htmlId.substring(4,8);
String fileUrl=getBaseUrl()+getPrefixFold()+"\\"+yearStr+"\\"+monthDayStr+"\\"+htmlId+".html";
File file_del=new File(fileUrl);
if(file_del.exists()){
file_del.delete();
bool=true;//删除成功标志
}
return bool;
}
/*
* name:formatUrl
* function:检查当前日期的文件目录结构是否存在,若不存在,则创建对应的目录结构,并且若目录结构存在,
* 则保存该目录结构字符串 保存
*
* */
private boolean formatUrl(){
/*
如果存放当前日期文件的目录结构不存在,则创建对应的目录结构
* */
boolean bool=false;
File file=new File(getBaseUrl());
if(file.exists()&&file.isDirectory()){
String foldStr=getTodayFilePath();
File filePath=new File(foldStr);
if(!filePath.exists()){
filePath.mkdirs();
}
if(filePath.isDirectory()){
bool=true;
setFoldUrl(foldStr);
}
}
return bool;
}//formatUrl()
//存放*.html的目录结构: .../.../根目录/年/月日/*.html
/*
* name:getTodayFilePath
* function:该方法返回文件名之前的部分呢
* */
private String getTodayFilePath(){
String tPath="";
String dateStr[];
dateStr=new String[2];
String patternStr[]={"yyyy","MMdd"};
dateStr[0]=new SimpleDateFormat(patternStr[0]).format(new Date());
dateStr[1]=new SimpleDateFormat(patternStr[1]).format(new Date());
tPath=getBaseUrl()+getPrefixFold()+"\\"+dateStr[0]+"\\"+dateStr[1];
return tPath;
}
private String generateFileNameStr(){
String fileName="";
fileName=new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
return fileName;
}
/*
* main 方法测试类是否正常工作
*
* */
public static void main(String args[]){
JspToHtml jspToHtml=new JspToHtml();
jspToHtml.createHtml("aa", "11");
System.out.println("create html success!!");
jspToHtml.deleteHtml("20091031191355");
}
}
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:网络转载接DevExpress原厂商通知,将于近日上调旗下产品授权价格,现在下单客户可享受优惠报价!
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号