-
Struts2校验方式:
1.编写代码方式校验:开发中常用;
2.配置校验:
2.1.基于XML配置校验(推荐使用)。
2.2.基于Annotation配置校验。 -
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中的业务方法. -
通过5个问题,搞明白输入校验的原理以及问题.
问题1:为什么在执行input方法之前,没有执行validate方法.
在validation拦截器中,标识需要排除的方法: -
问题2:为什么校验失败,默认跳转到input结果视图.
在workflow拦截器中,如果有错误,默认的结果视图就是input.
-
问题3:
当需要校验的方法比较多时用validate方法校验,不用validateXXX方法,然后在不需要执行校验的方法贴标签在不需要被校验的方法上,使用标签:@SkipValidation.
-
问题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结果类型,该结果类型就是专门用于支持文件下载功能的。
-
(阅读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> -
My97Date使用步骤:
1.将My97DatePicker日期插件的相关文件拷贝到项目中
2.在需要使用的页面中引入JS文件
<script src="/plugins/My97DatePicker/WdatePicker.js"></script>
3.在日期表单元素上添加一个点击事件,表示在点击该表单元素的时候弹出日期选择框 -
MD5使用步骤:
1.将MD5.java算法类拷贝到项目中:
2.在保存或者更新的方法中,将用户传递过来的密码进行加密 MD5.encode(明文) -
二次参数拦截器:未成功
2.让action继承ParametersInterceptor(PrepareInterceptor)?, 在prepare方法处理;
1.将默认拦截器修改为二次参数拦截器:paramsPrepareParamsStack注意:该方法是在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); } }
-
<img alt="标志" src="<s:property value='imgHead' default='/views/default.png'/>"/>
-
工厂:
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); } }