发表于: 2017-06-16 11:16:45

1 943


今日完成

数据绑定和表单标签

基于HTTP的特性,所有HTTP请求参数类型均为字符串。有了数据绑定,就可以用下面的代码取代上面的saveProduct方法部分。

@RequestMapping(value=“product_save")

public String saveProduct(Product product,Model model)

有了数据绑定,就不再需要ProductForm类,也不需要解析Product对象的price属性了。

数据绑定的另一个好处是:当输入验证失败时,它会重新生成一个HTML表单。手工编写HTML代码时,必须记着用户之前输入的值,重新填充输入字段。有了Spring的数据绑定和表单标签库后,它们就会替你完成这些工作。


表单标签库

表单标签库中包含了可以用在JSP页面中渲染HTML元素的标签。为了使用这些标签,必须在JSP页面的开头声明这个taglib指令

<%@taglib prefix="fom" uri="http://www.springframework.org/tags/form"%>

表单标签用于渲染HTML表单。表单标签必须利用渲染表单输入字段的其他任意标签

commandName属性是最重要的属性,他定义了模型属性的名称,其中包含了一个backing object,其属性将用于填充所生成的表单。如果该属性存在,则必须返回包含该表单的视图的请求处理方法中添加响应的模型属性。

<form:form commandName="book" action="book_save" method="post">

BookController类中的inputBook方法,是返回BookAddForm.jsp的请求处理方法。下面就是inputBook方法

@RequestMapping(value = "/book_input")
public String inputBook(Model model) {
List<Category> categories = bookService.getAllCategories();
model.addAttribute("categories", categories);
model.addAttribute("book", new Book());
return "BookAddForm";
}

此处用book属性创建了一个Book对象,并添加到Modle。如果没有Model属性,BookAddForm.jsp页面就会抛出异常,因为表单标签无法找到在其commandName属性中指定的form backing object。


input标签

input标签渲染<input type="text"/>元素。这个标签最重要的属性是path,它将这个输入字段绑定到form backing object的一个属性。

Converter和Formatter,两者均可用于将一种对象类型转换成另一种对象类型。Converter是通用元件,可以在应用程序的任意层中使用,而Formatter则是专门为Web层设计的。


EL表达式语言,JSP用户用它来访问应用程序数据。

表达表达式以${开头,并以}结束。EL表达式的结构如下:

${expression}

例如,表达式x+y,可以写成:

${x+y}

对于一系列的表达式,它们的取值将是从左到右进行,计算结果的类型为String,并且连接在一起。假如a+b等于8,c+d等于10,那么这两个表达式的计算结果将是810:$(a+b)$(c+d)

表达式$(a+b)and$(c+d)的取值结果则是8and10

如果在定制标签的属性值中使用EL表达式,那么该表达式的取值结果字符串将会强制编程该属性需要的类型

<my:tag someAttribute="${expression}"/>

像${这样的字符顺序就表示是一个EL表达式的开头。如果需要的只是文本${,则需要在它前面加一个转义符,如\${。

[]和.运算符

如果EL表达式的结果是一个带有属性的对象,则可以利用[]或者.运算符来访问该属性。[]和.运算符类似;[]是比较规范的形式,.运算符则比较快捷。

为了访问对象的属性,可以使用以下任意一种形式:

${object["propertyName"]} ${object.propertyName}

取值规则

EL表达式的取值是从左到右进行的。对于expr-a[expr-b]形式的表达式,其EL表达式的取值方法如下:

(1)先计算expr-a得到expr-b

(2)如果value-a为null,则返回null

(3)然后计算expr-b得到value-b

(4)如果value-b为null,则返回null。

(5)如果value-a为java.util.Map,则会查看value-b是否为Map的一个key。若是,则返回value-a.get(value-b),若不适,则返回null.

(6)如果value-a为java.util.List,或者假如它是一个array,则要进行以下处理:

a.强制value-b为int,如果强制失败,则抛出异常。

b.如果value-a.get(value-b)抛出IndexOutOfBoundsException,或者假如Array.get(value-a,value-b)抛出ArrayIndexOutOfBoundsException,则返回null

c.否则,若value-a是个List,则返回value-a.get(value-b):若value-a是个array,则返回Array.get(value-a,value-b).

(7)如果value-a不是一个Map、List或者array,那么value-a必须是一个JavaBean.在这种情况下,必须强制value-b为String。如果value-b是value-a的一个可读属性,则要调用该属性的getter方法,从中返回值。如果getter方法抛出异常,该表达式就是无效的,否则,该表达式有效。


访问JavaBean

利用.或[]运算符,都可以访问bean的属性,其结构如下:

${beanName["propertyName"]}

${beanName.propertyName}

例如,访问myBean的secret属性,使用以下表达式:

${myBean.secret}

如果该属性是一个带属性的对象,那么同样也可以利用.或[]运算符开访问第二个对象的该属性。假如该属性是一个Map、List或者array,则可以利用上面访问Map值或List成员或array元素的同样规则。

EL隐式对象

在JSP页面中,可以利用JSP脚本来访问JSP隐式对象。

pageContext

pageContext对象表示当前JSP页面的javax.servlet.jsp.PageContext。它包含了所有其他的JSP隐式对象。

initParam用于获取上下文参数的值。例如,为了获取名为password的上下文参数值,可以使用以下表达式

${initParam.password}或者${initParam["password"]

param用于获取请求参数值。这个对象表示一个包含所有请求参数的Map。例如,要获取userName参数,可以使用以下任意一种表达式:${param.userName} ${param["userName"]}

paramValues可以获取一个请求参数的多个值。这个对象表示一个包含所有请求参数,并以参数名称作为key的Map。每个key的值是一个字符串数组,其中包含了指定参数名称的所有值。即使该参数只有一个值,它也仍然返回一个带有一个元素的数组。例如为了获得selectedOptions参数的第一个值和第二个值,可以使用以下表达式

${paramValues.selectedOptions[0]}

${paramValues.selectedOptions[1]}

header表示一个包含所有请求标题的Map。为了获取header值,要利用header名称作为key。例如,为了获得accept-language这个header值,可以使用以下表达式:

${header["accept-laguage"]}

如果header名称是一个有效的Java变量名,如connection,那么也可以使用。运算符:${header.connection}

headerValues表示一个包含所有请求head,并以header名称作为key的Map。但是,与head不同的是,隐式对象headValues返回的Map返回的是一个字符串数组。例如,为了获取标题accept-language的第一个值,要使用以下表达式:${headerValues["accept-language"][0]}

cookie可以用来获取一个cookie。这个对象表示当前HttpServletRequest中所有cookie的值。例如,为了获取名为jsessionid的cookie值,要使用以下表达式:${cookie.jsessionid.value}为了获取jessionid cookie的路径值,要使用以下表达式${cookie.jessionid.path}

算术运算符+ - * / div % mod

逻辑运算符 && and       || or  !not

关系运算符 ==和eq   !=和ne   >和gt  >=和ge   <和lt   <=和le

$(statement? A:B}如果statement的计算结果为true,那么改表达式的输出结果就是A,否则是B

emty运算符 ${empty x}


关闭JSP页面中的脚本元素

禁用EL计算


收获

数据绑定和表单标签 表达式语言

困难

明日计划

JSTL,任务4 t11页面动态化


返回列表 返回列表
评论

    分享到