伪静态html
- 静态文件:真实存在的、内容不变的文件。指WebRoot下面的 html, js, css, jpg 这些文件,浏览器会认为,这些文件的内容是不会改变的,因而有可能会缓存在本地。
- 伪静态文件:看后缀像是一个普通的静态文件,但实际上内容却是由 Servlet生成的。
例如:
创建一个 Servlet,伪装成一个静态文件。http://127.0.0.1:8080/mid0401/test.html
package my;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/test.html")
public class TestHtmlService extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String timeStr=sdf.format(new Date());
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
Writer writer=response.getWriter();
writer.write("当前时间:"+timeStr);
writer.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
}
伪静态图片
使用 Servlet 技术,也可以生成一个伪静态的图片。比如生成一个二维码,要用到这两个jar包
package my;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
@WebServlet("/qr.png")
public class QRService extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 设置 Content-Type
response.setContentType("image/png");
// 生成图片、并直接输出到应答中
String content = "hello world";
genQRCode(content, "png", response.getOutputStream());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// TODO Auto-generated method stub
doGet(request, response);
}
/**
* 生成二维码
*
* @param content
* 要嵌入的内容文本,通常是一个URL
* @param format
* 图片格式, "jpeg" 或 "png"
* @param outputStream
* 输出数据
*/
private void genQRCode(String content, String format, OutputStream outputStream)
{
int width = 300;
int height = 300;
// 二维码的参数设置
HashMap<EncodeHintType, Object> hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");// 字符集
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);// 纠错级别
hints.put(EncodeHintType.MARGIN, 2);// 空白
// hints.put(EncodeHintType.QR_VERSION, 5);// 版本1-40,内部会自动适应,不用设置
try
{
MultiFormatWriter writer = new MultiFormatWriter();
BitMatrix matrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
MatrixToImageWriter.writeToStream(matrix, format, outputStream);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
伪静态JS
使用 Servlet 技术,生成一个伪静态的JS文件。
package my;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONObject;
@WebServlet("/userinfo.js")
public class JSService extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
JSONObject user = new JSONObject();
user.put("id", "20210001");
user.put("name", "小明");
user.put("email", "12345@163.com");
user.put("time", sdf.format(new Date()));
// 构造一段 JavaScript
String jsContent = "var user = " + user.toString(2) + " ; ";
// 应答
response.setContentType("application/javascript");
response.setCharacterEncoding("UTF-8");
response.addHeader ("Cache-Control", "no-cache"); // 禁止客户端缓存此文件
Writer writer=response.getWriter();
writer.write(jsContent);
writer.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
}
在HTML页面里包含这个JS文件 <script type="text/javascript" src="userinfo.js" ></script> 并使用它: $('.user').html ( user.name);
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="userinfo.js"></script>
</head>
<body>
<div>
当前用户: <span class='user'></span>
</div>
</body>
<script>
$('.user').html ( user.name );
</script>
</html>
注意
1 设置 Content-Type: application/javascript
2 设置 Cache-Control : no-cache 即告诉浏览器,不要缓存这个JS文件
3 在浏览器看来,它和一个真的JS没有区别 ,因此,可以加载它、并调用里面的变量