1,编码配置
可以在三个文件中配置编码,分别是struts.xml struts.properties web.xml 优先级依次增高
name =struts.i18n.encoding value="utf-8"
2,struts2注解:
action的名字一定以Action结尾,例如UserAction,在进行名称匹配时候,自动找user
<form action="user.action"/>
导包:struts2-convention-plugin-2.3.4.1.jar
spring-asm-3.0.5.RELEASE.jar
声明在类的外面
@ParentPackage(value="struts-default")
@Namespace(value="/")
//@Result(name="success",location="/fail.jsp")
@Results({
@Result(name="success" ,location="/success.jsp",type="redirect"),
@Result(name="error" ,location="/fail.jsp",type="redirect")
})
3,result结果集 action之间的跳转
配置:chain与redirectAction的区别:
chain 服务器端的跳转;
redirectAction:客户端的跳转
两者通过拦截器都可以传递数据;
页面的跳转:redirect 和dispacher
redirect传递数据的方法:?(url后面带参数)
<struts>
<package name="form" extends="struts-default">
<action name="test" class="com.tjise.TestAction" >
<result type="chain"> (type="chain" 或者 redirectAction)
<param name="actionName">test1</param>
</result>
</action>
4,不同包下面action之间的访问
要访问的action:
<package name="form2" namespace="/xxx" extends="struts-default">
<action name="test1" class="com.tjise.Test1Action" >
<result >/success.jsp?name=${name}</result>
</action>
</package>
访问该action的办法:
<result type="chain">
<param name="namespace" >/xxx</param>
<param name="actionName">test1</param>
</result>
<action name="test1" class="com.tjise.Test1Action">
<result >/success.jsp?name=${name}</result>
</action>
</package>
</struts>
5,struts中的值栈
值栈中存放的是action对象,发出一次请求创建一个值栈,action之间跳转,如果以chain(服务器跳转)跳转,那么两个action共享一个值栈;
如果以redirectAction(重定向)跳转,则两个action位于两个值栈中,信息不会共享!
在从值栈中取值时,取值的顺序是:先从栈顶取,顺序向下;
如果第一个action v1有个变量s={张三}
第二个action v2有个同名的变量s={李四}
v1请求分派到v2. 在页面中取s的值为:李四;
如果想要得到张三的值,做法:使用TOP
<s:property value="[1].top.s"/>
注意:[1].top 取栈中的对象
法二:N语法(把top去掉)
<s:property value="[1].s"/>
6,往栈中加入对象的方法
ActionContext.getContext.getValueStack.push();
7令牌机制
原理:从index.jsp登陆页面到success.jsp登陆成功页面;
访问index.jsp页面时,会从服务器端的session中取值赋值给index.jsp,当在index.jsp点击登陆并且登陆成功后,会把服务器端中session的值清空,并且产生新的值,
在success.jsp中点击后退按钮回到index.jsp,此时,index.jsp仍然保留原来的值,旧值与session中的值不一致,点击登陆后,会给出相应的信息提示!!
8 等待页面拦截器
引用struts2已经写好的拦截器,
<interceptor-ref name="execAndWait"/>
<result name="wait">/wait.jsp</result>
wait页面做刷新:<meta http-equiv="refresh" content="3;URL=login.action">
9,WEB-INF下面的资源是受保护的,用户不可见!
10,实现PreResultLinster接口的拦截器:
例如:TestPreResultLisenter implements PreResultListener
TestPreResultLisenter拦截器执行的时间:在执行完action之后,返回result结果集之前执行;主要对结果集做处理,比如修改文件的后缀名等等;
具体使用方法:TestPreResultLisenter需要在另外的拦截器中做绑定,在配置文件中无需配置;TestPreResultLisenter也没有返回值;
在另外拦截器绑定的方法:
Invocation.addPreResultListener(new (TestPreResultLisenter));
11,使用注解配置拦截器
注解配置拦截器属于方法级别的,因此需要把注解的信息配置在类action的里面;
在struts2-core-2.3.4.1.jar下面找到/xwork-core-2.3.4.1.jar,找到com.opensymphony.xwork2.interceptor.annotations,最终找到AnnotationWorkflowInterceptor.class,
步骤一:
需要在配置文件作如下说明:
<interceptors>
<interceptor name="annor" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor"></interceptor>
</interceptors>
步骤二:
在action类中如下:
@Before
在action执行之前被调用
@After
在action执行之后被调用,如何action没有执行那么此方法不会被调用
@BeforeResult
在result结果返回之前被调用
//拦截器的注解
@Before
public String doBefore(){
System.out.println("注解配置的方法在action执行之前调用");
if(session.get("name")==null){
return "fail";
}else{
return null;
}
}
@After
public void doafter(){
System.out.println("调用action后执行");
}
@BeforeResult
public void doBeforeResult(){
System.out.println("注解配置的方法在result返回之前执行");
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("开始执行execute方法");
if(username.equals("admin")&&password.equals("admin")){
return SUCCESS;
}else{
return "fail";
}
12 struts2中国际化见博客;
13 <!-- 两次密码不一致的验证办法!!! -->
页面:模型驱动
<![CDATA[... ]]>表示xml解析器将里面的东西当做纯文本解析,不会进行转义!
<field name="user.password1">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[(user.password.equals(user.password1))]]></param>
<message>密码不一致</message>
</field-validator>
</field>
14,通过配置文件给要请求的action中的参数赋值
action类中有个属性savePath
<action name="upload" class="com.tjise.Action.UploadAction">
<param name="savePath">img</param><!--给action中的参数赋值 -->
<result name="success" >login.jsp</result>
</action>
14,struts2文件上传
(1)
<s:form action="upload" method="post" namespace="/login" enctype="multipart/form-data">
<s:file name="user.file" label="选择上传的文件"></s:file>
<s:submit value="上传"/>
</s:form>
(2)
User实体中有三个字段,取名有规则;
private File file;
private String fileFileName;//取名规则:文件名+FileName;文件名+ContentType
private String fileContentType;//自动获得文件名和类型
(3)
在action中,定义一个user,定义一个文件保存路径savePath,savePath可以在struts.xml中赋值;
private User user;
private String savePath;//文件保存路径
struts.xml赋值:
<action name="upload" class="com.tjise.Action.UploadAction">
<param name="savePath">img</param><!--给action中的参数赋值 -->
<result>/success.jsp</result>
</action>
(4)在action类中通过流的读写进行上传
首先:构建路径:
String path=ServletActionContext .getServletContext().getRealPath(getSavePath());
//获取文件的后缀名
String expend=user.getFileFileName().substring(user.getFileFileName().lastIndexOf("."));
//利用UUID对文件重新命名
String newFileName=UUID.randomUUID().toString()+expend;
//写入路径(真实路径+文件名)
String fileName=path+"\\"+newFileName;
......
(5)页面显示
<img src="<s:property value="savePath+'/'+user.fileFileName"/>">