本文主要包括以下内容

  1. 文件上传,多文件上传
  2. 自定义拦截器
  3. 用户输入验证
  4. 国际化

文件上传

  • 将头设置为enctype=”multipart/form-data”
 <body><form action="${pageContext.request.contextPath}/upload/upload1.action" method="post" enctype="multipart/form-data">文件:<input type="file" name="image"/><br/><input type="submit" value="上传"/></form></body>
  • 写接收处理的方法,有两种,一种是自己实现IO流,一种是使用FileUtils
package cn.itcast.action;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;import javax.servlet.ServletContext;import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;public class UploadAction1 extends ActionSupport implements Serializable {private File image;//对应的就是表单中文件上传的那个输入域的名称,Struts2框架会封装成File类型的private String imageFileName;//   上传输入域FileName  文件名private String imageContentType;// 上传文件的MIME类型public File getImage() {return image;}public void setImage(File image) {this.image = image;}public String getImageFileName() {return imageFileName;}public void setImageFileName(String imageFileName) {this.imageFileName = imageFileName;}public String getImageContentType() {return imageContentType;}public void setImageContentType(String imageContentType) {this.imageContentType = imageContentType;}public String execute(){System.out.println(imageContentType);try {//处理实际的上传代码//找到存储文件的真实路径System.out.println(imageFileName);ServletContext sc = ServletActionContext.getServletContext();String storePath = sc.getRealPath("/files");//构建输入输出流/*OutputStream out = new FileOutputStream(storePath+"\\"+imageFileName);InputStream in = new FileInputStream(image);byte b[] = new byte[1024];int len = -1;while((len=in.read(b))!=-1){out.write(b, 0, len);}out.close();in.close();*/FileUtils.copyFile(image, new File(storePath,imageFileName));ActionContext.getContext().put("message", "上传成功!");return SUCCESS;} catch (Exception e) {e.printStackTrace();return ERROR;}}
}

多文件上传实现

package cn.itcast.action;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;import javax.servlet.ServletContext;import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;public class UploadAction2 extends ActionSupport implements Serializable {private File[] images;//对应的就是表单中文件上传的那个输入域的名称,Struts2框架会封装成File类型的private String[] imagesFileName;//   上传输入域FileName  文件名private String[] imagesContentType;// 上传文件的MIME类型public File[] getImages() {return images;}public void setImages(File[] images) {this.images = images;}public String[] getImagesFileName() {return imagesFileName;}public void setImagesFileName(String[] imagesFileName) {this.imagesFileName = imagesFileName;}public String[] getImagesContentType() {return imagesContentType;}public void setImagesContentType(String[] imagesContentType) {this.imagesContentType = imagesContentType;}public String execute(){try {if(images!=null&&images.length>0){ServletContext sc = ServletActionContext.getServletContext();String storePath = sc.getRealPath("/files");for(int i=0;i<images.length;i++)FileUtils.copyFile(images[i], new File(storePath,imagesFileName[i]));}ActionContext.getContext().put("message", "上传成功!");return SUCCESS;} catch (Exception e) {e.printStackTrace();return ERROR;}}
}

自定义拦截器

1、编写一个类,实现 com.opensymphony.xwork2.interceptor.Interceptor

2、主要实现public String intercept(ActionInvocation invocation) throws Exception{}方法

        该方法的返回值就相当于动作的返回值如果调用了String result = invocation.invoke();得到了动作类的返回的值。public String intercept(ActionInvocation invocation) throws Exception {//判断用户是否登录HttpSession session = ServletActionContext.getRequest().getSession();Object obj = session.getAttribute("user");if(obj==null){return "login";}else{return invocation.invoke();//调用动作方法}}

3、拦截器定义好后,一定要在配置文件中进行注册:

        <interceptors> 只是定义拦截器,并没有起作用 <interceptor name="permissionInterceptor" class="cn.itcast.interceptor.PermissionInterceptor"></interceptor></interceptors>

4、配置文件中的动作,要通过

        <interceptor-ref name="permissionInterceptor"></interceptor-ref>使用该拦截器

注意:一旦动作中使用了自定义的拦截器,那么默认的就不起作用了。一般应该采用如下的做法:

        <interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="permissionInterceptor"></interceptor-ref>

多个动作类都要使用的话,可以通过package来进行组合。

<package name="mypackage" extends="struts-default"><interceptors> <!--  只是定义拦截器,并没有起作用 --><interceptor name="permissionInterceptor" class="cn.itcast.interceptor.PermissionInterceptor"></interceptor><interceptor-stack name="mydefaultstack"><interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="permissionInterceptor"></interceptor-ref></interceptor-stack></interceptors><!-- 配置全局错误结果 :范围只是本包--><global-results><result type="dispatcher" name="error">/customer/error.jsp</result></global-results></package><package name="interceptor" extends="mypackage"><action name="visitIndex" class="cn.itcast.action.VisitAction" method="execute"><interceptor-ref name="mydefaultstack"></interceptor-ref><result name="success">/index.jsp</result><result name="login">/login.jsp</result></action></package>

用户输入验证

1、编程方式:

动作类中的所有方法进行验证:步骤:a、动作类继承ActionSupportb、覆盖调用public void validate()方法c、在validate方法中,编写不符合要求的代码判断,并调用父类的addFieldError(String fieldName,String errorMessage)如果fieldError(存放错误信息的Map)有任何的元素,就是验证不通过,动作方法不会执行。Struts2框架会返回到name=input的resultd、在name=input指定的页面上使用struts2的标签显示错误信息。<s:fielderror/>动作类中指定的方法进行验证:编写步骤与上面相同验证方法书写有要求:public void validateXxx()   Xxx代表的是要验证的动作方法名,其中要把动作方法名的首字母变为大写。

2、基于XML配置文件的方式:

动作类中的所有方法进行验证:在动作类的包中,建立一个名称为:动作简单类名-validation.xml ,比如要验证的动作类名是UserAction   UserAction-validation.xml内容如下:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.0.3//EN""http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"><validators><field name="username"><!-- 内置验证器都是定义好的,在xwork-core.jar com.opensymphony.xwork2.validator.validators包中的default.xml文件中 --><field-validator type="requiredstring"><!-- 不能为null或者""字符串,默认会去掉前后的空格 --><message>用户名不能为空</message></field-validator></field></validators>动作类中指定的方法进行验证:配置文件的名称书写有一定要求。动作类名-动作名(配置文件中的动作名)-validation.xmlUserAction-user_add-validation.xml

3、自定义基于XML的验证器

a、编写一个类,继承FieldValidatorSupport类。b、在public void validate(Object object)编写你的验证逻辑不符合要求的就向fieldErrors中放消息c、一定注册你的验证器才能使用在WEB-INF/classes目录下建立一个名称为validators.xml的配置文件,内容如下:<validators><validator name="strongpassword" class="cn.itcast.validators.StrongPasswordValidator"/></validators>d、日后就可以像使用Struts2提供的16个验证器方式去使用了。

实例

package cn.itcast.validators;import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;public class StrongPasswordValidator extends FieldValidatorSupport {public void validate(Object object) throws ValidationException {String fieldName = getFieldName();//取得字段名String filedValue = (String)getFieldValue(fieldName, object);//取得用户输入的当前字段的值if(!isPasswordStrong(filedValue)){addFieldError(fieldName, object);}}private static final String GROUP1 = "abcdefghijklmnopqrstuvwxyz";private static final String GROUP2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";private static final String GROUP3 = "0123456789";protected boolean isPasswordStrong(String password) {boolean ok1 = false;boolean ok2 = false;boolean ok3 = false;int length = password.length();for(int i=0;i<length;i++){if(ok1&&ok2&&ok3)break;String character = password.substring(i,i+1);if(GROUP1.contains(character)){ok1 = true;continue;}if(GROUP2.contains(character)){ok2 = true;continue;}if(GROUP3.contains(character)){ok3 = true;continue;}}return ok1&&ok2&&ok3;}
}

Struts2对于i18n的支持

全局资源文件/包范围资源文件/动作类的资源文件全局资源文件:放到WEB-INF/classes目录下包范围资源文件:服务于Java类中的包下的动作类的。  取名:package_语言_国家.properties动作类的资源文件:放到与动作类相同的包中取名:动作类名_语言_国家.properties

jsp中如何读取国际化的消息

<body><s:i18n name="itcast"><s:text name="welcome"><s:param>yr</s:param><s:param>study</s:param></s:text></s:i18n><s:i18n name="cn/itcast/action/package"><s:text name="welcome"><s:param>wxy</s:param><s:param>find boy friend</s:param></s:text></s:i18n></body>

动作类中如何读取国际化的消息

public class I18nAction extends ActionSupport implements Serializable {public String execute(){//取出资源文件中的welcome的值
//      String value = getText("welcome");String value = getText("welcome", new String[]{"朱巧玲","学习"});//封装到请求范围中ActionContext.getContext().put("message", value);return SUCCESS;}
}

完成

Struts2基础知识(二)相关推荐

  1. CV:计算机视觉技术之图像基础知识(二)—图像内核的可视化解释

    CV:计算机视觉技术之图像基础知识(二)-图像内核的可视化解释 目录 图像内核的可视化解释 测试九种卷积核 官方Demo DIY图片测试 DIY实时视频测试 相关文章 CV:计算机视觉技术之图像基础知 ...

  2. CV:计算机视觉技术之图像基础知识(二)—以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础)

    CV:计算机视觉技术之图像基础知识(二)-以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础) 目录 ...

  3. (五)JS基础知识二(通过图理解原型和原型链)【三座大山之一,必考!!!】

    JS基础知识二(原型和原型链) 提问 class 继承 类型判断(instanceof) 原型 原型关系 基于原型的执行规则 原型链 说明 提问 如何准确判断一个变量是不是数组 class的原型本质 ...

  4. oracle:oracle基础知识(二)

    oracle基础知识(二)笔记:高级查询 文章目录 分组查询 多属性分组语法: 过滤查询 group by 语句增强 sqlplus报表功能 多表查询 等值连接 外连接 自连接 子查询 子查询中的空值 ...

  5. 网络基础知识(二) HTTP

    网络基础知识(二) HTTP 黑发不知勤学早,白首方悔读书迟. 内容参考:https://www.runoob.com/http/http-content-type.html HTTP协议是Hyper ...

  6. CV:计算机视觉技术之图像基础知识(二)—图像内核的九种卷积核可视化解释(blur/bottom sobel /emboss/identity /sobel /outline/sharpen)

    CV:计算机视觉技术之图像基础知识(二)-图像内核的九种卷积核可视化解释(blur/bottom sobel /emboss/identity /left sobel /outline/right s ...

  7. scikit-learn学习基础知识二

    scikit-learn学习基础知识二 文章目录 scikit-learn学习基础知识二 一.介绍 二.代码实现 三.运行结果 四.总结 一.介绍 本文我们学习scikit-learn中的KNeigh ...

  8. kettle对字符串去除空格_整理|ABAP基础知识二:常用字符串处理

    常用字符串处理 上一期整理了ABAP的数据类型和定义,今天我们整理一下开发过程中常见的字符串处理命令.虽然说这些基础知识对于已经熟练使用Ctrl c + Ctrl v的资深码农来说过于简单.但是对于一 ...

  9. [Python学习] 专题五.列表基础知识 二维list排序、获取下标和处理txt文本实例

    通常测试人员或公司实习人员需要处理一些txt文本内容,而此时使用Python是比较方便的语言.它不光在爬取网上资料上方便,还在NLP自然语言处理方面拥有独到的优势.这篇文章主要简单的介绍使用Pytho ...

最新文章

  1. 2019年中国智能制造的十大发展关键点
  2. 数的补数 Number Complement
  3. linux运shell 出现commond vim_有了这个神器,再也不怕shell写得不对了
  4. 切割机插件_这些激光切割机的故障,看看你都遇到过吗?
  5. MySQL高级 - 日志 - 二进制日志(row及日志删除)
  6. linux ntp连接失败,linux ntp服务器连接异常
  7. orgmode导出html,含有python代码块的ORG-MODE导出为HTML时出错
  8. 提高加密程序加密强度的技巧
  9. 电信主机托管费用_电信服务器托管价格
  10. springboot租房管理系统答辩PPT模板
  11. Hessian学习(springboot环境)
  12. 计算机桌面锁屏设置,如何设置电脑锁屏壁纸详细方法
  13. state_dict详解--存放训练过程中需要学习的权重和偏执系数
  14. 最新wifi大师小程序独立版3.0.8源码
  15. 第十三题:中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”:一只公鸡值5钱,一只母鸡值3钱,三只小鸡值1钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?
  16. 修改谷歌浏览器缓存位置总结
  17. 输入目录路径以及名字,能够将该路径下所有文件的属性打印出来,类似ls -l
  18. GD32450i-EVAL学习笔记 1 - 准备工作
  19. Jquery实现textarea自动换行
  20. 【STM32】NVIC 中断优先级管理,抢占优先级,响应优先级,中断寄存器

热门文章

  1. Linux 程 序 员 失 业 警 告
  2. 拒绝无脑试错:写给萌新的“科学炼丹”入门手册
  3. 训练神经网络时如何确定batch size?
  4. 消息中间件系列(七):如何从0到1设计一个消息队列中间件
  5. 论文浅尝 - 计算机工程 | 知识图谱可视化查询技术综述
  6. pkuseg-python的postag.zip在不能联网的服务器上的解决办法
  7. 玩转算法值面试-第五章 -在链表中穿针引线
  8. [bzoj4994][Usaco2017 Feb]Why Did the Cow Cross the Road III_树状数组
  9. Restful Service 中 DateTime 在 url 中传递
  10. Android数据存储——SQLite数据库(模板)