在hibernate反向生成实体类过程中点击 Hibernate Reverse Engineering死活没反应
由于是用的别人的框架,所以我清空了其他数据只保留了基本的配置文件。但是当我连接数据库之后利用hibernate反向生成实体类和映射文件这里卡住了,点击反向生成根本没反应。于是在网上找了半天都是.project中加入一行 <nature>com.genuitec.eclipse.hibernate.hibernatenature</nature>本以为可以解决我的问题奈何我加进去依然没有反应,在网上寻找了半天之后我觉得我还是新创建一个项目。然后把hibernate配置进去之后根据数据库反向生成数据在copy到我现有的项目中。短短3分钟就搞定了。虽然没有从根本解决这个问题。但是这样也可以节省时间让我不必纠结在这里。
在启动项目时自定义securityMetadataSource不能使用依赖注入的问题,nullpointer问题,空指针问题
网上给出的解决办法在构造方法中加入
但是我已经写有了,于是我调到了debug模式在执行到resourceMap.containsKey(url)时报错,瞬间我就明白了,因为我数据库里边没有添加url,不过报的错依然是不能注入securityMetadataSource,导致我一直在这个方向寻找答案浪费了很多时间,希望可以记住这次教训。自己多动手调试,不要一遇问题就百度。
layui中多图片上传使用struts后端如何接收
private File file;//文件流
private String fileFileName; //文件名称
前端只需要按官方文档写,当点击上传之后后台会获取到它的文件流,和文件名称。一开始我纠结在多张上传。我使用的是File[] file去接受,但是最后经过调试发现并没有进入循环,而是重新跳入这个action,因此它上传多张图片其实就是一张一张的上传。我们只需要在后端用代码将它提交到服务器就可以了。我封装了一个方法
public HashMap<String, Object> uploadImg(String realSavePath, File file, String fileFileName) {//realSavePath是文件保存的路径
HashMap<String, Object> data = new HashMap<String, Object>();
String secondDate = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());//当前时间
String ex = fileFileName.SubString(fileFileName.lastIndexOf(".")+1); //文件扩展名
String newFileName = secondDate+new Random().nexInt(1000)+"."+ex;//文件名称
这样做的目的就是保定图片名称的一个唯一性
//创建文件夹
File uploadFile = new File(realSavePath+newFileName);
if(!uploadFile.getParentFile().exists){ //如果目录不存在则递归创建上一级目录
uploadFile.getParentFile().mkdirs();
}
try{
uploadFile.createNewFile(); //创建文件
FileUtils.copyFile(file,uploadFile); //上传图片
}catch(Exception e){
e.printStackTrace();
data.put("code",1);
}
return data; //将数据返回给前端 前端判断是否上传成功
}
4. 前端应注意的一些问题
前端在使用window.location.href跳转时如果在if里边后边必须添加return false方可跳转,不然
无效。后端接收参数时也用struts的模型驱动去接收值。我用属性驱动接收时没有成功。
因为我的图片是从数据库查询出来循环展示到页面,因此绑定div当点击删除时应获取子集中含有class为imgId的图片,不能直接根据$(".imgId").val()值删除。因为这样的画始终删除的都是第一张图片而不是咱们想要删的那张图片。
5 如何动态控制按钮的显示 这里边要用到layui自带的模板引擎
<script type="text/html" id="barDemo">
</script>
监听表格中后台返回的json数据根据后台传过来的状态来动态显示此商品是要上架还是下架
这里是模板引擎官方的讲解https://www.layui.com/doc/modules/laytpl.html
6 JSONObject.fromObject 和 JSONArray.fromObject转化问题
一个是转化为json对象一个是转化为json数组 但是json对象里边可以有json数组,json数组里又有json对象 举个例子 一个实体类
public class Area{ private int id; private String address; private List<HashMap<String,Object>>list; }
这种情况下用到的就是JSONObject.fomObject(area);转化之后就成了我上述说的那样
要是直接转化List结合就可以用到JSONArray.fromObject这种就是转换为JSON对象数组
7 实现搜索下拉框
当输入汉字时进行模糊查询,将查询到的数据在下拉框中显示,供我们选择。选择之后将其保存到数据库。主要就是因为数据库中数据太多,为了让操作者更方便
var flag = true; $('.layui-select-title .layui-input').on('compositionstart', function() { flag = false; }) $('.layui-select-title .layui-input').on('compositionend', function() { flag = true; }) $('.layui-select-title .layui-input').on('input', function() { var _this = this; setTimeout(function() { if (flag) { console.log($(_this).val()); var vgtAll = $(_this).val(); $.ajax({ url : '<%=path%>/biz/VgeBasics_findAll.action', type : 'GET', data : { "vgtAll" : vgtAll }, dataType : 'json', success : function(data) { console.log(data); if (data != null) { var sel = ''; var len = data.length; for (var i = 0; i < len; i++) { sel += '<option value="' + data[i].vgtBaseName + '" >' + data[i].vgtBaseName + '</option>' } $('#test_user').append(sel); form.render(); //更新全部 这句话比较重要 } //监听下拉框 form.on('select(test_user)', function(data) { var txt = $("#test_user option:selected").text(); //获取select选中的值 $('.test_user').html(txt); }); } }); } }, 0) }) 8、springSecurity的执行流程 运行项目时先进行到MyFilterSecurityInterceptor拦截器。然后进入MySecurityMetadataSource将 资源数据定义并且将所有的资源和权限关系对应建立起来,即定义某一资源可以被哪些角色访问 ,重定向策略MyRedirectStrategy使security框架可以实现转发功能。登录成功之后 MyUsernamePasswordAuthenticationFilter进行认证如果登录成功之后进入UserDetailServiceImpl 获取登录用户拥有的权限id,最后进入MyAccessDecisionManager判断用户的权限是否足够, 足够就跳转否则阻止跳转并且报权限不足错误。