It计算机课件 Struts2框架_第1页
It计算机课件 Struts2框架_第2页
It计算机课件 Struts2框架_第3页
It计算机课件 Struts2框架_第4页
It计算机课件 Struts2框架_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

iCarnegie

poweredbyCarnegieMellon

Struts2框架

什么是框架?

•什么是框架?

框架,BPframeworko其实就是某种应

用的半成品,就是一组组件,供开发系统使

用,它们相互协作实现某一功能或行为。而

且,框架一般是成熟的,不断升级的软件。

■什么是框架?

・“框架的强大之处不是源自它能让你做什么,

而是它不能让你做什么。”(Rickard)。

•Rickard解释框架为:框架使混乱的东西变得

结构化。

•Web应用程序框架则鼓励开发人员使用一系

列框架所提供的基础类和类库,从而避免杂

乱的JSP所造成的混乱。

组件的种类

软件组件根据性质不同大致分为两类:

•业务逻辑组件:直接处理业务的组件,由于

业务性质的不同不大可能在不同的系统中重

・应用服务组件:如决定程序流向的控制、输

入的校验、错误处理及标签库等这些只与程

序相关的组件,在不同的系统中可以很好地

得到重用

传统JSPWeb应用紧耦合Model

-5ebCariAti«r

User

Action

Syslern

Response

传统JSPWeb应用松耦合Model

,vd/KiCOn【direr、

Servlet

/□UserA[<Con:0116r1)|、、

Action

,,)[^5BSLB^■・O«tB

4

_Li=i__LyL_J

片田-8^_SyMem

-<JSP>J

BrowseiResponse(View)

J

,y|工,

M^/WeDM定予

的MVC模式

MVC模式(传统的单机中的MVC模式)

-MVC模式设法减少可复用的域模型与显示代码之

间的联系。它通过在显示层与域对象之间引入一

个控制器来实现。

-控制器处理来自显示层的事件,并将事件映射为

域模型的改动。

-控制器通过注册显示层以获得域模型被改动的通

知,从而令显示层能被更新。

传统M¥€梗式的事件流

cftd5ConiegieMeUos

M^/WeDM定予

的MVC模式

传统MVC模式的问题:

-在Web世界中,视图是在客户端浏览器中生成的,

而控制器和模型则在服务器端。

-传统MVC模式在HTTP和HTML世界中是行不通的,

使用HTTP请求/响应模式的Web应用程序需要一

个与传统MVC模式截然不同的设计,这个设计借

用了传统MVC模式的名字和一些方式。

M^/WeDM定予

的MVC模式

传统MVC模式的问题(续):

-在Web版的MVC中,视图不能直接调用控制器,

但是可以基于web请求映射成不同的URL。

-视图不是一个可被更新的对象,而是在客户端发

出新请求的时候随之重新呈现的Web页面。

-模型也不能将自身的改变通知视图,因为视图动

态呈现在不同机器的用户浏览器中。因此视图每

次都要依据最新的数据重新生成。

M^/WeDM定予

的MVC模式

传统MVC模式的更新:前端控制器(FrontController)

-在Web世界中MVC应用程序是通过使用前端控制器实现的。

-该模式包含一个分发器(在Java的webMVC实现中,使用

Servlet来实现分发器)。

-分发器将URL请求映射成需要执行的命令实例

(commandinstance.它是action-Struts的基本要素)。

-action与系统后端的服务(服务组合成模型)进行交互。

-命令实例处理完业务逻辑后返回一个码值,码值映射到一

个视图。

-最后,结合控制器和模型,视图呈现给用户。

-通常视图会使用标签库,以便更简单地访问数据。

二客户端

控制器视图

Web成川程序中的MVL事件流

.Struts简介

•Struts是一个基于SunJ2EE平台的MVC

框架,是MVC模式的一种实现。

•Struts继承了MVC的各项特性,并根据

J2EE的特点,做了相应的变化与扩展。

•Struts能充分满足应用开发的需求,简

单易用,敏捷迅速,颇受关注。

|Struts的结构

业务逻辑:

业务逻辑更新模型的状态,并帮助

控制应用程序的流程。就Struts而言,

业务逻辑是由Action类完成的。

Action类封装了具体的处理过程,调

用业务逻辑模块,并将响应提交给合适

的视图组件以产生响应。

|Struts的结构

View(视图):

视图就是一个JSP文件。其中没

有流程逻辑,没有业务逻辑,也没有模

型信息一只有标记。标记是使Struts

有别于其他框架(如Velocity)的因素

之一。

|Struts的结构

控制类:

(1)将客户请求映射到相应的Action类,如

果该类第一次收到请求,服务器将实例化该

类。

(2)调用Action实例的exectue()方法。

(3)exectue()方法返回一个resultcode—说

明执行结果的String。resultcode并非一

定对应一个将被执行的result(如JSP页面、

Servlet或另一个Action),尽管通常如此。

|Struts开发步骤

开发Struts实例的步骤(以Eclipse环境为

例)

-将相应的支持包引入开发环境

-定制web特性

一开发action类

一配置action

一使用action

Struts2概述

•Struts2是现今最流行的Web框架之一,

是基于MVC模式构建的一种先进的WEB

解决方案。

•Struts2中使用IOC和AOP最先进的设计

思想,使得控制器与容器最大程度的解耦,

让系统的核心业务代码与表示层分离。

•Struts2的提供了如国际化/类型转换,数

据验证,ajax等一系列优越的功能。

Struts2概述

•从根本上讲,Struts2是一个MVC框架。

•Struts2除了是一个MVC框架之外,还是

一个小巧的轻量级容器。让你可以创建

某些特性,以便让其它程序员从你所构

建的独一无二的容器中收益。

容器能够做什么

•Java运行环境中包括多种类型应用程序的组件,

JavaEE产品必须支持这些组件。

•Java容器是为相应类型的应用程序组件提供所

需服务的运行时环境。

•同种类型的不同产品容器在很多方面有差异,

如成本、性能和支持等。一个容器的关键是为

了装入相应的程序并为代码提供特有的特性。

・一个容器拥有越多有用的特性,则该容器就越

好。

Struts2的轻量级容器

•Servlet容器提供了规范要求的特性,或者说

提供了容器开发者所实现的特性。其它Java

EE容器也是如此。

•轻量级容器则不同,它允许为一个基本的容

器增加新的特性,使其符合特定应用程序的

要求。

•比如,要为程序员提供简单的事务支持,但

是不要用EJB,则可以将事务支持特性加入

到轻量级容器中,使装入容器的项目受益。

Xwork和Struts2之间交互图

四y及CoinedeMelLai

■Struts2处理流程

4山上

|Struts2特点

1.无需与ServletAPI整合,更容易测试

2.优雅的请求参数封装

3.灵活的视图技术

4.丰富的表达式语言

5.机动,灵活,简单的配置

6.线程安全的控制器(Action)

7.众多的插件

|Struts2相对于Strutsl的优势

•Struts2的应用无需依赖于ServletAPI和Struts

API

•Struts2提供了拦截器,利用拦截器可以进行

AOP编程,实现如权限拦截等功能

•Strut2提供了类型转换器,我们可以把特殊的

请求参数转换成需要的类型。

•Struts2的输入校验可以对指定方法进行校验,

解决了Strutsl长久之痛。

•提供了全局范围、包范围和Action范围的国际

化资源文件管理实现

Struts2应用的支持包

从apache网站上下载struts2,0.14的完整包

(/downloads.html),

解压后需要找到下列几个文件:

commons-logging-1.0.4.jar日志包

freemarker-2.3.Struts2的UI标签模板

ognl-2.6.11.jar对象图导航语言

struts2-core-2.0.14.jarStruts2框架核心类库

xwork-2.0.7.jarStruts2的基础底层组件

|Struts2开发步骤

开发Struts实例的步骤(以Eclipse环境为例)

-将Struts2的支持包引入开发环境(Struts2.1.6以

后的版本必须加入(:0011110115・和61^10201・

121Jar包)

-编写Action类,注意必须从

com.opensymphony.xwork2.ActionSupport

类继承或实现action接口

-编写相应的输入输出jsp页面代码

-编写struts,xml配置Action类及动作

-在web.xml中加入Struts2MVC框架启动配置

|Struts2开发实例

1.在Eclipse下创建一个Tomcat项目

2.创建和编写Action类:

这一步未口Strutsl.x相似。只是

Strutsl.x中的动作类必须从Action类

中继承,而Struts2.x的动作类需要质

com.opensymphony.xwork2.ActionS

upport类继承。下面是计算两个整数

和的Action类,代码FirstActionjava

(应放在WEB-INF/src/mystruts卞)为:

packagemystruts;

importcom.opensymphony.xwork2.ActionSupport;

publicclassFirstActionextendsActionSupport

privateintoperandl;

privateintoperand2;

publicStringexecute()throwsException

(

if(getSum()>=0)//如果代码数和是非负整数,跳到positive.jsp页面

(

return"positive";

}else〃如果代码数和是负整数,跳到negative.jsp页面

(

return"negative";

)

}

publicintgetOperand1()

(

returnoperand1;

publicvoidsetOperand1(intoperandl)

System.out.priritln(opeTarid1j;

this.operandl=operandl;

)

publicintgetOperand2()

(

returnoperand2;

)

publicvoidsetOperand2(intoperand2)

(

System.out.println(operand2);

this.operand2=operand2;

)

publicintgetSum()

(

returnoperandl+operand2;//计算两个整数的代码数和

)

)

关于Action类

•所有的action类必须实现action接口,或

从ActionSupport派生;

•execute。方法在struts2执行action时调

用,通常的业务逻辑在其中处理;

•execute。方法必须返回resultcode,

SUCCESS、INPUT.ERROR等都定义

在action接口中。

|入口sum.jsp(位于项目根目录)

<%@pagelanguage="java"import="java.util.*"pageEncoding="GBK"

%>“

<%@taglibprefix="s"uri="/struts-tags"%>

<html>

<head>

A

<tit在sum.jsp中使用了Struts2带的tag。在Struts2中已经将

</he<Strutsl.x的好几个标签库都统一了,在Struts2中只有一个标签

<bod库/struts-tags。但在使用Struts2的标签时,在vs:form>中最好

都使用Struts2标签,尽量不要用HTML或普通文本。

y

<s:formaction="mystruts/sum.action">

<s:textfieldname="operand1"label="操作数1"/>

<s:textfieldname="operand2"label-'操作数2”/>

<s:submitvalue=''代薮和"/>

</s:form>

</body>

</html>

Ipositive.jsp(位于项目根目录)

<%@pagelanguage="java"import="java.util.*"

pageEncoding="GBK"%>

<%@taglibprefix="s"uri=7struts-tags"%>

<html>

<head>

〈title,显示代数和v/title>

</head>

<body>

代数和为非负整数vh1>vs:propertyvalue="sum"/></h1>

</body>

</html>

4山上

|negative.jsp(位于项目根目录)

<%@pagelanguage="java"import="java.util.*“

pageEncoding="GBK"%>

<%@taglibprefix="s"uri=7struts-tags"%>

<html>

<head>

vtitle>显示代数和v/t让le>

</head>

<body>

代数和为负整数vh1>vs:propertyvalue="sum"

/></h1>

</body>

</html>

____

,配置struts.xml文件

在Eclipse中将st^Jts2・blank20.14.zip里标准st^Jts.xml文件拷贝到WEB・

INU/src目亲卞并作如下修改:

<!DOCTYPEstrutsPUBLIC

"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"

"http://struts.apache.Org/dtds/struts-2.0.dtd">

<struts>

<packagename="mystruts"extends="struts-default">

<actionname="sum”class="mystruts.FirstAction">

<resultname="positive">/positive.jsp</result>

<resultname="negativen>/negative.jsp</result>

</action>

</package>

</struts>

jjAction配置的各项默认值

关于struts.xml中Action的默认值:

•如果没有为action指定class,默认是

ActionSupporto

•如果没有为action指定method,默认

执彳亍action中的execute。方法。

•如果没有指定result的name属性,默

认值为success。

定制web特性

•在web.xml文件中,配置在web应用中使

用struts2的一些特性。

•Struts2.0与WebWork2.2以上的版本类

似,所有的配置被整合在一个Filter里施

该Filter位于

org.apache.struts2.dispatcher.FilterDi

spatcher9因此,在web.xml中应该这

样声明:

Mfilter〉

<filter-name>struts2</filter-name>

<filter-class>

org.apache.strutsZ.dispatcher.FilterDis

patcher

</filter-dass>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

I完成并测试

在Eclipse中将stnjts2Wank20.14.zip里

标准web.xml文件拷贝到WEB1NF目录下,

无需作任何修改。

Done!现在可以测试新建的Struts2项目,

在浏览器中打开:

:8080/struts2_exercise/su

m.jsp

程序的运行

•在jsp代码的第2行标签库定义将前缀s和uri

struts・tags建立了对应笑家;前缀s指明亍

析有的struts2标签在使用而时候均以:s亓

五是使用了自定义property标签的JSP页

面;

•property标签中含有一个value属性值,通

过疫置value值,标签可以从action中获得

相应表达式的内容。

•因为在action中创建了一个getSumQ^法,

value值为sum的properfy标签将会得到

getSum()方法调甫后的向1|彳直。

,怎样处理一个form多个submit

在很多Web应用中,为了完成不同的工作,一个HTMLform

标签中可能有两个或多个submit按钮,如下面的代码所示:

<htmlaction=""method=“post”,

〈inputtype="submit”value=“保存”/>

<inputtype=usubmirvalue=“打E[]”/>

</html>

使用Struts2Action的execute方法就无法判断用户点击了

哪一个提交按钮

Struts129之前的版本需要使用一个LookupDispatchAction

动作来处理含宥多个submit的form。但使用

LookupDispatchAction动作需要访问属性文件,还需要映

射,比较麻烦O

,怎样处理一个form多个submit

主页面multiple_submit.jsp:

<%@pagelanguage="java"import="java.util.*“pageEncoding="GBK"%>

<%@taglibprefix="s"uri=7struts-tags"%>

<html>

<head>

<title>MyStruts2,multiple_sbmit.jsp'startingpage</title>

</head>

<body>

<s:formaction="submit.action">

<s:textfieldname="msg"label="输入内容"/>

<s:submitname="save"value=“保存"align="left"method="save7>

<s:submitname="print"value-'align="left"method="print"/>

</s:form>

</body>

</html>

在multiplesubmitjsp中有两个submit:保存和打印。其中分别通过method

属性指左子要调用的方法:save和print。囱止匕,在Action类币必须要宥save和

print方法。

怎样处理一个form多个submit

结果显示页面result.jsp:

<%@pagepageEncoding="GBK"%>

<html>

<head>

〈title〉提交结果〈/title,

</head>

<body>

<h1>${result}</h1>

</body>

</html>

,怎样处理一个form多个submit

实现Action类:

packagemystruts;

importjavax.servlet.http.*;

importcom.opensymphony.xwork2.ActionSupport;

importerceptor.*;

publicclassMultipleSubmitActionextendsActionSupportimplements

ServletRequestAware

privateStringmsg;

privatejavax.servlet.http.HttpServletRequestrequest;

//获得HttpServletRequest对象

publicvoidset8ervletRequest(HttpServletRequestrequest)

this.request=request;

)

//处理savesubmit按钮的动作

publicStringsave()throwsException

request.setAttribute("result","成功保存["+msg+"]");

return"save";

,怎样处理一个form多个submit

实现Action类(续):

//处理printsubm计按钮的动作

publicStringprint()throwsException{

request.setAttribute("result","成功疔印["+msg+

return"print";

)

publicStringgetMsg(){

returnmsg;

)

publicvoidsetMsg(Stringmsg){

this.msg=msg;

)

)

上面的代码需要注意如下两点:

1.save和print方法必须存在,否贝”会抛出NoSuchMethodException异常。

2.Struts2Action动作中的方法和Strutsl.xAction的execute不向,只使用Struts2

Action动作的execute方法无法访问request对「象,囱此,Struts2Action类需要

实现一个Struts2自带的拦截器来获得request对象,拦截器为:

erceptor.ServletRequestAware

,怎样处理一个form多个submit

配置struts,xml:

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEstrutsPUBLIC

"-//ApacheSoftwareFoundation//DTDStrutsConfiguration

2.0//EN"

"http://struts.apache.Org/dtds/struts-2.0.dtd">

<struts>

<packagename="mystruts"extends="struts-default">

<actionname="submit"

class="mystruts.MultipleSubmitAction">

<resultname="save">/result.jsp</result>

<resultname="print">/result.jsp</result>

</action>

</package>

</struts>

I怎样获取内置对象

方法一,通过ServletActionContext,类直接获取:

publicStringrsa()throwsException{

HttpServletRequestrequest=

ServletActionContext.getRequest();

ServletContextservletContext=

ServletActionContext.getServletContext();

request.getSession()

HttpServletResponseresponse=

ServletActionContext.getResponse();

return"scope";

}

■怎样获取内置对象

方法二,实现指定接口,由struts框架运行时注入:

publicclassHelloWorldActionimplementsServletRequestAware,

ServletResponseAware,ServletContextAware{

privateHttpServletRequestrequest;

privateServletContextservletContext;

privateHttpServletResponseresponse;

publicvoidsetServletRequest(HttpServletRequestreq){

this.request=req;

)

publicvoidsetServletResponse(HttpServletResponseres){

this.response=res;

)

publicvoidsetServletContext(ServletContextser){

this.servletContext=ser;

)

怎样给Action附带属性参数

在struts2中还可以为action指定一个或多个参数。在

strutsl.x中可以使用〈action,标签的parameter属性为其指定

一个action参数,如果要指定多个,就只能通过逗号(,)或

其他的分隔符将不同的参数隔开。而在struts2中可以通过

vparam>标签指定任意多个参数。代码如下:

<actionname="submit"class="action.MyAction">

<paramname="param1">value1</param>

<paramname="param2">value2</param>

<resultname="save">

/result.jsp

</result>

</action>

注意:一定要要action类中定义相应的setter方法

,怎样实现动态action方法调用

如果Action中存在多个方法时,我们可以使用!+方法名调用指定方法。如下:

publicclassHelloWorldAction{

privateStringmessage;

publicStringexecute()throwsException{

this.message="我的第一个struts2应用”;

return"success";

)

publicStringother()throwsException{

this.message="第二个方法”;

return"success";

)

)

假设访问上面action的URL路径为:/struts/test/helloworld.action

要访问action的other。方法,我们可以这样调用:

/struts/test/helloworld!other.action

ConiedeMelba

,怎样实现动态action方法调用

<packagename="itcast"namespace=7test"extends="struts-default">

<actionname="helloworld_*"class="cn.itcast.action.HelloWorldAction"method="{1}">

<resultname="success">/WEB-INF/page/hello.jsp</result>

</action>

</package>

publicclassHelloWorldAction{

privateStringmessage;

publicStringexecute()throwsException{

this.message="我的第一个struts2应用";

return"success";

)

publicStringother()throwsException{

this.message="第二个方法”;

return"success";

)

要访问other。方法,可以通过这样的URL访问:/test/helloworld_other.action

怎样接收请求参数

采用基本类型接收请求参数(get/post)

在Action类中定义与请求参数同名的属性,struts2便能自

动接收请求参数并赋予给同名属性。

请求路径:http://localhost:8080/test/view.action?id=78

publicclassProductAction{

privateIntegerid;

publicvoidsetld(lntegerid){//struts2通过反射技术调

用与请求参数同名的属性的setter方法来获取请求参数值

this.id=id;

}

publicIntegergetld(){returnid;}

}

ConiedeMelba

I怎样接收请求参数

采用复合类型接收请求参数

请求路径:

http://localhost:8080/test/view.action?product.id=78

publicclassProductAction{

privateProductproduct;

publicvoidsetProduct(Productproduct){duct

=product;}

publicProductgetProduct(){returnproduct;}

)

Struts2首先通过反射技术调用Product的默认构造器创建

product对象然后甫通过反射技术调用product中与请耒

参数同名的属性的setter方法来获取请求参数值。

I类型转换

・客户端浏览器只能将字符串传送到服务器

(文件上传除外),而服务器端java语言是强类

型语言,数据类型非常丰富,这就造成B/S两端

的类型不兼容问题.

・传统做法:

-将客户端数据转变成int

•intv=lnteger.parselnt(request.getParameter(v));

-缺陷:

■过程烦琐枯燥.

I类型转换

•Struts2提供了强有力的表现层类型转换机

制,无需程序员过多干预即可自动完成转换.

•Struts能自动处理类型转换过程中出现的

未知异常.

•下面的数据类型会自动转换:

一boolean,char,int,long,float,double基石出类型,包

括封装类型和对应数组.

-Date,String数组,元素类型为String的List

I类型转换

•类型转换器是一个继承自

StrutsTypeConverter(抽象类)的类,必须重

写两个方法:

-publicObjectconvertFromString(Mapcontext,

String[]values,ClasstoClass)

•从字符串转换成目标类型

-publicStringconvertlbString(Mapcontext,

Objecto)

•将目标类型转换成字符串

•注:上面的两个方法都必须重写.

I数据验证

•验证器和转换器是一对兄弟,他们总是

如影随形.

•所有用户的输入都是邪恶的

•先类型转换,再验证

・Struts2主要通过验证框架来完成数据

验证.

•Action必须继承ActionSupport

I数据验证

•验证日期范围

•验证双精度/整型/长整型数值范围

•邮箱验证

•验证字段关系

•必填项验证

­字符串长度验证

•URL验证

•正则表达式验证(RegularExpression)

-正则表达式能解决绝大部分验证问题

,使用validate方法验证数据

建立一个主页面(validate.jsp)

<%@pagelanguage="java"import="java.util.*"

pageEncoding="GBK"%>

<%@taglibprefix="s"uri='7struts-tags"%>

<html>"

<head>

vtitle>验证数据v/Utle>

</head>

<body>

<s:actionerror/>

<s:actionmessage/>

<s:formaction="validate.action"theme="simple">

输入内容:<s:textfieldname="msg'7>

<s:fielderrorkey="msg.hello"/>

<br/>

<s:submit/>

</s:form>

</body>

</html>

____

,使用validate方法验证数据

•可以用Struts2的tag:<s:actionerror>>

<s:fielderror>^n<s:actionmessage>,分别

用来显示动作错误信息,字段错误信息,

和动作信息。如果信息为空,则不显示。

使用validate方法验证数据

Action类定义:

packageaction;

importjavax.servlet.http.*;

importcom.opensymphony.xwork2.ActionSupport;

importerceptor.*;

publicclassValidateActionextendsActionSupport

(

privateStringmsg;

publicStringexecute()

(

System.out.println(SUCCESS);

returnSUCCESS;

)

publicvoidvalidate()

(

if(!msg.equalslgnoreCase("hello"))

(

System.out.println(INPUT);

使用validate方法验证数据

this.addFieldE「ror(”msg.hello","必须输入hello!");

this.addActionErro「("处理动作失败!”);

}

else

{this.addActionMessage("提交成功”);

publicStringgetMsg()

returnmsg;

}

publicvoidsetMsg(Stringmsg)

this.msg=msg;

使用Validation框架验证数据

•我们可以为每一个单独的Action定义一个验

证文件

-验证文件格式:Action类名-validation.xml

•也可以为Action的方法定义一个验证文件:

-必须先为方法配置action

•<actionnavrie="abcdo"

class="com.aptech.actions.EmployeeAction"

method=

-验证文件格式:Action类名-name-validation.xml

•注:验证文件要和Action类放在同一包中

,使用Validation框架验证数据练习

1、建立Action类(NewValidateActionjava)

packagemystruts2;

importcom.opensymphony.xwork2.ActionSupport;

publicclassNewValidateActionextendsActionSupport

(

privateStringmsg;//必须输入

privateintage;//在13和20之间

publicStringgetMsg()

(

returnmsg;

)

publicvoidsetMsg(Stringmsg){

this.msg=msg;

)

publicintgetAge(){

returnage;

)

publicvoidsetAge(intage){

this.age=age;

,使用Validation框架验证数据练习

2、配置Action类,struts.xml的代码如下:

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEstrutsPUBLIC

"-//ApacheSoftwareFoundation//DTDStrutsConfiguration

2.0//EN"

"http://struts.apache.Org/dtds/struts-2.0.dtd">

<struts>

<packagename="mystruts2"extends="struts-default">

<actionname="new_validateH

class="mystruts2.NewValTdateAction">

<resultname="input">/validate_form.jsp</result>

<resultname="success">/validate_form.jsp</result>

</action>

</package>

</struts>

,使用Validation框架验证数据练习

3、编写验证规则配置文件

和strutsl.x中的validator框架的验证规则配置文件类似。但

一般放到和要验证的class文件在同一目录下,而且配置文

件名要使用如下两个规则中的一个来命名:

<ActionClassName>-validation.xml

<ActionClassName>-<ActionAliasName>-validation.xml

其中〈ActionAliasName〉就是struts.xml中vation>的name属

性值。在本例中使用第一种命名规则,、所以文住名是

NewValidateAction-validation.xmlo文件的内容如下:

,使用Validation框架验证数据练习

<?xmlversion="1.0"encoding=,,UTF-8"?>

<!DOCTYPEvalidatorsPUBLIC"-//OpenSymphonyGroup//XWorkValidator

1.0.2//EN"

"http://www.opensymphony.eom/xwork/xwork-validator-1.0.2.dtd">

<validators>

<fieldname="msg">

<field-validatortype="requiredstring">

〈message)请输入信息〈/message〉

</field-validator>

</field>

<fieldname="age,'>

<field-validatortype="int">

<paramname="min">13</param>

<paramname="max">20</param>

<message>

必须在13至20之间

</message>

</field-validator>

</field>

,使用Validation框架验证数据练习

4、编写数据录入JSP页validate_form.jsp:

<%@pagelanguage="java"import="java.util.*"pageEncoding="GBKn%>

<%@taglibprefix="s"uri=7struts-tags,'%>

<linkrel="stylesheet"type="text/css"href="<s:urlvalue=7styles/styles.css'7>,,>

<html>

<head>

〈title〉验证数据v/title>

</head>

<body>

<s:formaction="new_validate">

<s:textfieldname="msg"label="姓名"/>

<s:textfieldname="age"label二“年龄”/>

<s:submit/>

</s:form>

</body>

</html>

,使用Validation框架验证数据练习

在上面的程序中还使用了一个styles.css来定

制错误信息的风格。代码如下:

.label{font-style:italic;}

.errorLabel{font-style:italic;colonred;}

.errorMessage{font-weight:bold;color:red;}

需要在Web根目录中建立一个styles目录,并

将styles.css放至Ustyles目录中。

|OGNL

•OGNL

-Object-GraphNavigationLanguage的缩写,

它是一种功能强大的表达式语言(Expression

Language,简称为EL),通过它简尊一致的

表达式语法,可以存取对象的任意属性,调用

对象的方法,遍历整个对象的结构图,实现字

段类型转化等功能。

-Struts2默认的表达式语言是OGNL

70

|OGNL的符号一#

•#

-访问OGNL上下文和Action上下文,#相当于

ActionContext.getContext().

,示例见第5页

-构造Map

•示例见第6页

-用于过滤和投影(projecting)集合

•?——所有匹配选择逻辑的元素

•A——只提取符合选择逻辑的第一个元素

•$——只提取符合选择逻辑的最后一个元素

■称

作用示例

parameter读取请求参数<s:property

value="#parameters.id"/>

s

request读取request中的属<s:property

性\ia\ue="#request.r'7>

session读取session中的属<s:property

H

性value=#sess/on.s7>

application读取application中的<s:property

value="#application.a"/>

属性

attrrequest>session><s:property

value="#at".pc'7>

application顺序访问

具属性

____________

.

•<s:iteratorvalue="#{'china':‘中国'「usaY美

国「俄国Fvar="c”>

-<s:propertyvalue="#ckey'7>--vs:property

value="#c.value7><br/>

•</s:iterator>

var=cur>

-<s:property\/a\ue="#cur.sname"l>

丁v/s:iterator>

-返回张三,王八

•<s:iteratorvaIue=M#attr.list.{^#this.sid%2/=0}"

var="cur">

-<s:property\/a\\je="#cur.sname"l>

•v/s:iterator〉

—返回张三

•<s:iteratorvaIue=M#attr.list.{$#this.sid%2!=0}"

Yar="cur”>

-<s:property\/a\\je="#cur.sname"l>

•</s:iterator

-返回王八

List<Student>list=newArrayList<Student>();

list.add(newStudent。"张三",newDate()));

list.add(newStudent(2,"李夕,newDate()));

list.add(newStudent、,“王/(",newDate()));

DageContext.setAttribute(“〃sf”,list);

•<s:property\/a\\je="#attr.list.{sname}[O]"/>

•<s:propertyvalue="#attr.list.{$#this.sid==

3}.{sname}[0]u/>

|OGNL的主要功能

-支持对象方法调用

-<s:propertyvalue="#attr.p.doSomeThing('^E/i')"l>

•调用保存在pageContext中的Student对象的doSomeThing()

•[N]语法

-从ValueStack的第N个位置开始取值

•top关键字

-取出最顶端的对象

-示例:

•<s:pus\\、a\ue='''阿拉伯联合酋长国

-<s:property\za\ue=n[0].top"/>

•</s:push>

-从ValueStack中的第。个位置开始取出最顶部的对象返回为"阿法

Struts标签分类

7g支恃标签度

衰单标簸摩效据访问标签摩

导入taglib

•<%@taglibprefixes”uri="/stiTits・tags"%>

4山上

控制标签

if

elseif

else

iterator

append

merge

generator

subset

sort

■条件标签if…elseif…else

•主要属性:

-test:测试条件

•示例

•<%!Randomrnd=newRandom();%>

・<%

•intn=rnd.nextlnt(200);

•pageContext.setAttribute(nn",n);

・%>

•<s:iftest="#attr.n%7==0">

•恭喜,您中了一等奖!

•</s:if>

•<s:elseiftest="#attr.n%5==0">

•恭喜,您中了二等奖!

•</s:elseif>

•<s:else>

•欢迎惠顾!

•</s:else>

■迭代标签iterator

•用于循环数组,集合和Map

•属性

-value:数组,集合或Map

-var:当前元素

-status:当前元素的状态

•index,count,even,odd,first,last

•示例

■迭代标签iterator

•遍历List

•<s\teratorva\ue="(中华人民共和国「美利坚合众

国'阿拉伯联合酋&国'}”var="cur"status="st">

•<s:property\/a\\je="#st.count"/>

•<s:propertyvaIue="#cur"/><br/>

•</s:iterator>

•遍历Map

•vs:iteratorvalue="#{1J中国、2J美国,3,旧本F

var="cur">

•<s:propertyvalue=,,#cur.key7>

•<s:propertyvaIue="#cur.value"/><brl>

•</s:iterator>

■集合合并标签append和merge

•将多个集合合并成一个集合

•属性

-var新集合的名称

•示例

•<s:appendvar="newCollection">

-<s:param\/a\ue="{'中国','美国,'日本}"><ls:param>

-vs:paramvalue="f‘德国','泰国','新加坡7">v/s:param>

•</s:append>

•<s:iteratorvalue="#newCollection"var="cur">

-<s:propertyvalue=,,#cur,,/><br/>

•</s:iterator>

•mercie用法和aDDend相同,结果的组织不——才

ConiedeMelba

■字符串分割标签generator

•将一个字符串按照指定分隔符分割成一个

字符串数组

-属性

•separator:分隔符

•val(value):字符串

•count:字符串数幺且中元素偃I数

-示例

•<s:generatorseparator=val=中,华人,民共和,国

var="arr"/>

•<s:iteratorvalue="#arr"\/ar="cur">

•<s:propertyvalue="#cur"/><Br

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论