前天使用Struts2写了一个类型转换器,用于将IP地址转换成字符串保存。
希望本人能够对同样是初学者的你有所帮助
我写的是一个登录模块,需要将用户的登录IP,登录时间上传到服务器
我的思路是这样的
首先由客户端输入账户密码,然后将账户,密码,IP,时间传给服务器。
action里面的代码如下
public class Login extends ActionSupport{
private String username;
private String password;
private Date logindate;
private IpAddress idaddress;
下面省略set,get
。。。。。。
IpAddress是一个IP的坐标,就不写出来了。
但是在服务器端的action里面,居然没有执行到public String execute()函数,使得我百思不得其解,而且不管怎么输入,字符串都是返回的input。
在struts.xml里面的配置如下
<action name="login" class="action.Login">
<result>login_success.jsp</result>
<result name="input">login_success.jsp</result>
</action>
我不管怎么修改,都是返回的input的,
后来我发现在成功的页面,打印日期和IP地址
发现日期是可以正常显示,IP地址没有正确的显示,我第一感觉,是不是类型转换出问题了。下面我先发一下错误的类型转换代码,我们只看方法
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
IpAddress ia = new IpAddress();
String[] abcd = arg1[0].split(".");
ia.setA(Integer.parseInt(abcd[0]));
ia.setB(Integer.parseInt(abcd[1]));
ia.setC(Integer.parseInt(abcd[2]));
ia.setD(Integer.parseInt(abcd[3]));
return ia;
}
@Override
public String convertToString(Map arg0, Object arg1) {
IpAddress ia = (IpAddress)arg1;
String str = "("+ia.getA()+"."+ia.getB()+"."+ia.getC()+"."+ia.getD()+")";
return str;
}
因为我也不知道是那里的错误,所以我就逐步排查,发现程序在
String[] abcd = arg1[0].split(".") 这里出问题了。
而且arg1[0] 也是正常的。
然后下面获取abcd[0] 当然肯定也会出问题。
然后我就想会不会是这个函数有问题
split(".")
然后看了以下split的用法
stringObj.split([separator,[limit]])
原来可选项separator是一个字符串或正则表达式。
然后在正则表达式中 (点). 表示匹配除“\r\n”之外的任何单个字符。要匹配包括“\r\n”在内的任何字符,请使用像“[\s\S]”的模式。
如果要用点,就必须转义 \\.
当然还有|符号也是要进行转义的 \\|
自此,问题已经解决,原来是类型转换错误,导致action始终返回input字符串。爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情