1,编码配置
可以在三个文件中配置编码,分别是struts.xml struts.properties web.xml 优先级依次增高
name =struts.i18n.encoding value="utf-8"
2,struts2注解:
action的名字一定以Action结尾,例如UserAction,在进行名称匹配时候,自动找user
导包: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后面带参数)
test1
4,不同包下面action之间的访问
要访问的action:
访问该action的办法:
/xxx
test1
5,struts中的值栈
值栈中存放的是action对象,发出一次请求创建一个值栈,action之间跳转,如果以chain(服务器跳转)跳转,那么两个action共享一个值栈;
如果以redirectAction(重定向)跳转,则两个action位于两个值栈中,信息不会共享!
在从值栈中取值时,取值的顺序是:先从栈顶取,顺序向下;
如果第一个action v1有个变量s={张三}
第二个action v2有个同名的变量s={李四}
v1请求分派到v2. 在页面中取s的值为:李四;
如果想要得到张三的值,做法:使用TOP
注意:[1].top 取栈中的对象
法二:N语法(把top去掉)
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已经写好的拦截器,
wait页面做刷新:
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,
步骤一:
需要在配置文件作如下说明:
步骤二:
在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
页面:模型驱动
表示xml解析器将里面的东西当做纯文本解析,不会进行转义!
14,通过配置文件给要请求的action中的参数赋值
action类中有个属性savePath
img
14,struts2文件上传
(1)
(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赋值:
img
(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)页面显示
">