Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说JSP详解,希望能够帮助你!!!。
JSP :Java server pages
,即java服务器页面
作用?代替 Servlet 程序回传 html 页面的数据(Servlet程序回传 html 页面是一件非常繁琐的事情,开发和维护成本较高)
IDEA中直接new JSP创建文件进行了,里面类似html文件
jsp文件和html页面一样,存放在web目录下,访问也和html页面一样
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 {
}
是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
①声明脚本 (基本不用)
格式:<%! 声明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页面上输出数据
内置对象: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
⭐⭐其中的四个域对象:request
,pageContext
,session
,application
域对象可以像Map一样存取数据,上面四个的功能都一样,不一样的是对数据的存取范围。
pageContext
:当前jsp页面范围内有效
request
:一次请求内有效
session
:一个会话范围内有效(会话:打开浏览器访问服务器,直到关闭浏览器)
application
:整个web工程内有效(只要web不停止,数据都在)
使用优先顺序,也是存取数据从小到大的范围:!!
pageContext -> request -> session -> application
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页面中所有代码执行完后会有以下两个操作:
结论:由于jsp底层翻译的源代码都算用out输出,所以jsp页面中我们一般统一用out输出,避免打乱顺序
out输出的细节? out.write()
out.print()
区别?
<%
out.write(12);
out.print(12);
%>
如果输出是整形,会发现只有print
输出正常 (如果都输出字符串没问题),因为print()
底层输出任何都先转化为字符串,调用write()
再执行,而write()
当传入整形时,会把传入的整形直接强转为char,即(char) c
,放入缓冲区,所以会把整形强转为对应的字符输出,所以有问题。
结论:write只适合输出字符串。print由于底层把所有的数据都变为了字符串,所以他可以输出所有的数据
在jsp页面中,可以统一使用 out.print() 进行输出
类似网站最下面的内容,网站中的所有页面都是相同的。只维护一份,该一处都改。下面你个区域包含引入这一份进行了
格式:<%@ include file="/include/footer.jsp"%>
file 属性代表你要包含jsp页面的路径,一般以斜杠开头,映射工程的web目录。
底层是什么?就是把被包含的页面原封不动的拷贝 静态包含的位置去
out.write()
执行输出,而且被包含页面footer.jsp
不会被翻译为java源代码
现在上基本上就使用静态包含就够了,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") %>
格式:<jsp:forward page="/forwardC"></jsp:forward>
page 属性设置请求转发的路径,中间也可以传参(不怎么用)
现在JSP也快被淘汰了,了解即可
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章