2019-02-19 11:37
umeditor 上传图片不要使用 JSP,而是做一个 action ,在里头用 getFile() 去接收上传文件,jfinal club 项目中的大致代码如下:
/**
* UploadController 上传控制器,接管 ueditor 上传功能
*/
public class UploadController extends BaseController {
@Injedt
UploadService srv;
/**
* 接管 ueditor 上传图片服务端
*
* 1:该 action 与 ueditor.config.js 中的 serverUrl: "/upload/ueditor" 对应
*
* 2:ueditor 页面加载时会向后端发送 "/xxx?action=config 请求用来获取服务端
* /ueditor-home/jsp/config.json 中的配置,后续的上传将受该配置的影响
*
* 3:ueditor1_4_3_2-utf8-jsp 版本测试上传图片成功所返回的 json 数据格式如下:
* {
* "state": "SUCCESS",
* "title": "1461249851191086496.png",
* "original": "qr.png",
* "type": ".png",
* "url": "/ueditor/jsp/upload/image/20160421/1461249851191086496.png",
* "size": "58640"
* }
*
* 4:如果上传出现错误,直接响应如下的 json 即可:
* {"state": "错误信息"}
*
*/
public void ueditor() {
/**
* ueditor 在页面加载时会向后端请求获取 config.json 内容
*/
if ("config".equals(getPara("action"))) {
render("/assets/ueditor/jsp/config.json");
return;
}
/**
* 对应 config.json 配置的 imageActionName: "uploadimage"
*/
if ( ! "uploadimage".equals(getPara("action"))) {
renderJson("state", "UploadController 只支持图片类型的文件上传");
return ;
}
/**
* uploadType 是通过如代码令 ueditor 在上传图片时通过问号挂参的方式传递过来的自定义参数
* ue.ready(function() {
* ue.execCommand('serverparam', {
* 'uploadType': 'project'
* });
* });
*/
String uploadType = getPara("uploadType");
if (StrKit.isBlank(uploadType)) {
renderJson("state", "上传类型参数缺失");
return ;
}
if (notLogin()) {
renderJson("state", "只有登录用户才可以上传文件");
return ;
}
UploadFile uploadFile = null;
try {
// "upfile" 来自 config.json 中的 imageFieldName 配置项
uploadFile = getFile("upfile", UploadService.uploadTempPath, UploadService.imageMaxSize);
Ret ret = srv.ueditorUpload(getLoginAccount(), uploadType, uploadFile);
// renderJson(ret);
render(new JsonRender(ret).forIE()); // 防止 IE 下出现文件下载现象
}
catch(com.jfinal.upload.ExceededSizeException ex) {
renderJson("state", "上传图片只允许 200K 大小");
}
catch(Exception e) {
if (uploadFile != null) {
uploadFile.getFile().delete();
}
renderJson("state", "上传图片出现未知异常,请告知管理员:" + e.getMessage());
LogKit.error(e.getMessage(), e);
}
}
}
2019-02-18 17:42
@osril 用最新版本的 undertow.sh 脚本,在此下载:
https://gitee.com/jfinal/jfinal-undertow/blob/master/undertow.sh
2019-02-18 15:57
@王子鹏 跳转在本质上与后端的 render 无关,既然你是 ajax 请求,在得到后端的数据以后,只能用 javascript 代码实现跳转
跳转的目标 url,可以是后端传过来的,例如:
Ret ret = Ret.ok("url", "/users");
renderJson(ret);
success : function(ret) {
if (ret.state == "ok") {
window.loacation.href = ret.url;
}
}
2019-02-18 11:26
后端使用 renderToString 配合 renderJson 来使用, 而不是直接使用 render,大致如下:
String html = renderToString("xxx.html");
Ret ret = Ret.ok("html", html);
renderJson(ret);
前端 ajax 大至如下:
success : function(ret) {
alert(ret.state);
alert(ret.html);
}
其中 ret.state 是 Ret.ok 设置的一个状态,有两种状态:"ok" 与 "fail"
这两个状态可以这么来判断:
if (ret.state == "ok")
if (ret.state == "fail")
还可以在后台传入更多数据,例如:
Ret ret = Ret.ok("html", html);
ret.set("key1", 123).set("key2", 456);
renderJson(ret);
在前台通过 ret.key1、ret.key2 获取
2019-02-18 11:17
@tianya 这个就奇怪了。 不过就算是 sessionId 变化了,但你通过 getSessionAttr(key) 仍然是可以获取到数据的
对于 session 的操作,不要直接使用 sessionId,而是直接使用 session 操作的 API,例如:
setSessionAttr(...)
getSessionAttr(...)
getSession(true).setAttribute(...)
getSession(true).getAttribute(...)
这样就绕开了 session id
2019-02-18 11:14
从 response.getWriter() 得到的 Writer 无需自己关闭,web 容器负责关闭它,看一下 java web 相关类中的文档可知
如果你主动关闭,会出下面的问题:
1:在某些 web 容器下,如果在你正发送数据时客户端主动断开连接会报异常,如 undertow 之下
2:拉低性能
早期的 jfinal 版本是主动关闭 Writer 与 OutputStream 的,是多年的打磨改进成现在的样子的
注意,上面所指仅限于 java web 规范中从 HttpServerletResponse response 对象中获取的 Writer 与 OutputStream,不能自行 close(), 其它情况多数需要自己 close(),如 FileOutputStream
2019-02-17 19:29
@tianya 那应该是老版本 jfinal undertow 的依赖没有消除,jfinal undertow 1.5 修复过这个问题,你再试试
2019-02-17 16:04
@yangzhiwen 用于 sql 管理的 Engine 可独立配置 devMode ,配置方法如下:
activeRecordPlugin.getEngine().setDevMode(true)
也可以这样:
activeRecordPlugin.setDevMode(true)
上面这个与前面那个是打通的,两种配置完全等价
重点:由于同一个项目中通常使用了多个 Engine 对象,用于不同的用途,所以这些 Engine 对象需要被单独配置,保障互不干扰
关于独立配置特意补充了相关文档:
http://www.jfinal.com/doc/6-2