Jimoshi_Struts2 框架学习(三)--valueStack和ognl、struts2验证、struts2文件上传和下载

来源:互联网 发布:崖山之后无中国 知乎 编辑:程序博客网 时间:2024/06/07 20:55
Jimoshi成长经历:前面的笔记后面再慢慢整理-------方便自己

目录:valueStack(值栈)、ognl( 对象图形导航语言)、struts2标签、struts2国际化、struts2验证、struts2文件上传和下载

Struts2 框架学习(三):


一、valueStack(值栈,存储数据的空间,线程安全)

  1、描述:Struts2会为每个请求创建一个新的值栈,也就是说,栈和请求是一一对应的,不同的请求,值栈也不一

样,而值栈封装了一次请求所有需要操作的相关的数据。

  2、狭义值栈:狭义值栈主要用来存放动态EL(表达式语言)运算需要的值和结果,当然OgnlValueStack对象主要是

用来支持OGNL(对象图导航语言)运算的(也就是说请求action 中产生的数据或者获取的数据,最终都是放到Ation

对应的值栈当中)

  代码示例:
  注::前台页面取值需要用S标签 当然注意要引入S标签 <s:property  value="uname"/>
  ActionContext   ac =   ActionContext.getContext();
  ValueStack    vs =  ac.getValueStack();
  vs.set("uname","wwj");

二、ognl( 对象图形导航语言)

  1、描述:对存放的数据进行取值,是一种表达式

  2、#request,#session,#application后面跟.语法(这里访问的是actioncontext里面的数据)

  3、通过使用#attr取数据的范围是:page - request -session -application

  4、ognl 访问静态方法和属性

    4.1.配置struts.xml文件

    代码示例:

    <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

    4.2.页面中使用OGNL表达式访问

    代码示例:

     <!-- 访问静态属性和方法 -->
     <s:property value="@com.zr.controller.MyStatic@name"/><br/>
     <s:property value="@com.zr.controller.MyStatic@showMsg()"/>

    4.3.ongl访问javabean对象、集合和Map
    
    代码示例:

    模拟数据:
           this.setStudent1(new Student(1, "wwj"));
           Map<String,Student>  s2  =new HashMap<String,Student>();
           s2.put("student2", new Student(2,"xyz"));
           this.setStudent2(s2);
           List<Student>  students = new ArrayList<Student>();
           students.add(new Student(3,"abc"));
           this.setStudents(students);

    页面获取:
           <!-- 访问对象 -->
       对象:<s:property  value="student1.sname"/><br>
       <!-- 访问集合 -->
       集合:<s:property  value="students[0].sname"/><br>
       <!-- 访问Map-->
       map:<s:property  value="student2.student2.sname"/>

三、struts2标签(数据标签,控制标签,界面标签,其它一些标签)

  优点:比JSTL强大   
  缺点 :性能特别低,一般在开发中不太常用

  数据标签:Propetry(输出值)、set(设置值)、Bean(定义java对象)、Date(日期)、Debug(调试)
            url标签、Include 标签(在页面使用<s:debug></s:debug>)
  控制标签:ifelse(判断标签)、Iterator(循环)、Append(叠加)、Generator(分隔标签)
            Merge(组合)、sort(排序标签)、subset(截取标签)
  循环标签:
       <s:iterator var="student"  value="students">
      <s:property  value="#student.sname"/>
    </s:iterator>
  界面标签:Form(表单)、text(文本)、radios(单选)、checkbox 标签、select (下拉)
  其它标签:UpdownSelect、optiontransferselect

四、struts2国际化


  1、配置国际化的属性文件

   代码示例:

   resource_en_US.properties
   resource_zh_CN.properties

   uname=Uname
   upsw=Upassword

  2、配置struts.xml文件

  代码示例:

   <!-- 添加国际化资源文件配置,value里面的值随便取-->
   <constant name="struts.custom.i18n.resources" value="resource"></constant>

  3、标签都是采用s标签

  代码示例:

   <s:form id="loginform" action="login" method="post">
         <s:text name="uname"></s:text>
         <input  type="text"/>
         <s:text name="upsw"></s:text>
         <input  type="text"/>
   </s:form>

五、struts2验证(实现的效果跟我们前台使用js进行验证是一个效果)

  1、编写提交文件

  代码示例:

  <s:form id="loginform" action="login" method="post">
        <s:textfield name="uname"  label="用户名"></s:textfield>
        <s:submit  value="提交"></s:submit>
  </s:form>

  2、配置对应的请求验证器XML文件
   注意:要保证跟action类同级
   比如action叫做abc那么对应验证文件就叫做abc--validation.xml
   编写XML中的验证规则:

   <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"         

"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
   <!-- 编写验证 -->
   <validators>
     <!-- 对哪个字段进行验证-->
     <field name="uname">  
        <!-- 配置必填字符串校验器 -->
         <!-- 这里相当于是对字符长度的验证-->
        <field-validator type="requiredstring">  
            <param name="minLength">5</param>
            <param name="maxLength">10</param>
            <message>对不起长度不满足要求</message>  
        </field-validator>  
     </field>
   </validators>

  3、如果不满足条件配置返回结果为input。返回你自己验证的页面。提交测试


六、struts2文件上传和下载

  1、文件上传

   1.1.编写页面

   代码示例:

   <!--enctype 必需配置,这个需要不是针对框架的,而是文件上传必需有这个  -->
       <form action="upload" method="post" enctype="multipart/form-data">
       请选择需要上传的文件:<input type="file"   name="fname"/>    
                                <input type="submit" value="提交">   
        </form>
  1.2.配置对应的XML文件

  代码示例:

   <!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) -->
   <constant name="struts.multipart.maxSize" value="10701096"/>
   <!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir-->
   <constant name="struts.multipart.saveDir " value="d:/tmp" />
   <package name="zr" extends="struts-default">
            <!-- 接收文件上传的请求 -->
             <action name="upload"  class="com.zr.controller.UploadController" method="upload">
                 <result name="success">index.jsp</result>
             </action>
    </package>

  1.3.编写对应的action类

  代码示例:

  public class UploadController extends ActionSupport{
    //通过文件上传,struts2会帮你接受上传的一些数据
    //文件  fname 跟  页面中file 定义的name名字一致的
    private   File  fname;
    //文件名    必需后缀加上FileName
    private   String fnameFileName;
    //文件类型  必需后缀加上ContentType
    private   String fnameContentType;
    (自行get set)
    public  String upload(){
    //获取服务器的地址    webapps/项目名/users
        String path  = ServletActionContext.getServletContext().getRealPath("/users");
        System.out.println(path);
        //将文件拷贝到需要的路径下面
        //1.先创建File 对象
        File  f = new  File(path);
        //2.执行拷贝的方法  (io组件当中 FileUtils 类 )
        try {
            //FileUtils.copyFileToDirectory(fname, f);
             FileUtils.copyFile(fname, new File(f,fnameFileName));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
        return  SUCCESS;
    }
   }
  注意:多文件上传也就是接收的参数为数组
  代码示例:
   private   File[]  fnames;//文件
   private   String[] fnamesFileName;//文件名
   private   String[] fnamesContentType;//文件类型

 2、文件下载

  2.1. 发送请求下载否文件

  代码示例:

  <a href="download">点击我下载</a>

  2.2.配置Struts.xml文件 接受对应下载请求

  代码示例:

  <!-- 接受下载的请求 -->  设置返回类型为流的形式
    <action name="download"  class="com.zr.controller.DownloadController">
      <result type="stream">
          <!-- 默认是找getInputstream 方法  但是可以配置由哪个方法来处理流-->
          <!--这里命名为download 那么anction 中必需方法命名为getDdownload-->
        <param name="inputName">download</param>
      <!-- 提示用户下载  attachment;filename= 不变  等号跟文件名-->
          <param name="contentDisposition">attachment;filename="${filename}"</param>
       </result>
    </action>

  2.3.编写getDownload的方法 返回类型是流

  代码示例:

  public  InputStream getDownload(){
        //模拟已经知道文件路径的地址
      String fpath = ServletActionContext.getServletContext().getRealPath("/users")+"\\abc.xls";
      File f =  new  File(fpath);
      this.setFilename("bcd");
      FileInputStream in = null;
      try {
           in = new FileInputStream(f);
       } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
         }
    return in;
   }

  2.4.测试下载
1 0
原创粉丝点击