struts2学习笔记

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后面带参数)


 
 
  (type="chain" 或者 redirectAction)
 test1
 

 

 

4,不同包下面action之间的访问

要访问的action:


 
 /success.jsp?name=${name}
 

 

访问该action的办法:

/xxx
 test1
 


 
 
 /success.jsp?name=${name}
 

 
 

 

 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.jsp

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

login.jsp

 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
     /success.jsp
    

 (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)页面显示

">

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(struts2学习笔记)