JFinal問題整理

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");
}php

相關文章
相關標籤/搜索