Struts2基础知识(二)

本文主要包括以下内容

  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;}
}

完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想做自动驾驶技术的入,这回分享一个简单好用的开放平台

前言 自动驾驶已经是现在技术开发领域最热门的方向之一&#xff0c;作为程序员&#xff0c;很多人也都想来这个领域试试水。但是这个领域的门槛也挺高&#xff0c;不过想开始的话&#xff0c;其实可以从一些专门针对自动驾驶的开放平台开始入手&#xff0c;目前比较主流的可以…

潘建伟团队再登Nature:全球首次实现器件无关量子随机数,量子保密通信安全再升级...

岳排槐 编辑量子位 出品 | 公众号 QbitAI据消息&#xff0c;潘建伟团队日前成功实现了器件无关的量子随机数&#xff0c;将在数值模拟、密码学等领域广泛应用&#xff0c;并有望形成新的随机数国际标准。相关研究成果于北京时间20日由国际权威学术期刊《自然》在线发表&#xf…

一篇文章搞懂数据仓库:数据治理(目的、方法、流程)

目录 1、什么是数据治理 2、数据治理的目的 3、数据治理的方法 4、数据质量8个衡量标准 5、数据治理流程 1、什么是数据治理 数据治理&#xff08;Data Governance&#xff09;是组织中涉及数据使用的一整套管理行为。由企业数据治理部门发起并推行&#xff0c;关于如何制…

在OEL5上安装配置Oracle Gird Control 10.2.0.5

早期的Grid Control问题实在太多了&#xff0c;以至于把10.2.0.1的Grid Control升级到10.2.0.5几乎是不可能完成的任务&#xff1b;此外10.2.0.5以前的gc不支持11g作为repository database仓库数据库&#xff0c;不仅于此10.2.0.1版本是不支持rhel5或OEL5的&#xff0c;如果想安…

Struts2基础知识(三)

本文主要包括以下内容 OGNL表达式标签 防止表单重复提交 使用第三方插件tomcat启动时struts2容器做的事 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写&#xff0c;它是一个开源项目。Struts2框架使用OGNL作为默认的表达式语言。 相对EL表达…

70行Python代码,获取中国数据库大会(DTCC)全部PPT

大家好&#xff0c;我是明月十四桥&#xff01; 擅长领域&#xff1a;python黑科技、大数据后端研发、数据仓库 今日重点&#xff1a; ① 学会使用python 获取各种网站的ppt&#xff0c;可见即可爬&#xff1b; ② 中国数据库大会一年一届&#xff0c;门票昂贵&#xff0c;干货…

半导体产业格局:行稳而致远,强者将恒强

来源&#xff1a;华泰证券▌中国半导体产业链渐趋完善&#xff0c;产业生态体系逐步成形目前我国垂直分工模式的芯片产业链初步搭建成形&#xff0c;产业上中下游已然打通&#xff0c;涌现出一批实力较强的代表性本土企业。集成电路是基础性、先导性产业&#xff0c;涉及国家信…

Struts2之Crud综合实例

本文是Struts2的综合实例&#xff0c;主要包含以下功能 添加&#xff0c;删除&#xff0c;修改&#xff0c;查询用户上传&#xff0c;下载图片 拦截器实现登陆功能 验证器检查输入 下载图片功能以前没有实现过&#xff0c;步骤如下 在类中增加两个属性 //文件下载private…

教你用python爬英雄联盟官网:①掌握爬虫技术;②Python数据可视化

大家好&#xff0c;我是明月十四桥&#xff01;&#xff01; 擅长领域&#xff1a;python黑科技、大数据后端研发、数据仓库 今日重点&#xff1a; ① 掌握爬虫技术&#xff0c;体会python爬虫流程&#xff0c;可见即可爬&#xff1b; ② 学会使用python数据可视化。 有问题的…

7套干货,Python常用技术学习知识图谱!!(史上最全,建议收藏)

大家好&#xff0c;我是明月十四桥&#xff01; 你要偷偷努力&#xff0c;然后惊艳所有人~ 给大家推荐 7 个宝藏级教程&#xff0c;视频课是永久有效的&#xff0c;可以随时学习&#xff0c;有几门课程还有CSDN官方学习答疑群&#xff0c;课程右边扫码入群&#xff0c;讲师在群…

权威发布 |《科学美国人》:2018全球十大新兴技术

来源&#xff1a;世界经济论坛摘要&#xff1a;尽管这些技术仍处于发展早期&#xff0c;但它们吸引了众多研究团队的关注&#xff0c;并且广受投资者青睐。在未来3~5年间&#xff0c;它们可能会对社会与经济产生重要影响。9月19日&#xff0c;《科学美国人》与世界经济论坛&…

23篇大数据系列(一)java基础知识全集(2万字干货,建议收藏)

大数据系列爽文&#xff0c;从技术能力、业务基础、分析思维三大板块来呈现&#xff0c;你将收获&#xff1a; ❖ 提升自信心&#xff0c;自如应对面试&#xff0c;顺利拿到实习岗位或offer&#xff1b; ❖ 掌握大数据的基础知识&#xff0c;与其他同事沟通无障碍&#xff1b; …

Hibernate基础知识

本文主要包括以下内容 对象的状态 一对多的单向关联一对多的双向关联多对多关联 一对一关联 对象状态的变化 对象的状态 临时状态 new 持久化状态 get,save,update脱管状态 clear close evict 一对多单向操作&#xff0c;以班级表与学生表为例 Classes.java package …

从概念到应用,腾讯视角深入“解剖”AI平台和语音技术

来源&#xff1a;AI科技大本营摘要&#xff1a;9 月 15 日&#xff0c;以“破局人工智能&#xff1a;AI平台及智能语音应用解析”为题的沙龙在上海举办&#xff0c;本次活动由 CSDN、腾讯云联合主办。近年来&#xff0c;人工智能技术快速发展&#xff0c;与其他行业的结合也成为…

23篇大数据系列(二)scala基础知识全集(史上最全,建议收藏)

作者简介&#xff1a; 蓝桥签约作者、大数据&Python领域优质创作者。管理多个大数据技术群&#xff0c;帮助大学生就业和初级程序员解决工作难题。 我的使命与愿景&#xff1a;持续稳定输出&#xff0c;赋能中国技术社区蓬勃发展&#xff01; 大数据系列文章&#xff0c;…

为什么 AI 芯片时代必然到来——从TPU开始的几十倍性能之旅

作者&#xff1a;刘肉酱摩尔定律的终结将使服务于特定领域的架构成为计算的未来。一个开创性的例子就是谷歌在 2015 年推出的张量处理单元&#xff08;TPU&#xff09;&#xff0c;目前已经在为超过十亿人提供服务。TPU 使深度神经网络&#xff08;DNN&#xff09;的计算速度提…

java学习笔记之数组

数组是一种效率最高的存储和随机访问对象引用序列的方式,一旦初始化完成&#xff0c;数组长度将不能变&#xff0c;但可以改变其引用&#xff0c;如&#xff1a; int a[]{1,2}; int b[]{1,2,3,4,5}; ab; 如果输出&#xff0c;将得到&#xff1a; b.length5;a.length5; java数组…

《爬虫写得好,铁窗关到老》教你把握爬虫的法律边界!㊫

作者简介 蓝桥签约作者、大数据&Python领域优质创作者。维护多个大数据技术群&#xff0c;帮助大学生就业和初级程序员解决工作难题。 我的使命与愿景&#xff1a;持续稳定输出&#xff0c;赋能中国技术社区蓬勃发展&#xff01; 最近的IT公司违法案件越来越多&#xff0c;…

23篇大数据系列(三)sql基础知识(史上最全,建议收藏)

作者简介 蓝桥签约作者、大数据&Python领域优质创作者。维护多个大数据技术群&#xff0c;帮助大学生就业和初级程序员解决工作难题。 我的使命与愿景&#xff1a;持续稳定输出&#xff0c;赋能中国技术社区蓬勃发展&#xff01; 大数据系列文章&#xff0c;从技术能力、…

脑机交互研究及标准化实践

来源&#xff1a; 人机与认知实验室摘要&#xff1a;本文介绍脑机交互的概念及标准化的必要性&#xff0c;讨论近年来脑机交互的发展状况&#xff0c;重点阐述国内外植入式脑机接口的研究历程&#xff0c;并从脑机交互系统角度提出了脑机交互标准化的思考&#xff0c;同时介绍在…