简单数据验证

 

在action方法里用if条件判断校验,不成功时,怎么向前台传递信息?

this.addFieldError(“name”,”name is error”);   return Error;

name是出错的属性名,后面是校验信息。

怎么把FieldError拿出来。

在jsp页面中,<%@taglib uri=”/struts-tags” prefix=”s” %> 调用struts标签

<s:fielderror fieldName=”name” theme=”simple”/>

<s:property value=”errors.name[0]”/> 取value stack的属性展现。下面的debug链接可以看到。

<s:debug></s:debug> 页面会出现debug链接。

 

怎么访问map类型:request,session, application, 真实类型:HttpServletRequest,HttpSession,ServletContext

 

 

  1. 1.       前三者:依赖于容器

定义

Action类中

 

private Map request;private Map session; private Map application;

request = (Map)ActionContext.getContext().get(“request”);

session=ActionContext.getContext().getSession();

application=ActionContext.getContext().getApplication();

存值:

request.put(“r1”,”r1”); session.put(“s1”,“s1”); application.put(“a1”,”a1”);

取值:

Jsp可以用jsp里的httprequest可以访问map里的值,所以在struts2处理过程中,会把map值复制到httprequest中。

<s:property value=”#request.r1”/> | <%=request.getAttribute(“r1”) %><br/>

<s:property value=”#session.s1”/>|<%=session.getAttribute(“s1”)%><br />

<s:property value=”#application.a1”/>|<%=application.getAttribute(“a1”)%>

|前 是用标签的方式访问。#key可以访问Statck Context中的值。

 

  1. 前三者:IoC(最常用)

定义:private Map<String, Object> request; …(泛型)

Action类实现接口: implements RequestAware, SessionAware, ApplicationAware

接口要求提供三个方法:

public void setRequest(Map<String, Object> request){

       this.request = request;

}

…session,application类似。。

DI dependency injection 或IoC inverse of control

依赖注入或控制反转。

属性request依赖于struts2(外界环境)把值注过来。

由环境来控制。

  1. 后三者:依赖于容器

private HttpServletRequest request; private HttpSession session; private ServletContext application;

 

request = ServletActionContext.getRequest();

session=request.getSession();  application=session.getServletContext;

 

request.setAttribute(“r1”,”r1”);…

  1. 后三者:IOC

实现接口implements ServletRequestAware

Public void setServletRequest(HttpServletRequest request){

       This.request=request; this.session=request.getSession();

       This.application=session.getServletContext();

 

模块包含

Struts.xml里面有个include属性

<struts>

       <constant name =”struts.devMode” value=”true”/>

       <include file=”login.xml”/>

</struts>

相当于把login.xml里面的内容当做struts.xml来用。

如果要把模块分下去,开发不在同一台机器上,不共用一个struts文件比较方便。把共用的配置配到struts.xml里面。把别的包含进去就ok了。

 

默认Action

<default-action-ref name=”index”></default-action-ref>

<action name=”index”>

       <result>/default.jsp</result>

</action>

如果找不到对应的action就用index的结果。

如果用户访问界面不存在,可以交给defaultAction来解决。

 

Action总结

  1. 实现一个Action的最常用方式: 从ActionSupport继承
  2. DMI动态方法调用 |
  3. 通配符配置 *{1}{2}。。。
  4. 接收参数的方法(一般用属性或者DomainModel来接收)
  5. 简单参数验证addFieldError  一般不使用Struts2的UI标签
  6. 访问Web元素

a) Map类型  1.IoC   2.依赖Struts2

b)原始类型 1. IoC    2.依赖Struts2

7. 包含文件配置

8. 默认action处理

 

Result类型

1.  dispatcher。默认类型。运用服务器跳转,jsp forward。Forward到一个jsp文件,或xml,freemarker。页面。不能是action。

2.  Redirect 客户端跳转。也是只能跳转到页面。不能是action。浏览器地址显示的是jsp。

3.  Chain   forward到一个action (一次request只有一个值栈, forward共享一个值栈。)

4.  redirectAction 客户端跳转到另外一个action

 

(查文档 struts-2.。。/docs/index.html。 Guides.)

 

全局结果集GlobalResult

假如有许多action都有一个共同的结果。可以写到一个地方。

<global-result>

       <return name=”mainpage”>/main.jsp</result>

</global-result>

如果另一个package想用package name=“user”的globalResult。Extends=“user”,相当于user包里的配置就全有了。  项目中可以把一些公用的配置单独放一个包里让大家都继承。

 

动态结果集

<result>${r}</result> $用来在配置文件里往值栈里面取值(debug)。即通过action方法来动态确定r的值。

带参数的结果集

客户端跳转才需要传递。

<result type=”redirect”>/user.jsp?t=${type}</result> 通过action类设置参数。

取参数:Jsp中 <s: property value=”#parmeters.t”/>因为客户端跳转,jsp中t不在value stack中。

 

读书只记最常用的。不常用的只留印象。90%的书都是用来查的。