Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
JSP(全稱JavaServer Pages)是由 Sun Microsystems 公司主導創建的一種==動態==網頁技術標準。JSP部署于網絡服務器上,可以響應客戶端發送的請求,并根據請求內容動態地生成 HTML、XML 或其他格式文檔的 Web 網頁,然后返回給請求者。
JSP 主要作用
接下來我們去看看 JSP 是如何實現代替 Servlet 的。
如果我們訪問一個 Servlet 程序,讓它返回給我們一個前端頁面,那么就需要在 JavaWEB 項目下編寫一個 HelloServlet 程序:
package com.example.demo;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet("/hello-servlet")
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=utf8");
// HelloWorld 頁面
PrintWriter out=response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html lang='en'>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Title</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
}
當我們啟動程序,在瀏覽器訪問http://localhost:8080/hello-servlet 時,瀏覽器會回傳顯示一個簡單的頁面
按 F12 進入開發者模式,可以看到 Servlet 程序響應回傳了我們在Servlet 程序中拼接的 html 代碼。
那么到這里還不能讓我們明白 JSP 就是一個 Servlet,再往下看。
我們創建一個JSP 文件 index.jsp,這樣啟動項目時,自動彈出的首頁就是我們的 index.jsp 頁面。
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
</head>
<body>
<h1><%="Hello World!" %></h1>
</body>
</html>
我們啟動項目
從控制臺找到項目部署路徑
C:\Users\Jie\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\38d57dfc-4429-4e47-8912-74706f5fff5a
我們直接訪問此路徑,可以看到目錄下存在的文件。
進入work\Catalina\localhost\ROOT\org\apache\jsp 目錄,可以看到存在的兩個文件【index_jsp.java】和【index_jsp.class】
接著我們將這兩個文件刪除,同時在瀏覽器進行刷新頁面,可以看到目錄下新增了我們剛刪除的兩個文件【index_jsp.java】和【index_jsp.class】
接著,我們使用 Notepad++ 打開【index_jsp.java】文件,查看編譯之后的 Java 文件代碼。
可以看到 index.jsp 中 HTML 部分的代碼被嵌入在 java 代碼中,這和我們一開始在 HelloServlet 中拼接的 HTML 代碼一摸一樣。
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
/*something*/
}
查看源碼我們可以看見 index_jsp 繼承了 org.apache.jasper.runtime.HttpJspBase 類,
package org.apache.jasper.runtime;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.HttpJspPage;
import org.apache.jasper.Constants;
import org.apache.jasper.compiler.Localizer;
/**
* This is the super class of all JSP-generated servlets.
*
* @author Anil K. Vijendran
*/
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {
/*something*/
}
我們繼續查看 org.apache.jasper.runtime.HttpJspBase 類的源碼,可以發現,HttpJspBase 類直接繼承了 HttpServlet類。也就是說,JSP 翻譯出來的 index_jsp.java 類,它間接了繼承 HttpServlet 類,這和我們直接編寫 Servlet 程序繼承 HttpServlet 類 是一樣的。
因此 JSP 本質就是一個 Servlet 程序。它可以省掉不少我們在 Servlet 中拼接 HTML 代碼的時間。不過隨著前后端分離的出現,JSP 也逐漸被淘汰。
當我們第一次訪問 JSP 頁面的時候,Tomcat 服務器主要會幫我們完成:
當我們第二次訪問 JSP 頁面的時候,如果未做更改,則使用上次編譯的 .class 文件;若修改過,則重新編譯。
建工程
File>New>Web Project
填寫項目名稱Project Name,舉例為andylife,這里使用的是默認存儲路徑,如需修改,把下面Use default location前面的勾去掉,并在Directory填寫自己的地址
設置完成后點擊Finish,新建完成
編寫內容
打開WebRoot目錄下的index.jsp,把編碼改為utf-8
網頁修改內容,顯示日期時間源碼:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path=request.getContextPath();
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<body>
<%
//設置刷新頁面的時間,每隔1秒鐘刷新一次
response.setHeader("refresh", "10");
%>
當前的系統時間是:
<%
//輸出當前時間
Calendar now=Calendar.getInstance();
out.print(now.get(Calendar.YEAR) + "年");
out.print(now.get(Calendar.MONTH) + 1 + "月");
out.print(now.get(Calendar.DATE) + "日");
out.print(now.get(Calendar.HOUR_OF_DAY) + "時");
out.print(now.get(Calendar.MINUTE) + "分");
out.print(now.get(Calendar.SECOND) + "秒 ");
out.print("星期");
switch (now.get(Calendar.DAY_OF_WEEK)) {
case 1:
out.print("日");
break;
case 2:
out.print("一");
break;
case 3:
out.print("二");
break;
case 4:
out.print("三");
break;
case 5:
out.print("四");
break;
case 6:
out.print("五");
break;
case 7:
out.print("六");
}
out.print(""+"<hr>");
out.print("ID Things need to be done IF DAILY "+"<br>");
%>
</body>
<body>
<%
out.print(""+"<hr>");
%>
</body>
</html>
運行
把頁面部署到Tomcat上
點擊ADD,然后選擇我們的Tomcat服務器,點擊Finish,然后點OK
點擊旁邊圖標的小三角形,選擇服務器,并運行
當我們在控制臺看到此信息時,服務器就開啟成功了
前端瀏覽
在瀏覽器輸入網址:http://localhost:8080/life/index.jsp
它表示的是,在本地8080端口下,life中的index.jsp
1),模板文件add_jsp_.ftl
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String childPath=request.getContextPath();
String basePath=request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort() + childPath +"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<%@ include file="/pub/scripts.jsp"%>
<script type="text/javascript">
function submit_save() {
var varName_=$("#name_").val();
if(varName_==null || varName_=='') {
alert("請先輸入名稱!")
return false;
} else {
$("#addForm").submit();
}
}
</script>
</head>
<body>
<!-- 標題區域 -->
<div class="tleBg">
<div class="title">
<span class="txt"> <em></em><#list mapDataTableComment as listItmCom > ${listItmCom.columnComment} </#list>- 新增
</span> <a href="javascript:;" class="search-hide"></a>
</div>
<div class="clr"></div>
</div>
<!-- 查詢維度區域 -->
<div class="t_list" id="addtable">
<form name="addForm" id="addForm" action="<%=childPath %>/testT00_userConter/testT00_userAddSave" method="post">
<table border="0" cellspacing="0" width="100%" cellpadding="0" class="t_list_1">
<tbody>
<#list mapDataList as listItm >
<tr style="line-height: 36px;">
<td width="15%">
</td>
<td width="20%" class="text" style="text-align: right;">
${listItm.columnComment}:
</td>
<td>
<input type="text" id="${listItm.columnName}" name="${listItm.columnName}" style="width: 300px;" class="inputStyle" value="原左大括<#list mapDataTableComment as listItmCom > ${listItmCom.columnName} </#list>.${listItm.columnName}原右大括" />
</td>
<td width="15%">
</td>
</tr>
</#list>
<tr>
<td width="15%">
</td>
<td width="20%" class="text" style="text-align: right;">
</td>
<td>
<input type="button" id="btn_add" value="保 存" class="t_button_gray" onclick="return submit_save();" />
<input type="reset" id="btn_rest" value="重 置" class="t_button_gray" />
</td>
<td width="15%">
</td>
</tr>
</tbody>
</table>
</form>
</div>
</body>
</html>
(2),根據模板及表元數據生成新增jsp頁面
import freemarker.template.Configuration;
import freemarker.template.Template;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @date: 2022/12/03 08:27
* @desc: 測試入口
*/
public class TestCls {
public static void main(String[] args) throws Exception {
new TestCls().outTemplate();
}
// 輸出到模板
private void outTemplate() throws Exception {
Configuration configuration=new Configuration();
configuration.setDirectoryForTemplateLoading(new File("F:\\xbl\\myResource\\temp_test_"));
Template template=configuration.getTemplate("add_jsp_.ftl");
Map<String, List<EntryInfoPo>> dataMap=new HashMap<String, List<EntryInfoPo>>();
List<EntryInfoPo> listEntryInfo=new ArrayList<EntryInfoPo>();
listEntryInfo=testMetaAddComment();
dataMap.put("mapDataList", listEntryInfo );
// 表注釋
dataMap.put("mapDataTableComment", testTableComment());
Writer outputWriter=new OutputStreamWriter(new FileOutputStream(new File("F:\\xbl\\myResource\\temp_test_\\add_.jsp") ) );
// Writer outputWriter=new OutputStreamWriter(System.out );
template.process(dataMap, outputWriter);
System.out.println("輸出完成!");
outputWriter.close();
}
// 表注釋
private List<EntryInfoPo> testTableComment() throws Exception {
List<EntryInfoPo> listTableComment=new ArrayList<EntryInfoPo>();
EntryInfoPo entryInfoPo=new EntryInfoPo();
entryInfoPo.setColumnName("testT00_userDto");
entryInfoPo.setColumnComment("用戶管理");
listTableComment.add(entryInfoPo);
return listTableComment;
}
private List<EntryInfoPo> testMetaAddComment() throws Exception {
List<EntryInfoPo> listEntryInfoPo=new ArrayList<EntryInfoPo>();
Connection connection=getDataBaseConnection();
Statement statement=connection.createStatement();
ResultSet resultSet=statement.executeQuery("show full columns from t00_user ");
while (resultSet.next()) {
String columnComment=resultSet.getString("Comment");
String columnName=resultSet.getString("Field");
EntryInfoPo entryInfoPo=new EntryInfoPo();
entryInfoPo.setColumnName(columnName);
entryInfoPo.setColumnComment(columnComment);
listEntryInfoPo.add(entryInfoPo);
}
return listEntryInfoPo;
}
private Connection getDataBaseConnection() throws Exception {
// 連接數據庫
Class.forName("com.mysql.jdbc.Driver");
String databaseUrl="jdbc:mysql://127.0.0.1:3306/grcdb05?useUnicode=true&characterEncoding=utf8";
Connection connection=DriverManager.getConnection(databaseUrl, "root", "root");
return connection;
}
}
(3),創建一個空文件add_.jsp,執行步驟(2)能生成頁面
*請認真填寫需求信息,我們會在24小時內與您取得聯系。