2019-02-19 11:51

拦截所有请求,将请求转发给 Handler

2019-02-19 11:49

升级到 jfinal 3.6,这个版本去掉了 ByteWriter.close() 中的 flush() 动作

当然,这个问题本质上是与 jfinal 无关的,而是客户端主动断开连接导致的

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 17:11

严格按文档来配置 eclipse 中的 maven ,否则会出各种奇怪问题:
https://www.jfinal.com/doc/1-1

已经有多人是因为 maven ===> User Settings 没配置好出了各种奇葩问题

2019-02-18 16:55

细心去写 javascript 代码,ajax 是基础

2019-02-18 16:21

jfinal undertow 是专门支持 jfinal 项目开发的,不支持 spring

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 13:19

@yunmuzhou 用 getPara 或者 getRawData() 试试

2019-02-18 11:44

getFile 获取到 null 值这个很奇怪,升级 cos 到 2017.5 这个版本试试

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:19

还有一个更方便的办法是使用与源码绑定的 jar 包,名字可能叫:
jfinal-3.6-bin-with-src.jar

同样也是在 首页右侧下载 jfinal-3.6-all.zip 的 zip 包里面提供了

2019-02-18 11:18

在首页右侧下载 jfinal-3.6-all.zip,里面有一个源码的 zip 包,在开发的时候绑定过去就可以了

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