简介

Java Server Pages  是Java的动态网页技术 

JSP引擎

引擎原理: 
    JSP引擎用于将JSP文件, 转换为Servlet

    1.    在服务器启动时 , JSP引擎读取.jsp文件.
    2.    将文件转换为Servlet的代码 , 并给servlet添加映射地址为 jsp的文件名称.
    3.    当用户浏览器访问 jsp文件名称时,  其实请求的不是jsp文件, 而是生成的servlet
    4.    servlet负责给浏览器进行响应.


例如: 
    demo4.jsp文件:

        <body>
            <h3>我们的第一个JSP文件</h3>
            <%
                for(int i=0;i<100;i++){
                    %>
                    <div>从前有座山</div>
                    <%
                }
            %>
        </body>

    demo4_jsp.java
        PrintWriter out = response.getWriter();        
        out.println("<body>");
        out.println("<h3>我们的第一个JSP文件</h3>");

                for(int i=0;i<100;i++){
        out.println("<div>从前有座山</div>");    
                }
        out.println("</body>");

JSP语法结构

JSP文件保存的路径:    webContent目录下

JSP文件 可以包含HTML代码, Java代码, 以及JSP特有的标记.
Java代码 声明区
指的是Java的成员代码位置,  在JSP声明区中编写的Java代码, 会生成到servlet的成员位置.

语法:
    <%!
        这里用于编写Java代码, 且会生成到声明区
    %>
Java代码 执行区
指的是Servlet的service方法中. 用户每次请求 都会执行

语法:
    <%
        Java代码
    %>
表达式
用于快速的将Java代码中的变量输出到网页中.

语法:
    <%=变量名%>

转换的Java:
    out.print(变量名);
JSP中如何编写注释
因为JSP文件包含了三种语法结构 (java/html/jsp)
所以 ,三种语法结构的注释 都可以起到注释的效果:

html注释:    
        <!--     html的注释 -->
        在JSP中, HTML的注释会被JSP引擎认为是HTML代码 , 会转换为out.write("<!-- -->");
Java注释:
        单行:    //
        多行:    /*  */
        文档:    /** */
        在JSP中, Java的注释 会被JSP引擎认为是Java代码 ,会原封不动的放到_jsp.java文件中.
JSP注释:
        <%-- JSP注释 --%>
        在JSP引擎将jsp文件 转换为.java文件时, 会忽略JSP注释的部分.

JSP 三大指令

指令的格式:
    <%@ 指令名称 属性名=值 属性名2=值 ... 属性n=值 %>

page指令

用于设置页面

完整格式:
<%@ page
    language="java"
    extends="继承的类"
    buffer="数值|none" -- 缓冲大小 ,none表示不缓冲 ,默认是8kb
    session="true|false" --true:自动创建session  false时表示不自动创建
    autoFlush="true|false" --true:缓冲器自动清除, 默认true
    isThreadSafe="true|false" --<%%>中的代码 是否是同步的 , true表示同步, 默认false
    contentType="text/html;charset=utf-8" -- 内容类型以及编码格式
    errorPage="网页地址" -- 当JSP代码出错误, 页面由指定地址进行显示 *
    isErrorPage="true|false" --true:当前页面是处理错误的页面. 只有为true时, 才可以查看异常信息. *
    import="导包列表" -- 属性值是一个或多个导入的包 , 包于包之间使用逗号隔开即可
   %>

指定项目全局错误页面

编写项目的web.xml

在根节点中, 加入子节点:
    <error-page>
        <error-code>404</error-code>
        <location>处理404的页面地址</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>处理500的页面地址</location>
    </error-page>

模仿jsp引擎将jsp代码转化为servlet代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* 模拟Tomcat中的 JSP引擎
* @author lwj
*
*/
public class Main {

static Scanner input = new Scanner(System.in);
public static void main(String[] args) throws Exception {
//边读边写
System.out.println("请输入要转换的HTML路径:");
String htmlPath = input.nextLine();
System.out.println("请输入要保存的Servlet路径");
String servletPath = input.nextLine();

//1. 创建输入流 , 读取HTML文件
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(htmlPath), "UTF-8"));
//2. 创建输出流, 用于生成servlet.java文件
PrintWriter pw = new PrintWriter(servletPath);
//3. 先打印Servle头部的一些信息
pw.println("package servlet;");
pw.println("");
pw.println("import java.io.IOException;");
pw.println("import javax.servlet.ServletException;");
pw.println("import javax.servlet.annotation.WebServlet;");
pw.println("import javax.servlet.http.HttpServlet;");
pw.println("import javax.servlet.http.HttpServletRequest;");
pw.println("import javax.servlet.http.HttpServletResponse;");
pw.println("/**");
pw.println(" * 由引擎转换的Servlet类");
pw.println(" */");
pw.println("@WebServlet(\"/servlet.do\")");
pw.println("public class HeiHeiServlet extends HttpServlet {");
pw.println(" protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {");
pw.println(" response.setContentType(\"text/html;charset=utf-8\");");

//边读边写
String text = null;
while((text = br.readLine())!=null) {
if(text.contains("<%")) {
StringBuilder sb = new StringBuilder();
sb.append(text);
while(true) {
text = br.readLine();
sb.append(text);
if(text.contains("%>")) {
break;
}
}
String javaCode = sb.toString().replace("<%", "");
javaCode = javaCode.replace("%>", "");
pw.println(javaCode);
pw.flush();
}else {
text = text.replace("\"", "'");//" \"
pw.println(" response.getWriter().append(\""+text+"\");");
pw.flush();
}
}
pw.println(" }");
pw.println("}");
pw.close();
br.close();
System.out.println("Java文件生成完毕了");

//C:\code\29\code1\day11_JSP\WebContent\demo1.html
//C:\Users\lwj\Desktop\视频\后端\day05_JSP\HeiHeiServlet.java
}
}


11月      Java

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!