简单CMS项目笔记之六:信息发布模块

本文详细阐述了信息发布过程中的技术细节,包括模块设计、Action处理、表单验证、数据库存储等关键步骤,以及如何通过JS和Action的validate方法进行有效的错误检查。重点介绍了如何在前端与后端交互中实现信息的有效收集与存储。


一:进入模块

页首上的连接:启动Add方法

 <a href="info_Add.action?addType=linkTo" style="color:gray">[发布信息]</a>



二:action的add方法

有两个作用,一是:如果是页首跳转来的信息 要条到真正的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"));
				}				
			}
对字串的空值校验和正则

























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值