??xml version="1.0" encoding="utf-8" standalone="yes"?> <result name="success" type="freemarker">foo.ftl</result> (6)、JasperReports:Action执行的结果通过JasperReports报表形式输出Q可以指定JasperReports支持的输出格?PDF,HTML,XLS,CVS,XML{?Q默认的是PDF格式?br />
location ?/span> 执行完成之后转向的位|?/span> parse ?/span> 默认的是“true”Q如果设|ؓ“false”Qlocation参数不会被OGNL表达式语a解析 dataSource ?/span> 它是Action的一个字D(通常是一个ListQ,OGNL表达式被用来去value stackQOgnlValueStackQ重新找回这个dataSource format ?/span> 报表生成的数据格式,默认的是pdf
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
xwork.xml文g的标{օ?br />
1、xwork:xwork配置文g的内容,都是定义?lt;xwork>标签中,它的直接子标{有<package>?lt;include>
2、Package:我们的Action,Interceptor,Result-type都是在此标签中定义,<package>标签有个必需的属?name",它用来标识唯一的一个package.属?extends"是可选的Q它用来l承前面定义的一个或一个以上Package配置信息?br />
3、Result-type:用来定义输出l果cd的Class:<result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/>,default="true"表示如果在Action的result中不指定result-type,׃用这个默认的result-type.
4、Interceptors:它是一个简单的<interceptors></interceptors>标签Q我们的interceptor和interceptor-stack都在q里定义?br />
5、Interceptor:用来定义我们的拦截器Q?br />
<interceptor name="timer" class="com.opensymphony.xwork.interceptor.TimerInterceptor"/>,在Action中,可以通过<interceptor-ref/>来直接引用前面定义的拦截器?br />
6、Interceptor-satack:用来上面定义的Interceptorl织成堆栈的形式Q这h们就可以创徏一l标准的interceptor,让他按照序执行Q在我们的action中直接引用这个interceptor堆栈可以了?br />
<interceptor-stack name="validationWorkflowStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
</interceptor-stack>
7、Global-results:它允许我们定义全局的输出结?global result)?br />
<global-results>
<result name="login" type="dispacher">
<param name="location">/login.jsp</param>
</result>
<result name="error" type="dispatcher">
<param name="location">/error.jsp</param>
</result>
</global-results>
]]>
<validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/
<validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/>
</validators>
2、开启Action的验证功能:
在xwork.xml中加?lt;interceptor class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
3、实现我们的验证文g(也就是规?Q?br />
我们的验证文件必需以ActionName-validation.xml格式命名Q他必需被放|到与这个Action相同的包中?br />
格式Q?br />
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
<field name="count">
<field-validator type="required">
<message>You must enter a value for count.</message>
</field-validator>
<field-validator type="int">
<param name="min">0</param>
<param name="max">5</param>
<message>
count must be between ${min} and ${max}, current value is ${count}.
</message>
</field-validator>
</field>
</validators>
(1)?lt;field>标签代表一个字D,属?name"和页面输入框?name"属性必需完全一致?br />
(2)?lt;field-validator>标签定义我们的验证规则,type属性的值就是我们前面定义的验证cd?br />
(3)、验证文件中Q字D|据是通过表达式语a从我们的值堆栈中取得Q一般是Action对象?br />
(4)、不验证是否通过Q我们的Action都会执行Q但是如果验证没有通过Q他不会调用Action的execute()Ҏ?/span>
4、验证Action的写法:
import com.opensymphony.xwork.ActionSupport;
import com.opensymphony.xwork.ValidationAware;
public class SimpleAction extends ActionSupport implements ValidationAware {
private int count;
public void setCount(int count) {
this.count = count;
}
public int getCount() {
return count;
}
public String execute(){
//在这里调用用h册的业务逻辑Q比如:注册信息存储到数据?br />
return SUCCESS;
}
}
5、xwork.xml中需要注意的地方Q?br />
<action name="validation" class="com.wyq.login.action.SimpleAction">
<result name="success" type="dispatcher">
<param name="location">/login/simple_result.jsp</param>
</result>
<result name="error" type="dispatcher">
<param name="location">/login/simple.jsp</param>
</result>
q里是最重要的,不符合条件的都从下面输出Q这里也是必需声明?br />
<!-- If you don't override execute(), you must do this: -->
<result name="input" type="dispatcher">
<param name="location">/login/simple.jsp</param>
</result>
<interceptor-ref name="validator" />
<interceptor-ref name="debugStack" />
<interceptor-ref name="defaultStack" />
</action>
]]>
<result name="success" type="dispatcher">
<param name="location">register-result.jsp</param>
</result>
<interceptor-ref name="params"/>
</action>
result标签里面?name"DCactionҎ名字q行视图输出?br />
type军_采用那一U视图技术,执行结果展现给用户Q下面是Type的类型:
(1)、dispatcher:通过javax.servlet.RequestDispatcher的forward()或include()Ҏ调度到页面展玎ͼq样的页面一般是Jsp面。location是必需的参敎ͼ表示执行完成之后转向的位|?br />
(2)、redirect:响应重新定向到览器指定的位置Q它会DAction执行完成的数据丢失或不再可用Q将响应定向到参数location指定的,新的url中,location是必需的,执行完成之后转向的位|?br />
(3)、chaining:Action执行完成之后q接到另一个Action中l执行,新的Action使用上一个Action的上下文QactionName是必需的,要被连接的Action名字?br />
(4)、velocity:它类似Jsp的执行环?使用JavaServlet容器)Q将Velocity模板转化成数据流的Ş式,直接通过JavaServlet输出Qlocation是必需的执行完成之后{向的位置(一般是.vm面).
<result name="success" type="velocity">
<param name="location">foo.vm</param>
</result>
(5)、FreeMarker:是一个纯Java模板引擎Q一个普通的Z模板生成文本的工兗location是必需的,执行完成之后转向的位|?/span>
<result name="success" type="jasper">
<param name="location">foo.jasper</param>
<param name="dataSource">mySource</param>
<param name="format">CSV</param>
</result>
(1)、imerQ记录Action执行的时_q做为日志信息输出;
(2)、loggerQ在日志信息中输执行的Action信息Q?/p>
(3)、chainQ将前一个执行结束的Action属性设|到当前的Action中。它被用在ResultType?#8220;chain”指定l果的Action中,该结果Action对象会从OgnlValueStack中获得前一个Action对应的属性,它实现Action链之间的数据传递;
(4)、static-paramsQ将xwork.xml配置文g里定义的Action参数Q设|到对应的Action中。Action参数使用<param />标签Q是<action />标签的直接子元素。我们这里定义的Actioncd需实现com.opensymphony.xwork.config.entities. Parameterizable接口Q?/p>
(5)、paramsQ将Requesth的参数设|到相应Action对象的属性中Q用h册例子用到过q个拦截器;
(6)、model-drivenQ如果Action实现ModelDriven接口Q它getModel()取得的模型对象存入OgnlValueStack中;
(7)、componentQ激zȝ件功能支持,让注册过的组件在当前Action中可用,即ؓAction提供IoCQ依赖倒{控制Q框架的支持Q?/p>
(8)、tokenQ核对当前ActionhQrequestQ的有效标识Q防止重复提交Actionh(request)?/p>
(9)、token-sessionQ功能同上,但是当提交无效的Actionh标识Ӟ它会请求数据保存到session中?/p>
(10)、validationQ实C用xml配置文gQ{Action}-validation.xmlQ对Action属性D行验证,详细L后面介绍的验证框架?/p>
(11)、workflowQ调用Actioncȝ验证功能Q假设Action使用ValidationAware实现验证QActionSupport提供此功能)Q如果验证没有通过Qworkflow会将hq回到input视图QAction?lt;result />中定义的Q?/p>
(12)、servlet-configQ提供Action直接对HttpServletRequest或HttpServletResponse{JavaServlet api的访问,Action要实现相应的接口Q例如:ServletRequestAware或ServletResponseAware{。如果必需要提供对JavaServlet api的访问,我们使用ServletActionContextQ在前面ActionContext章节中有介绍?/p>
(13)、prepareQ在Action执行之前调用Action的prepare()ҎQ这个方法是用来准备Action执行之前要做的工作。它要求我们的Action必需实现com.opensymphony.xwork. Preparable接口
(14)、conversionErrorQ用来处理框架进行类型{?Type Conversion)时的出错信息。它存储在ActionContext中的cd转化QType ConversionQ错误信息{化成相应的Action字段的错误信息,保存在堆栈中。根据需要,可以这些错误信息在视图中显C出来?br />
public String intercept(ActionInvocation invocation) throws Exception {
String result = null;
before(invocation);
result = invocation.invoke();
after(invocation, result);
return result;
}
1?nbsp; javax.servlet.http.HttpServletRequestQHTTPservleth对象
2?nbsp; javax.servlet.http.HttpServletResponse;QHTTPservlet相应对象
3?nbsp; javax.servlet.ServletContextQServlet 上下文信?/p>
4?nbsp; javax.servlet.ServletConfigQServlet配置对象
5?nbsp; javax.servlet.jsp.PageContextQHttp面上下?br />
1?取得HttpServletRequest对象Q?/p>
HttpServletRequest request = ServletActionContext. getRequest();
2?取得HttpSession对象Q?/p>
HttpSession session = ServletActionContext. getRequest().getSession();
<action name="register" class="example.register.RegisterAction" >
<result name="success" type="dispatcher">
<param name="location">/register-result.jsp</param>
</result>
<interceptor-ref name="params"/>
</action>
<interceptor-refname="params"/>,interceptor-ref标签讄q个Action用到的拦截器Q?params"引用的是配置文g中的<interceptor name="params" class="com.opensymphony.xworkinterceptor.ParametersInterceptor"/>q个拦截器将在Action调用execute()Ҏ执行之前调用Q作用是requesth的参数通过表达式语a讄到相应Action的模型里?br />
ActionҎFormBean的不同可以分Zc:
一cLField-Driven(字段驱动?Action
Action直接用自己的字D|充当FormBean的功能,可以直接用域对象作ؓAction的字Dc?br />
二类是Model-Driven(模型驱动?Action
他很想Struts的FormBean,但在webwork中,只要通过Java对象可以充当模型部分。Model-Driven(模型驱动?Action要求我们的Action实现com.opensymphony.xwork.ModelDriven接口Q它有一个方法:Object getModel();我们用这个方法返回我们的模型对象?br />
采用模型对象比较重要的一Ҏ在Action的配|文件Xwork.xml中要配置模型拦截器model-driven,他的作用是将模型对象保存到值堆栈中?br />
<action name="registerModel" class="example.register.RegisterActionModel">
<result name="success" type="dispatcher">
<param name="location">/register-result-model.jsp</param>
</result>
<interceptor-ref name="model-driven"/>
<interceptor-ref name="params"/>
</action>
<servlet-name>webwork</servlet-name>
<servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>webwork</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>