struts2学习笔记

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"/>">

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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