1、form表单数据获得问题:
即:只要是在<form></form>标签里,传递的数据都可以通过form直接获得到,也可以通过request.getParameter("saId");获得到,无论是:隐藏域传的参数、链接传的参数、javascript传递的参数、还是表单里文本框的参数,都可以通过form获得到。
eg:隐藏域:<input type=hidden name=status value="<%=statusShow%>">
链接:<a href="especiallyDestroy.do?method=handle&saId=<%=saId%>">
javascript:
function dis(saId){
document.form1.action="especiallyDestroy.do?method=dis&saId="+saId;
document.form1.submit();
}
<input type="button" name="go22" value="作 废" οnclick="dis('<%=saId%>')" >
文本框:
<td height="25" align="right">客户名称
<input type="text" name="customerName" value="<%=customerNameWhere%>">
</td>
注意:如果你想在业务逻辑类里通过form获得传递过来的参数,必须在struts的配置文件里,配置这个参数,否则就会报错,如果你不通过form获得传递过来的参数,而是通过request.getParameter("saId");获得参数,就不用在配置文件中,配置这个参数。
报的错误:java.lang.IllegalArgumentException: Invalid property name 'saId'
2、通过javascript实现,批量删除:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/furthersun/b2b779af8d464c559229b48616ffd06c.png)
a、首先通过javascript获得复选框的值,这个值是一个String [],这个值就是复选框里,你所选上的。
b、通过javascript调用Action里的方法,并把这个数组,传递给Action。
c、在Action里对这个数组做下处理,把数组用","分隔开,然后在Action里做for循环,在for循环里调用app里的方法,也就是当i=2时,把某个id传递给app里的方法,所以说app里的方法接收的参数可以是int或string而不是数组,通过这样的一个for循环,就实现了循环删除,也就是批量删除。其实批量删除并不是一下把所选的都删除了,在后台的实现
是一个一个删除的,这种思想真的挺好!
d、本人所做模块用到的东西:app里有多个方法,并且接收的参数不止id一个,这时就可以通过用到这个id的一条sql把其他的参数,直接从表里检索出来,再传给接收此参数的方法。这里用到的思想:不是所有后台的参数,都是从页面传递过来的,也可以是从数据库中直接检索出来的。
eg:当你在Action里调用app里的一个方法时,传递这个方法所需要的参数,而在这个方法里,又调用了app里的另一个方法,这时就可以在调用这个方法之前,通过带id的一条sql把下面这个方法,所需的参数,直接从数据库中检索出来。
javascript:
function del(){
var flag = "false";
var str = "";
if(document.form1.sel==undefined)
{
alert("您没有要操作的信息!");
return false;
}
else
{
if(document.form1.sel.length == undefined)
{
if(document.form1.sel.checked==false)
{
alert("请选择要操作的信息!");
return false;
}
else
{
document.form1.action = "agentDomainAddYuJing.do?method=dis&arry="+document.form1.sel.value;
document.form1.submit();
}
}
else
{
for(var i=0;i<document.form1.sel.length;i++)
{
if(document.form1.sel[i].checked == true)
{
if(str=="")
{
str = document.form1.sel[i].value;
}
else
{
str = str+","+document.form1.sel[i].value;
}
flag = "true";
}
}
if(flag =="false")
{
alert("请选择要操作的信息!");
return false;
}
document.form1.action = "agentDomainAddYuJing.do?method=dis&arry="+str;
document.form1.submit();
}
}
}
function submitform(){
document.all("jumpPage").value = 1;
return true;
}
<input name="sel" type="checkbox" class="noborder " value="<%=domainRegId%>">
Action里的for循环:
for(int i=0;i<id.length;i++){
b = app.deleteSave(agentDomainAddYuJingForm, id[i]);
if(b==false){
System.out.println("删除域名时"+id[i]+"出错");
break;
}
}
3、隐藏域传值问题:
特批单作废模块:当你点某条记录的处理时,把这条记录的id传给后台Action里的方法,那么你怎么知道这个id就是你所点"处理"的那条记录的id呢?看下面的代码:
ArrayList list=(ArrayList)pageBean.getNewData();
for(int i=0;i<list.size();i++){
DBRecord dbr=(DBRecord)list.get(i);
String saId = dbr.getField("SPECIAL_APPLICATION_ID")==null?"":dbr.getField("SPECIAL_APPLICATION_ID").toString();
}
![](https://p-blog.csdn.net/images/p_blog_csdn_net/furthersun/918c5b3a30814530b5bb7b85b00f5179.png)
解释:首先获得当前页面的数据,通常是10条,之后是做for循环输出数据。把数据库对应的一条数据封装到DBRecord这个对象里。当i=0时,获得的就是第一条记录,而此时的id就是第一条记录的id,所以当你点第一个"处理"时,就把这个id传递给了后台的方法。其实上,当页面上已经列出每条记录时,每条记录的id就是固定的了,这个通过for循环就能实现,而当你点某条记录的处理时,就把这条记录的id传递给后台的业务逻辑方法。
隐藏域解释:当id=0时,把id为0的数据库的相关信息检索出来,此时,假如:"作废"这个方法需要接收一个"客户名称"这个参数,在especiallyDestroySearchApply.jsp页面里这里我们通过隐藏域,把"客户名称"这个属性传递给Action里的方法,传递的就是id为0这条记录的"客户名称"。如果在这个especiallyDestroySearch.jsp页面里,通过隐藏域传递"客户名称",给后台的Action,此时Action里接收的,不知道是哪条记录的"客户名称",也就是不知道跟哪个id相对应。
我的错误:我在"代理域名续费预警"模块中,就犯了上面的错误,后台方法里需要接收domainName和type两个参数,我就在jsp页面里,直接通过隐藏域传递给后台,结果在后台把两个参数打印出来,发现传递的参数始终是页面显示的第一条记录的domainName
和type,当你选其他记录删除时,传递的还是第一条记录的,出现的就是这样的问题。
解决办法:通过javascript把所选记录的id数组,传递到Action里,然后在Action里做一个for循环,在for循环里调用app里的业务逻辑方法,根据id,用一条sql把业务逻辑方法需要的domainName和type直接从数据库中检索出来,传递给业务逻辑方法。
4、查询问题:问题所在:就是在第一次默认查询时,传递一个jumpPage参数即可,当调用查询的方法时,不用再传递此参数。
不理解:a、为什么我在查询里,传递了一个jumpPage参数,会影响分页呢?,可能就是因为往pageBean里传了两次jumpPage。
b、存储过程只需要编译一次,那么它第一次取出来的数据放在什么地方了呢?缓存?,我第二次调用存储过程,从哪取的数据呢??
5、页面参数保留问题:
<td width="48%" height="35" align="right">域名名称
<input type="text" name="domainName" value="<%=domainName1%>">
</td>
注:其实很简单,只要添加一个value属性就可以了。