struts2总结 2

文件的上传和下载09-14

国际化17

异常18

传参问题

报表的导入导出26-28

整合ssi

struts2:

Struts2仍然是一个基于请求驱动的 Struts2不是struts1的升级

Struts2与struts1的体系结构差别很大 Struts2采用了另一种WebWork核心设计

Struts2是WebWork的升级

Struts2更加优秀

* OGNL:对象矢量图导航语言,也是struts2的专用表达式语言

* 体现的设计模式:GOF4人组,23种设计模

- 代理模式:action-多例的线程安全 - 工厂模式:objectFactory

- 责任链模式:拦截器栈(串行,只要有一个链条中断,那么整个链条全部断掉)

- 缺省适配器模式:拦截器都来自于一个抽象类

- 策略模式:result-type:sucess input error

- 迭代模式:加载拦截器

* action可以作为纯

* 拦截器:35个

* 默认拦截器栈:18

* 返回类型:10种

* 两个重要的文件:

struts.xml default.properties

* 继承struts-default.xml中的包<package

name="struts-default" abstract="true">

* 可以实现action接口或集成actionSupport(推荐),因为actionSupport已经实现了action接口。 com.opensymphony.xwork2.ActionSupport

对于validate()方法是验证所有的action中的方法,只要继承ActionSupport,就会自动最先调用

对于形如save()和validateSave()的针对某一方法的验证,既可以单独使用,也可以 和validate()方法一起使用,一起使用的时候,不管方法的位置是什么,首先验证的是专用的方法,

即validateSave()方法,之后再验证validate()方法。

<struts>

<!-- 编码 -->

<constant

name="struts.i18n.encoding" <!-- 开发模式 不推荐使用--> <constant

value="true"/>

<!-- 加载配置文件不推荐使用 --> <constant

name="struts.configuration.xml.reload" value="true"/>

<package

extends="struts-default" <action

method="show">

<result>/index.jsp</result> </action>

</package>

</struts>

name="testAction" class="com.zmx.action.TestAction" name="team" name="struts.devMode"

* 使用验证方法:addActionMessage不返回input串,所以不会跳转到错误页面上 public void validate() { // 验证

//this.addActionError("不能为空值");

不能为空值field");

this.addActionMessage("不能为空值message");

}

* //针对方法进行验证

public void validateSave() { // 验证

this.addActionError("不能为空值");

不能为空值field");

//this.addActionMessage("不能为空值message");

}

一个ACTION类继承ActionSupport有何用处?

答:在ActionSupport中实现了很多接口,就拿一个来讲,validate()方法,是默认的验证。我们可以在我们的action类中重写一下此方法。比方说验证用户名是否为空。这个方法不需要调用,当S:FORM表单提交了,到了action类中会首先执行此方法。对数据进行验证。

在Struts2中最简单的验证数据的方法是使用validate。我们从ActionSupport类的源代码中可以看到,ActionSupport类实现了一个

口。这个接口只有一个validate方法。如果Action类实现了这个接口,Struts2在调用execute方法之前首先会调用这个方法,我们可以在validate方法中验证,如果发生错误,可以根据错误的level选择字段级错误,还是动作级错误。并且可使用addFieldError或addActionError加入相应的错误信息,如果存在Action或Field错误,Struts2会返回“input”(这个并不用开发人员写,由Struts2自动返回),如果返回了“input”,Struts2就不会再调用execute方法了。如果不存在错误信息,Struts2在最后会调用execute方法。

这两个add方法和ActionErrors类中的add方法类似,只是add方法的错误信息需要一个ActionMessage对象,比较麻烦。除了加入错误信息外,还可以使用addActionMessage方法加入成功提交后的信息。当提交成功后,可以显示这些信息。

以上三个add方法都在ValidationAware接口

中定义,并且在ActionSupport类中有一个默认的实现。其实,在ActionSupport类中的实现实际上是调用了ValidationAwareSupport中的相应的方法,也就是这三个add方法是在ValidationAwareSupport类中实现的

、和,分别用来显示动作错误信息,字段错误信息,和动作信息。如果信息为空,则不显示。

* 分组开发配置多个文件,使用斜杠 <include

* 动态调用方法:<a 缺点:变长,安全性下降了。

* <!-- 禁止使用动态调用 -->

<constant

name="struts.enable.DynamicMethodInvocation" value="false"/>

*

如:<s:textfield name="user.username" label="用户1"/>

<s:submit value="save"/>

* struts2占两层

* 数据交换:

属性方式:在action中的引用类型做成员变量时,页面必须加对象名称.属性名称,否则空指针异常,action中不需要new,在jsp页面中可以用EL表达式来取值: ${username }。

模型驱动方式:在action中,实现com.opensymphony.xwork2.ModelDriven接口,重写方法,提供返回对象,必须new对象,不需要setter getter,页面不需要对象直接写属性,如:

public class extends ActionSupport

ModelDriven<TUser>{//

Action{

private TUser user = new TUser();

/**

* 保存

*/

public String save() {

System.out.println(user.getUsername

());

//System.out.println(user.getUsername());

return SUCCESS;

}

/** implements implements

* 删除

*/

public String delete() {

System.out.println("delete"); return SUCCESS;

}

public TUser getModel() {

// TODO Auto-generated method stub return user;

}

Jsp页面直接写属性:

<s:textfield name="username" label="用户1"/>

<s:submit value="save"/>

* 获取内置对象:session

- 第一种:

ActionContext.getContext().getSession 返回的是一个map对象

- 第二种:ServletActionContext.getRequest().get 返回的是当前对象

- 第三种:implements

、ServletRequestAwareServletResponseAware接口

HttpServletRequest request; public

request) {

//必须实现此方法

this.request = request; } void setServletRequest(HttpServletRequest

public

e response) {

// TODO Auto-generated method stub

}

以上三种都来自于ActionContext,所以从使用的效率上没有什么区别。

在页面上可以用EL表达式来取值:

${session.username }

<s:form

* 命名空间:以不同的空间名称调用对应的action,配置在不同的包中,执行方法

<package name="team1" action="a/loginAction" theme="simple"> 回复成普通 void setServletResponse(HttpServletRespons

<!-- 登陆 -->

<action

method="login">

前面表单: <s:form action="b/d/f/g/h/loginAction" theme="simple">

* 通配符的使用:解决了多方法配置多个文件 方法名称和中的通配符必须相同 使用通配符必须遵守更多的要求 <!-- 通配符-->

<action

method="{1}"> <result

name="input">/error.jsp</result> </action>

通配符越多,需要程序员注意的地方就越多 name="*Action" class="com.zmx.action.TestAction" name="loginAction" class="com.zmx.action.TestAction"

<!-- 通配符-->

<action

method="{1}"> <result

name="input">/error.jsp</result> </action>

类型转换:默认这种格式被转换:11-9-4 被转换成Sun Sep 04 00:00:00 CST 2011

name="*-*Action" class="com.zmx.action.TestAction"

* 类型转换

* 自己定义一个转换类继承抽象类:public class MyConverter extends StrutsTypeConverter抽象类,重写里面的方

struts2总结2

struts2总结2

o)

* 配置自定义的转换类:

- 局部:与需要被转换的属性所在类同路径下配置:TestAction-conversion.properties,里面的形式如:date=com.zmx.util.MyConverter

全局:xwork-conversion.properties配置在java.util.Date=com.zmx.util.MyConverter * 类型转换后使用struts2的标签展现数据。如:

<s:property value="date" /><br> <s:text name="date"></s:text>

但是,用${date }显示的是默认的时间格式,

struts2总结2

方法中是否有定义,还是返回空值,显示的都是 默认的时间格式。

但是,对于这两种取值方式

<s:property value="date" /><br> <s:text name="date"></s:text> 如果convertToString(Map context, Object o)该方法设定返回值为空,则在页面上不显示,而EL表达式显示的是默认。

* 拦截器: - 全局拦截器:接口随项目启动而启动 <!-- 定义拦截器 -->

<interceptor name="myException"

class="com.zmx.util.MyInterceptor"/>

--------------------------------------------------------------------

name="myException"/>

>关注

全局拦截器:做一个拦截器类:实现Interceptor接口,重写里面的三个方法:init()、public String intercept(ActionInvocation invocation) throws Exception {

return invocation.invoke();//注意 }

Destroy()

之后,在struts.xml中定义拦截器:在<package>根下:

<interceptors>

<!-- 定义拦截器 -->

<interceptor

</interceptors>

name="myException" class="com.zmx.util.MyInterceptor"/>

最后,在具体的<action>根下引入拦截器 <interceptor-ref name="myException"/> <interceptor-ref

name="defaultStack"></interceptor-ref>千万不要忘记默认的拦截器

方法拦截器:

首先定义一个拦截器类:继承MethodFilterInterceptor抽象类,重写里面的方法: Protected

doIntercept(ActionInvocation invocation) throws Exception { return invocation.invoke(); }

之后,在struts.xml中定义拦截器:在<package>根下:

<interceptors>

<!-- 定义拦截器 -->

<interceptor name="myException" class="com.zmx.util.MyInterceptor"/> String

</interceptors>

最后,在具体的<action>根下引入方法拦截器 <interceptor-ref name="myException"> <param

name="includeMethods">save</param> </interceptor-ref>

<interceptor-ref

name="defaultStack"/>千万不要忘记默认的拦截器

excludeMethods表示放过那些方法 includeMethods表示拦截那些方法 注意:方法拦截器表示:只是拦截特定的方法,除了规定的方法之外的方法,不拦截,也就是不走拦截器,特定的方法才先走拦截器,满足拦截器一些验证之后才调用该方法。

而全局拦截器:指的是所有的方法都拦截。

优化拦截器的方式:配置拦截器栈

Struts.xml:<package>根下:

<interceptors>

<!-- 定义拦截器 -->

<interceptor name="myException" class="com.zmx.util.MyInterceptor"/> <!-- 配置拦截器栈 -->

<interceptor-stack name="myStack"> <interceptor-ref

name="myException">

<param

name="includeMethods">save</param> </interceptor-ref>

<interceptor-ref

name="defaultStack"/>

</interceptor-stack>

</interceptors>

在<action>中只要引入自定义的拦截器栈即可:<interceptor-ref name="myStack"/>

分析:原先是:在struts.xml<package>中定

义拦截器,在<action>中引入自定义和默认拦截器。优化之后,是在struts.xml<package>中定义拦截器,并且自定义拦截器栈,将自定义拦截器和默认拦截器全部引入栈中,这样,在<action>中只需要引入自定义栈即可。另外,一定要注意引入的顺序。

进一步优化程序:配置默认拦截器栈:本包中的所有的action都生效,这样就不用在<action>中引入了。只需要在struts.xml配置即可,就是将自定义的拦截器栈引入到默认栈中即可。

在<package>根下:

<interceptors>

<!-- 定义拦截器 -->

<interceptor

name="myException"

class="com.zmx.util.MyInterceptor"/> <!-- 配置拦截器栈 --> <interceptor-stack

name="myStack">

<interceptor-ref

name="myException">

<param

name="includeMethods">save</param> <param

name="excludeMethods">show,delete</param>

</interceptor-ref>

<interceptor-ref

name="defaultStack"/>

</interceptor-stack> </interceptors>

<!-- 配置默认拦截器栈 --> <default-interceptor-ref name="myStack"/>

令牌:token目的就是防止页面刷新

- 页面必须加token标签,放置在表单的任意位置

- token码和session码都是在页面产生的

- 如果两个码相同那么放过,否则拦截

使用方式:

1.<s:token></s:token>

2.不需要定义,直接引入<interceptor-ref name="token">

<param

name="includeMethods">save</param> </interceptor-ref>

可放在栈中。

3.如果有刷新或后退,会产生invalid.token 配置

<result

name="invalid.token">/token.jsp</result>可放在<global-results>公共错误中

*** 安全问题:

* 把所有的页面配置在WEB-INF下即可,

* 强制程序员使用方法调用页面

在index页面中可以定义脚本转向

<script type="text/javascript"> function login(){

window.location

}

</script>

</head>

<body onload="login()"> <span

style="color:red">load...</span> </body>

struts2总结2

t>

* redirect redirectAction chain =

struts2总结2

* redirect当后缀发生变化时必须添加对应的后缀名称

* redirectAction(推荐)当后缀发生变化时不需要添加对应的后缀名称,因为它会自动添加对应的后缀

* 传递参数:redirect可以传递但是redirectAction不可以

<action name="loginAction" class="com.zmx.action.TestAction" method="login">

<result

</action>

* 可以配置chain传递参数:要求,参数的名称必须相同

<action name="loginAction" class="com.zmx.action.TestAction" method="login">

<result

type="chain">showAction</result>

</action>

<result name="list" 多个参数的连接符使用了"&",但XML的语法规范,应该使用"&"代替"&"

相关推荐