JFinal问题整理
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
1.【問(wèn)】:Jfina如何不區(qū)分數(shù)據(jù)庫(kù)列名的大小寫?
我這兒隨時(shí)出現(xiàn) The attribute name is not exists: regdate,改成regDate就OK.怎么設(shè)置不區(qū)分大小寫呢???
【答】: ActiveRecordPlugin ar = new ActiveRecordPlugin();
// 配置大小寫不敏感
arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));
2.【問(wèn)】:jfinal用maven構(gòu)建項(xiàng)目的所依賴jar的groupId和artifactId等信息
你好~ 我想問(wèn)下jfinal用maven構(gòu)建項(xiàng)目的所依賴jar的groupId和artifactId 等信息在什么地方找的到啊~
【答】:你可以把JFinal的jar添加到本地的Maven庫(kù)中,具體命令如下
mvn install:install-file -DgroupId=com.jfinal -DartifactId=jfinal -Dversion=1.2 -Dpackaging=jar -Dfile=你本地jfinal的jar包的路徑
然后在pom.xml中就可以按照上面定義的groupId和artifactId還有version添加<dependency>了
【jfinal答】:JFinal沒(méi)有使用maven來(lái)構(gòu)建,因?yàn)镴Final自身對(duì)第三方j(luò)ar無(wú)依賴,弄上maven反而事更多了 :)
3.【問(wèn)】:要是controller中一個(gè)方法 返回json數(shù)據(jù)的話應(yīng)該加什么東東么~ 和SpringMVC的@ResponseBody這個(gè)功能相似么~ 還是要自己組拼啊 剛剛接觸jfinal 請(qǐng)指教下...
【jfinal答】:Controller中返回Json數(shù)據(jù)主要有兩種方法:一是先使用setAttr("blogList",blogList), setAttr("user", user)...將值都set好,然后調(diào)用一下 renderJson()方法。第二種方法是直接 renderJson("blogList", blogList)。第一種方法適合將多個(gè)對(duì)象轉(zhuǎn)換成json并返回客戶端;第二種方法適合僅轉(zhuǎn)換指定的對(duì)象為josn并返回客戶端。你還可以自行生成 json數(shù)據(jù)再調(diào)用 renderHtml(jsonString)來(lái)返回,或者自定義JsonRender也可以,方法多多:)
4.【問(wèn)】:關(guān)于jfinal的Record字段順序
想跟你請(qǐng)教個(gè)問(wèn)題:現(xiàn)在想要根據(jù)SQL直接查詢出Record給前端頁(yè)面使用,想字段能夠具有順序,比如:
SELECT id,username,password from users;
希望record.getcolumNames()得到的列順序也是按照id,username,password來(lái)的。
簡(jiǎn)單看了一下源碼,在Record.columns中使用了HashMap的子類,而不是LinkedHashMap子類,所以我想現(xiàn)在是做不到的,請(qǐng)問(wèn)一下是否有解決辦法?
【jfinal答】:1:仿照 com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory做個(gè) IContainerFactory實(shí)現(xiàn)類,例如叫:MyContainerFactory,注意將getColumnsMap()實(shí)現(xiàn)為返回 LinkedHashMap。
2:將這個(gè)MyContainerFactory對(duì)象在創(chuàng)建ActiveRecordPlugin時(shí)傳入,如 arp.setContainerFactoryu(new MyContainerFactory())
5.【問(wèn)】:jfinal 一個(gè)老生常談的問(wèn)題 亂碼
遇到一個(gè)老生常談的亂碼問(wèn)題,前臺(tái)是get的方式提交請(qǐng)求 參數(shù)中有中文 中文也已經(jīng)URLEncoder.encode編碼,用jetty 能正常獲取中文,用tomcat就亂碼,tomcat的server.xml已經(jīng)配置了URIEncoding="UTF8" 也重啟了 還是亂碼,這會(huì)是哪里沒(méi)配置好?以前沒(méi)用jfinal的時(shí)候是在web.xml里面添加一個(gè)過(guò)濾器來(lái)處理字符集 沒(méi)出過(guò)這樣的問(wèn)題。會(huì)不會(huì)和apache有關(guān)系呢? 我的是apache+php+tomcat 請(qǐng)求是由apache轉(zhuǎn)發(fā)給的tomcat。
【答】:找到問(wèn)題了 果然是這個(gè)問(wèn)題
Apache是使用AJP13模式代理到Tomcat的 所以需要把AJP13的編碼也設(shè)置成 UTF8 這樣就OK啦
<Connector URIEncoding="UTF8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF8"/>
6.【問(wèn)】:有關(guān)jFinal的POST問(wèn)題
想跟你請(qǐng)教個(gè)問(wèn)題:在常見(jiàn)的CRUD操作中,如果我現(xiàn)在需要使用Ajax操作,應(yīng)該如何結(jié)合jFinal實(shí)現(xiàn)。
我的代碼是這樣的:
前臺(tái)頁(yè)面:
<table class="info">
? ? <tr>
? ? ? ? <th>編號(hào)</th>
? ? ? ? <th>學(xué)號(hào)</th>
? ? ? ? <th>姓名</th>
? ? ? ? <th>年齡</th>
? ? ? ? <th>性別</th>
? ? ? ? <th>身份證號(hào)</th>
? ? ? ? <th>操作</th>
? ? </tr>
<c:forEach items="${stuList}" var="stu">
<tr>
<td>${stu.id}</td>
<td>${stu.Cno}</td>
<td>${stu.Name}</td>
<td>${stu.Age}</td>
<td>${stu.Gender}</td>
<td>${stu.Identity}</td>
<td>
? ?<a class="edit">修改</a>
? ?<a class="delete">刪除</a>
</td>
</tr>
</c:forEach>
</table>
點(diǎn)擊edit發(fā)出post操作:
$('.edit').on('click', function(){
$.post("/student/edit/", "id=" + id, function (data) {
? ? });
});
后臺(tái)處理:
@Before(POST.class)
public void edit() {
? ? int idValue = http://my.oschina.net/muchuanwazi/blog/getParaToInt(); ?....
}
這時(shí)候我發(fā)現(xiàn)無(wú)法取得id參數(shù),也就是getParaToInt()方法返回值為null。
【答】:前端頁(yè)面:
/**
?* ajax提交
?* @param param
?* @param url
?* @param returl
?*/
function do_ajaxSubmit(param,url,returl){
var params = $(param).serialize();
var eurl = encodeURI(url);
$.ajax({type:"POST", url:eurl, data:params, dataType:"json", error:function () {
alert("系統(tǒng)錯(cuò)誤,請(qǐng)稍后重試");
}, success:function (data) {
if (data.type == 1) {
//art.dialog.alert(data.msg);
returl == null ? window.location.reload() : window.location.href=http://my.oschina.net/muchuanwazi/blog/returl;
} else {
alert(data.msg);
}
}});
}
【jfinal答】:在Servler端與傳統(tǒng)用法基本一樣,只是響應(yīng)數(shù)據(jù)通常是json格式,所以JFinal在Controller中一般使用renderJson(...)系列方法即可
? ? 在Client端,就是js拿到j(luò)son數(shù)據(jù)后更新一下html頁(yè)面元素即可
7.【問(wèn)】:jfinal的action中獲取參數(shù)獲取是否可以進(jìn)一步優(yōu)化?
考慮到多個(gè)action方法可能會(huì)用到一些共用參數(shù),jfinal是否可以類似于struts那樣能給controller中的私有屬性自動(dòng)賦值而不用getPara或setAttr即可直接使用這些參數(shù)?這樣子就會(huì)方便很多。
【jfinal答】:Struts給私有屬性自動(dòng)賦值的方式,要做以下的事情:
1:在Controller 中定義屬性
2:創(chuàng)建setter、getter方法
3:修改xml添加para攔截器
4:重啟 web server 生效
? ? 缺點(diǎn)有:
1:增加了代碼量
2:共用參數(shù)增加了各action耦合度
3:定義在Controller中的屬性大多數(shù)情況對(duì)某些action是無(wú)用的
4:依賴反射注入屬性影響性能
5:框架復(fù)雜度提升
? ? 樓主試用對(duì)比后應(yīng)該能知道 JFinal 這樣設(shè)計(jì)的好處 :)
8.【問(wèn)】:jfinal url訪問(wèn)參數(shù)配置方式
想跟你請(qǐng)教個(gè)問(wèn)題:jfinal 不能PHP一樣配置參數(shù)方式嗎? ? http://www.oschina.net/question/ask/project/JFinal/user/201137,像這樣?或者可以完全自己定義,我看代碼里強(qiáng)調(diào)了了不能用/方式,能說(shuō)下具體原因嗎? 還有個(gè)問(wèn)題,就是在程序目錄名有空格的情況自動(dòng)掃描會(huì)失敗,判斷目錄不存在。
【jfinal答】: ? ?JFinal 可以用 Handler 完全自定義路由規(guī)則,目前 JFinal 采用的路由規(guī)則兼顧了簡(jiǎn)單、高效、可用性方面的考慮。
? ? 樓主提到的OSChina的這個(gè)url JFinal在不使用Handler的情況下可以換種方式實(shí)現(xiàn):http://www.oschina.net/question/ask /project/JFinal-user-201137,也即 url中傳送的參數(shù) JFinal是采用減號(hào)"-"分隔的,而OSC采用正斜杠進(jìn)行分隔,JFinal采用的方式讓url層次變淺,更有利于SEO。
分隔符可以自定義,減號(hào)“-”是默認(rèn)分隔符。即便出現(xiàn)沖突,至少有三種解決辦法:
1:用別的字符轉(zhuǎn)義,后端再轉(zhuǎn)換回來(lái)
2:問(wèn)號(hào)掛參
3:表單域傳參
9.【問(wèn)】:Jfinal批量提交sql執(zhí)行查詢
【jfinal答】:建議使用 Db.batch(...)系列方法,里面很多重載,可以試試其它重載方法
10.【問(wèn)】:jfinal的 @paginate分頁(yè)中,怎么附加其他的參數(shù)傳遞?
想跟你請(qǐng)教個(gè)問(wèn)題:
<@paginate totalRow=housePage.totalRow pageSize=housePage.pageSize currentPage=housePage.pageNumber totalPage=housePage.totalPage actionUrl="/news/news_list/" />
我想在actionUrl中添加其他的參數(shù)通過(guò)分頁(yè)一起傳遞,不過(guò)在添加參數(shù)后,頁(yè)碼會(huì)自動(dòng)加在最后的位置,而獲取頁(yè)碼頁(yè)面又默認(rèn)獲取第一個(gè)參數(shù)為頁(yè)碼,請(qǐng)問(wèn)一下這里該如何來(lái)做?
【jfinal答】:JFinal demo 中提供的 _paginate.html文件,其中定義的宏paginate還具有urlParas這個(gè)參數(shù),一般可以不去使用,樓主的需求,可以這樣用:
<@paginate totalRow=housePage.totalRow?
? pageSize=housePage.pageSize?
? currentPage=housePage.pageNumber?
? totalPage=housePage.totalPage?
? actionUrl="/news/news_list/"?
? urlParas="-${otherPara}" />
urlParas 也可以是問(wèn)號(hào)掛參的形式,如:
urlParas="?var=${var}"
11.【問(wèn)】:JFinal 如何在保存方法里取得最后insert的主鍵ID
【jfinal答】:User user = new User().set(...).set(...);
user.save();
Integer id = user.getInt("id");
12:【問(wèn)】:Jfinal 兩個(gè)Controller跳轉(zhuǎn)問(wèn)題 ?
【Jfinal答】:setAttr 或者 forwardAction 的時(shí)候生成urlPara, 如 forwardAction("/abc/" + value);
13:【問(wèn)】:Jfinal等框架選擇(性能)
【jfinal答】:JFinal 核心特點(diǎn)是:開(kāi)發(fā)效率高、代碼量少、學(xué)習(xí)成本低、開(kāi)發(fā)體驗(yàn)好。開(kāi)源四個(gè)月以來(lái),反饋一直非常好,充分體現(xiàn)了開(kāi)發(fā)者對(duì)以上特點(diǎn)的關(guān)注度。你對(duì)開(kāi)發(fā)框架提出的需求 JFinal 都可以滿足:
1:性能問(wèn)題
? ? JFinal 僅對(duì) servlet 進(jìn)行了極薄封裝,理論上來(lái)說(shuō)性能接近純 servlet,框架屬于MVC + ORM 但整體代碼僅一萬(wàn)多行,屬于超輕量級(jí)開(kāi)發(fā)框架。除此之外 JFinal 核心經(jīng)過(guò)精心的優(yōu)化,如路由匹配、Action緩存等。
2:功能問(wèn)題
? ? JFinal 擁有 struts2 絕大部分核心功能,文件上傳下載等這些都是極常規(guī)的功能了,不僅支持而且?guī)缀醵际且恍写a搞定。權(quán)限管理做一個(gè)全局?jǐn)r截器就可以輕松搞定,公司目前的權(quán)限 管理就是這么做的。Word、PDF、Excel這些貌似是前端的事了吧。
? ? 建議樓主先試用幾天時(shí)間,由于學(xué)習(xí)成本低,一般來(lái)說(shuō)兩個(gè)小時(shí)即可上手開(kāi)發(fā) :)
14.【問(wèn)】:如何修改JFinal中默認(rèn)的404和500的錯(cuò)誤頁(yè)面
【jfinal答】:在 YourJFinalConfig中的configConstant(Constants me)中進(jìn)行配置:me.setError404View(...);me.setError500View(...)
15.【問(wèn)】:JFinal訪問(wèn)路徑問(wèn)題
后臺(tái)使用JFinal搭建,前端url怎么寫訪問(wèn)路徑?是絕對(duì)路徑,還是相對(duì)路徑?我有個(gè)小項(xiàng)目之前一直用jetty測(cè)試,今天部署到tomcat中后, 發(fā)現(xiàn)所有的url路徑都錯(cuò)了,之前(jetty)的寫法是/user/login,部署到tomcat中需要改為user/login,把前面的斜線去 掉,jetty調(diào)試時(shí)只需訪問(wèn)http://localhost:8089/ ,部署到tomcat后需要訪問(wèn)http://localhost:8089/JFProject 請(qǐng)問(wèn)這個(gè)問(wèn)題怎么解決?謝謝~~
【答】:路徑的問(wèn)題用ContextPathHandler解決。我的經(jīng)驗(yàn)是最好寫絕對(duì)路徑
/**
?* Provide a context path to view if you need.
?* <br>
?* Example:<br>
?* In JFinalFilter: handlers.add(new ContextPathHandler("CONTEXT_PATH"));<br>
?* in freemarker: <img src=http://my.oschina.net/muchuanwazi/blog/"${BASE_PATH}/images/logo.png" />
?*/
public class ContextPathHandler extends Handler {
16.【問(wèn)】:關(guān)于JFinal自動(dòng)獲取頁(yè)面提交參數(shù)映射到javabean的問(wèn)題
前段時(shí)間給公司的小項(xiàng)目選web框架,發(fā)現(xiàn)了JFinal,感覺(jué)很不錯(cuò),現(xiàn)在遇到一個(gè)問(wèn)題,JFinal現(xiàn)在支不支持頁(yè)面提交的參數(shù)自動(dòng)映射到j(luò)avabean啊?類似struts的form的概念,比較忙,也沒(méi)時(shí)間翻論壇的帖子了,麻煩知道的朋友告訴我下,謝謝啊!
【答】:頁(yè)面提交參數(shù)
user.name=xx?
user.age=xx
后臺(tái)獲取
getModel(User.class);
可以參考官方的demo
17.【問(wèn)】:JFinal如何接受多個(gè)model的參數(shù)。
比如我們有一個(gè)User的model。頁(yè)面只要參數(shù)名字為user.age ?user.name,后臺(tái)可以用getModel得到 User的model然后進(jìn)行保存更新工作。
但是現(xiàn)在我是需要一次性添加多條數(shù)據(jù),request參數(shù)如下
users[0].age=11
users[0].name=1
users[1].age=22
users[1].name=2
在傳統(tǒng)的struts2中我們可以直接用一個(gè)list<user>很方便的接受此類參數(shù)。
請(qǐng)問(wèn)在jfinal的model中能否支持類似功能?
【jfinal答】:本想在Controller 中做個(gè) getModels(...) 方法的,后來(lái)覺(jué)得這種需求可能太少,而且代碼不太好看,所以留給開(kāi)發(fā)者自己了。目前 JFinal 已有的功能也可以解決這個(gè)問(wèn)提。只需要在表單中生成這樣的input 域: user1.name ?user2.name ?user3.name,然后在 Controller 中這樣:
for (int i=0; i<size; i++) {
? getModel(User.class, "user" + i).save();
}
? ? 針對(duì)于你在問(wèn)答中的這類形式的參數(shù):users[0].age ?users[1].age,可以這樣解決:
for (int i=0; i<size; i++) {
? getModel(User.class, "user[" + i + "]").save();
}
? ?可以走得更遠(yuǎn),在 YourController 方法中實(shí)現(xiàn):
public List<Model> getModels(Class<? extends Model> modelClass) {
? // TODO
}
? ? ?有時(shí)間我會(huì)考慮在新版本中加入這個(gè)特性,如果哪位童鞋先實(shí)現(xiàn)了這個(gè)方法,可以發(fā)給我先看看 :)
18.【問(wèn)】:Jfinal 如何在Interceptor獲取session
如何在攔截器 Interceptor獲取 session來(lái)攔截用戶未登錄
【jfinal答】:權(quán)限用攔截器來(lái)做最合適了,一般代碼形式如下:
public class AuthInterceptor implements Interceptor {
? public void intercept(ActionInvocation ai) {
? ? Controller controller = ai.getController();
? ? User loginUser = controller.getSessionAttr("loginUser");
? ? if (loginUser != null && loginUser.canVisit(ai.getActionKey()))
? ? ? ai.invoke();
? ? else
? ? ? controller.redirect("/login.html");
}
轉(zhuǎn)載于:https://my.oschina.net/u/197668/blog/356298
總結(jié)
以上是生活随笔為你收集整理的JFinal问题整理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 02 如何使用Git
- 下一篇: dos 一行两条命令