《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隐式对象
JspWriterout
HttpServletRequestrequest
HttpServletResponseresponse
HttpSessionsession
ServletContextapplication
ServletConfigconfig
JSPExceptionexception
PageContextpageContext
Objectpage

注意,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" />

转载于:https://www.cnblogs.com/myitroad/p/6192528.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值