一、关于数据前后端交互
1、后端传值至bootstrap表格
Bootstrap table的表格数据要求格式为json,我们一般从数据库查询得到的对象都会放在list中,运用struts的插件struts2-json-plugin.jar将数据转化为json格式。
这个过程中,可能会遇到failed to lazily initialize a collection of role 懒加载的问题,就是在查询时没有加载关联表的对象,你读取这个关联对象的时候,hibernate的session已经关闭,所以无法获取对象。
可以在配置文件里关闭懒加载 lazy=false。
接着可能又会出现这样的问题:There is a cycle in the hierarchy!
其实问题主要还是处在属性关联表上。
使用Hibernate manytoone属性关联主表的时候,如果使用JSONArray把pojo对象转换成json对象时,很容易出现循环的异常。
一个解决方法就是在转换json对象时忽略引起循环的对象。
比如student类中有course属性,忽略course属性,就不会再出错。
JsonConfig cfg = new JsonConfig();
cfg.setJsonPropertyFilter(new PropertyFilter()
{
public boolean apply(Object source, String name, Object value) {
if(name.equals("tcs")) {
return true;
} else {
return false;
}
}
});
JSONArray jsonArray = JSONArray.fromObject(list,cfg); //加载配置文件
但是总感觉只是解决燃眉之急而已,不是真正的标准解决方案。
2、用ajax实现前后端数据交互
2.1前端传给后端对象
前端代码
$("#btn_submit").on("click",function(){
var teacher={
'teacher.tid':$('#tid').val(),
'teacher.tname':$('#tname').val(),
'teacher.tsex':$('#tsex').val(),
'teacher.tintroduction':$('#tintroduction').val(),
//默认密码为123456
'teacher.tpassword':"123456"
};
addNewTeacher(teacher);
});
//添加新教师信息
function addNewTeacher(teacher){
console.log(teacher);
alert(teacher.toString());
$.ajax({
url:'addTeacher',
type:'post',
data:teacher,
dataType:"json",
success:function(data){
//验证一下后端传来的数据
alert(data);
//一些操作
}
});
}
action代码(包括添加教师信息和获取教师列表):
public class TeacherAction extends ActionSupport {
//此变量用于传递所有教师列表数据
private JSONArray teaJsonArr;
private TeacherService teacherService;
//在Action中,从客户端传来的数据可以只生成set方法,发送到客户端的数据可以只生成get方法
private Teacher teacher;
//添加教师后返回前端的信息
private String returnData;
public String getReturnData() {
return returnData;
}
public Teacher getTeacher() {
return teacher;
}
public void setReturnData(String returnData) {
this.returnData = returnData;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public JSONArray getTeaJsonArr() {
return teaJsonArr;
}
public void setTeaJsonArr(JSONArray teaJsonArr) {
this.teaJsonArr = teaJsonArr;
}
public TeacherService getTeacherService() {
return teacherService;
}
public void setTeacherService(TeacherService teacherService) {
this.teacherService = teacherService;
}
public String showAllTeacher(){
try{
List<Teacher>list=teacherService.findAllTeacher();
JsonConfig cfg = new JsonConfig();
cfg.setJsonPropertyFilter(new PropertyFilter()
{
public boolean apply(Object source, String name, Object value) {
if(name.equals("tcs")) {
return true;
} else {
return false;
}
}
});
JSONArray jsonArray = JSONArray.fromObject(list,cfg); //加载配置文件
teaJsonArr=jsonArray;
System.out.println(teaJsonArr);
return SUCCESS;
}catch (Exception e) {
System.out.println(e);
return ERROR;
}
}
public String addNewTeacher(){
boolean success=teacherService.addNewTeacher(teacher);
System.out.println(teacher.getTid());
System.out.println(teacher.getTname());
System.out.println(success);
if(success){
//这是要返回到前端页面的数据
returnData="添加成功";
return SUCCESS;
}else{
return ERROR;
}
}
}
struts.xml配置信息:
<package name="teacher" namespace="/" extends="json-default">
<action name="allTeacher" class="TeacherAction" method="showAllTeacher">
<result name="success" type="json">
<!-- 这里指定将被struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
<param name="root">TeaJsonArr</param>
</result>
<result name="error">/error.jsp</result>
</action>
<action name="addTeacher" class="TeacherAction" method="addNewTeacher">
<result name="success" type="json">
<!-- 这里指定将被struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
<param name="root">returnData</param>
</result>
<result name="error">/error.jsp</result>
</action>
</package>
二、动态控制模态框
1、需要注意的一点是,当模态框隐去的时候取消绑定的事件,下一次再动态绑定。
如果没有这一步!就会出现重复相应点击事件的结果!!!
一开始我就出现了Illegal attempt to associate a collection with two open sessions的错误,还以为是session出错,结果是前端重复提交事务了!
$('#editModal').on('hidden.bs.modal', function (event) {
$("#btn_submit").unbind();
})
三、bootstrap-table 批量删除条目
四、