2018-5-15 14:45:06

 1.tomcat容器等级

    tomcat的容器分为四个等级,Servlet的容器管理Context容器,一个Context对应一个Web 工程。

    tomcat > Container > Engine(引擎容器) > HOST(主机容器) > Servlet > 多个Context工程

2. 抽象类不能实例化,我们一般要继承他。

3.编写一个Servlet的步骤

    (1)继承HttpServlet(抽象类,实现了http协议的servlet),这个类继承了GenericServlet(抽象类,与协议无关的servlet),

            此类实现了Servelet接口(里面有三个方法Init(),service(),destroy())。

      (2)重写doGet()或doPost()方法

    (3)在web.xml中注册Servlet

4.httpServlet包在tomcat下。

5.超链接是get请求。

6.Servlet的生命周期。

    Servlet调用构造方法创建实例----->调用init()初始化方法----->调用service方法处理请求并响应---->服务器关闭后调用 destroy()方法。

7.jstl核心标签库

一、概念

    JSTL(JSP 标准标签函数库),英文全称为Java Server Pages Standard Tag Library(JSP Standard Tag Library)。 

目的:为了取代传统直接在页面上嵌入Java程序(Scripting)的做法,利用JSTL和EL来开发Web程序,以提高程序可读性、维护性和方便性。  

JSTL1.0需要支持Servlet2.3和JSP1.2的Web容器,

JSTL1.1需要支持Servlet2.4和JSP2.0的Web容器。

JSTL API下载地址为:http://jcp.org/aboutJava/communityprocess/final/jsr052/index2.html

JSTL是一个标准的已制定好的标签库,可以应用于各种领域,如:基本输入输出、流程控制、循环、XML文件剖析、数据库查询及国际化和文字格式标准化的应用等。JSTL所提供的标签函数库主要分为五大类:

(1)核心标签库 (Core tag library)

(2)I18N 格式标签库 (I18N-capable formatting tag library)

(3)SQL 标签库 (SQL tag library)

(4)XML 标签库 (XML tag library)

(5)函数标签库 (Functions tag library)

JSTL

前缀

URI

核心标签库

c

http://java.sun.com/jsp/jstl/core

I18N格式标签库

fmt

http://java.sun.com/jsp/jstl/xml

SQL标签库

sql

http://java.sun.com/jsp/jstl/sql

XML标签库

xml

http://java.sun.com/jsp/jstl/fmt

函数标签库

fn

http://java.sun.com/jsp/jstl/functions

 

二、引用

为了使用JSTL,我们需要先下载jstl安装包。

下载地址:http://www.apache.org/dist/jakarta/taglibs/standard

下载的文件名为: jakarta-taglibs-standard-current.zip

解压下载的zip包,在lib目录下有2个jar文件:jstl.jar和standard.jar。

将jstl.jar和standard.jar复制到WEB-INF/lib目录下

Core标签库

JSP中使用Core标签库,要使用taglib指令,指定引用的标签库。

[javascript] view plain copy
  1. <span style="white-space:pre">    </span><%@ taglib uri=http://java.sun.com/jsp/jstl/core prefix="c" %>  

三、核心标签库

Core 标签库,又被称为核心标签库,该标签库的工作是对于 JSP 页面一般处理的封装。在该标签库中的标签一共有 14个,被分为了四类,分别是:

q         通用核心标签: <c:out> 、 <c:set> 、 <c:remove> 、 <c:catch> 。

q         条件控制标签: <c:if> 、 <c:choose> 、 <c:when> 、 <c:otherwise> 。

q         循环控制标签: <c:forEach> 、 <c:forTokens> 。

q         URL 相关标签: <c:import> 、 <c:url> 、 <c:redirect> 、 <c:param> 。

1、 <c:out>

用于计算一个表达式,并将结果输出到当前的JspWriter对象。<c:out>标签的功能类似于JSP的表达式<%=expression %>, 或者EL表达式${el-expression}

语法1:没有本体(body)内容

<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />


语法2:有本体内容

[html] view plain copy
  1. <span style="white-space:pre">    </span><c:out value="value" [escapeXml="{true|false}"]>  
  2.         default value  
  3.     </c:out>  

属性名称

说明

EL

类型

必须

默认值

value

需要显示出来的值

Y

Object

default

如果value的值为null则显示default的值

Y

Object

escapeXml

是否转换特殊字符,如:<转换成&lt;

Y

boolean

true

 

注意

表格中的EL字段,表示此属性的值是否可以为EL 表达式,例如:Y表示 attribute = "${表达式}"为符合语法的,N 则反之。

Null 和错误处理

假若 value为null,会显示default 的值;假若没有设定default的值,则会显示一个空字符串。

一般来说,<c:out>默认会将 <、>、’、” 和 & 转换为 &lt;、&gt;、&#039;、&#034; 和 &amp;。

假若不想转换时,只需要设定<c:out>的escapeXml 属性为fasle 就可以了。

范例:

<c:out value="Hello JSP 2.0 !! " />

<c:out value="${ 3 + 5 }" />

<c:out value="${ param.data }" default="No Data" />

<c:out value="<p>有特殊字符</p>" />

<c:out value="<p>有特殊字符</p>" escapeXml="false" />


1.在网页上显示 Hello JSP 2.0 !! ;

2.在网页上显示 8;

3.在网页上显示由窗体传送过来的data 参数之值,假若没有data 参数,或data 参数的值为null 时,则网页上会显示No Data;

4.在网页上显示“<p>有特殊字符</p>”;

5.在网页上显示“有特殊字符”。


2、<c:set>

<c:set>主要用来将变量储存至JSP范围中或是JavaBean的属性中。

语法1:将 value 的值储存至范围为scope 的 varName 变量之中

<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>

语法2:将本体内容的数据储存至范围为scope 的 varName 变量之中

<c:set var="varName" [scope="{ page|request|session|application }"]>

… 本体内容

</c:set>

语法3:将 value 的值储存至 target 对象的属性中

< c:set value="value" target="target" property="propertyName" />

语法4:

将本体内容的数据储存至 target 对象的属性中

<c:set target="target" property="propertyName">

… 本体内容

</c:set>

属性:

名称

说明

EL

类型

必须

默认值

value

要被储存的值

Y

Object

var

欲存入的变量名称

N

String

scopevar

变量的JSP范围

N

String

page

target

为一JavaBean或java.util.Map对象

Y

Object

property

指定target对象的属性

Y

String

范例

(1)、<c:set var="number" scope="request" value="${1 + 1}" />

(2)、<c:set var="number" scope="session" />

${3 + 5}

</c:set>

(3)、<c:set var="number" scope="request" value="${ param.number }" />

(4)、<c:set target="User" property="name" value="${ param.Username}" />


1.将2 存入Request 范围的number 变量中;

2.将8 存入Session 范围的number 变量中;<c:set>是把本体(body)运算后的结果来当做value的值。

3.假若 ${param.number}为null 时,则移除Request 范围的number 变量;若${param.number}不为null 时,则将 ${param.number}的值存入Request 范围的number 变量中;

4.假若 ${param.Username}为null 时,则设定User(JavaBean)的name 属性为null;若不为

null 时,则将 ${param.Username}的值存入User(JavaBean)的name 属性(setter 机制)。

注意

上述范例的3.中,假若 ${param.number}为null时,则表示移除Request范围的number变量。


3、<c:remove>

<c:remove>主要用来移除变量。

语法

<c:remove var="varName" [scope="{ page|request|session|application }"] />

属性

名称

说明

EL

类型

必须

默认值

var

欲移除的变量名称

N

String

scope

var变量的JSP范围

N

String

page

说明

<c:remove>必须要有var 属性,即要被移除的属性名称,scope 则可有可无,

例如:<c:remove var="number" scope="session" />

将number 变量从Session 范围中移除。若我们不设定scope,则<c:remove>将会从Page、Request、Session 及Application 中顺序寻找是否存在名称为number 的数据,若能找到时,则将它移除掉,反之则不会做任何的事情。

注意:当不指定scope时,会remove掉从page到application的var指定的变量。

4、<c:catch>

<c:catch>主要用来处理产生错误的异常状况,并且将错误信息储存起来。

语法

<c:catch [var="varName"] >

… 欲抓取错误的部分

</c:catch>

属性

名称

说明

EL

类型

必须

默认值

var

用来储存错误信息的变量

N

String

说明

<c:catch>主要将可能发生错误的部分放在<c:catch>和</c:catch>之间。如果真的发生错误,可以将错误信息储存至varName 变量中,例如:

<c:catch var="message">

: //可能发生错误的部分

</c:catch>

另外,当错误发生在<c:catch>和</c:catch>之间时,则只有<c:catch>和</c:catch>之间的程序会被中止忽略,但整个网页不会被中止

如果没有发生异常,而var所标识的范围变量存在,那么它将被移除。

如果没有指定var属性,那么异常只是被简单地捕获,异常信息并不会被保存。

[html] view plain copy
  1. <c:catch var=“exception”>  
  2.   <%  
  3.         int i = 5;  
  4.         int j = 0;  
  5.         int k = i / j;  
  6.    %>  
  7. </c:catch>  
  8. <c:out value=“${exception}” /><p>  
  9. <c:out value=“${exception.message}” /><p>  
  10. ${exception.message}相当于调用exception.getMessage()  

以下四个是:条件标签

      <c:if>

<c:choose>

<c:when>

<c:otherwise>

5、<c:if>

<c:if>的用途就和我们一般在程序中用的if 一样。

语法1:没有本体内容(body)

<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]/>

语法2:有本体内容

<c:if test="testCondition" [scope="{page|request|session|application}"] [var="varName"] >

      body content

</c:if>

属性

名称

说明

EL

类型

必须

默认值

Test

如果表达式的结果为true,则执行本体内容,false则相反

Y

boolean

var

用来储存test运算后的结果,即true或false

N

String

scope

var变量的JSP范围

N

String

page

示例

[html] view plain copy
  1. <c:if test="${user.visitCount==1}">  
  2.     This is your first visit. Welcome to the site!  
  3. </c:if>  
  4. <c:if test="${param.name==‘admin’}" var="result" />  
  5. <c:out value=“${result}” />  


6、<c:choose>

<c:choose>本身只当做 <c:when> 和 <c:otherwise> 的父标签。

语法

<c:choose>

本体内容( <when> 和 <otherwise> )

</c:choose>

限制

<c:choose>的本体内容只能有:

空白

1 或多个 <c:when>

0 或多个 <c:otherwise>

若使用<c:when><c:otherwise>来做流程控制时,两者都必须为<c:choose>的子标签.

<c:when>

<c:when>的用途就和我们一般在程序中用的when 一样。

语法

<c:when test="testCondition" >

本体内容

</c:when>

属性

名称

说明

EL

类型

必须

默认值

Test

如果表达式的结果为true,则执行本体内容,false则相反

Y

boolean

 

限制

 <c:when>必须在<c:choose>和</c:choose>之间

 在同一个<c:choose>中时,<c:when>必须在<c:otherwise>之前

说明

<c:when>必须有test 属性,当test中的表达式结果为true时,则会执行本体内容;如果为

false时,则不会执行。


<c:otherwise>

在同一个 <c:choose> 中,当所有 <c:when> 的条件都没有成立时,则执行<c:otherwise> 的本体内容。

语法

<c:otherwise>

本体内容

</c:otherwise>

常用方式:

[html] view plain copy
  1. <c:choose>  
  2.     <c:when test="testCondition">  
  3.          body content  
  4.     </c:when>  
  5.     ……  
  6.     <c:otherwise>  
  7.         conditional block  
  8.     </c:otherwise>  
  9. </c:choose>  

7、<c:forEach>

<c:forEach> 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时,就会持续重复执行<c:forEach>的本体内容。

语法1:迭代一集合对象之所有成员

<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"][end="end"] [step="step"]>

本体内容

< /c:forEach>

语法2:迭代指定的次数

<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end"[step="step"]>

本体内容

</c:forEach>

限制

假若有begin 属性时,begin 必须大于等于 0

假若有end 属性时,必须大于begin

假若有step 属性时,step 必须大于等于0

Null 和错误处理

假若items 为null 时,则表示为一空的集合对象

假若begin 大于或等于items 时,则迭代不运算

 

[html] view plain copy
  1. <%@ page contentType="text/html;charset=GB2312 " %>  
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
  3. <html>  
  4. <head>  
  5. <title>CH7 - Core_forEach.jsp</title>  
  6. </head>  
  7. <body>  
  8. <h2><c:out value="<c:forEach> 的用法" /></h2>  
  9. <%  
  10. String atts[] = new String [5];  
  11. atts[0]="hello";  
  12. atts[1]="this";  
  13. atts[2]="is";  
  14. atts[3]="a";  
  15. atts[4]="pen";  
  16. request.setAttribute("atts", atts);  
  17. %>  
  18. <c:forEach items="${atts}" var="item" >  
  19. ${item}</br>  
  20. </c:forEach>  
  21. </body>  
  22. </html>  

<c:forEach>除了支持数组之外,还有标准J2SE 的集合类型,例如:ArrayList、List、LinkedList、Vector、Stack和Set 等等;另外还包括java.util.Map 类的对象.

<c:forEach>并不只是用来浏览集合对象而已,读者可以从语法2中发现,items并不存在
,但是当没有使用items 属性时,就一定要使用begin end 这两个属性。

[html] view plain copy
  1. <%@ page contentType="text/html;charset=GB2312" %>  
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
  3. <html>  
  4. <head>  
  5. <title>CH7 - Core_forEach2.jsp</title>  
  6. </head>  
  7. <body>  
  8. <h2><c:out value="<c:forEach> 循环" /></h2>  
  9. <c:forEach begin="1" end="10" var="item" >  
  10. ${item}</br>  
  11. </c:forEach>  
  12. </body>  
  13. </html>  

上述范例中,我们并没有执行浏览集合对象,只是设定begin 和end 属性的值,这样它就变成一个普通的循环。此范例是将循环设定为:从1 开始跑到10,总共会重复循环10 次,并且将数字放到item 的属性当中. begin主要用来设定在集合对象中开始的位置(注意:第一个位置为0);end 用来设定结束的位置;而step 则是用来设定现在指到的成员和下一个将被指到成员之间的间隔.

另外,<c:forEach>还提供varStatus 属性,主要用来存放现在指到之成员的相关信息。例如:varStatus="s",那么将会把信息存放在名称为s的属性当中。varStatus属性还有另外四个属性:index、count、first 和last,它们各自代表的意义如表:

属性

类型

意义

index

number

现在指到成员的索引

count

number

总共已经指到成员的总数

first

boolean

现在指到的成员是否为第一个成员

last

boolean

现在指到的成员是否为最后一个成员

 我们可以使用varStatus 属性取得循环正在浏览之成员的信息,下面为一个简单的范例:

 

[html] view plain copy
  1. <%@ page contentType="text/html;charset=GB2312" %>  
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
  3. <html>  
  4. <head>  
  5. </head>  
  6. <body>  
  7. <h2><c:out value="<c:forEach> varStatus 的四种属性" /></h2>  
  8. <%  
  9. String atts[] = new String [5];  
  10. atts[0]="hello";  
  11. atts[1]="this";  
  12. atts[2]="is";  
  13. atts[3]="a";  
  14. atts[4]="pen";  
  15. request.setAttribute("atts", atts);  
  16. %>  
  17. <c:forEach items="${atts}" var="item"varStatus="s">  
  18. <h2><c:out value="${item}"/>的四种属性:</h2>  
  19. index:${s.index}</br>  
  20. count:${s.count}</br>  
  21. first:${s.first}</br>  
  22. last:${s.last}</br>  
  23. </c:forEach>  
  24. </body>  
  25. </html>  

还有一个例子:

我要获取:http://localhost:8080/t/index.jsp?a=123&b=256&com=297中的参数列表按如下:

键com:297
键b:256
键a:123

可以结合EL表单式实现:

[html] view plain copy
  1. <c:forEach items="${param}" var="b">  
  2.         键${b.key}:${b.value }<br/>  
  3. </c:forEach>  

8、<c:forTokens> 

<c:forTokens> 用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。
语法:
<c:forTokens   items="stringOfTokens"  
delims="delimiters" [var="varName"] [varStatus="varStatusName"][begin="begin"] [end="end"] [step="step"]>

本体内容
</c:forTokens>  


 

说明
<c:forTokens>的begin、end、step、var 和varStatus 用法都和<c:forEach>一样,因此,笔者在这里就只介绍items 和delims 两个属性:items 的内容必须为字符串;而delims 是用来分割items 中定义的字符串之字符。
范例
下面为一个典型的<c:forTokens>的范例:

[html] view plain copy
  1. <c:forTokens items="A,B,C,D,E" delims="," var="item" >  
  2. ${item}  
  3. </c:forTokens>  
上面范例执行后,将会在网页中输出ABCDE。它会把符号“,”当做分割的标记,拆成5 个部分,也就是执行循环5 次,但是并没有将A,B,C,D,E 中的“,”显示出来。items 也可以放入EL 的表达式,如下:
[html] view plain copy
  1. <%  
  2. String phoneNumber = "123-456-7899";  
  3. request.setAttribute("userPhone", phoneNumber);  
  4. %>  
  5. <c:forTokens items="${userPhone}" delims="-" var="item" >  
  6. ${item}  
  7. </c:forTokens>  

这个范例将会在网页上打印1234567899,也就是把123-456-7899以“-”当做分割标记,将字符串拆为3 份,每执行一次循环就将浏览的部分放到名称为item 的属性当中。delims 不只指定一种字符来分割字符串,它还可以一次设定多个分割字符串用的字符。如下面这个范例:

[html] view plain copy
  1. <c:forTokens items="A,B;C-D,E" delims=",;-" var="item" >  
  2. ${item}  
  3. </c:forTokens>  

此范例会在网页输出ABCDE,也就是说,delims 可以一次设定所有想当做分割字符串用的字符。其实用<c:forEach>也能做到分割字符串,写法如下:

[html] view plain copy
  1. <c:forEach items="A,B,C,D,E" var="item" >  
  2. ${item}  
  3. </c:forEach>  

上述范例同样也会在网页输出ABCDE。<c:forEach>并没有delims这个属性,因此<c:forEach>无法设定分割字符串用的字符,而<c:forEach>分割字符串用的字符只有“,”,这和使用<c:forTokens>,delims 属性设为“,”的结果相同。所以如果使用<c:forTokens>来分割字符串,功能和弹性上会比使用<c:forEach>来得较大。


       

阅读更多
个人分类: 日常百度
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭