2018-02-02 13:45

去项目的 WebRoot/WEB-INF/web.xml 里面找 一个叫 :



jfinal
com.jfinal.core.JFinalFilter

configClass
java源码中找到这个类Config



在那个类里configHandler方法面加:

public void configHandler(Handlers me) {
me.add(new JfHandler());


搞定~~

2018-02-02 13:37


package com.xxx.common.handler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jfinal.handler.Handler;

public class JfHandler extends Handler {

@Override
public void handle(String target, HttpServletRequest request,
HttpServletResponse response, boolean[] isHandled) {
if (target.startsWith("/jf/")) {
next.handle(target, request, response, isHandled);
}
}

}

2018-02-02 12:21

建一个 Handler , 先判断 target 请求路径是不是 JFinal项目的,
(比如判断前缀, 路由统一使用某一个前缀,推荐“/jf/xxx”),
如果是就调用 next.handle( 。。。,
不是就放过去让老项目处理

2018-02-01 10:02

想不报错 只需要在后面加个 true
getBean(Class beanClass, boolean skipConvertError)
getBean(beanClass, true)
不贴异常信息还得猜。。
看看源码:打个断点进去看看吧~



public static T injectBean(Class beanClass, HttpServletRequest request, boolean skipConvertError) {
String beanName = beanClass.getSimpleName();
return (T)injectBean(beanClass, StrKit.firstCharToLowerCase(beanName), request, skipConvertError);
}

@SuppressWarnings("unchecked")
public static final T injectBean(Class beanClass, String beanName, HttpServletRequest request, boolean skipConvertError) {
Object bean = createInstance(beanClass);
String modelNameAndDot = StrKit.notBlank(beanName) ? beanName + "." : null;
TypeConverter converter = TypeConverter.me();
Map parasMap = request.getParameterMap();
Method[] methods = beanClass.getMethods();
for (Method method : methods) {
String methodName = method.getName();
if (methodName.startsWith("set") == false || methodName.length() <= 3) { // only setter method
continue;
}
Class[] types = method.getParameterTypes();
if (types.length != 1) { // only one parameter
continue;
}

String attrName = StrKit.firstCharToLowerCase(methodName.substring(3));
String paraName = modelNameAndDot != null ? modelNameAndDot + attrName : attrName;
if (parasMap.containsKey(paraName)) {
try {
String paraValue = request.getParameter(paraName);
Object value = paraValue != null ? converter.convert(types[0], paraValue) : null;
method.invoke(bean, value);
} catch (Exception e) {
if (skipConvertError == false) {
throw new RuntimeException(e);
}
}
}
}

return (T)bean;
}

2018-02-01 09:36

com.jfinal.core.ActionHandler.java
handle 中使用:(target是请求的地址 )


if (target.indexOf('.') != -1) {
return ;
}

带 . 点 的都过不去的。
所以正确的姿势 使用?挂参:
url localhost:8000/xm/user?p1=a.b&p2=c

2018-01-30 18:20

@lyq027 分开执行啊,当成两步进行业务处理。
1 先使用ajax去触发“执行操作”,这时你可以使用loading效果。
2 当“执行操作”执行完毕后返回 成功或失败。
3 ajax的回调函数判断 返回结果是成功,就触发 js 的模拟表单提交进行直接下载文件

2018-01-30 16:33

至少贴点 代码啊。。。

2018-01-30 16:32


《提问的智慧》如何向社区提问题 - 分享



社区发展很快,迎来很多刚上手的朋友, 但是根据我经常泡社区来看,很多朋友都不是很会提问啊! 这里分享一篇玉伯老师送给我们的礼物~ 希望大家都签收一下~如何向开源社区提问题使用软件产品,或多或少都会遇到问题。对于商业产品,我们可以咨询客服寻


2018-01-30 16:30

我以前也想这么整来着。。。。 失败了, ,,网友说:
原因:ajax方式请求的数据只能存放在javascipt内存空间,可以通过javascript访问,但是无法保存到硬盘,因为javascript不能直接和硬盘交互,否则将是一个安全问题。
所以一般都是js 模拟表单提交,或者windows.open 啊什么的。。

2018-01-30 16:19

SQL 不是你自己传进来的吗? 写sql 的时候自己不写 limit 1的吗? 如果框架自动把limit 1追加到sql里面, 外面的代码sql不易读吧。。。

2018-01-26 21:42

@昵称而已
好多个BaseModel ???
你指的是那种 get和set的 BaseXxxModel 吗?
这个简单啊, 让哪些BaseXxxModel 去继承你通用公共的BaseModel 就可以了。
比如我的:


public abstract class BaseAccount> extends BaseModel implements IBean {
setXxx
getXxx


值得注意的是 Jfinal 3.3版本 getConfig() 增加了 _getConfig() 下划线前缀的。
同时Model 生成器的模版也需要自定义一下,这样生成的就不用修改了

2018-01-25 23:20

@215115704
比较简单的 递归调用函数体:
#define showMenu(me){
...html...
#@showMenu(me.menus)
...html...
}


如果你的函数体比较复杂 , 可以建一个java , 使用下面方式去调用,

6.8 Shared Object扩展



    通过使用addSharedObject方法,将某个具体对象添加为共享对象,可以全局进行使用,以下是代码示例:

  1. public void configEngine(Engine me) {
  2.    me.addSharedObject("RESOURCE_HOST", "http://res.jfinal.com");
  3.    me.addSharedObject("sk", new com.jfinal.kit.StrKit());
  4. }

    以上代码中的第二行,添加了一个名为RESOURCE_HOST的共享对象,而第三行代码添加了一个名为sk的共享对象,以下是在模板中的使用例子:

  1. <img src="#(RESOURCE_HOST)/img/girl.jpg" />
  2. #if(sk.isBlank(title))
  3.    ...
  4. #end

    以上代码第一行中使用输出指令输出了RESOUCE_HOST这个共享变量,对于大型web应用系统,通过这种方式可以很方便地规划资源文件所在的服务器。以上第二行代码调用了名为sk这个共享变量的isBlank方法,使用方式符合开发者直觉。

    注意:由于对象被全局共享,所以需要注意线程安全问题,尽量只共享常量以及无状态对象。


2018-01-25 23:06

也许移动端传的时候就已经乱码了。。。 可以看看前面是不是有坑

2018-01-25 22:42

看 演示第二种方式,


public List 获取子菜单() {
return find("select * from 菜单 where 自联键=?", get("id"));
}