问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java开发如何将动态页面转化为静态页面发布

发布网友 发布时间:2022-04-20 15:28

我来回答

4个回答

懂视网 时间:2022-04-20 19:50

一、为什么要生成静态页面?

1.随着你网站的访问量增大,每次访问动态页面都要从数据库中读取一次数据,这无疑是给数据库和服务器端造成了压力与负担。如果没优化的话,往往会导致页面访问速度缓慢。

2.如果项目程序出现了bug,导致动态页面发生错误不能访问。这时候如果你有生成的静态页面,还是可以访问的,避免带来不必要的损失。

3.搜索引擎更青睐静态页面,对SEO优化提升搜索排名来说是有益的。(也可使用伪静态优化)

二、什么地方该生成静态页面呢?

访问量比较大的页面且内容更新不是较为频繁的。为了用户访问的流畅和服务端的减压,各类门户网站一般是将首页、新闻页等生成静态页面,然后再每隔一段时间自动进行数据更新生成新的静态页面。

三、如何去实现呢?

实现的方法有很多,有些人用框架自动生成,有些人重写输出方法实现适合自己的新方法,还有些人用缓存机制从而无需生成静态页面。而我要介绍的方法也是借鉴别人写的,原理就是:后台发送一条指定的链接请求访问servlet的方法,该方法中再发送请求去读取jsp页面动态数据,然后将数据写入到指定的html文件中。说的倒是很轻松,别急,接下来挺我仔细分析:

1.首先要有个读取jsp数据写入html的主方法(我们发送get请求中需带有的参数 file_name、path、realName、realPath):

/** 
 * @file_name 文件名及文件之后的参数.最好为a.jsf?fileId=aaaa 
 * @path 文件所在的路径.相对于根目录而言的. 
 * @realName 文件要保存的名字 
 * @realPath 文件要保存的真实路径, 默认与文件所在的目录相同。 
 */ 
public class ToHtmlPath extends HttpServlet { 
 
 public void service(HttpServletRequest request, HttpServletResponse response) 
  throws ServletException, IOException { 
 
 HttpSession session = request.getSession(); 
 String url = ""; 
 String name = ""; 
 System.out.println("name==="+name);
 ServletContext sc = getServletContext(); 
 
 String file_name = request.getParameter("file_name");// 你要访问的jsp文件,如news.jsf。 
 // file_name如:fileDetail.jsf?fileId=56.要是有参数, 只有一个参数。并且以参数名作为文件名。 
 
 String realName = request.getParameter("realName");// 要保存的文件名。如aaa;注意可以没有这个参数。 
 
 String path = request.getParameter("path");// 你要访问的jsp文件路径。如news。注意可以没有这个参数。 
 
 String realPath = request.getParameter("realPath");// 你要保存的文件路径,如htmlNews.注意可以没有这个参数。 
 // 下面确定要保存的文件名字。 
 if (realName == null || realName == "") { 
  int a = 0; 
  a = file_name.indexOf("=") + 1; 
  realName = file_name.substring(a); 
  if (realName.indexOf(".")>0) { 
  realName = file_name.substring(0, file_name.indexOf(".")); 
  } 
 } 
 // 下面构造要访问的页面。 
 if (path == null || path.equals("")) { 
  url = "/" + file_name;// 这是你要生成HTML的jsp文件,如 
 } else { 
  url = "/" + path + "/" + file_name;// 这是你要生成HTML的jsp文件,如 
 } 
 // System.out.println("url==="+url);
 // 下面构造要保存的文件名,及路径。 
 // 1、如果有realPath,则保存在realPath下。 
 // 2、如果有path则保存在path下。 
 // 3、否则,保存在根目录下。 
 if (realPath == null || realPath.equals("") ) { 
  if (path == null || path.equals("") ) {
  // 这是生成的html文件名,如index.htm.说明: ConfConstants.CONTEXT_PATH为你的上下文路径。 
  name = session.getServletContext().getRealPath("") + "\" + realName + ".html";
  } else { 
  name = session.getServletContext().getRealPath("") + "\" + path + "\" 
   + realName + ".html";// 这是生成的html文件名,如index.html 
  } 
 } else { 
  name = session.getServletContext().getRealPath("") + "\" + realPath + "\" 
   + realName + ".html";// 这是生成的html文件名,如index.html
 } 
 
 // 访问请求的页面,并生成指定的文件。 
 RequestDispatcher rd = sc.getRequestDispatcher(url); 
 
 final ByteArrayOutputStream os = new ByteArrayOutputStream(); 
 
 final ServletOutputStream stream = new ServletOutputStream() { 
  public void write(byte[] data, int offset, int length) { 
  os.write(data, offset, length); 
  } 
 
  public void write(int b) throws IOException { 
  os.write(b); 
  } 
 }; 
 
 final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os)); 
 
 HttpServletResponse rep = new HttpServletResponseWrapper(response) { 
  public ServletOutputStream getOutputStream() { 
  return stream; 
  } 
 
  public PrintWriter getWriter() { 
  return pw; 
  } 
 }; 
 rep.setCharacterEncoding("gbk");//response的编码为gbk防乱码
 rd.include(request, rep); 
 pw.flush(); 
 FileOutputStream fos = new FileOutputStream(name); // 把jsp
输出的内容写到xxx.html os.writeTo(fos); fos.close(); } }

2.需要一个方法来调用上面的主方法,同时这个方法即是后台发送请求访问servlet的方法:

public class CallJspToHtml {
 
 //这个方法适当重载,就可以省去一些参数传递。
 public static void CallOnePage(String basepath,String fileName, String path, 
  String realName, String realPath) { 
  try { 
  String str = basepath+"toHtmlPath?file_name=" 
  + fileName + "&path=" + path + "&realName=" + realName 
  + "&realPath=" + realPath; 
  int httpResult; //请求返回码
 
  URL url = new URL(str); //URL发送指定连接请求
  URLConnection connection = url.openConnection(); 
  connection.connect(); 
  HttpURLConnection httpURLConnection = (HttpURLConnection) connection; 
  httpResult = httpURLConnection.getResponseCode(); 
  
  if (httpResult != HttpURLConnection.HTTP_OK) { //返回码为200则连接成功
  System.out.println("没有连接成功!"); 
  } else { 
  System.out.println("连接成功了!!!!!"); 
  } 
  } catch (Exception e) { 
  e.printStackTrace();
  } 
  } 
}

上面2的方法发送的请求又是如何调用到3的servlet中方法呢?

3.web.xml配置

<servlet> 
 <servlet-name>toHtmlPath</servlet-name> 
 <servlet-class>com.tptravel.util.compilerhtm.ToHtmlPath</servlet-class> 
 </servlet> 
 <servlet-mapping> 
 <servlet-name>toHtmlPath</servlet-name> 
 <url-pattern>/toHtmlPath</url-pattern> 
 </servlet-mapping>

嗯,没错。就是在配置文件中指定请求链接跳转至相应的方法,这样2中所发送的请求就会相应的去找到3中的方法。每个人使用框架都不一样,所以发送的链接请求样式也不一样,只要你请求与参数相对应就行,其实都是一个道理。

红色部分就是你所要转换的jsp动态页面的访问链接

***部分为要转换的jsp文件所存放位置,因为红色部分我们就已经可以访问到了jsp所以可以省略

蓝色部分为生成的静态文件的名字

绿色部分为静态文件所要存放的位置(默认是在项目更目录下),例子中则是存放在根目录的html文件夹中的news文件夹中。

4.具体应用分析:

把上述的方法都封装到自己的常用Util类中。

手动生成:后台在发布新闻、更新新闻,生成动态文件的同时则可以调用CallJspToHtml.CallOnePage(对应参数)生成html静态文件。

自动生成:设置监听器去判断其若超出约定时间则自动更新html文件。

结语:分享是一种快乐,坚持是一种精神。

热心网友 时间:2022-04-20 16:58

java生成静态页面无需特殊配置,非常简单的,下面有各种输出需求,看你要哪种就拿去用吧

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.ArrayList;
import java.util.Date;
import java.net.URL;
import java.net.URLConnection;
import java.io.*;

public class JspToHtml {
private static String title ="标题测试";
private static String context ="标题测试";
private static String editer ="标题测试";

/**
* 根据本地模板生成静态页面
* @param JspFile jsp路经
* @param HtmlFile html路经
* @return
*/
public static boolean JspToHtmlFile(String filePath, String HtmlFile) {
String str = "";
long beginDate = (new Date()).getTime();
try {
String tempStr = "";
FileInputStream is = new FileInputStream(filePath);//读取模块文件
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while ((tempStr = br.readLine()) != null)
str = str + tempStr ;
is.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
try {

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

File f = new File(HtmlFile);
BufferedWriter o = new BufferedWriter(new FileWriter(f));
o.write(str);
o.close();
System.out.println("共用时:" + ((new Date()).getTime() - beginDate) + "ms");
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}

/**
* 根据url生成静态页面
*
* @param u 动态文件路经 如: http://www.163.com/x.jsp
* @param path 文件存放路经如:x:\\abc\bbb.html
* @return
*/
public static boolean JspToHtmlByURL(String u, String path) {
//从utl中读取html存为str
String str = "";
try {
URL url = new URL(u);
URLConnection uc = url.openConnection();
InputStream is = uc.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while (br.ready()) {
str += br.readLine() + "\n";

}
is.close();
//写入文件
File f = new File(path);
BufferedWriter o = new BufferedWriter(new FileWriter(f));
o.write(str);
o.close();
str = "";
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}

/**
* 根据url生成静态页面
*
* @param url 动态文件路经 如: http://www.163.com/x.jsp
* @return d
*/
public static StringBuffer getHtmlTextByURL(String url) {
//从utl中读取html存为str
StringBuffer sb = new StringBuffer();
try {
URL u = new URL(url);
URLConnection uc = u.openConnection();
InputStream is = uc.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while (br.ready()) {
sb.append(br.readLine() + "\n");
}
is.close();
return sb;
} catch (Exception e) {
e.printStackTrace();
return sb;
}
}

/**
* 测试main 函数
*
* @param arg
*/
public static void main(String[] arg) {
long begin = System.currentTimeMillis();
//循环生成20个html文件
for (int k = 0; k < 20; k++) {
String url = "E:\\workspace\\oa\\golatel\\utils\\Temp\\mb.htm";//模板文件地址
String savepath = "d:/" + k + ".html";//生成文件地址
JspToHtmlFile(url, savepath);
}
System.out.println("用时:" + (System.currentTimeMillis() - begin) + "ms");
}

}

//模板文件名称 leon.html

<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###
</tr>
<tr>
<td align="center">
作者:###author###
</tr>
<tr>
<td align="center">
###content###
</td>
</tr>
</table>
</body>
</html>

热心网友 时间:2022-04-20 18:16

如果是伪静态只要想办法包装一下url,让他看起来像个静态地址就行。
如果想要真静态,可以通过io,把页面写到一个真实的html文件中,以后可以直接访问这个这个文件地址。

热心网友 时间:2022-04-20 19:50

用IO流将动态内容往指定目录写成HTML,作为静态页面进行访问
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
月经不尽褐色的是怎么回事 月经前后有褐色分泌物是什么原因 二十四节气的重要意义24节气在生活中的作用 你来我往,猜一个数字? 姓谭女孩起什么名字最优雅 男孩姓谭的好名字 黄家驹在beyond的地位 黄家驹是Beyond的主唱吗? 老板对员工的新年微信 每次感冒和一些小毛病,我都是选择运动出身汗,让它自然好,请问这种方 ... 从胶州到临沂开车有哪些景点 临沂哪家公墓风水最好 临沂老刑场在哪里? 临沂艾山火化场用的什么车? 临沂有什么山? 临沂有哪些公墓?具体位置,公交怎么到? 临沂艾山殡仪馆的具体位置,谢谢 保险从业资格证考过了,什么时候可以拿到证? 想要入手一台搭载1070显卡的笔记本,小白该如何选择? 客货运从业资格证考试合格后,交通局多久能出证 临沂艾山在哪 从业资格证考试完那以后要几天才能拿到证呀 临沂兰山区艾山天都灵在哪? 会计从业资格考试通过后多久能拿到证书 道路运输驾驶员从业资格证,通俗叫法是汽车上岗证,考完试多久能把证拿到手? 方解石的特征以及用途 价格 绝地求生现在什么加速器好用? 请问这个是什么原石呀?值钱吗? 网游加速器好用吗??? 伊宁市塔什科瑞克乡政府到伊宁市多远 从临沂去艾山要坐几路车 大家有谁知道临沂艾山旁边的富衣庄,那个算命的星期几不算吗,,谁知道的告诉我下呗,呜呜~~ 四大快递公司有哪些优势? (数字档案管理的大数据问题研究)这个句子应该用英语怎么翻译? 华为手机有没有自动连拍的功能?就我自己打球想用手机拍自己一系列动作,但没人帮我按快门 韩国化妆品sum37flawless regenerating cream如何使用? 韩国抗衰老的护肤品有靠谱推荐吗? 南京保时捷改装,哪家好?我想加装个罗盘和胎压监测,听说南京宝卡不错,有知道地址的吗? 这就是江湖南海打完怎么去下一个地图 南京埃尔科汽车技术有限公司怎么样? 新年新交规,从明天起开车上路,这几点你要知道! OMG!2020年落地新政策和小伙伴们用车出行息息相关! 苍绿之境怎么开启下一个地图 元旦过后 这些新规将影响你的生活! 光遇云野下一个地图是什么 光遇禁阁下一个地图叫什么 寒战开启,轮“胎”如何抵抗降温“压”力? 原神下一个地图开放时间 不想理那个逼四川话什么意思? 长安CS55胎压信息在哪里可以看?