• java_第一年_JavaWeb(8)


    前面说到,JSP在运行时会被编译成Servlet源代码,通过_jspServlet方法处理请求,此时该方法会传递和提供9个与web开发相关的对象进行使用,开发人员在JSP页面通过对这些变量即可引用这9大变量;

    其中的request、response、session、application(servletContext)、config在前面的博客已经或多或少有对其介绍,这篇重点说下pageContext、out、page这3对象;

    page对象:把当前的jsp页面当做一个对象使用,在开发中很少使用,看看眼熟即可;

    out 对象:向客户端发送文本数据,通过调用pageContext对象的getOut方法返回,对象类型是JspWriter,具有缓存功能,当其缓冲区已满或者jsp页面结束或通过page指令将其buffer缓存功能关闭时,out对象会调用ServletResponse,getWriter方法,通过PrintWriter对象将其缓冲区的内容写入到Servlet引擎提供的缓冲区中;图解:

    pageContext对象:及其重要的一个对象,代表整个jsp页面的运行环境,封装的对其他8大隐式对象的引用,也是一个域对象(容器),可以保存数据、引入、跳转等等功能

    • getException方法返回exception隐式对象
    • getPage方法返回page隐式对象
    • getRequest方法返回request隐式对象
    • getResponse方法返回response隐式对象
    • getServletConfig方法返回config隐式对象
    • getServletContext方法返回application隐式对象
    • getSession方法返回session隐式对象
    • getOut方法返回out隐式对象

    常用的方法有:setAttribute、getAttribute、removeAttribute、findAttribute;

    JSP的属性范围:

    • page:只能在当前页寻找属性值,跳转到其他页则访问不到;
    • request:服务器跳转有效,即转发状态其属性是一直可用的,如forward;
    • ’session:用户跳转有效,即超链接、重定向等都可查到属性;
    • application:任何用户都共用,即在服务器设置好属性后,无论哪个客户端都可进行访问;

    其查找的顺序是page>request>session>application从小到大范围寻找;也可以通过制定域寻找,如:

    pageContext.getAttribute("Name",PageContext.SESSION_SCOPE);

    其结果等于:

    session.getAttribute("Name");

    代表各个域的常量有:

    PageContext.APPLICATION_SCOPE
    PageContext.SESSION_SCOPE
    PageContext.REQUEST_SCOPE
    PageContext.PAGE_SCOPE

    使用pageContext中的forward跳转页面,如:

    pageContext.forward("/xxx/xxx");

    第一个"/"表示当前的web应用,不过该方法在jsp开发中并不常用,因为引进了java代码,一般会使用<jsp:forward>标签进行转发;

    同样的可以用pageContext对象中的include方法进行引入资源:

    pageContext.include("/xxx/xxx");

    由于需嵌入java代码,因此在实际开发中,使用pageContext的include方法引入页面这种做法也很少用,一般都使用<jsp:include>标签引入资源;

    常用的JSP标签有3种:

    • <jsp:include>标签:用于引入资源,动态引入;

    动、静态引入的区别:静态是合并为一个Servlet,先合并后执行;而动态是有各种不同的Servlet,各自执行后再合并;

    语法:

    <jsp:include page = "relativeURL | <% =expression%>" flush = "true|false" />

    page属性指定引入资源的相对路径,也可用表达式表示;

    flush属性表示在插入别的资源时,本身是否再刷新到客户端;

    扩展名为.jspf的文件在jsp:include、@include的区别:.jspf文件在被解析时会被当做纯文本解析,因此只有在运用@include静态引入时会正确显示结果,在运用jsp:include动态引入时会出现乱码;

    解决办法:

    1. 修改web.xml文件,增加
      <servlet-mapping>
              <servlet-name>jsp</servlet-name>
              <url-pattern>*.jspf</url-pattern>
      </servlet-mapping>

      让扩展名为.jspf也成为JSP Servlet处理的文件

    2. 修改tomcat中的web.xml文件,然后根据Servlet名找到对应的servlet-mapping配置,增加一个*.jspf的扩展名:
      <servlet-mapping>
               <servlet-name>jsp</servlet-name>
               <url-pattern>*.jsp</url-pattern>
               <url-pattern>*.jspx</url-pattern>
      </servlet-mapping>
    • <jsp:forward>标签:用于将请求转发到另外一个资源;

    语法:

    <jsp:forward page = "relativeURL | <%expression%>" />

    page属性用于指定转发资源的相对路径,也可通过一个表达式来获得;

    • <jsp:param>标签:在使用include和forward标签时,可通过param标签向资源传递参数;

    语法:

    <jsp:include page = "relativeURL | <%=expression%>">
        <jsp:param name = "parameterName" value = "parameterValue|<%=expression%>" />
    </jsp:include>

    其中的name属性和value属性分别表示传入参数的参数名和值;

  • 相关阅读:
    准确且巧妙的躲过了正确答案;
    百思不得其解,终得妙笔生花;
    考后小反思
    第一次接触oi知识对其分析。
    0515比赛感慨
    变量问题——赋值问题
    oi集训第七天感慨
    OI集训第五天总结(似乎是第一个正经题目)
    OI萌新第四天的渺(考)小(试)发(总)言(结)
    刚刚入Oi坑两天的萌新对于今天的吐槽
  • 原文地址:https://www.cnblogs.com/lzj-learn/p/11635443.html
Copyright © 2020-2023  润新知