《Head First Servlets & JSP》-7-使用JSP
学习的知识点

JSP,最后会变成一个servlet
JSP最终或变成一个完整的servlet在Web应用中运行,只不过这个servlet类会由容器写好。
JSP中的scriptlet
所谓scriptlet就是放在<%…%>标记中的java代码。如:
<%out.println(com.inspur.Counter.getCount());%>
JSP中的指令
JSP指令和scriptlet区别在于:多了一个@符号。注意中间无空格。
使用page指令导入包
- 导入一个包:
<%@ page import="com.inspur.*"%><html><body><%out.println(Counter.getCount());%></body></html>
- 导入多个包,使用一个import属性,只不过多个包之间用逗号分隔
<%@ 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" />
《Head First Servlets & JSP》-7-使用JSP的更多相关文章
- 【Head First Servlets and JSP】笔记19:JavaBeans与JSP动作元素(<jsp:setProperty.....>、<jsp:getProperty.....>)
内容来自imooc. 1.什么是JSP动作元素 2.在JSP页面中如何使用Javabeans <jsp:......>表示这是一个JSP动作元素 3.使用JSP动作元素创建JavaBean ...
- Java遇见HTML——JSP篇之JSP基础语法
一.JSP简介 JSP全名为Java Server Pages,Java服务器端页面,其根本是一个简化的Servlet设计,它实现了在Java中使用HTML标签.Jsp是一种动态网页技术标准,是在服务 ...
- JSP页面以及JSP九大隐式对象
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比 ...
- JSP之->初识JSP
JSP 引用百度百科的介绍: JSP(Java Server Pages)是由Sun Microsystems公司倡导.许多公司参与一起建立的一种动态网页技术标准.JSP技术有点类似ASP技术,它是在 ...
- jsp学习---使用jsp和JavaBean实现超简单网页计算器
一.需求 如题,用jsp实现一个超简单的网页计算器. 二.实现 1.效果图 1)初始界面: 2)随便输入两个数进行相乘: 3)当除数为零时提示报错: 2.代码 Calculator.java pack ...
- Java遇见HTML——JSP篇之JSP指令与动作元素
一.include指令(如:<%@include file="..."%> ) 示例: Date.jsp <%@page import="java.te ...
- HeadFirst Jsp 07 (使用 jsp)
Jsp 变成 Servlet, 容器会查看你的JSP, 把它转换成java源代码, 再编译成完整的Java servlet类. Jsp 不需要你的编译, 容器会自动替换成servlet. 在 jsp中 ...
- JSP起源、JSP的运行原理、JSP的执行过程
JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变. 如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序 ...
- jsp的静态包含与动态包含:<%@ include file="" %>和<jsp:include page=""></jsp:include>区别与分析
<%@ include file="" %>是将文件原封不动的copy进现有的文件中,像是拼接好后,再编译成为servlet运行. <jsp:include pa ...
- JSP JSP工作原理 JSP语法 JSP声明 JSP注释 JSP指令 jsp九大隐式/内置对象
1 什么是JSP 1)为什么说,Servlet是一个动态Web开发技术呢? Servlet是基于服务端的一种动态交互技术, HttpServletRequest表示客户端到服务端的 ...
随机推荐
- THUPC2017 小 L 的计算题
求 $k=1,2,\cdots,n \space \space \sum\limits_{i=1}^n a_i^k$ $n \leq 2 \times 10^5$ sol: 时隔多年终于卡过去了 之前 ...
- BerOS file system
The new operating system BerOS has a nice feature. It is possible to use any number of characters '/ ...
- 「长乐集训 2017 Day1」区间 线段树
题目 对于两个区间\((a,b),(c,d)\),若\(c < a < d\)或\(c < b < d\)则可以从\((a,b)\)走到\((c,d)\)去,现在有以下两种操作 ...
- 【转】Cron表达式简介
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month ...
- CentOS 7安装Azcopy
Azcopy是Azure存储一个非常好用的工具.本文将介绍如何在CentOS7下安装的过程. 更新:目前需要.net core 2.0版本.具体下载地址大家自己搜索. 1 安装.net core 1. ...
- 树结构ztree的 ajax交互的简单使用
今天做前端页面要用到树结构,用了第三方插件ztree,搞了好久不过终于弄出来了,, 一点小心得.(用的版本 V3 ) 首先看下载的文件结构: 一:将要用到的CSS 和 JS 拷贝到工程中,我这里在工程 ...
- js中的执行环境和作用域链
首先介绍一些即将用到的概念: 执行环境: 它定义了变量和函数有权访问其他数据的范围,每一个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个变量对象中. 所有javasc ...
- 为什么在进行Full GC之前最好进行一次Minor GC
摘自:<Java Performance>第三章 为什么在进行Full GC之前最好进行一次Minor GC? Garbage collecting the young generatio ...
- Unknown error: Unable to build: the file dx.jar was not loaded from the SDK folder!
Eclipse 编译没问题,但是运行就出现这个报错:Unknown error: Unable to build: the file dx.jar was not loaded from the SD ...
- oracle创建完实例删除的时候报ORA-01031:insufficient privileges错误,解决办法
创建了一个数据库,想删除确报了一个ORA-01031:insufficient privileges错误 查了好久,总算解决了,原因是我的电脑登录账户不在ORA_DBA系统群组中,添加进去完美删除! ...