文件的上传和下载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抽象类,重写里面的方
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 }显示的是默认的时间格式,
方法中是否有定义,还是返回空值,显示的都是 默认的时间格式。
但是,对于这两种取值方式
<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>
t>
* redirect redirectAction chain =
* 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的语法规范,应该使用"&"代替"&"
1Struts2中Action通过什么方式获得用户从页面输入的数据又是通过什么方式把其自身的数据传给视图的Action从页面获取数…
第一章MiniStruts的制作不使用Servlet也不使用requestgetParameter获取参数是用户能够直接访问Dao…
1struts2步骤1创建web项目2添加struts2的必须jar包3添加支持配置webxml文件4创建界面和相应的action…
20xx年5月13日221312Struts2总结fdteamcaptain陈玉龙1Struts2的起源和背景Struts2以We…
Day1一框架概述1三大框架是企业主流JavaEE开发的一套架构Struts2SpringHibernate2什么是框架为什么要学…
Struts2框架培训日志92020xxStruts2框架培训日志Struts框架的起源Struts是在20xx年5月发布第一个版…
Struts2项目开发总结注Struts2版本Struts216数据库Oracle9i所须架包commonslogging104j…
Day1一框架概述1三大框架是企业主流JavaEE开发的一套架构Struts2SpringHibernate2什么是框架为什么要学…
Struts2基础三种方式接收用户输入1使用领域对象接收用户输入2使用ModelDrivenaction页面示例注意代码黑体部分3…
1Struts2中Action通过什么方式获得用户从页面输入的数据又是通过什么方式把其自身的数据传给视图的Action从页面获取数…