web。xml 中JSP配置、servlet配置 EL表达式

【摘要】

  1. servlet 基本配置
 <servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.dy.java.servlet.LoginServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>

JSP 配置

 <servlet>
<servlet-name>configuration</servlet-name>
<jsp-file>configuration.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>configurationt</servlet-name>
<url-pattern>/configuration</url-pattern>
</servlet-mapping>

<jsp-config>标签 

 作用: web.xml中的<jsp-config>标签支持对JSP的批量配置

<jsp-config> 包括 <taglib> 和 <jsp-property-group> 【 taglib 】  n。标签库;标签】

其中<taglib> 元素在JSP 1.2 时就已经存在;用于定义taglib 属性。

而<jsp-property-group> 是JSP 2.0 新增的元素。用于批量定义JSP属性      <jsp-property-group> 元素主要有八个子元素,它们分别为: 

1.<description>:设定的说明 
2.<display-name>:设定名称 
3.<url-pattern>:设定值所影响的范围,如: /CH2 或 /*.jsp
4.<el-ignored>:若为 true,表示不支持 EL 语法 
5.<scripting-invalid>:若为 true,表示不支持 <% scripting %>语法 
6.<page-encoding>:设定 JSP 网页的编码 
7.<include-prelude>:设置 JSP 网页的抬头,扩展名为 .jspf
8.<include-coda>:设置 JSP 网页的结尾,扩展名为 .jspf

<jsp-config>
<taglib>
<taglib-uri>Taglib</taglib-uri>
<taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location>
</taglib>
<jsp-property-group>
<description>Special property group for JSP Configuration JSP example.</description>
<display-name>JSPConfiguration</display-name>
<url-pattern>/jsp/* </url-pattern>
<el-ignored>true</el-ignored>
<page-encoding>GB2312</page-encoding>
<scripting-invalid>true</scripting-invalid>
<include-prelude>/include/prelude.jspf</include-prelude>
<include-coda>/include/coda.jspf</include-coda>
</jsp-property-group>
</jsp-config>

对于Web 应用程式来说,Scriptlet 是个不乐意被见到的东西,因为它会使得HTML 与Java 程式码交相混杂,对于程式的维护来说相当的麻烦,必要的时候,您可以在web.xml 中加上<script-invalid> 标签,设定所有的JSP 网页都不可以使用Scriptlet ,例如:

<web-app ..>
....
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<script-invalid>true</script-invalid>
</jsp-property-group>
</jsp-config>
....
</web-app>

EL表达式

EL 全名为Expression Language

EL 语法很简单,它最大的特点就是使用上很方便。接下来介绍EL主要的语法结构

${sessionScope.user.sex}    /*  从Session的范围中,取得用户的性别 */

所有EL都是以${为起始、以}为结尾的。上述EL范例的意思是:从Session的范围中,取得

用户的性别。假若依照之前JSP Scriptlet的写法如下:

User user = (User)session.getAttribute("user");

String sex = user.getSex( );

两者相比较之下,可以发现EL 的语法比传统JSP Scriptlet 更为方便、简洁。

.与 [ ] 运算符

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。

属性范围(jstl名称)

EL中的名称

Page

PageScope

Request

RequestScope

Session

SessionScope

Application

ApplicationScope

我们也可以指定要取出哪一个范围的变量:

范例

说明

${pageScope.username}

取出Page范围的username变量

${requestScope.username}

取出Request范围的username变量

${sessionScope.username}

取出Session范围的username变量

${applicationScope.username}

取出Application范围的username变量

其中,pageScope、requestScope、sessionScope和applicationScope都是EL 的隐含对象,由它们的名称可以很容易猜出它们所代表的意思,例如:${sessionScope.username}是取出Session范围的username 变量。这种写法是不是比之前JSP 的写法:

String username = (String) session.getAttribute("username");容易、简洁许多.

自动转变类型

E除了提供方便存取变量的语法之外,它另外一个方便的功能就是:自动转变类型,我们来看下面这个范例:

${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的语法(当字符串和数字用“+”链接时会把数字转换为字符串)搞混淆喽


EL 
隐含对象

JSP有9个隐含对象,而EL也有自己的隐含对象。EL隐含对象总共有11 个

隐含对象

类型

说明

PageContext

javax.servlet.ServletContext

表示此JSP的PageContext

PageScope

java.util.Map

取得Page范围的属性名称所对应的值

RequestScope

java.util.Map

取得Request范围的属性名称所对应的值

sessionScope

java.util.Map

取得Session范围的属性名称所对应的值

applicationScope

java.util.Map

取得Application范围的属性名称所对应的值

param

java.util.Map

如同ServletRequest.getParameter(String name)。回传String类型的值

paramValues

java.util.Map

如同ServletRequest.getParameterValues(String name)。回传String[]类型的值

header

java.util.Map

如同ServletRequest.getHeader(String name)。回传String类型的值

headerValues

java.util.Map

如同ServletRequest.getHeaders(String name)。回传String[]类型的值

cookie

java.util.Map

如同HttpServletRequest.getCookies()

initParam

java.util.Map

如同ServletContext.getInitParameter(String name)。回传String类型的值

 

不过有一点要注意的是如果你要用EL输出一个常量的话,字符串要加双引号,不然的话EL会默认把你认为的常量当做一个变量来处理,这时如果这个变量在4个声明范围不存在的话会输出空,如果存在则输出该变量的值。

属性(Attribute)与范围(Scope)

与范围有关的EL 隐含对象包含以下四个:pageScope、requestScope、sessionScope 和

applicationScope,它们基本上就和JSP的pageContext、request、session和application一样,所以笔者在这里只稍略说明。不过必须注意的是,这四个隐含对象只能用来取得范围属性值,即JSP中的getAttribute(String name),却不能取得其他相关信息,例如:JSP中的request对象除可以存取属性之外,还可以取得用户的请求参数或表头信息等等。但是在EL中,它就只能单纯用来取得对应范围的属性值,例如:我们要在session 中储存一个属性,它的名称为username,在JSP 中使用session.getAttribute("username") 来取得username 的值, 但是在EL中,则是使用${sessionScope.username}来取得其值的。

cookie

所谓的cookie是一个小小的文本文件,它是以key、value的方式将Session Tracking的内容记录在这个文本文件内,这个文本文件通常存在于浏览器的暂存区内。JSTL并没有提供设定cookie的动作,因为这个动作通常都是后端开发者必须去做的事情,而不是交给前端的开发者。假若我们在cookie 中设定一个名称为userCountry的值,那么可以使用${cookie.userCountry}来取得它。

header 和headerValues

header 储存用户浏览器和服务端用来沟通的数据,当用户要求服务端的网页时,会送出一个记载要求信息的标头文件,例如:用户浏览器的版本、用户计算机所设定的区域等其他相关数据。假若要取得用户浏览器的版本,即${header["User-Agent"]}。另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。

注意:因为User-Agent 中包含“-”这个特殊字符,所以必须使用“[]”,而不能写成

$(header.User-Agent)。

initParam

就像其他属性一样,我们可以自行设定web 站台的环境参数(Context),当我们想取得这些参数initParam就像其他属性一样,我们可以自行设定web 站台的环境参数(Context),当我们想取得这些参数

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

version="2.4">:

<context-param>

<param-name>userid</param-name>

<param-value>mike</param-value>

</context-param>:

</web-app>

那么我们就可以直接使用 ${initParam.userid}来取得名称为userid,其值为mike 的参数。下面是之前的做法:String userid = (String)application.getInitParameter("userid");

param和paramValues
在取得用户参数时通常使用一下方法:

request.getParameter(String name)
request.getParameterValues(String name)

在 EL中则可以使用param和paramValues两者来取得数据。
${param.name}
${paramValues.name}

这里param 的功能和request.getParameter(String name)相同,而paramValues和
request.getParameterValues(String name)相同。如果用户填了一个表格,表格名称为username,则我们就可以使用${param.username}来取得用户填入的值。

看到这里,大家应该很明确EL表达式只能通过内置对象取值,也就是只读操作,如果想进行写操作的话就让后台代码去完成,毕竟EL表达式仅仅是视图上的输出标签罢了。

pageContext

我们可以使用 ${pageContext}来取得其他有关用户要求或页面的详细信息。下表列出了几个比较常用的部分

Expression

说明

${pageContext.request.queryString}

取得请求的参数字符串

${pageContext.request.requestURL}

取得请求的URL,但不包括请求之参数字符串,即servlet的HTTP地址。

${pageContext.request.contextPath}

服务的webapplication的名称

${pageContext.request.method}

取得HTTP的方法(GET、POST)

${pageContext.request.protocol}

取得使用的协议(HTTP/1.1、HTTP/1.0)

${pageContext.request.remoteUser}

取得用户名称

${pageContext.request.remoteAddr}

取得用户的IP地址

${pageContext.session.new}

判断session是否为新的,所谓新的session,表示刚由server产生而client尚未使用

${pageContext.session.id}

取得session的ID

${pageContext.servletContext.serverInfo}

取得主机端的服务信息

这个对象可有效地改善代码的硬编码问题,如页面中有一A标签链接访问一个SERVLET,如果写死了该SERVLET的HTTP地址那么如果当该SERVLET的SERVLET-MAPPING改变的时候必须要修改源代码,这样维护性会大打折扣。

EL算术运算

表达式语言支持的算术运算符和逻辑运算符非常多,所有在Java语言里支持的算术运算符,表达式语言都可以使用;甚至Java语言不支持的一些算术运算符和逻辑运算符,表达式语言也支持。

Code

上面页面中示范了表达式语言所支持的加、减、乘、除、求余等算术运算符的功能,读者可能也发现了表达式语言还支持div、mod等运算符。而且表达式语言把所有数值都当成浮点数处理,所以3/0的实质是3.0/0.0,得到结果应该是Infinity。

如果需要在支持表达式语言的页面中正常输出“$”符号,则在“$”符号前加转义字符“\”,否则系统以为“$”是表达式语言的特殊标记。

EL关系运算符

关系运算符

说明

范例

结果

== 或 eq

等于

${5==5}或${5eq5}

true

!= 或 ne

不等于

${5!=5}或${5ne5}

false

< 或 lt

小于

${3<5}或${3lt5}

true

> 或 gt

大于

${3>5}或{3gt5}

false

<= 或 le

小于等于

${3<=5}或${3le5}

true

>= 或 ge

大于等于

5}或${3ge5}

false

表达式语言不仅可在数字与数字之间比较,还可在字符与字符之间比较,字符串的比较是根据其对应UNICODE值来比较大小的。

注意:在使用EL 关系运算符时,不能够写成:
${param.password1} = = ${param.password2}
或者
${ ${param.password1 } = = ${ param.password2 } }
而应写成
${ param.password1 = = param.password2 }


EL
逻辑运算符

逻辑运算符

范例

结果

&&或and

交集${A && B}或${A and B}

true/false

||或or

并集${A || B}或${A or B}

true/false

!或not

非${! A }或${not A}

true/false

Empty 运算符

Empty 运算符主要用来判断值是否为空(NULL,空字符串,空集合)。

条件运算符

${ A ? B : C}

web.xml中JSP配置及 EL表达式的更多相关文章

  1. SpringMVC(十六):如何使用编程方式替代/WEB-INF/web.xml中的配置信息

    在构建springmvc+mybatis项目时,更常用的方式是采用web.xml来配置,而且一般情况下会在web.xml中使用ContextLoaderListener加载applicationCon ...

  2. Spring中,applicationContext.xml 配置文件在web.xml中的配置详解

    一.首先写一下代码结构. 二.再看web.xml中的配置情况. <?xml version="1.0" encoding="UTF-8"?> < ...

  3. 使用Spring时web.xml中的配置

    使用Spring时web.xml中的配置: <?xml version="1.0" encoding="UTF-8"?> <web-app x ...

  4. J2EE进阶(五)Spring在web.xml中的配置

     J2EE进阶(五)Spring在web.xml中的配置 前言 在实际项目中spring的配置文件applicationcontext.xml是通过spring提供的加载机制自动加载到容器中.在web ...

  5. Struts在Web.xml中的配置及Struts1和Struts2的区别

    (1)配置Struts的ActionServlet     <servlet>元素来声明ActionServlet    <servlet-name>元素:用来定义Servle ...

  6. spring 和springmvc 在 web.xml中的配置

    (1)问题:如何在Web项目中配置Spring的IoC容器? 答:如果需要在Web项目中使用Spring的IoC容器,可以在Web项目配置文件web.xml中做出如下配置: <!-- Sprin ...

  7. Jsp在Web.xml中的配置

    以下列出web.xml经常使用的标签元素及这些标签元素的功能: 1.指定欢迎页面.比如: <welcome-file-list> <welcome-file-list> < ...

  8. servlet中用注解的方式读取web.xml中的配置信息

    在学习servletContext的时候,我们知道了可以在web.xml中通过<context-param>标签来定义全局的属性(所有servlet都能读取的信息),并在servlet中通 ...

  9. Spring web.xml中的配置

    转载博客:http://blog.163.com/zhangke_616/blog/static/191980492007994948206/ 在实际项目中spring的配置文件application ...

随机推荐

  1. Jquery插件学习

    前端开发也工作了一段时间,Jquery代码页写了很多,但是都是些的很零散的,不是很好用,网上看了很多人写的Jquery 很好用,而且到每个项目中都可以使用, 本人就感觉很好奇他们是怎么做到的呢,于是自 ...

  2. js判断图片上传时的文件大小,和宽高尺寸

    今天在做图片上传的小功能,使用了一个kissy上传组件.很好奇它是如何在图片上传前,检测到图片的大小和尺寸的?我们来写个小实例实现一下吧 如何读取图片的size 首先,原生input file控件有个 ...

  3. sql 自定义函数-16进制转10进制

    做过笔记,好记性不如烂笔头: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[HEXTOINT]') and ...

  4. CSS设置行内元素和块级元素的水平居中、垂直居中

    CSS设置行内元素的水平居中 div{text-align:center} /*DIV内的行内元素均会水平居中*/ CSS设置行内元素的垂直居中 div{height:30px; line-heigh ...

  5. [改善Java代码]不要覆写静态方法

    建议33: 不要覆写静态方法 我们知道在Java中可以通过覆写(Override)来增强或减弱父类的方法和行为,但覆写是针对非静态方法(也叫做实例方法,只有生成实例才能调用的方法)的,不能针对静态方法 ...

  6. 【网络收集】Sql Server datetime 常用日期格式转换

    ) , sfrq, ) 我们经常出于某种目的需要使用各种各样的日期格式,当然我们可以使用字符串操作来构造各种日期格式,但是有现成的函数为什么不用呢? SQL Server中文版的默认的日期字段date ...

  7. Microsoft Dynamics CRM 2011的组织服务中的RetrieveMultiple方法(转)

    本篇文章,介绍Microsoft Dynamics CRM 2011的组织服务中的RetrieveMultiple方法. RetreiveMultiple方法,用于获取实体的多个实例,该方法的签名如下 ...

  8. oracle是数据库的学习第一节:数据库的安装

    一.本地oracle服务器 1.安装oracle服务器,可以到oracle官方网站上下载与自己电脑匹配的服务器,一般用10g,或者11g; 2.打开cmd,打开sql*plus,之后可以写SQL语句了 ...

  9. PHP自定义日期英文格式 Feb 11,2015

    背景:[PHP小工具]项目中,经常会要求多版本语言支持,而日期也是必不可少的组成元素. 英文日期书写顺序分英式和美式,举例如. 美国:月日年(January 8th,2014 或 January 8, ...

  10. C# list使用方法

    C# list使用方法 集合是OOP中的一个重要概念,C#中对集合的全面支持更是该语言的精华之一. 为什么要用泛型集合? 在C# 2.0之前,主要可以通过两种方式实现集合: a.使用ArrayList ...