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