zoukankan      html  css  js  c++  java
  • 《Head First Servlets & JSP》-7-使用JSP

    学习的知识点

    JSP,最后会变成一个servlet

    JSP最终或变成一个完整的servlet在Web应用中运行,只不过这个servlet类会由容器写好。

    JSP中的scriptlet

    所谓scriptlet就是放在<%…%>标记中的java代码。如:

    1. <%
    2. out.println(com.inspur.Counter.getCount());
    3. %>

    JSP中的指令

    JSP指令和scriptlet区别在于:多了一个@符号。注意中间无空格。
    使用page指令导入包

    • 导入一个包:
    1. <%@ page import="com.inspur.*"%>
    2. <html><body>
    3. <%
    4. out.println(Counter.getCount());
    5. %>
    6. </body></html>
    • 导入多个包,使用一个import属性,只不过多个包之间用逗号分隔
    1. <%@ page import="com.inspur.*,java.util.*"%>

    JSP表达式

    和scriptlet代码也很相似,表达式多了一个=。注意中间无空格,还要注意表达式结尾没有分号!
    scriptlet代码:
    <% out.println(Counter.getCount());%>
    表达式代码:
    <%= Counter.getCount()%>

    表达式为啥没有分号结尾?
    表达式会成为out.print()的参数!
    <%= Counter.getCount()%>,会被容器转换为:
    <% out.print(Counter.getCounter());%>,若加上分号,则会被带入外层括号内造成编译错误。
    另外,out是一个隐式对象。

    JSP中的声明

    如使用java语法声明count变量:
    <% int count=0;%>
    其实就是scriptlet啦!
    不过,有一种真正的JSP声明,和scriptlet区别在于加了一个!:
    <%! int count=0;%>
    以上两个声明的区别:
    所有scriptlet和表达式代码都放在服务方法中,即scriptlet中声明的变量总是局部变量!
    而JSP声明的变量是类变量,JSP声明方法是类方法!

    容器是如何处理JSP的?


    下面是一个简单的例子:

    隐式对象

    API 隐式对象
    JspWriter out
    HttpServletRequest request
    HttpServletResponse response
    HttpSession session
    ServletContext application
    ServletConfig config
    JSPException exception
    PageContext pageContext
    Object page

    注意,PageContext封装了其他隐式对象,即若有一个PageContext引用,就可以得到其他隐式对象的引用,并得到所有作用域的属性。

    JSP注释

    <!-- HTML 注释 用户在浏览器就可以看到我 -->
    <%-- JSP注释,页面开发人员才可能看到我 --%>

    JSP所生成的servlet的API


    我们主要关注三个关键方法:JspInit()、JSPDestroy()和_jspService().
    前两个方法都可以覆盖,而最后一个方法不可以覆盖,这也就是为啥要用下划线开头。
    后文可以看到如何覆盖方法。

    JSP的生命周期





    注意,JSP的转换和编译只发生一次,类似于其他的servlet,一旦得到加载哈初始化,请求时就只会发生一件事,即创建或分配一个线程来运行服务方法。
    但是,第一个访问JSP页面的人可能要等待一段时间了,不过JSP规范提到一种推荐的JSP预编译协议,可以看看。

    初始化JSP

    可以在JSP中完成servlet初始化工作,但是这与常规的servlet中的做法稍有不同。

    • 配置servlet初始化参数
    • 覆盖jspInit()
      使用jspInit()方法获取一个servlet初始化参数(已经在DD中配置的参数),并使用这个参数值来设置一个应用作用域属性:

    JSP中的属性

    大多数情况,都使用4个隐式对象之一来得到和设置4个JSP作用域中的属性。
    4个作用域?处理标准servlet中的请求、会话和应用(上下文)作用域,JSP第四个作用域就是页面作用域,从pageContext对象得到。

    前面说过pageContext封装了其他作用域的引用,那么下面就是一个例子:

    • 使用pageContext获得和设置属性的示例:

    JSP指令与指令属性

    page是一个JSP指令,import是它的13个属性之一,那么page指令其他的属性是什么样的?

    JSP中的EL表达式

    在JSP中放servlet、声明和表达式并不好:
    1)不应该要求WEB页面设计人员必须懂Java
    2)JSP中的Java代码很难修改和维护
    EL(Expression Language)的用户是提供一种更简单的方法来调用Java代码,但是代码本身放在被的地方。
    这些代码可能在一个普通的常规Java类中,也许是一个JavaBean、一个用静态方法的类或者某个所有的标签处理器。
    总之,按照当今的最佳实践,不能再JSP中编写方法代码,要是要把Java方法写在别的地方,再用EL来调用。

    • 阻止JSP中的脚本元素
      在DD中使用<scripting-invalid>

    • 忽略EL
      若JSP中有模板文本(普通的HTML或者文本),其中刚好包括了类似EL的东西(${somethind}),要告诉容器忽略这些看似EL的东西。(默认EL是启用的。)
      在DD中放置

      或者使用page指令:
      <%@ page isELIgnored="true" %>

    JSP中的动作元素

    • 标准动作:
      <jsp:include page="Footer.jsp" />
    • 其他动作
      <c:set var="rate" value="32" />
  • 相关阅读:
    #负分小组WEEK1#本周工作小结+下周计划
    #负分小组WEEK1#软件开发之路——需求获取与相关建模
    #负分小组WEEK1#第一次会议纪要
    #负分小组WEEK1#软件开发之路——准备阶段
    #负分小组WEEK1#确定项目——“宝宝睡吧!”儿童睡前服务服务软件+计划分工
    p6spy sql 执行记录
    apache common-lang3 工具类
    根据 ip 定位
    springcloud 与 spring boot 版本对应关系
    PowerDesign 基于mysql 数据库建模
  • 原文地址:https://www.cnblogs.com/myitroad/p/6192528.html
Copyright © 2011-2022 走看看