JSP详解

(3) 2024-05-06 18:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说JSP详解,希望能够帮助你!!!。

文章目录

  • JSP
    • 1. 概念
    • 2. JSP的本质
    • 3. 详解JSP
      • 3.1 page指令
      • 3.2 jsp常用脚本
    • 4. JSP九大内置对象
      • 4.1 九大对象
      • 4.2 JspWriter/PrintWriter
      • 4.3 write()/print()
    • 5. JSP常用标签
      • 5.1 jsp静态包含
      • 5.2 jsp动态包含
      • 5.3 请求转发标签

JSP

1. 概念

JSP :Java server pages,即java服务器页面

作用?代替 Servlet 程序回传 html 页面的数据(Servlet程序回传 html 页面是一件非常繁琐的事情,开发和维护成本较高)

IDEA中直接new JSP创建文件进行了,里面类似html文件

jsp文件和html页面一样,存放在web目录下,访问也和html页面一样

2. JSP的本质

JSP本质上是一个 Servlet 程序

当我们第一次访问JSP页面的时候,Tomcat会帮我们把JSP页面翻译成 Java 源文件,并且对它进行编译成为 .class 字节码程序。

我们打开源文件:

// 翻译的java源文件类,继承了HttpJspBase,而HttpJspBase又继承了HttpServlet
// 所以JSP翻译的java源文件就是个Servlet程序,即JSP本质上是一个 Servlet 程序
// 在这个类里面是如何回传html页面的?
// 底层其实和我们写差不多,先获得响应流输出流,然后一行一行write()写入,把html页面回传给客户端
public final class test_jsp extends HttpJspBase implements JspSourceDependent, JspSourceImports { 
   
    
}

3. 详解JSP

3.1 page指令

是page指令 (可以多个),可以修改jsp页面中的一些重要指令,或者行为。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<!-- 属性-->
language 属性:表示jsp翻译后是什么语言文件,暂时只支持java
contentType 属性:表示jsp返回的数据类型是什么,即源码中的resq.setContentType()的参数值
pageEncoding 属性:表示当前jsp页面本身的字符集,默认是UTF-8
import 属性:和java源代码一样,同于导包 <%@page import="java.util.HashMap" %>
errorPage 属性:设置当jsp页面运行时出错,自动跳转去的错误页面路径 <%@ page errorPage="/error.jsp" %>
一般这个路径都以斜杠开头,(服务器中)表示http://ip:port/工程路径/,映射当工程中的web目录

<!-- 这下面的五个一般都不用改-->
isErrorPage 属性:设置当前页面是否是错误信息的页面,默认是false,如果是true可以获取异常信息!
session 属性:设置访问当前jsp是否会创建HttpSession对象,默认是true
extends属性:设置jsp翻译出来的java类,默认继承谁。

<!-- 以下两个属性是给,响应输出流out,使用的(一般不用改)-->
autoFlush 属性:设置当out输出流缓冲区满了后,是否自动刷新,默认值是true
buffer 属性:设置out缓冲区的大小,默认是 8kb

3.2 jsp常用脚本

①声明脚本 (基本不用)

格式:<%! 声明java代码 %>

作用:可以给翻译出来的java类定义属性和方法,甚至是静态代码块,内部类

<%!
    private Integer id;
    private String name;
    private static Map; // idea敲回车自己用import属性导包
	public void func() {}
%>

②表达式脚本 (常用)

格式:<%= 表达式 %>

作用:在jsp页面上输出数据

<%= 12 %>  <!-- 页面上就有显示个12了-->
<%= "我是字符串" %>

特点:都会被翻译到 _jspService() 方法中,_jspService() 方法中的对象都能在表达式中使用。都会被翻译为 out.print("表达式") 输出到页面上 (out是响应输出流) 。表达式不能分号结尾。

③代码脚本(基本不用)

格式:<% java语句 %>

作用:可以在jsp页面中编写我们自己需要的功能(写的是java语句)

<%
    for (int i = 0; i < 10; i++) {
    	System.out.println(i);
    }
%>


<!-- 迷之操作--> 
<%
    for (int i = 0; i < 10; i++) {
%>
    <%= j %> <br/> // 输出在页面
<%
    }
%>

特点:这个也会被翻译到_jspService() 方法中,所以在方法中的现有对象/参数都能直接使用。还可以由多个代码脚本块,组合完成一个完整的java语句。还可以和表达式脚本一起组合使用(不能嵌套),在jsp页面上输出数据

4. JSP九大内置对象

4.1 九大对象

内置对象:Tomcat在翻译jsp页面成为Servlet源代码后,内部提供的对象。

①request :请求对象 (类型HttpServletRequest

②response :响应对象 (类型HttpServletResponse

③pageContext: jsp的上下文对象(类型PageContext

④session :会话对象(HttpSession

⑤application: Serlvet上下文对象(ServletContext

⑥config :Servlet配置信息对象 (ServletConfig

⑦out:响应输出流对象(JspWriter

⑧page:指向当前jsp的对象(Object

⑨exception:异常对象(Exception),这个需要把属性改为isErrorPage=true

⭐⭐其中的四个域对象:requestpageContextsessionapplication

域对象可以像Map一样存取数据,上面四个的功能都一样,不一样的是对数据的存取范围。

pageContext:当前jsp页面范围内有效

request:一次请求内有效

session :一个会话范围内有效(会话:打开浏览器访问服务器,直到关闭浏览器)

application:整个web工程内有效(只要web不停止,数据都在)

使用优先顺序,也是存取数据从小到大的范围:!!

pageContext -> request -> session -> application

4.2 JspWriter/PrintWriter

out输出和 response.getWriter() 输出的区别?

<!--out是JspWriter类型, response.getWriter()是PrintWriter类型-->
<%
    out.write("out输出1 <br/>");
    out.write("out输出2 <br/>");
    response.getWriter().write("response输出1 <br/>");
    response.getWriter().write("response输出2 <br/>");
%>

页面上会先显示response的输出,再显示out的输出,why? 因为这两个流都有自己的缓冲区。

jsp页面中所有代码执行完后会有以下两个操作:

  • 执行 out.flush() ,会把out流的缓冲区内容,追加到response缓冲区末尾
  • 执行response对象流的刷新,把数据写给客户端

结论:由于jsp底层翻译的源代码都算用out输出,所以jsp页面中我们一般统一用out输出,避免打乱顺序

4.3 write()/print()

out输出的细节? out.write() out.print() 区别?

<%
    out.write(12);
    out.print(12);
%>

如果输出是整形,会发现只有print输出正常 (如果都输出字符串没问题),因为print()底层输出任何都先转化为字符串,调用write()再执行,而write()当传入整形时,会把传入的整形直接强转为char,即(char) c,放入缓冲区,所以会把整形强转为对应的字符输出,所以有问题。

结论:write只适合输出字符串。print由于底层把所有的数据都变为了字符串,所以他可以输出所有的数据

在jsp页面中,可以统一使用 out.print() 进行输出

5. JSP常用标签

5.1 jsp静态包含

类似网站最下面的内容,网站中的所有页面都是相同的。只维护一份,该一处都改。下面你个区域包含引入这一份进行了

格式:<%@ include file="/include/footer.jsp"%>

file 属性代表你要包含jsp页面的路径,一般以斜杠开头,映射工程的web目录。

底层是什么?就是把被包含的页面原封不动的拷贝 静态包含的位置去 out.write() 执行输出,而且被包含页面footer.jsp不会被翻译为java源代码

现在上基本上就使用静态包含就够了,jsp注意用来页面输出,不会太复杂,所以静态就够了

5.2 jsp动态包含

动态包含也能实现静态包含的功能,底层原理不太一样。(不怎么用)

格式:<jsp:include page="/include/footer.jsp"></jsp:include>

page 属性代表你要包含jsp页面的路径

动态包含特点:

  • 会把被包含的页面(footer.jsp)也翻译成 java源代码。

  • 底层代码如下,动态包含页面去调用被包含的页面(footer.jsp)执行输出,而不是直接 write了。

    注意:传入了request,response和out,两个页面引用的同一个,保证了缓冲区是一个避免了输出顺序混乱

    // 源码:
    JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
    
  • 还可以传递参数,供被引用页面使用

    <!-- mian.jsp-->
    <jsp:include page="/include/footer.jsp">
        <jsp:param name="username" value="root"/>
        <jsp:param name="password" value="123"/>
    </jsp:include>
    
    <!-- footer.jsp-->
    <%= request.getParameter("password") %>
    

5.3 请求转发标签

格式:<jsp:forward page="/forwardC"></jsp:forward>

page 属性设置请求转发的路径,中间也可以传参(不怎么用)

现在JSP也快被淘汰了,了解即可

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复