`
shishi11
  • 浏览: 116442 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2潜水(客户端静态验证)

阅读更多

<!----><!----><!----> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} --> <!---->

Struts2 潜水(客户端 静态 验证)

背景:

       看了一阵子的 struts2 Struts2 的开放性,使得我们可以不再特别死板地写 action jsp 代码,可以选择 velocity freemark 。对于以前的 struts1 tag ,我是很不喜欢的,代码时甚至不用,宁可用 script 来控制请求,特别是 Ajax 流行起来之后,以 script 来处理更是大有前途。于是对 struts2 中的 tag 进行了研究。为什么要用 tag 呢,我认为主要是为了标准化,它的特点是降低代码耦合、复用代码。而在 struts2 tag 渲染部分,可以选择 jsp/velocity/freemark ,(以前见过用一些自定义的标签库,内部生成的时候,以 print 的方式写出,逻辑相当复杂,而且不利于改造,因为要进参数的话,不但要改标签代码,还要改 JSP 代码。)由于前一个项目用的 velocity 渲染页面,所以比较熟,这里就想仔细研究一下自定义的 velocity 标签改造。

试验:

       根据网上的大部分可查到的代码,改造 struts.properties struts.ui.templateDir=template/archive

struts.ui.templateSuffix=vm

       这样,再做一个 jsp 的例子:

<s:form action="hello" validate="true" theme="ajax" id="aaa">

            Name: <s:textfield name="name" />

            <s:submit />

  </s:form>

Action 部分本来不用多话,但由于 annotation 的出现,这里我也做了新的试验,

package hello;

 

import java.text.DateFormat;

import java.util.Date;

 

import org.apache.struts2.config.NullResult;

import org.apache.struts2.config.Result;

import org.apache.struts2.config.Results;

import org.apache.struts2.dispatcher.VelocityResult;

 

import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.validator.annotations.IntRangeFieldValidator;

import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator;

import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;

import com.opensymphony.xwork2.validator.annotations.Validation;

 

@Validation

@Results({

    @Result(name="success",value="/HelloWorld.jsp",type=NullResult.class),

    @Result(name="error",value="/SayHelloWorld.jsp",type=NullResult.class),

    @Result(name="input",value="/SayHelloWorld.jsp",type=NullResult.class),

    @Result(name="velocity",value="/HelloWorld.vm",type=VelocityResult.class)

})

public class HelloAction extends ActionSupport { 

 

private static final long serialVersionUID = -3236383242453104587L;

 

private int name;

    @RequiredFieldValidator(message=" 需要 ")

    @IntRangeFieldValidator(message=" 数字 ",max="1000",min="0")

    public int getName() {

        return name;

    }

 

    public void setName(int name) {

        this.name = name;

    }

   

     public String execute() {

         //name = "Hello, " + name + "!";

        return SUCCESS;

}

}

 

其它的准备是codebehinde— 这个就不多说了,有jar 就行,web.xml

<filter>

        <filter-name>struts2</filter-name>

               <filter-class>org .apache .struts2.dispatcher.FilterDispatcher</filter-class>

   <init-param >

    <param-name>actionPackages</param-name>

    <param-value>hello</param-value>

  </init-param >

</filter>

好了,这个好处是不用像 struts1 中那样配 action struts.xml 可以完全不用, annotation 的主要目的就是减少 xml 配置量,甚至零配置。

结果:

结果并不让人满意,看到的是包含 validation JS ,好像是 ajax 的,但看了源代码之后,发现虽然基本完成了验证的作用,但说到所谓“客户端”验证,实在是没有达到。网上也有很多对 struts2 验证的评价,都说不太好用,我也同样认为不行,它好像实际是用 ajax 方式向服务器请求,看验证的输入值对不对,从性能角度,没有太多改善。为什么不能在客户端静态验证呢?其实所有的验证条件已经在代码时就写好了,为什么还要在运行时再来请求验证呢?这时,看到了 jquery validator 框架,下了代码,确实非常好用,而且也非常有利于和模板结合生成。但关键是,如何在运行前取到验证条件呢?

    先来看自定义模板吧。按 struts2 什么深入什么权威什么的书上写的,在 src 下建一下目录 template/archive/mytest ,(这里还容易犯一个错误,书上说建到 template 下,但已经换成了 vm 形式的了, struts.ui.templateDir=template/archive ,所以这里也得这么建)。建一个 theme.properties 文件,里面写一个 parent = xhtml 。这里不知道是不是一个 struts2 BUG ,理论上这样就可以了,只要在 form theme 中写 mytest 就可以了,实际上,大部分是可以的,但如果 struts2 源代码 (\src\core\src\main\resources\template\archive\) 中的 vm 里用了

#parse("/$parameters.templateDir/xhtml/controlheader.vm") 之类,会报错说找不到什么什么的,所以需要把源代码中 xhtml 中的所有 vm 都复制到 mytest 目录下才行。

接下来直接重写原来的 vm 就可以了。

改进:

对于veloctiy 来说,可以自定义隐含在context 中的对像,也就是toolbox; 而对于annoation 来说,本来是第一次用,所以从网上找到一段代码ValidationUtils

public HashMap getActionForm(String clazz) {

       HashMap actionform = new HashMap ();

       try {

           Class bean = Class.forName (clazz);

           validateMethods(bean, actionform);

       } catch (Exception e) {

           // TODO : handle exception

       }

 

       return actionform;

    }

 

    private void validateMethods(Class bean, HashMap actionform) {

       // get all of public methods

       Method[] publicMethods = bean.getMethods();

       // System.out.println (publicMethods.length);

       for (Method method : publicMethods) {

           // ignore if it is not getXXX method

           if (!isGetterMethod(method)) {

              continue ;

           }

 

           Annotation[] annotations = method.getAnnotations();

   

           if (annotations. length ==0) continue ;

           List annotations1= new ArrayList ();

           for (Annotation annotation : annotations) {

              // 如果有 validate--> 后面再试以 xml 方式混合的

              if (annotation != null )

              {

                  annotations1.add(annotation);

              }

           }

           actionform.put(StringUtils.lowerCase(StringUtils.remove(

                  method.getName(), "get")), annotations1);

       }

    }

也说是从 class 的中取回所有的声明,对于 struts2 action 来说,就是 getXXX

然后,建一个 velocity-toolbox.xml

<toolbox>

<tool>

     <key>validator</key>

     <scope>application</scope>

     <class>utils.ValidationUtils</class>

  </tool>

</toolbox>

把它放到 src 下,再在 struts.properties 里, struts.velocity.toolboxlocation=WEB-INF/classes/velocity-toolbox.xml

试过之后,开始改 form.vm ,这里只是试验性的代码,当然你也可以不这么写,无所谓,反正是 vm 的模板代码,随时改,不用编译。

<form

#if ($parameters.namespace) namespace="$!struts.htmlEncode($parameters.namespace)" #end

#if ($parameters.id) id="$!struts.htmlEncode($parameters.id)" #end

#if ($parameters.name) name="$!struts.htmlEncode($parameters.name)" #end

#if ($parameters.action) action="$!struts.htmlEncode($parameters.action)" #end

#if ($parameters.target) target="$!struts.htmlEncode($parameters.target)" #end

#if ($parameters.method) method="$!struts.htmlEncode($parameters.method)" #end

#if ($parameters.enctype) enctype="$!struts.htmlEncode($parameters.enctype)" #end

#if ($parameters.cssClass) class="$!struts.htmlEncode($parameters.cssClass)" #end

#if ($parameters.cssStyle) style="$!struts.htmlEncode($parameters.cssStyle)" #end

 

#if ($parameters.validate)

  <script type="text/javascript">

    #set($form=$validator.getActionForm("$parameters.actionClass.getName()"))

  $("#${parameters.id}").validate({ 

        rules: {

         'inttype':{

            required:true,

            number:true,

            min:0,

            max:100

        },

        #foreach($method in $form.keySet())

        #set($annotations=$form.get($method))

            $method :{

            #foreach($annotation in $annotations)

       

                $validator.toJQueryValidRule($annotation)   #if($velocityCount!=$annotations.size()),#end

            #end

            }

        #end

          }

      }

);

       

  </script>

#end

<table class="wwFormTable">

 

这里主要是两个问题,一个是如何得到 action uri 对应的 classname ,比较难,看了 struts2 源代码,找了好多方法,因为是 annotation 的方式验证,所以都不太成功,不知有没有找这个的代码。最后在 Form.java 里看到, evaluateExtraParamsServletRequest 方法里, addParameter("actionClass", clazz) ,发现其实是可以直接得到 classname 的。在 ValidtaionUtils 里加代码(其实并不好,只是为了减少 VM 中的代码,毕竟 VM 里写逻辑并不太好写)

public String toJQueryValidRule(Annotation annotation) {

       String rule = "" ;

       String vname = annotation.annotationType().getSimpleName();

       String v = (String) Validators .get(vname);

       if (vname.equals( "RequiredStringValidator" )) {

          

分享到:
评论

相关推荐

    struts2 登陆注册 以及验证

    对于验证,Struts2提供两种验证方式:客户端验证和服务器端验证。客户端验证通常使用JavaScript进行,对用户输入的数据进行实时检查,如非空验证、格式验证等。服务器端验证则在服务端进行,确保数据的安全性,防止...

    struts2验证框架

    在 Struts2 中,验证分为两部分:客户端验证和服务器端验证。客户端验证是指在浏览器端对用户输入的数据进行验证,服务器端验证是指在服务器端对用户输入的数据进行验证。在本文中,我们将主要介绍 Struts2 的服务器...

    ssh2中的urlrewrite和Struts2的生成静态页面

    ### SSH2中的URLRewrite与Struts2生成静态页面 #### URLRewrite的理解与应用 在SSH2(Spring + Struts2 + Hibernate)框架中,URLRewrite是一种强大的工具,可以用于实现URL重写功能,使得网站的URL更加友好、易于...

    struts2简单的登陆验证

    这个"struts2简单的登陆验证"项目是一个基础入门级别的教程,适合初学者学习理解Struts2的核心概念和工作原理。 在Struts2中,登陆验证是常见的功能,涉及到用户身份的确认和权限控制。下面我们将详细探讨Struts2...

    struts2官方例子7-表单验证 xml形式的验证

    在Struts2中,表单验证是非常重要的一个环节,它确保了用户输入的数据符合预设的规则,从而保证了应用程序的数据质量和安全性。本示例主要讲解的是使用XML文件进行表单验证的方法。 首先,让我们理解表单验证的基本...

    Struts2远程命令执行验证工具

    这个标题提到的“Struts2远程命令执行验证工具”就是专门针对这类漏洞设计的检测和分析软件。 Struts2远程命令执行漏洞,通常被称为S2-045或CVE-2017-5638,是由于Struts2框架在处理特定的HTTP头信息时存在缺陷,...

    Struts2静态页面生成

    Struts2结合FreeMarker模板引擎可以方便地生成静态页面,提高网站的响应速度和用户体验。 FreeMarker是一个强大的、轻量级的模板语言,用于生成动态内容。它与Java紧密集成,允许开发者用模板来分离业务逻辑和表现...

    struts2登陆验证

    在Struts2中,登录验证是常见的安全控制机制,用于确保只有合法用户能够访问受保护的资源。 在Struts2中实现登录验证,我们需要以下几个关键组件和步骤: 1. **Action类**:这是处理用户请求的核心,通常包含一个...

    struts2的Ajax实现注册验证

    一个简单的例子是使用`$.ajax()`函数,指定URL为Struts2 Action的路径,方法为GET或POST,根据你的需求来传递参数,如待验证的用户名。 3. **服务器端验证**:在Action类中,你需要编写一个方法来检查用户名是否已...

    Struts2 校验器

    Struts2提供了.struts2-jquery-validation-plugin等插件支持客户端验证。 2. **服务器端验证**:当客户端验证通过后,数据被发送到服务器,服务器端的验证是不可或缺的一环,因为它能防止恶意用户绕过客户端验证。...

    Struts2登陆+输入验证+动态调用实例

    Struts2提供两种主要的输入验证方式:客户端验证和服务器端验证。 1. 客户端验证:通过JavaScript在用户提交表单前检查输入,可以提供实时反馈,但安全性较低,因为JavaScript可以被禁用或篡改。 2. 服务器端验证:...

    struts的表单验证

    在Struts中,可以通过添加JavaScript代码到JSP页面,或者使用Struts2的验证框架生成客户端脚本来实现。但是,客户端验证不能完全替代服务器端验证,因为它容易被恶意用户绕过。 2. 服务器端验证: 服务器端验证是...

    struts2 短路校验(客户端校验)

    1. **引入JSR303 Bean Validation**:Struts2客户端校验依赖于JSR303(JavaBean Validation API),所以首先确保项目中已经包含了JSR303的实现,如Hibernate Validator。 2. **配置Action**:在Action类中,使用`@...

    struts2写的邮箱验证

    在这个“struts2写的邮箱验证”项目中,我们可以推测这是一个使用Struts2实现的用户注册系统的一部分,它包含了邮箱验证功能,以确保用户提供的邮箱地址有效并能接收邮件。 在Struts2中,邮箱验证通常涉及到以下几...

    Struts2中Validation数据验证框架教程

    在Struts2中,Validation框架是用于处理数据验证的重要组件,它允许开发者在用户输入提交到服务器之前或之后进行验证,确保数据的准确性和完整性。下面将详细解释Struts2中的Validation框架及其在前后台验证中的应用...

    Struts2 使用Validation框架验证数据(三十七)

    在Struts2中,数据验证是一个至关重要的部分,确保用户输入的数据符合预期格式和规则。本篇文章将详细探讨Struts2如何使用Validation框架进行数据验证。 一、Struts2 Validation框架概述 Struts2的Validation框架是...

    struts2 表单验证验证信息显示位置及效果

    这篇博客文章“Struts2 表单验证验证信息显示位置及效果”探讨了如何有效地实现和展示Struts2中的表单验证信息。 首先,Struts2提供了一种灵活的验证机制,包括Action级别的校验和ValidatorForm级别的校验。Action...

    Struts2 拦截器 手动验证 或 自动验证 后台登录验证 源码

    在提供的文件"10Struts2Validation"和"11Struts2InterceptorConfig"中,可能包含了Struts2拦截器配置和验证的示例代码。这些代码可以帮助你理解如何设置拦截器,如何配置验证规则,以及如何在实际应用中实现登录验证...

    struts2配置静态资源代码详解

    在Struts2中,配置静态资源是为了确保像CSS、JavaScript、图片等非Action处理的资源能够正常被浏览器访问。这些资源通常不涉及业务逻辑,而是用于页面展示和交互。配置静态资源对于优化应用性能和提升用户体验至关...

    struts2验证框架简单示例

    在Struts2中,验证框架是处理用户输入验证的关键部分,它确保了从客户端接收到的数据的质量和准确性。本示例将深入探讨Struts2验证框架的基本用法,特别适合初学者理解和掌握。 ### 一、Struts2验证框架概述 ...

Global site tag (gtag.js) - Google Analytics