0%

除了在Action中实现validate()方法外,还可以添加配置文件来实现数据校验。Action必须继承自 ActionSupport. 假设Action名为LoginAction,在Action所在包下新建LoginAction-validation.xml,校验规则写在这里。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
        
<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <message>用户名不能为空</message>
        </field-validator> 
        <field-validator type="stringlength">
            <param name="minLength">4</param>
            <param name="maxLength">6</param>
            <message>用户名长度必须是4-6位</message>
        </field-validator>
    </field>
    <field name="password">
        <field-validator type="requiredstring">
            <message>密码不能为空</message>
        </field-validator>
    </field>
</validators>

field标签 name属性指定待验证的属性,field-validator的type属性指定校验器的类型,其值 可以为: int 整数; double 实数; date 日期; expression 两数的关系比较; email Email地址; url visitor conversion regex 正则表达式验证; required 是否为空; requiredstring 必须字符; stringlength 输入字符长度限制 参考com.opensymphony.xwork2.validator.validators包下的default.xml,在xwork-core-2.X.X.jar内。 各个验证器的参数可以参考通过default.xml找到对应的类,查看成员变量的setter和getter方法。 上面的配置文件,要求用户名和密码都不为空,且用户名长度在4-6位间。 现在可以删除Action中的validate方法,测试一下,struts.xml配置不变。

前面博文讲到,fielderror会自动把类型转换失败的错误信息加进去,其实我们可以自定义自动添加的错误信息。 1、在Action所在包下,新建一个以Action命名的properties文件,如RegisterAction.properties 2、指定每个出错字段的错误提示信息,如:

invalid.fieldvalue.age=age invalid!!

age是字段名,等号后面的是错误提示信息。如果输入中文,会自动转换为unicode.

在struts.xml中声明Action时,可以添加method属性指定执行的方法,而不是默认的execute()方法。 如果有多个自定义方法,又不希望使用同一个验证方法,可以分别定义验证方法, 方法定义必须为:

public void validateMyExecute()

方法名必须是validate加上首字母改为大写的自定义方法名,即这里的自定义方法名为myExecute。

应用中经常要对用户提交的数据进行验证,根据验证结果返回不同的页面,显示不同的信息。 struts2的表单验证流程:Action继承ActionSupport类,在执行execute()方法前,先执行validate()方法验证数据,如果有不合要求的数据,添加错误信息,当validate()方法执行完,如果发现错误信息不为空,则不再执行execute()方法,直接转发请求到struts.xml中定义的Action, result标签name属性为input对应的页面,下面的例子是直接转向到用户提交数据的页面。在用户提交的页面中,如果表单是用struts标签生成,则会自动填充之前填写的数据,还可以用struts标签输出错误信息。 提交信息的页面register.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>




Insert title here



    
    ------------------------
    
    
    
        用户名
        
        密码
        
        重复密码
        
        
    

接收用户提交的Action: RegisterAction.java

package com.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport {
    private String username;
    private String password;
    private String repassword;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRepassword() {
        return repassword;
    }

    public void setRepassword(String repassword) {
        this.repassword = repassword;
    }


    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("execute");
        return SUCCESS;
    }

    @Override
    public void validate() {
        // TODO Auto-generated method stub
        // 合法的情况什么都不用干
        //有错误会自动转向struts.xml中定义的result标签name属性为input的页面,本例中即用户输入页面
        if (username == null || username.length() < 4 || username.length() > 6) {
            //两种不同的方式添加错误信息
            this.addActionError("用户名不合规则");
            //参数为字段名,错误信息
            this.addFieldError("username", "用户名不合规则");
        }
        if(password==null||repassword==null||password!=repassword||password.length()<4||password.length()>6)
        {
            this.addActionError("密码不合规则");
        }
    }

}

struts.xml中Action的声明:

        <action name="register" class="com.struts2.RegisterAction">
            <result name="success">/registerResult.jsp</result>
            <result name="input">/register.jsp</result>
        </action>

通过验证后转向的页面,registerResult.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>




Insert title here


    用户名 
    密码

这里的类型转换器用来把用户输入转换成字符串解析后转换为指定的对象,也可以把对象转换成字符串输出页面。 这里以用户输入用户名密码为例,因为Action的属性要与Post过来的表单元素name属性对应,所以这里用户名和密码只有一个文件框中输入,以分号隔开。 JavaBean:User.java:

package com.bean;

public class User {
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return this.username+" "+this.password;
    }
}

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>




Insert title here


    使用分号隔开用户名和密码
    
    user info:	
     
    

UserAction:

package com.struts2;

import com.bean.User;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
    private User user;
    //不再需要声明成String类型,配置好后会自动调用转换器转换
    //但变量名还是要和input的name属性对应
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return SUCCESS;
    }
}

struts.xml配置action:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="struts2" extends="struts-default">
        <action name="userAction" class="com.struts2.UserAction">
            <result name="success">/result.jsp</result>
        </action>
    </package>
</struts>

接下来就是配置转换器了,因为可以双向转换,所以有两个不同的转换方法.

package com.converter;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.bean.User;
public class UserConverter extends StrutsTypeConverter {
    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        // TODO Auto-generated method stub
        //把jsp页面的提交转换成User对象
        String[] strs=values;
        String str=strs[0];
        String[] ss=str.split(";");
        User user=new User();
        user.setUsername(ss[0]);
        user.setPassword(ss[1]);
        return user;
    }

    @Override
    public String convertToString(Map context, Object o) {
        // TODO Auto-generated method stub
        //把User转换成字符串
        User user=(User)o;
        return user.getUsername()+" "+user.getPassword();
    }

}

接下来添加转换器配置文件,在UserAction所在的包下新建UserAction-conversion.properities文件,(文件名规则action名-conversion.properities),输入:

user=com.converter.UserConverter

Action中的属性=转换器类名.如果是全局类型转换,在src目录下建立xwork-conversion.properities,内容格式为对象所属类名=转换器类名 前面在struts.xml中配置action时配置了转向result.jsp,下面是result.jsp的代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>


  
    My JSP 'result.jsp' starting page
  
  
  
          
        username:${requestScope.user.username }
        password:${requestScope.user.password }
  

分别用struts2标签和EL表达式输出。

装了MyEclipse 10.0,想装个插件,却发现Help菜单下没有Install New Software…。最后发现,MyEclipse作了些修改,安装插件方法跟原版的Eclipse有些不同。 点Help->MyEclipse Configuration Center,再点击Software选项卡,在左边的搜索插件输入框右边,有Add Site链接,在这添加插件安装地址。添加后,可以在下面的Personal Sites里看到,展开,双击要安装的项,右边的Pending Changes框内会有 Apply XXX Changes按钮,点击即可安装。

Flot是jQuery的一个图表插件,可以很方便地用来绘制折线图。最新版的Flot是支持IE的,只是在使用时额外导入一个js文件。

<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="../flot/excanvas.min.js"></script><![endif]-->

另外,在定义数组时,最后一个元素后面不能加逗号,加了逗号在其他浏览器显示正常,但IE就有问题。包括在json中和javascript代码中。

用户登录,主要用到了session方法和CURD中select方法的连贯操作。

$user=D("User");
$password=md5($_POST['password']);
$username=addslashes($_POST['username']);
$login=$user->where("username='$username' and password='$password'")->select();
if($login!=null)
{
    session("user",$login);
    echo "登录成功";
    dump(session("user"));
}

都是基础不扎实惹的祸,这问题也困扰了半小时。 我的类在libs命名空间中,需要使用系统自带的DateTime类,但Eclipse提示找不到DateTime类,运行后报找不到libs\DateTime类,说明PHP是在当前命名空间中找的。 解决方法:

$startTime = new \DateTime($start);

在DateTime前加\,即在系统最底层的命名空间查找。访问外部命名空间方法:

$a = new subnamespace\foo();