一:进入模块
页首上的连接:启动Add方法
<a href="info_Add.action?addType=linkTo" style="color:gray">[发布信息]</a>
有两个作用,一是:如果是页首跳转来的信息 要条到真正的infoAdd.jsp
二是:如果是从infoAdd.jsp跳转来(也就是信息都填好了),那就存入数据库
(这一步感觉这样处理不好,代码写的也有些问题,不过不影响理解)
if(addType==null||addType.equals("")||addType.equals("linkTo")){//???这块存疑,linkTo的部分原程序里没考虑
request.setAttribute("mainPage","/pages/add/addInfo.jsp");
三:addInfo.jsp
这部分创建一个专门接受“信息发布”内容的表单,填好验证无误后,在交回给action的add方法
隐藏属性,add方法的两种用途做区分用
<input type="hidden" name="addType" value="add"/>
用select做下拉菜单
<tr>
<td width="20%" style="text-indent:10">信息类别:</td>
<td>
<s2:select
emptyOption="true"
list="#session.typeMap"
name="infoSingle.infoType"/>
</td>
<td align="right"><font color="#7F7F7F">[信息标题最多不得超过 40 个字符]</font></td>
</tr>
<tr><td colspan="3"><s2:fielderror><s2:param value="%{'typeError'}"/></s2:fielderror></td></tr>
<tr>
数据区
<tr><td colspan="3"><s2:fielderror><s2:param value="%{'titleError'}"/></s2:fielderror></td></tr>
<tr>
<td style="text-indent:10">信息内容:</td>
<td>
<font color="#7F7F7F">
已用:<input type="text" name="ContentUse" value="0" size="4" disabled style="text-align:center;border:0;"> 个
剩余:<input type="text" name="ContentRem" value="500" size="4" disabled style="text-align:center;border:0;"> 个
</font>
</td>
<td align="right"><font color="#7F7F7F">[信息内容最多不得超过 500 个字符]</font></td>
</tr>
<tr><td colspan="3"><s2:fielderror><s2:param value="%{'contentError'}"/></s2:fielderror></td></tr>
<tr><td colspan="3" align="center"><s2:textarea id="content" name="infoSingle.infoContent" rows="12" cols="85" onkeydown="check(content,ContentUse,ContentRem,500)" onkeyup="check(content,ContentUse,ContentRem,500)" onchange="check(content,ContentUse,ContentRem,500)"/></td></tr>
<tr>
<td style="text-indent:10">联系电话:</td>
<td colspan="2"><s2:textfield label="联系电话" name="infoSingle.infoPhone" size="45"/><font color="gray">[多个电话以逗号分隔!]</font></td>
</tr>
<tr><td colspan="3"><s2:fielderror><s2:param value="%{'phoneError'}"/></s2:fielderror></td></tr>
每个填写数据的地方后边都跟了一个写错误的fielderror标签
四:上述“二”中的add方法
折腾一圈,又回到这个方法,现在用这个方法的第二个功能,就是操作dao存储(感觉还是分开写比较好吧)
if(addType.equals("add")){//刚刚hidden的值
request.setAttribute("mainPage","/pages/error.jsp");//这个是action中validate-验错用的,后分析
OpDB myOp=new OpDB();
Integer type=Integer.valueOf(infoSingle.getInfoType());//是jsp直接传来的dto
String title=infoSingle.getInfoTitle();
String content=DoString.HTMLChange(infoSingle.getInfoContent());//工具类里,特殊字符的字串转换
String phone=infoSingle.getInfoPhone();
phone=phone.replaceAll(",","●");
String linkman=infoSingle.getInfoLinkman();
String email=infoSingle.getInfoEmail();
String date=DoString.dateTimeChange(new java.util.Date());
String state="0";//默认是没有审核,不付费的信息,要等后台操作此帖子
String payfor="0";
Object[] params={type,title,content,linkman,phone,email,date,state,payfor};
String sql="insert into tb_info values(?,?,?,?,?,?,?,?,?)";//各种组装
int i=myOp.OpUpdate(sql,params); //执行插入sql
if(i<=0)
addFieldError("addE",getText("city.info.add.E"));
else{
sql="select * from tb_info where info_date=?";
Object[] params1={date}; //插入后,用时间做标签,再取出来,展示给发布信息的人看
int infoNum=myOp.OpSingleShow(sql, params1).getId();
addFieldError("addS",getText("city.info.add.S")+infoNum);
}
}
return SUCCESS;
}
五:整个过程中的验错
第一关是发布页面的js
<head>
<title>发布信息</title>
<script type="text/javascript" src="<s2:url value='js/InputCheck.js'/>"></script>
</head>
function check(fieldName,UseName,RemName,len){
if(fieldName.value.length>len){
fieldName.value=(fieldName.value).substring(0,len);
alert("最多可只允许输入 "+len+" 个字符!");
return false;
}
else{
UseName.value=eval(fieldName.value.length);
RemName.value=len-UseName.value;
return true;
}
}
第二关是action的validateAdd()
validate加上要校验的方法名,就能在方法执行前先执行校验
摘录两段比较有用的
if(linkman==null||linkman.equals("")){
mark=false;
addFieldError("linkmanError",getText("city.info.no.infoLinkman"));
}
if(email==null||email.equals("")){
mark=false;
addFieldError("emailError",getText("city.info.no.infoEmail"));
}
if(mark){
String phoneRegex="(\\d{3}-)\\d{8}|(\\d{4}-)(\\d{7}|\\d{8})|\\d{11}";
if(phone.indexOf(",")<0){
if(!infoSingle.getInfoPhone().matches(phoneRegex)){
addFieldError("phoneError",getText("city.info.format.infoPhone"));
}
}
else{
String[] phones=phone.split(",");
for(int i=0;i<phones.length;i++){
if(!phones[i].matches(phoneRegex)){
addFieldError("phoneError",getText("city.info.format.infoPhone"));
break;
}
}
}
String emailRegex="\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
if(!infoSingle.getInfoEmail().matches(emailRegex)){
addFieldError("emailError",getText("city.info.format.infoEmail"));
}
}
对字串的空值校验和正则