JSP学习总结

1. JSP运行原理

  1. 当服务器上的JSP页面被第一次请求执行时,服务器会将JSP翻译成一个 java 文件并编译,生成一个字节码文件,然后执行字节码文件响应用户的请求。当这个JSP页面再次被请求时,服务器将直接执行已经驻留在内存中的字节码文件,这样可以大大提高响应效率。如果对JSP页面进行了修改,服务器会重新会重新编译,生成一个新的字节码文件。
  2. JSP翻译成一个 java 文件里面有一个_jsp类,该类继承了HttpJspBase,而HttpJspBase继承了HttpSerrvlet。说到这里,我们就明白了,其实JSP就是一个Servlet,访问jsp即访问一个Servlet。
  3. 在JSP转换成的Servlet里面,所有的HTML代码都通过out.write()的形式输出到了页面,java部分代码会原封不动搬移过来。
  4. 当有多个用户请求一个JSP页面时,Tomcat服务器为每一个用户启动一个线程,该线程会执行驻留在内存中的字节码文件来响应用户 的请求,多个线程之间互不干扰,这些线程由Tomcat服务器来管理。

2. JSP页面基本结构

(1)普通HTML标记

    HTML标记即JSP页面中的HTML内容。

(2)java变量和方法的声明

    在<%!   %>里面声明变量和方法,在<%!   %>里面声明的变量和方法在整个jsp页面内都有效,与所在jsp页面的位置无关。变量被所有线程共享,也就是说一个用户修改了某个变量会影响到其他用户。

(3)java程序片

    在<%   %>里面插入Java程序片,可以使用<%!   %>里面声明的变量和方法。<%   %>里面的声明的变量是线程隔离的,也就是说会为每个线程都分配一个变量。

(4)java表达式

    在<%=   %>里面插入表达式,例如<%= new java.util.Date() %>,获取当前时间。

(5)jsp中的注释

  • html注释:<!--    -->,用户能够在浏览器看到。
  • jsp注释:<%--    --%>,服务器在编译JSP页面时会忽略JSP注释。

(6)jsp指令标记

  • page指令标记
  • include指令标记
  • taglib指令标记

(7)jsp动作标记

  • <jsp:include>动作标记
  • <jsp:forward>动作标记
  • <jsp:param>动作标记

3. JSP 9大隐式对象

request://就是Servlet里的request
response: //就是Servlet里的response
session: //就是Servlet里的session
application: //就是servlet里的servletContext
config: //就是Servlet里的servletConfig
page: //就是Servlet自己
exception: //异常,只有errorPage才有
out://JSP页面输出
pageContext://代表JSP页面的运行环境,最重要

pageContext 对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。

getException()  //返回exception隐式对象
getPage()  //返回page隐式对象
getRequest()  //返回request隐式对象
getResponse()  //返回response隐式对象
getgetServletContext()  //返回application隐式对象
getServletConfig()  //返回config隐式对象
getSession()  //返回session隐式对象
getOut()  //返回out隐式对象

pageContext作为一个域对象,还封装了下面的方法:

//pageContext域对象的方法:
public void setAttribute(String name, Object value)
public Object getAttribute(String name)
public void removeAttribute(String name)

//pageContext对象中还封装了访问其它域的方法(重要)
public void setAttribute(String name, Object value, int scope)
public Object getAttribute(String name, int scope)
public void removeAttribute(String name, int scope)

//代表各个域的常量
pageContext.APPLICATION_SCOPE
pageContext.SESSION_SCOPE
pageContext.REQUEST.SCOPE
pageContext.PAGE_SCOPE

        另外还有个findAttribute()方法(查找各个域中的属性,EL表达式就依赖于这个方法),可以直接调用pageContext.findAttribute(String name),首先会从pageContext里找该属性,如果没有,会依次按照下面顺序在相应的域中查找:request, session, servletContext,如果没找着,返回null,否则返回属性值。
        pageContext类中定义了一个forward方法和两个include方法分别简化和替代RequestDispatcher.forward方法和include方法,方法接收的资源如果以"/"开头,"/"代表当前web应用。不过这里的include是动态包含,不建议使用include。

4. JSP四个域对象

pageContext(称为page域): //pageContext中存的数据在页面范围都可以取出
request(称为request域):  //request中存的数据在请求范围内都可以取出
session(称为session域):  //session中存的数据在会话范围内都可以取出
servletContext(称为application域)://servletContext中存的数据在整个应用程序范围内都可以取出

 明确如下两个问题:这四个对象的生命周期?哪种情况下用哪种对象?
        request:如果客户机向服务器发请求产生的数据,用户看完就没用了,向这样的数据就存在request域中。如用户看的新闻。
        session:如果客户机向服务器发请求产生的数据,用户用完了等一会儿还有用,向这样的数据就存在session域中。如用户购买的东西,因为结账还要用到。
        servletContext:如果客户机向服务器发请求产生的数据,用户用完了还要给其他用户用,向这样的数据就存在servletContext域中。如聊天室中说出的话,因为话要在自己页面中看到,别人也要看到。
        实际中,能用小的容器就不要用大的,即request能满足就不要用session,session能满足就不要用servletContext 。
 

原文:https://blog.csdn.net/eson_15/article/details/51264205 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值