在学习S2SH框架,jsp表单处理时,传递参数如String,int常见的参数基本没有问题,但在传递一个类(Model)时,遇到一点点小挫折。
通常表单传参数步骤如下:
服务器(Action类)
1.定义变量
2.创建getter和setter,便于前端传值
Scope("prototype")
@Namespace("/Control")
@Action(value="AlarmGroup_SMS")
public class RTDAlarmGroup_SMSAction extends BaseAction {
private String s_UserID;
private String s_delUserIDs;
private RTDAlarmGroup_SMS_User User;
public String getUserID() {
return s_UserID;
}
public void setUserID(String s_UserID) {
this.s_UserID = s_UserID;
}
public String getDelUserIDs() {
return s_delUserIDs;
}
public void setDelUserIDs(String s_delUserIDs) {
this.s_delUserIDs = s_delUserIDs;
}
public RTDAlarmGroup_SMS_User getUser() {
return User;
}
public void setUser(RTDAlarmGroup_SMS_User User) {
this.User = User;
}
// 其他代码
前台(jsp)
function addUser(){
resetValue();
$(dlgUser).dialog("open").dialog("setTitle","新增 - 短信用户信息");
url = "${contextPath}/Control/AlarmGroup_SMS!addUser?ID_AlarmGroup=<%=ID_AlarmGroup%>";
}
function editUser(){
var selectedRows=$(dgUser).datagrid('getSelections');
if(selectedRows.length!=1){
$.messager.alert("系统提示","请选择一条要编辑的数据!");
return;
}
var row = selectedRows[0];
$(dlgUser).dialog("open").dialog("setTitle","编辑 - 短信用户信息");
$("#ID").val(row.id);
$("#Name").val(row.Name);
$("#Phone").val(row.Phone);
$("#Checked").val(row.Checked);
//$("#Checked1").combobox("setValue",row.Checked);
if (row.Checked == true)
document.getElementById("UserChecked1").checked=true;
else
document.getElementById("UserChecked0").checked=true;
url="${contextPath}/Control/AlarmGroup_SMS!editUser?ID_AlarmGroup=<%=ID_AlarmGroup%>&UserID=" + row.id;
}
function delUser(){
var selectedRows=$(dgUser).datagrid('getSelections');
if(selectedRows.length == 0){
$.messager.alert("系统提示","请选择要删除的数据!");
return;
}
var s_Ids = [];
for(var i = 0; i < selectedRows.length; i++){
s_Ids.push("'" + selectedRows[i].id + "'");
}
var ids = s_Ids.join(",");
$.messager.confirm("系统提示","您确认要删掉这"+selectedRows.length+"条数据吗?",function(r){
if(r){
$.post("${contextPath}/Control/AlarmGroup_SMS!deleteUser",{ID_AlarmGroup:<%=ID_AlarmGroup%>,DelUserIDs:ids},function(result){
if(result.success){
//$.messager.alert("系统提示","您已成功删除数据!");
$(dgUser).datagrid("reload");
}else{
$.messager.alert('系统提示',result.errorMsg);
}
},"json").error(function() {
alert("执行失败");
})
;
}
});
}
function save(){
$("#fm").form("submit",{
url:url,
onSubmit:function(){
if($("#Name").val()==""){
$.messager.alert("系统提示","名称不能为空");
return false;
}
if($("#Phone").val()==""){
$.messager.alert("系统提示","手机不能为空");
return false;
}
//
$("#Checked").val($('input[name="UserChecked"]:checked').val());
//$.messager.alert("系统提示Checked",$("#Checked").val());
return $(this).form("validate");
},
success:function(data){
var result = eval('(' + data + ')');
if(result.errorMsg){
$.messager.alert("系统提示",result.errorMsg);
return;
}else{
//$.messager.alert("系统提示","保存成功");
resetValue();
$(dlgUser).dialog("close");
$(dgUser).datagrid("reload");
}
}
});
}
function resetValue(){
$("#ID").val("");
$("#Name").val("");
$("#Phone").val("");
// $("#Checked").combobox("setValue","1");
//$.messager.alert("系统提示:UserChecked",$('input[name="UserChecked"]:checked').val());
//var str = document.getElementsByName("UserChecked");
document.getElementById("UserChecked1").checked = true;
}
function close(){
$(dlgUser).dialog("close");
resetValue();
}
但始终得到的User是一个null,无法正确地从前台获取到值,s_UserID就能够正常从前台获取值,经过不断测试(因初学,对Action机制了解不深),发现是User没有初始化的原因,导致前端无法传值,于是修改如下:
// SMS_User 必须初始化,否则easyui 表单无法向User传值
private RTDAlarmGroup_SMS_User User = new RTDAlarmGroup_SMS_User();
这样,就能很顺利从前台得到对应的值了。
很奇怪:为啥int、String就不用初始化就可以呢,而自己的类就必须要先初始化呢。
另外,特记:前台传递参数的名字调用Action类的get对应的名字,和Action定义的变量名不一定完全一致。
例如:
变量名为s_UserID;但对应的get是GetUserID(),
private String s_UserID;
public String getUserID() {
return s_UserID;
}
public void setUserID(String s_UserID) {
this.s_UserID = s_UserID;
}
url="${contextPath}/Control/AlarmGroup_SMS!editUser?ID_AlarmGroup=<%=ID_AlarmGroup%>&UserID=" + row.id;
前端效果: