struts2-02-Struts2的 校验-上传-下载未知-二次参数未成功-工厂

33 篇文章 0 订阅
4 篇文章 0 订阅
  1. Struts2校验方式:
    1.编写代码方式校验:开发中常用;
    2.配置校验:
      2.1.基于XML配置校验(推荐使用)。
      2.2.基于Annotation配置校验。

  2. Struts2中做校验:
    Action中
        *  要继承ActionSupport
        *  重写Validateable接口中的validate()方法 ,在该方法中完成验证
               * 步骤如下:
        execute()也可以校验,单是还调用业务方法,责任分离        
     * validate()方法在所有其他的业务方法之前执行
                     * 验证出错转向的页面 当出错,addFieldError有错误信息,方法中默认返回INPUT逻辑视图名
                             struts.xml配置<result name="input">/validate/login.jsp</result>   
                             其中input转向是在action中已经定义好的.
                             public static final String INPUT = "input";                  
                     *   什么时候表示验证出错(转向input所指向的页面)
                             1super.addFieldError("字段名称", "错误信息");【super.addActionError("请登陆。。。"),用<s:property value="actionErrors[0]">】
                             2 当集合不为空时,转向错误页面.
                           3若校验失败,不会再执行Action中的业务方法.

  3. 通过5个问题,搞明白输入校验的原理以及问题.
    问题1:为什么在执行input方法之前,没有执行validate方法.
               在validation拦截器中,标识需要排除的方法:

  4. 问题2:为什么校验失败,默认跳转到input结果视图.
           在workflow拦截器中,如果有错误,默认的结果视图就是input.
           

  5. 问题3:
    当需要校验的方法比较多时用validate方法校验,不用validateXXX方法,然后在不需要执行校验的方法贴标签

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

  6. 问题4.开发中在一个Action中,被校验的方法是少数,大多数方法都不需要校验.
         不覆写validate(),定义一个以validate开头的validateXXX方法,就只会在XXX方法之前执行 。
         public void validate(){}:默认对Action中所有方法做校验.
         public void validateXxx():该方法就只对xxx方法做校验.
    问题5:从workflow的拦截可以看出,校验失败会跳到默认的结果视图("input").
            比如,要求校验失败之后不要挑战到input视图,而是edit视图.

         解决方案:在被校验的方法上,使用@InputConfig标签.
       

  •         private String username;
    	private File headImg;
    	private String headImgFileName;
    	private String headImgContentType;
    public String upload() throws IOException {
    		String realPath =                 ServletActionContext.getServletContext().getRealPath("/views");
    		File file = new File(realPath,headImgFileName);
    		FileUtils.copyFile(headImg, file);
    		System.out.println("进入save方法");
    		return NONE;
    }

    Struts2文件上传的细节:
     Struts2中的FileUploadInterceptor拦截器完成了文件上传的操作.
    Struts2支持cos,pell,jakarta文件上传组件,默认使用的jakarta(Apache).
    struts.multipart.saveDir=                      上传文件的临时目录,默认是在Tomcat下面.
    struts.multipart.maxSize=2097152     一次请求允许上传文件的最大字节数,默认是2M.
    --------------------------
    控制上传文件的大小和文件类型.
        1):控制单个文件的最大字节.
        2):控制上传文件的类型,比如png,jpg,jpeg,bmp.
    ---------------------------------------------------------
    问题:上传失败之后,提示信息看不懂.
          解决方案:把提示信息作出国际化.支持中文.
          提示信息都在struts-messages.properties 文件里预定义.  (org.apache.struts2包下)
          在struts.xml中引用资源文件:
          <constant name="struts.custom.i18n.resources" value="fileuploadMsg"/>

                    <interceptors>
    			<interceptor-stack name="myStack">
    				<interceptor-ref name="fileUpload">
    					<param name="maximumSize">20</param>
    					<param name="allowedExtensions">jpg,png,bmp</param>
    				</interceptor-ref>
    				<interceptor-ref name="defaultStack"></interceptor-ref>
    			</interceptor-stack>
    		</interceptors>
    		<default-interceptor-ref name="myStack"></default-interceptor-ref>
    		<action name="upload" class="icbc.validate.FileAction"
    			method="upload">
    			<result name="input" type="dispatcher">/WEB-INF/upload.jsp</result>
    		</action>
                <constant name="struts.custom.i18n.resources" value="fileuploadMsg"/>
    jsp:
            <s:debug/>
    	<s:fielderror/>
            super.addFieldError("fieldName", "请登陆。。。");
    	<s:property value="fieldErrors.username[0]"/>

    下载:Struts2提供了stream结果类型,该结果类型就是专门用于支持文件下载功能的。

  1. (阅读stream结果集代码)
    指定stream结果类型 需要指定一个 inputName参数,该参数指定一个输入流,提供被下载文件的入口
    ----------------------------------------------------------------------------------------------
           <action name="" class="">  
               <result name="success" type="stream">  
                   <param name="contentDisposition">attachment;fileName="${fileName}"</param>  
                   <param name="inputName">downloadFile</param>  
               </result>  
           </action>  

  2. My97Date使用步骤:
         1.将My97DatePicker日期插件的相关文件拷贝到项目中
         2.在需要使用的页面中引入JS文件
             <script src="/plugins/My97DatePicker/WdatePicker.js"></script>
        3.在日期表单元素上添加一个点击事件,表示在点击该表单元素的时候弹出日期选择框

  3. MD5使用步骤:
        1.将MD5.java算法类拷贝到项目中:
      2.在保存或者更新的方法中,将用户传递过来的密码进行加密 MD5.encode(明文)

  4. 二次参数拦截器:未成功
      1.将默认拦截器修改为二次参数拦截器:paramsPrepareParamsStack

      2.让action继承ParametersInterceptor(PrepareInterceptor)?, 在prepare方法处理;

      注意:该方法是在saveOrUpdate方法之前执行,   是由prepare拦截器调用

    package icbc.interceptor;
    
    import com.opensymphony.xwork2.interceptor.ParametersInterceptor;
    import com.opensymphony.xwork2.interceptor.PrepareInterceptor;
    
    import lombok.Getter;
    import lombok.Setter;
    @Getter@Setter
    public class ParamsPrepareParamsStackAction extends  ParametersInterceptor{
    	private String username;
    	private String password;
    	private String honeyname;
    	private static final long serialVersionUID = 178505990943139832L;
    	public void prepare()  {
    		 this.setHoneyname("老汪");
    		 System.out.println(honeyname);
    	}
    	public void params() throws Exception {
    		 System.out.println(honeyname+username+password);
    	}
    }
    

     

  5. <img alt="标志" src="<s:property value='imgHead' default='/views/default.png'/>"/>

  6. 工厂:

    public class BeanFactory {
    	private BeanFactory(){};
    	public static Properties p = new Properties();
    	static{
    		InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("factory.properties");
    		try {
    			p.load(in);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	@SuppressWarnings("unchecked")
    	public static <T> T getBean(String beanName) throws Exception {
    		String beanClassName = p.getProperty(beanName);
    		Object bean = Class.forName(beanClassName).newInstance();
    		return (T)bean;
    	}
    	public static void main(String[] args) throws Exception {
    		Object person = BeanFactory.getBean("person");
    		Object user = BeanFactory.getBean("user");
    		System.out.println(person+" >>> "+user);
    	}
    }
    

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值