祭奠
祭奠_即将消失的JSP
相关:
关于Request与Response,你所必须掌握的,都在这儿了
Servlet概念-原理-操作[Java-web]
全文采取灰阶主题为JSP默哀…
文章目录
- 祭奠_即将消失的JSP
- WHAT IS JSP
- 使用JSP
- JSP内置对象
- JSP四个域对象
- JSP指令
- JSP动态标签
WHAT IS JSP
我们可以从JSP和Servlet的关系这个角度阐述JSP
Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容
JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成
Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来
而JSP是Java和HTML可以组合成一个扩展名为.jsp的文件,很特么不优雅对不对,可很早以前这却是最流行的开发方式
在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)
讲了那么多,抛出JSP的官方定义:
JSP(全称JavaServer Pages)是由[Sun Microsystems]公司主导创建的一种动态网页技术标准,JSP部署于网络服务器上,可以响应客户端发送的请求
简单说:JSP=JAVA+HTML=Sevlet
JSP演变历程:
JavaWeb早期:servlet,在servlet中需要写大量的
response.getWriter().println(“<html>”);
JavaWeb后期:JSP,只需要在html中直接添加动态信息,即java代码片段就可以了。服务器会把所有的< html>语句转换成
response.getWriter().println(“<html>”);
即Servlet不再负责显示页面,而由JSP来完成!而Servlet专注于控制层内容
HOW:
JSP会在客户端第一次请求JSP文件时被编译为HttpJspPage类(接口Servlet的一个子类)。该类会被服务器临时存放在Tomcat服务器工作目录里面
JSP只会在客户端第一次请求时被编译,后续访问相关servlet的时候,直接运行字节码文件
Tomcat能够自动检测到JSP程序的改动。如果检测到JSP源代码发生了改动。Tomcat会在下次客户端请求JSP时重新编译JSP,而不需要重启Tomcat。
使用JSP
html中的java代码:
<%...%>
:java代码片段代码片段会原模原样的出现在真身中,不会有变动。正常的Java代码都可以在代码片段中出现
<%=…%>
:表达式在页面上打印数据,例如<%=a%>对应out.println(a)
<%!...%>
:声明:声明对应Servlet类中的属性和方法JSP只有一种注释:
<%-- … --%>
,注释中的内容会被JSP编译系统忽略!
由于jsp是java和html的合体,
所以:
java片段中的代码注释依然遵守java的注释//,/*...*/, /**.../
html片段中的代码依然遵守html的注释< !-- … -->
说Html注释和jsp注释二者:
<! – -->:Tomcat不把它当注释,和其他东西一样,会发送到客户端。但浏览器不会去显示它,因为浏览器知道它是注释;
<%----%>:Tomcat在生成JSP“真身”时,就会忽略它,因为Tomcat认识它,知道它是注释。所以在“真身”中就没有它,也不会发现到客户端。也就是说,客户端永远看不到它
JSP内置对象
内置对象是在JSP页面中无需创建就可以直接使用的变量。在JSP中一共有9个这样的对象!它们分别是
out(JspWriter):最为常用的方法是
print()
,向页面输出!它与response.getWriter()
基本相同config(ServletConfig):在页面中基本没有什么用,但如果JSP在web.xml中存在配置,而且存在初始化参数,那么可以使用config来获取;config对象的功能是:
getServletContext()
、getServletName()
、getInitParameter()
,这三个方法在JSP中都没什么用。所以config就没什么用了。JSP也可以在web.xml中配置,但我们没有配置它的必要page(当前JSP的真身类型):基本没用!表示当前JSP页面的当前实例!在页面中使用this和使用page是相同的;也没什么用
pageContext(PageContext):页面上下文,很有用*的东西,下面会讲解。你以后可能不会经常直接使用它,但一定间接使用它
exception(Throwable):虽然名字叫exception,但类型为Throwable。它只能在错误页中可以使用!后面讲
request(HttpServletRequest):与Servlet中的request一样,没有区别
response(HttpServletResponse):与Servlet中的response一样,没有区别
application(ServletContext):就是ServletContext对象
Session (HttpSession):就是HttpSession对象
查看内置对象源代码:
找到Tomcat编译后的.class文件,通过反编译,看看JSP的源代码
public void _jspService(HttpServletRequest request, HttpServletResponse response)throws java.io.IOException, ServletException {//内置对象初始化PageContext pageContext = null;HttpSession session = null;ServletContext application = null;ServletConfig config = null;JspWriter out = null;Object page = this;JspWriter _jspx_out = null;PageContext _jspx_page_context = null;//JSP被访问时执行的内置对象实例化try {response.setContentType("text/html;charset=UTF-8");pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);_jspx_page_context = pageContext;application = pageContext.getServletContext();config = pageContext.getServletConfig();session = pageContext.getSession();out = pageContext.getOut();_jspx_out = out;...从这里开始,才是JSP页面逻辑的内容}…
JSP中的内容都出现在try块中,而且在try块的正文,上方是对隐藏对象的初始化
上面代码只是给出普通页面的“真身”,而错误页面的“真身”你会看到exception对象的出现
JSP四个域对象
域对象的范围:
- pageContext范围:当前页面之内有效
- request范围:当前的请求内有效
- session范围:当前的会话内有效
- application范围:当前这次服务器生命周期内有效,Tomcat不死application不死
域对象的共同特点是都管理域中的属性,他们有着相同的方法:
void setAttribute(String name, Object value);
Object getAttrbiute(String name, Object value);
void removeAttribute(String name, Object value);
关于pageContext:
ageContext 对象是PageContext类型,它不只是域对象,而且还可以操作所有域对象,还可以获取其他隐藏对象
pageContext是JSP中的域对象,而在Servlet中不能使用它!它表示的当前页面中可以使用,是最小的范围,它可以使用以下方法
void setAttribute(String name, Object value); Object getAttrbiute(String name, Object value); void removeAttribute(String name, Object value);
pageContext可以取得或获得所有域的属性:
可以使用pageContext对象操作所有域对象,在
getAttribute()、setAttribute()、removeAttribute()
三个方法中多添加一个参数,int scope来指定范围。在PageContext类中包含四个int类型的常量表示四个范围
PAGE_SCOPE:pageContext范围;
REQUEST_SCOPE:request范围;
SESSION_SCOPE:session范围;
APPLICATION_SCOPE:application范围;
pageContext可以获取内置对象:
JspWriter getOut()
:获取out隐藏对象;
ServletConfig getServletConfig()
:获取config隐藏对象;
Object getPage()
:获取page隐藏对象;
HttpServletRequest getRequest()
:获取request隐藏对象;
HttpServletResponse getResponse()
:获取response隐藏对象;
HttpSession getSession()
:获取session隐藏对象;
ServletContext getServletContext()
:获取application隐藏对象;
JspException getException()
:获取exception隐藏对象转换后的JspException对象例如
pageContext.setAttribute(“hello”, “hello world”,PageContext.REQUEST)
这个方法调用等同与:request.setAttribute(“hello”, “hello world”)
JSP指令
JSP指令的格式:
<%@指令名 attr1=”” attr2=”” %>
一般都会把JSP指令放到JSP文件的最上方,但这不是必须的
JSP中有三大指令:page、include、taglib,最为常用,也最为复杂的就是page指令了
指令在“真身”中不存在,生成“真身”时需要使用指令,Tomcat编译系统会根据JSP的指令信息来编译JSP,生成Java文件
在生成的Java文件中,不存在指令信息
- page指令:
page指令的pageEncoding和contentType:
pageEncoding指定的是当前JSP页面的编码!Tomcat编译系统会使用这个编码把JSP编译成Java文件。
contentType指定的是响应给客户端时使用的编码,
response.setContentType()方法的参数值中设置
! Tomcat都会把响应正文转换成(UTF-8)编译,然后发送给客户端,并且会在响应头中设置Content-Type头信息为text/html;charset=utf-8,这样浏览器就知道使用服务器发送过来的正文使用了什么编码注意:
无论是page指令的pageEncoding还是contentType,它们的默认值都是ISO-8859-1,我们知道ISO-8859-1是无法显示中文的,所以JSP页面中存在中文的话,一定要设置这两个属性
当pageEncoding和contentType只出现一个时,那么另一个的值与出现的值相同。如果两个都不出现,那么两个属性的值都是ISO-8859-1
import属性
import是page指令中一个很特别的属性
import属性值对应“真身”中的import语句
<%@page import=”java.net.,java.util.,java.sql.*”%>
import属性是唯一可以重复出现的属性
但是,我们一般会使用多个page指令来导入多个包:
<%@ page import=”java.util.*”%> <%@ page import=”java.net.*”%> <%@ page import=”java.text.*”%>
errorPage和isErrorPage
我们知道,在一个JSP页面出错后,Tomcat会响应给我用户错误信息!
如果你不希望Tomcat给用户输出错误信息,那么可以使用page指令的errorPage来指定错误页!例如
<%@page errorPage=”xxx.jsp”%>
这时,在当前JSP页面出现错误时,会转发到xxx.jsp页面,
错误页需要添加标记,
<%@ page isErrorPage="true" %>
完事才可使用<%=exception.getMessage()%>
打印错误信息其实还可以在web.xml文件中配置错误页面,在出现某种错误时跳转到对应的页面处理
<error-page><error-code>404</error-code><location>/error404.jsp</location></error-page><error-page><error-code>500</error-code><location>/error500.jsp</location></error-page> <!--当出现404时,会跳转到error404.jsp页面--> <!--当出现500时,会跳转到error500.jsp页面-->
include指令
include指令表示静态包含
include指令只有一个属性:file,指定要包含的页面
例如:在a.jsp中指定
<%@include file=”b.jsp”%>
当a.jsp页面包含了b.jsp页面后,在编译a.jsp页面时,需要把a.jsp和 b.jsp页面合并成一个文件,然后再编译成Servlet(Java文件)
taglib指令
在JSP页面中使用第三方的标签库时,需要使用taglib指令来“导包”,例如
<%@ taglib prefix="c" uri="" %>
其中prefix表示标签的前缀,这个名称可以随便起。uri是由第三方标签库定义的,所以你需要知道第三方定义的uri
taglib指令的使用方式在JSTL标签库中讲解
JSP动态标签
JSP动态标签是JSP自己的标签,不是由第三方提供的,所以使用JSP动态标签时无需使用taglib指令“导包”
JSP动态标签的格式为:
<jsp:xxx …>
无论是自定义的JSP标签,还是JSP自己的动态标签,还有第三方的标签,最终都会对应一组方法的调用
include动态标签
include标签是动态包含,与include指令不同,include标签与
RequestDispatcher.include()
方法的功能是相同的
forward动态标签
forward标签的作用是请求转发,forward标签的作用与
RequestDispatcher#forward()
方法相同
无论是自定义的JSP标签,还是JSP自己的动态标签,还有第三方的标签,最终都会对应一组方法的调用
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689236393a224866.html
评论列表(0条)