JSP详解

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也快被淘汰了,了解即可

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值