Java Server Page(jsp)

什么是jsp?

Jsp全称,Java  Server  Page ,java服务页面,能够提供java服务的页面
html:由html标签组成的,输出能够输出一些静态内容.
jsp:可以写html标签,还可以写java代码.
jsp页面也是需要交给tomcat服务器运行

Jsp页面如何被tomcat服务器运行?

第一次访问jsp:
    1)tomcat服务器会把jsp页面翻译成java源文件.(01.hello.jsp--->01.hello_jsp.java)
    2)tomcat服务器会把java源文件编译成class文件: _01_hello_jsp.java---->_01_hello_jsp.class
    3)读取class文件,创建类对象._01hell0_jsp类的方法
    4)执行类中的方法._01_hello_jsp类的方法
第n次访问jsp:
    4)执行类中的方法._01_hello_jsp类的方法
    直接走第4个步骤:
    注意:
        重新修改了jsp页面时,重新走翻译和编译的过程.

运行的class类是什么类?
public final class _01_hello_jsp extends org.apache.jasper.runtime.HttpJspBase
public abstract class org.apache.jasper.runtime.HttpJspBase extends javax.servlet.http.HttpServlet implements javax.servlet.jsp.HttpJspPage

jsp的源文件是一个servlet!    
servlet的技术可以用在jsp上面
servlet的生命周期:
    构造方法
    init方法
    service方法
    destory方法
jsp的生命周期
    翻译(java文件)
    编译(class文件)
    构造方法
    _jspinit方法
    _jspService方法
    _jspDestroy方法

Jsp的表达式

  语法:<%=变量或者表达式%>
    作用:想浏览器输出变量的值或表达式计算的结果
      注意:
        原理是使用out.print()方法向浏览器输出内容


Jsp脚本

   语法:<% java语句 %>
    作用:执行java语句
    原理:脚本就是原封不动地翻译到java文件的_jspservice方法中执行


Jsp声明

   语法:<%! 变量或者方法%>
    作用:用于声明变量或者方法的
    原理:声明的变量变成成员变量,声明的方法作为成员方法
      注意:
        1)不要声明和翻译后的java文件相同的方法名
        2)jsp脚本是不能声明方法的


Jsp注释

    语法:<%--jsp注释--%    >
      作用:注释jsp页面的内容
      注意:  
        html注释会被翻译执行,而jsp的注释不会被翻译和执行
        <!--<jsp:forward page="/01.hello.jsp"></jsp:forward>?还会跳转
        所以应该用:<%-- <jsp:forward page="/01.hello.jsp"></jsp:forward>m--%>

Jsp的三大指令

1、taglib指令

  作用:taglib指令用来引用标签库并设置标签库的前缀。
  taglib指令包含两个属性:
        1)uri属性:用来指定标签文件或标签库的存放位置。
        2)prifix属性:用来指定该标签锁使用的前缀。

2、include指令

  作用:用于包含其他页面的
  <%--包含头部页面 --%>
  <%@include file="/common/header.jsp" %>
原理:直接把包含与被包含的内容先合并在一起,然后翻译成一个java源文件,最后编译执行.(先合并到一起,再翻译)(源码包含,也叫做静态的包含)

3、page指令

  作用:告诉浏览器如何翻译jsp文件
<%@
    page
    language="java"         -- 使用什么语言翻译jsp文件
    import="java.util.*"    -- 导包;导入多个包中间使用逗号
jsp文件的编码相关的
    pageEncoding="utf-8"    -- 使用什么编码翻译jsp文件
    contentType="text/html; charset=utf-8" –- 服务器发送给浏览器的数据类型和内容的编码格式

异常页面相关的
    errorPage="/common/error.jsp"    -- 指定jsp错误处理页面
    isErrorPage="true"               --指定当前页面为错误处理页面,如果是错误处理页面,就可以使用exception内置对象,使用exception对象可以查看错误信息
session="true"              -- 是否打开session功能,true:打开,false:关闭
    buffer="8kb"               -- jsp页面的缓冲区大写
    isELIgnored="false"        -- 是否忽略EL表达式;true:忽略,false:不忽略
%>

分工问题:
    servlet技术:写java代码(普通的java类)
    jsp技术:输出html代码(类似于html页面)

项目中涉及的功能:
    1)接收参数信息: (servlet做)
    2)执行业务逻辑(CURD) (servlet做)
    3)返回结果,输出结果    (jsp做)
    4)跳转页面     (servlet做)

jsp的七大动作指令

(1)JSP:forward  执行页面转向,将请求的处理转发到下一个页面。
     用于将页面相应转发到另外的页面,既可以转发到静态的html页面,也可以转发到动态的JSP页面,或者转发到容器中的Servlet。
(2)JSP:param  用于传递参数,必须与其他支持参数的标签一起使用
     param用于设置参数值,这个指令本身不能单独使用,因此单独的param指令没有实际意义,param指令可以与以下指令结合使用(jsp:include  jsp:forward   jsp:plugin)
(3)JSP:include  用于动态引入一个JSP页面
     include指令时一个动态include指令,也用于包含某一个页面,它不会导入被include页面的编译指令,仅仅被导入页面的body内容插入页面。
(4)JSP:plugin 用于下载JavaBean或者Applet到客户端执行
     plugin指令主要用于下载服务器端的JavaBean或Applet到到客户端执行,由于程序在客户端执行,因此客户端必须安装虚拟机。
 (5) JSP:useBean 创建一个Javabean实例
     <jsp:useBean id="name" class="classname" scope="page|request|session|application"/>
     其中,id属性是JavaBean的实例名,class属性确定JavaBean的实现类。scope属性用于指定JavaBean实例的作用范围。
(6) JSP:setProperty  设置JavaBean实例的属性值
     <jsp:setProperty name="BeanName" property="propertyName"   value="propertyValue"/>
     其中,name属性是要确定JavaBean的实例名,property属性要确定设置属性的属性名,value属性时要确定属性名对应的值。
(7)JSP:getProperty  获取JavaBean实例的属性值
     <jsp:getProperty  name="BeanName" property="propertyName"/>
     其中,name属性时要确定JavaBean的实例名,property属性是指定要获取的属性名对应的值。
注意: 注:使用userBean标签时,除在页面脚本中创建了JavaBean实例之外,该标签还会将该JavaBean实例放入指定scope中,所以我们还需要在脚本中将JavaBean放入指定的scope中,所下面的代码所示:
pageContext.setAttribute("beanName",beanName)
request.setAtttibutr("beanName",beanName)
session.setAttribute("beanName",beanName)
application.setAttribute("beanName",beanName)

jsp九大内置对象(隐藏对象)

在jsp开发有些对象使用频率比较高,(例如:request,response,session,servletContext…)如果每次要使用这些对象都自己去获取对象才能使用,会显示太麻烦了.jsp把这些对象都创建或获取好了,我们开发者之间使用这些对象即可。这些对象叫内置对象。

jsp对象名            类型
request            HttpServletRequest        请求对象
response        HttpServletResponse        响应对象
config            ServletConfig            配置对象
application        servletContext            servlet上下文对象
session            HttpSession            会话对象
exception        Throwable    异常信息对象
page            Object        ---代表jsp文件翻译后的java类
out            JspWriter    代表输出对象,response.getWriter.PrintWriter相当于带缓冲功能的PrintWriter
pageContext        pageContext    代表jsp的上下文对象

通过pageContext获得其他对象
getException方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象

什么是EL?

EL表达式替代jsp的表达式.因为开发jsp页面的时候遵守原则:在jsp页面中尽量少写甚至不写java代码.
EL表达式作用:向浏览器输出域对象中的变量或者表达式技术的结果
语法:    ${变量或表达式}    代替:<%= 变量或者表达式%>

想要停用对EL表达式的评估的话,需要使用page指令将isELIgnored属性值设为true:
<%@ page isELIgnored ="true|false" %>
这样,EL表达式就会被忽略。若设为false,则容器将会计算EL表达式。

 EL中的基础操作符

EL表达式支持大部分Java所提供的算术和逻辑操作符:
.     访问一个Bean属性或者一个映射条目
[]     访问一个数组或者链表的元素
( )     组织一个子表达式以改变优先级
+     加
-     减或负
*     乘
/ or div     除
% or mod     取模
== or eq     测试是否相等
!= or ne     测试是否不等
< or lt     测试是否小于
> or gt     测试是否大于
<= or le     测试是否小于等于
>= or ge     测试是否大于等于
&& or and     测试逻辑与
|| or or     测试逻辑或
! or not     测试取反
empty     测试是否空值

.与 [ ] 运算符

EL 提供 . 和 [ ] 两种运算符来导航数据。下列两者所代表的意思是一样的:
${sessionScope.user.sex}等于${sessionScope.user["sex"]}
. 和 [ ] 也可以同时混合使用,如下:
${sessionScope.shoppingCart[0].price}
回传结果为shoppingCart中第一项物品的价格。
不过,以下两种情况,两者会有差异:
(1) 当要存取的属性名称中包含一些特殊字符,如. 或 – 等并非字母或数字的符号,就一定要使用 [ ],
例如:${user.My-Name }
上述是不正确的方式,应当改为:${user["My-Name"] }
(2) 我们来考虑下列情况:
${sessionScope.user[data]}
此时,data 是一个变量,假若data的值为"sex"时,那上述的例子等于${sessionScope.user.sex};
假若data 的值为"name"时,它就等于${sessionScope.user.name}。
因此,如果要动态取值时,就可以用上述的方法来做,但无法做到动态取值。

EL 变量

EL 存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page 范围找,假如找不到,
再依序到Request、Session、Application范围。假如途中找到username,就直接回传,不再继续找下去,
但是假如全部的范围都没有找到时,就回传null,当然EL表达式还会做出优化,页面上显示空白,而不是打印输出NULL。

自动转变类型

EL 除了提供方便存取变量的语法之外,它另外一个方便的功能就是:自动转变类型,我们来看下面这个范例:
${param.count + 20}
假若窗体传来count的值为10时,那么上面的结果为30。之前没接触过JSP 的读者可能会认为上面的例子是理所当然的,
但是在JSP 1.2 之中不能这样做,原因是从窗体所传来的值,它们的类型一律是String,所以当你接收之后,必须再将它转为其他类型,
如:int、float 等等,然后才能执行一些数学运算,下面是之前的做法:
String str_count =request.getParameter("count");
int count =Integer.parseInt(str_count);
count = count + 20;
所以,注意不要和java的语法(当字符串和数字用“+”链接时会把数字转换为字符串)搞混淆。

什么是JSTL?(需要导入)

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。

JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
    1、核心标签
    2、格式化标签
    3、SQL 标签
    4、XML 标签
    5、JSTL 函数

JSTL的核心标签

1、<c:out>     用于在JSP中显示数据,就像<%= ... >
语法格式
  <c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
  属性                描述          是否必要     默认值
  value     要输出的内容             是     无
  default     输出的默认值             否     主体中的内容
  escapeXml     是否忽略XML特殊字符     否     true

2、<c:set>     用于保存数据
  <c:set>标签用于设置变量值和对象属性。
  <c:set>标签就是<jsp:setProperty>行为标签的孪生兄弟。
  这个标签之所以很有用呢,是因为它会计算表达式的值,然后使用计算结果来设置 JavaBean 对象或 java.util.Map 对象的值。
语法格式
  <c:set
   var="<string>"
   value="<string>"
   target="<string>"
   property="<string>"
   scope="<string>"/>
  属性                 描述          是否必要     默认值
  value     要存储的值             否     主体的内容
  target     要修改的属性所属的对象     否     无
  property     要修改的属性             否     无
  var         存储信息的变量            否     无
  scope     var属性的作用域     否     Page

3、<c:remove>     用于删除数据
  <c:remove>标签用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。
  这个标签不是特别有用,不过可以用来确保JSP完成清理工作。
语法格式
  <c:remove var="<string>" scope="<string>"/>
  属性                   描述          是否必要     默认值
  var             要移除的变量名称     是     无
  scope     变量所属的作用域     否     所有作用域

4、<c:catch>     用来处理产生错误的异常状况,并且将错误信息储存起来
  <c:catch> 标签主要用来处理产生错误的异常状况,并且将错误信息储存起来。
语法格式
  <c:catch var="<string>">
  ...
  </c:catch>
  属性              描述         是否必要     默认值
  var    用来储存错误信息的变量    否    None

5、<c:if>     与我们在一般程序中用的if一样
  <c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
语法格式
  <c:if test="<boolean>" var="<string>" scope="<string>">
   ...
  </c:if>
  属性                描述          是否必要 默认值
  test                   条件             是     无
  var          用于存储条件结果的变量     否     无
  scope     var属性的作用域     否     page

6、<c:choose>     本身只当做<c:when>和<c:otherwise>的父标签
7、<c:when>     <c:choose>的子标签,用来判断条件是否成立
8、<c:otherwise>     <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行
  <c:choose>标签与Java switch语句的功能一样,用于在众多选项中做出选择。
  switch语句中有case,而<c:choose>标签中对应有<c:when>,switch语句中有default,而<c:choose>标签中有<c:otherwise>。
语法格式
  <c:choose>
      <c:when test="<boolean>">
          ...
      </c:when>
      <c:when test="<boolean>">
          ...
      </c:when>
      ...
      ...
      <c:otherwise>
          ...
      </c:otherwise>
  </c:choose>

属性

    <c:choose>标签没有属性。
    <c:when>标签只有一个属性,在下表中有给出。
    <c:otherwise>标签没有属性。
  属性  描述     是否必要     默认值
  test     条件        是               无

9、<c:import>     检索一个绝对或相对 URL,然后将其内容暴露给页面
  <c:import>标签提供了所有<jsp:include>行为标签所具有的功能,同时也允许包含绝对URL。
  举例来说,使用<c:import>标签可以包含一个FTP服务器中不同的网页内容。
语法格式
  <c:import
     url="<string>"
     var="<string>"
     scope="<string>"
     varReader="<string>"
     context="<string>"
     charEncoding="<string>"/>
  属性                                       描述                                          是否必要 默认值
  url             待导入资源的URL,可以是相对路径和绝对路径,并且可以导入其他主机资源     是     无
  context     当使用相对路径访问外部context资源时,context指定了这个资源的名字。     否   当前应用程序
  charEncoding     所引入的数据的字符编码集                                             否   ISO-8859-1
  var             用于存储所引入的文本的变量                                             否     无
  scope     var属性的作用域                                                     否     page
  varReader     可选的用于提供java.io.Reader对象的变量                                     否     无

10、<c:forEach>     基础迭代标签,接受多种集合类型
11、<c:forTokens>     根据指定的分隔符来分隔内容并迭代输出
这些标签封装了Java中的for,while,do-while循环。
相比而言,<c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象。

  <c:forTokens>标签通过指定分隔符将字符串分隔为一个数组然后迭代它们。
forEach 语法格式
  <c:forEach
      items="<object>"
      begin="<int>"
      end="<int>"
      step="<int>"
      var="<string>"
      varStatus="<string>">

forTokens 语法格式
  <c:forTokens
      items="<string>"
      delims="<string>"
      begin="<int>"
      end="<int>"
      step="<int>"
      var="<string>"
      varStatus="<string>">

<c:forEach>标签有如下属性:
属性                    描述                          是否必要     默认值
items     要被循环的信息                                否     无
begin     开始的元素(0=第一个元素,1=第二个元素)     否     0
end     最后一个元素(0=第一个元素,1=第二个元素)     否     Last element
step     每一次迭代的步长                             否     1
var     代表当前条目的变量名称                             否     无
varStatus     代表循环状态的变量名称                 否     无

<c:forTokens>标签与<c:forEach>标签有相似的属性,不过<c:forTokens>还有另一个属性:
属性     描述     是否必要      默认值
delims     分隔符     是               无

12、<c:param>     用来给包含或重定向的页面传递参数
<c:param>标签用于在<c:url>标签中指定参数,而且与URL编码相关。
在<c:param>标签内,name属性表明参数的名称,value属性表明参数的值。
语法格式
  <c:param name="<string>" value="<string>"/>

属性                描述          是否必要 默认值
name     URL中要设置的参数的名称     是     无
value     参数的值                     否     Body

13、<c:redirect>     重定向至一个新的URL.
 <c:redirect>标签通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持c:param标签。
语法格式
<c:redirect url="<string>" context="<string>"/>

属性                      描述                          是否必要     默认值
url                    目标URL                       是     无
context     紧接着一个本地网络应用程序的名称     否     当前应用程序

14、<c:url>     使用可选的查询参数来创造一个URL
<c:url>标签将URL格式化为一个字符串,然后存储在一个变量中。
这个标签在需要的时候会自动重写URL。
var属性用于存储格式化后的URL。
<c:url>标签只是用于调用response.encodeURL()方法的一种可选的方法。它真正的优势在于提供了合适的URL编码,包括<c:param>中指定的参数。

语法格式
<c:url
  var="<string>"
  scope="<string>"
  value="<string>"
  context="<string>"/>

属性              描述          是否必要     默认值
value            基础URL             是     无
context 本地网络应用程序的名称     否     当前应用程序
var     代表URL的变量名     否     Print to page
scope     var属性的作用域     否     Page

格式化标签

JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:

<fmt:formatNumber>     使用指定的格式或精度格式化数字
<fmt:parseNumber>     解析一个代表着数字,货币或百分比的字符串
<fmt:formatDate>     使用指定的风格或模式格式化日期和时间
<fmt:parseDate>     解析一个代表着日期或时间的字符串
<fmt:bundle>     绑定资源
<fmt:setLocale>     指定地区
<fmt:setBundle>     绑定资源
<fmt:timeZone>     指定时区
<fmt:setTimeZone>     指定时区
<fmt:message>     显示资源配置文件信息
<fmt:requestEncoding>     设置request的字符编码

猜你喜欢

转载自blog.csdn.net/scbiaosdo/article/details/81203630