美文网首页
Struts2(三)

Struts2(三)

作者: 贾里 | 来源:发表于2017-10-20 09:23 被阅读15次

    1.输入校验


    1).需求

    Paste_Image.png

    2).输入校验(对用户输入的数据做合法的判断):

    • 1.客户端校验: 过滤正常用户的误操作,通过JS代码完成(可以绕开).

    • 2.服务端校验: 整个应用阻止非法数据的最后防线(必须),使用Java代码.

    • 3.数据库校验: 数据表的列有约束.

    3).Struts2校验方式:

    • 1.代码方式校验:开发中常用;

    • 2.配置校验:

      • 2.1.基于XML配置校验(推荐使用)。

      • 2.2.基于Annotation配置校验。

    4).在Action中如何做校验:

    方法:

    • 要继承ActionSupport.
    • 覆盖Validateable接口中的validate()方法 ,在该方法中完成验证

    步骤如下:

    • 1.validate()方法在其他的Action方法之前执行

    • 2.验证出错转向的页面

                         struts.xml配置<result name="input">/validate/login.jsp</result>   
      
                         其中input转向是在action中已经定义好的.
      
                         public static final String INPUT = "input";                  
      
                       什么时候表示验证出错(转向input所指向的页面)
      
                         *  super.addFieldError("字段名称", "错误信息");
      
                         *  当集合不为空时,转向错误页面.
      
                         *  若校验失败,不会再执行Action中的业务方法.
      
    Paste_Image.png Paste_Image.png

    5).出现的问题

    • 问题1:为什么在执行input方法之前,没有执行validate方法.

    在validation和workflow拦截器中配置了excludeMethods参数.告诉拦截器,要忽略方法名称为:input,back,cancel,browse的方法.

    Paste_Image.png
    • 问题2.为什么校验失败,默认跳转到input结果视图.

    在workflow拦截器中,默认跳转视图就是input(看下图).

    Paste_Image.png
    • 问题3:Action中某些方法不需要校验,却也执行了validate方法,如何避免问题.

    在不需要校验的方法之上,使用标签:@SkipValidation.

    • 问题4.开发中在一个Action中,校验的方法是少数,大多数方法都不需要校验.

      • 解决方案1:在其他方法上都贴@SkipValidation标签.(很烦)
      • 解决方案2:只针对于需要校验的方法做检验.
        编写方法: public void validateXxx(){}:此时该方法只对xxx方法做校验.
        比如: public void validateSave()针对于save方法.
    • 问题5:从workflow的拦截可以看出,校验失败会跳到默认的结果视图("input").
    Paste_Image.png

    使用标签:@InputConfig(resultName="edit"),注意该注解贴在被校验方法之上,而不是校验方法.

    • 问题6.错误信息提示丑陋.

    2.Struts2国际化


    1).准备国际化资源文件:基本名词:app

    中文:app_zh_CN.properties

    英文:app_en_US.properties

    2).告诉Struts2框架:国际化资源文件叫什么名字.

    <constant name="struts.custom.i18n.resources" value="app"/>

    3).准备国际化的login.jsp

    在JSP中,获取指定的国际化信息:(先引入Struts2的标签库)
    <s:text name="资源文件中的key"/>

    Paste_Image.png

    4).若要让Action支持国际化,那么Action必须继承ActionSupport或者ActionSupport的子类.

    5).在Action中获取资源信息:

    通过ActionSupport类中的:
    String getText(String name,String[] args);

    参数:

    名字 意义
    name 表示资源文件中的key
    args 资源文件中指定key占位符的真实值.

    返回:拼接好的一个国际化信息.

    Paste_Image.png

    3.文件上传


    1).文件上传准备:

    2).注意:

     1):表单必须使用POST方式提交;
     2):使用二进制编码.multipart/form-data
     3):<input type="file" name=""/>
    
    Paste_Image.png Paste_Image.png

    3).default.properties

    struts.multipart.parser=jakarta : 设置在Struts2中使用哪一种上传组件

    struts.multipart.saveDir= : 设置临时文件的保存路径(不要设置),默认就在Tomcat下.

    struts.multipart.maxSize=2097152 : 设置一次请求的最大值,单位字节. 默认是2M

    4).异常处理:

    • 1.格式不正确:

      默认情况下,Struts2框架没有设置允许的上传类型. 需要我们自己来配置允许的文件拓展名.

      fileUpload拦截器默认没有配置.

      解决方案:重新引用fileUpload拦截器,并配置允许的拓展名.


      Paste_Image.png
    • 2.文件过大:
      问题:上传失败之后,提示信息看不懂.
      解决方案:把提示信息作出国际化.支持中文.
      提示信息都在struts-messages.properties 文件里预定义. (org.apache.struts2包下)
      在struts.xml中引用资源文件:
      <constant name="struts.custom.i18n.resources" value="fileuploadMsg"/>

    Paste_Image.png

    4.文件下载


    struts2提供了stream结果类型,该结果类型就是专门用于支持文件下载功能的。
    (阅读stream结果集代码)
    指定stream结果类型 需要指定一个 inputName参数,该参数指定一个输入流,提供被下载文件的入口

    Paste_Image.png

    5.Struts标签


    表单标签将在 HTML 文档里被呈现为一个表单元素

    1).使用表单标签的优点:

    表单回显
    对页面进行布局和排版

    2).引用标签库:

    <%@ taglib uri="/struts-tags" prefix="s"%>

    3).Struts2标签:

    • 通用标签
      • 控制标签
      • 数据标签
    Paste_Image.png
    • 表单标签
    Paste_Image.png

    通用标签:

    1):控制流程标签:if-else if-else.

    Paste_Image.png

    2):其他的标签:默认会带上上下文路径和action的拓展名.

    Paste_Image.png Paste_Image.png Paste_Image.png

    6.Struts+JDBC的CRUD


    相关文章

      网友评论

          本文标题:Struts2(三)

          本文链接:https://www.haomeiwen.com/subject/rremuxtx.html