Struts2学习(三):所有基本功能详解

总结 struts2的常用东东:

一、验证,包括声明式(XML)和编程式验证(java),常用于后台验证

1.在action中复写 validate() 方法,此方法是通用验证

2.创建validateXxx()方法,此方法是专用于Xxx()方法的验证。以上如果两种都有的话,顺序则是专用—>通用

3.JSP页面中通过Struts2标签 <s:fielderror/>输出验证的相关信息

代码片段:


    
< form action ="${pageContext.request.contextPath}/login" method ="post" > < table border =1 > < tr > < td > 用户名: </ td > < th >< input type ="text" name ="username" ></ th > < td >< s:fielderror fieldName ="username" /></ td > </ tr > < tr > < td > 密码: </ td > < th >< input type ="password" name ="password" /></ th > < td >< s:fielderror fieldName ="password" /></ td > </ tr > </ table > < input align ="right" type ="submit" value ="登陆" /> </ form >

    
// 通用验证 public void validate() { System.out.println( " 进入通用验证程序----> " ); if (username != null && username.trim().length() > 0 ){ // 正则表达式,判断是否在汉子的区间里 if (username.matches( " [\u4E00-\uFA29] " )){ } else { this .addFieldError( " username " , " 用户名必须是中文 " ); } } else { this .addFieldError( " username " , " 用户名必填 " ); } if (password != null && password.trim().length() > 0 ){ // 密码必须是6个数字 if (password.matches( " [0-9]{6} " )){ ; } else { this .addFieldError( " password " , " 密码为6个数字 " ); } } else { this .addFieldError( " password " , " 密码必填 " ); } }

关于中文乱码问题,同样两种方式,POST和GET,如果是GET提交,则在set方法里把中文正确编码好即可。因为Action获取JSP页面参数是通过set方法得到的。


    
public void setUsername(String username) {//设置用户名 //获取提交方法 String methodType = ServletActionContext.getRequest().getMethod(); //POST提交 if("post".equalsIgnoreCase(methodType)){ this.username = username; //GET提交 }else if("get".equalsIgnoreCase(methodType)){ try { byte[] buf = username.getBytes("ISO8859-1");//还原编码 this.username = new String(buf,"UTF-8");//重新以UTF-8编码 } catch (Exception e) { } } }

声明式验证:需要Action里的get方法,否则获取不到值验证,通用验证为 xxxAction-validation.xml,放在与Action同级的目录下,专用xxx方法验证为xxxAction-xxx-validation.xml。文件首部信息可以从xwork-core-2.3.1.1.jar包里的 xwork-validator-1.0.3.dtd获取。


    
<? xml version="1.0" encoding="UTF-8" ?> <! DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd" > < validators > <!-- name与Action里的字段要一致 --> < field name ="username" > <!-- type表示验证的类型 --> < field-validator type ="requiredstring" > <!-- param 此处表示去除空格 --> < param name ="trim" > true </ param > <!-- 验证失败后的提示信息 --> < message > (XML)用户名必填 </ message > </ field-validator > < field-validator type ="regex" > < param name ="expression" > ^[\u4E00-\uFA29]+$ </ param > < message > (XML)用户名必须为中文!! </ message > </ field-validator > </ field > <!-- name与Action里的字段要一致 --> < field name ="password" > <!-- type表示验证的类型 --> < field-validator type ="requiredstring" > <!-- param 此处表示去除空格 --> < param name ="trim" > true </ param > <!-- 验证失败后的提示信息 --> < message > (XML)密码必填 </ message > </ field-validator > < field-validator type ="regex" > < param name ="expression" > ^[0-9]{6}$ </ param > < message > (XML)密码必须是6个数字 </ message > </ field-validator > </ field > </ validators >

如果编程式和声明式都出现的话,顺序则为 声明式->编程式

以下为常用验证规则

Struts2 的验证规则大概有以下数种:
required:必填校验器
requiredstring:必填字符串校验器
int:整数校验器
double:双精度浮点数校验器
date:日期校验器
expression:表达式校验器
fieldexpression:字段表达式校验器
email:电子邮件校验器
url:网址校验器
visitor:Visitor校验器(JavaBean)
conversion:转换校验器
stringlength:字符串长度校验器
regex:正则表达式校验器

常用的验证规则:
1.必填检验
<validators>
<field name="username">
<field-validator type="required">
  <message>指定检验失败的提示信息</message>
</field-validator>
</field>
</validators>


2.必填字符串检验
<validators>
<field name="username">
<field-validator type="requiredstring">
  <param name="trim">true</param>
  <message>指定检验失败的提示信息</message>
</field-validator>
</field>
</validators>


3.整数检验器/浮点检验
<validators>
<field name="age">
<field-validator type="int">
  <param name="min">1</param>
  <param name="max">150</param>
  <message>年纪必须在1到150之间</message>
</field-validator>
   </field>
</validators>

4.日期检验
<validators>
<field name="birth">
<field-validator type="date">
  <param name="min">1900-01-01</param>
  <param name="max">2050-02-21</param>
  <message key="birth.range"/>
</field-validator>
</field>
</validators>


5.字段表达式检验器(要求指定字段满足一个逻辑表达式)
<validators>
<field name="re_pass">
   <field-validator type="fieldexpression">
    <!--指定逻辑表达式 -->
        <param name="expression"> (pass eq re_pass)</param>
         <message>密码必须和确认密码相等</message>
   </field-validator>
</field>
</validators>


6.邮件地址校验
<validators>
<field name="email">
   <field-validator type="email">
         <message>你的电子邮件地址必须是一个有效的电邮地址</message>
   </field-validator>
</field>
</validators>


7.网址检验
<validators>
<field name="url">
   <field-validator type="url">
         <message>你的主页地址必须是一个有效的网址</message>
   </field-validator>
</field>
</validators>


8.字符串长度检验
<validators>
<field name="user">
<field-validator type="stringlength">
  <param name="minlength">4</param>
  <param name="maxlength">20</param>
  <message>你的用户名长度必须在4到20之间</message>
</field-validator>
   </field>
</validators>


9.正则表达式检验
<validators>
<field name="user">
<field-validator type="regex">
  <param name="expression_r"><![CDATA[(\w{4,25})]]></param>
  <message>您输入的用户名只能是字母和数组,且长度必须在4到25之间</message>
</field-validator>
   </field>
</validators>

二、拦截器

自定义拦截器,应该实现com.opensymphony.xwork2.interceptor.Interceptor接口或者继承AbstractInterceptor类或MethodFilterInterceptor(方法过滤需要)

拦截器配置好后,会在Action前执行,一般我们都需要struts2自带的拦截器


   
< package name ="interceptorPackage" namespace ="/" extends ="struts-default" > <!-- 定义拦截器和拦截器栈 --> < interceptors > < interceptor name ="ReferenceInterceptor" class ="com.igou.interceptor.ReferenceInterceptor" /> < interceptor-stack name ="testStack" > < interceptor-ref name ="ReferenceInterceptor" /> <!-- struts2默认自带的拦截器 --> < interceptor-ref name ="defaultStack" /> </ interceptor-stack > </ interceptors > < action name ="login" class ="com.igou.interceptor.LoginAction" method ="loginMethod" > < result name ="success" > /login_interceptor_success.jsp </ result > < result name ="input" > /login.jsp </ result > < result name ="toLoginJsp" > /login.jsp </ result > < interceptor-ref name ="testStack" /> </ action > </ package >


   
// 总拦截器,拦截直接访问action public class ReferenceInterceptor extends MethodFilterInterceptor { protected String doIntercept(ActionInvocation invocation) throws Exception { System.out.println( " 进入总拦截器,防止直接访问Action " ); String referer = ServletActionContext.getRequest().getHeader( " referer " ); if ( " referer " != null ){ invocation.invoke(); // 相当于Servlet的chain.doFilter(); return null ; } else { return " toLoginJsp " ; // 返回登录页面 } } }


   
< interceptor-ref name ="testStack" > <!-- 方法不被拦截 --> < param name ="excludeMethods" > loginMethod </ param > < param name ="includeMethods" > loginMethod </ param > </ interceptor-ref >

如果一个Action中对应多个方法,则方法拦截起作用

三、文件上传和下载

文件上传是通过Struts2拦截器实现的,必须的三个参数为:upfile(文件),upfileContentType(文件类型),upfileFileName(文件名称)—是fileupload拦截器自动传入的,要提供set和get方法,拦截器会自动上传变成临时文件。

JSP页面的form标签必须 写上 enctype="multipart/form-data"


   
package com.igou.Action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.UUID; import javax.servlet.ServletContext; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class uploadAction_2 extends ActionSupport{ private String username;//上传用户 private String uploadPath;//保存路径,这里通过struts.xml配置注入 //---三个参数是fileupload拦截器自动传入,数组就加上[] private File[] upfile;//真实文件 private String[] upfileContentType;//文件类型 private String[] upfileFileName;//文件名 //--set和get方法 //......省略 //业务方法 public String execute() throws Exception { //通过配置struts.xml 注入参数,隔离掉了Servlet API //ServletContext context = ServletActionContext.getServletContext(); //String uploadPath = context.getRealPath("/WEB-INF/upload"); InputStream is = null; OutputStream os = null; for(int i=0;i < this.upfile.length ;i++){ try { //文件名前面+UUID String uuidRealFileName = this.makeUuidRealFileName(this.upfileFileName[i]); //打开上传的临时文件 is = new FileInputStream(this.upfile[i]); os = new FileOutputStream(uploadPath+"/"+uuidRealFileName); byte[] buf = new byte[2048]; int len = 0; while((len = is.read(buf))>0){ os.write(buf, 0, len); } } catch (Exception e) { e.printStackTrace(); }finally{ if(is! =null){ is.close(); } if(os! =null){ os.close(); } //程序员自定义上传成功后删除临时文件 this.upfile[i].delete(); } } //保存相关信息到request域,打印信息 ActionContext.getContext().put("username", username); //ActionContext.getContext().put("uploadPath", uploadPath); ActionContext.getContext().put("upfile", upfile); ActionContext.getContext().put("upfileContentType", upfileContentType); ActionContext.getContext().put("upfileFileName", upfileFileName); return this.SUCCESS; } //工具类,生成随机文件名 private String makeUuidRealFileName(String realFileName){ return UUID.randomUUID().toString()+"_"+realFileName; } }

--------------------------------------------------------------------

<action name="upload_2" class="com.igou.Action.uploadAction_2" method="execute">
            <!-- 注入到uploadAction中的字段,通过set方法 -->
            <param name="uploadPath">
                K:\apache-tomcat-6.0.36\webapps\struts_1\WEB-INF\upload
            </param>
            <result name="success" type="dispatcher">/upload_success.jsp</result>
            <result name="input" type="dispatcher">/upload.jsp</result>
</action>   

---------------------------------------------------------------------

如果对上传文件限制的话,比如文件类型和后缀,大小等,可以使用拦截器进行设置。


   
<!-- 拦截器,拦截具体上传的类型 --> < interceptor-ref name ="fileUpload" > <!-- 参数注入,单个文件大小,后缀名jpg,文件类型jpg(二进制头文件判断) --> < param name ="maximumSize" > 512000 </ param > < param name ="allowedExtensions" > jpg </ param > < param name ="allowedTypes" > image/pjpeg </ param > </ interceptor-ref > <!-- 默认栈 --> < interceptor-ref name ="defaultStack" ></ interceptor-ref >

四、类型转换器

五、ActionContext数据中心

六、OGNL标签

转载于:https://my.oschina.net/5365437/blog/155975

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值