仍是關於JSP後臺管理系統的,有幾個問題要解決一下html
使用虛擬路徑訪問本地圖片java
以前在kindeditor編輯框插入圖片時,是把圖片文件轉換爲base64編碼的形式;還有一種方法是使用虛擬地址。另外圖片在數據庫中存儲的時候,應該是存儲圖片的虛擬地址(固然也能夠是圖片的二進制流數據)。web
能夠參考數據庫
配置好了以後,就得把圖片的路徑上傳到數據庫中,更新表t_hp_new的thumb字段api
後臺登陸狀態驗證瀏覽器
這裏先不作,由於程序還在調試,每次進入要登陸也是很麻煩了。tomcat
爲客戶端建立網絡請求API服務器
客戶端首頁要加載新聞標題和縮略圖,貌似能夠直接從數據庫中讀取,另外也能夠訪問服務端建立的網絡請求API。我不知作別人是怎麼作的,可是這裏能夠隨便嘗試一下。網絡
·新建一個web project
·建一個Servlet別名是api
·Servlet裏添加代碼
public class ClientApiServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Object newsCount=req.getParameter("news"); resp.setContentType("text/html;charset=utf-8"); ArrayList<New> newsList=new T_NewImpl().queryForHpPages(1,Integer.parseInt(newsCount.toString())); JSONArray jsonArray=new JSONArray(); newsList.forEach( x->jsonArray.add(JSONObject.fromObject(x)) ); // jsonArray.forEach( // x->System.out.println(x) // ); for(Object i :jsonArray){ JSONObject jsonObject=JSONObject.fromObject(i); System.out.println(jsonObject.getString("title")); } resp.getWriter().println(jsonArray); } }
在瀏覽器中輸入
http://localhost:8087/工程名/api?news=5
得到返回
[{"id":34,"title":"test","author":"admin","pubDate":"2020-02-28 04:39:42.0","origin":"admin","href":"admin","thumb":"\"null\""},{"id":35,"title":"第二篇","author":"說點什麼好呢","pubDate":"2020-02-28 04:44:08.0","origin":"說點什麼好呢","href":"說點什麼吧","thumb":"\"null\""},{"id":36,"title":"3","author":"2","pubDate":"2020-02-28 05:50:08.0","origin":"3","href":"4","thumb":"/thumb/20200228055008.jpg"},{"id":37,"title":"說點什麼好呢","author":"說點什麼好呢","pubDate":"2020-02-28 06:38:51.0","origin":"說點什麼好呢","href":"說點什麼好呢","thumb":"/thumb/20200228063851.png"},{"id":38,"title":"haha","author":"dd","pubDate":"2020-02-28 18:24:45.0","origin":"ee","href":"dd","thumb":"/thumb/20200228182444.png"}]
應該就能夠了
客戶端經過okhttp請求數據
把web工程項目移到tomcat的webapps目錄下。在這裏,圖片上傳保存的路徑應該改爲工程目錄的上一層目錄。應該是兩個工程獨立的,都要訪問thumb目錄。只要在保存的時候加上../。
而後在客戶端的新聞列表RecyclerView的Adapter中,用okttp請求服務器的數據。
仍是不知作別人是怎麼作的。但我注意到別的網站有個cgi-bin的目錄,那以後須要瞭解一下cgi這個概念。我暫時把目錄改爲clientapi,okhttp就直接請求http://本地電腦局域網地址/clientapi/api?news=5
這裏有個問題是用Gson解析json的時候,[]被認做列表,因此若是是多條新聞數據,應該使用jsonObject.put("list":jsonArray)的形式。以前返回數據給easyui的datagrid,也是這樣作的
另外pubdate是個datetime對象(Timestamp類型),能夠getTime()以後響應給瀏覽器
更規範的作法是,加一些別的信息,好比狀態碼之類的,表示請求成功或失敗,好比
{"code":0,"ts":1580987499140,"mv_list":{"code":0,"data":{ "list": [ { "comme...
//New been類中,重寫toString
@Override public String toString() { // Long date=0L; // if(pubdate!=null){ // date=pubdate.getTime(); // } // SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); // String dateString=sdf.format(date); return "{" + "id=" + id + ", title='" + title + '\'' + ", author='" + author + '\'' + ", pubdate='" + pubdate.getTime() + '\'' + ", origin='" + origin + '\'' + ", href='" + href + '\'' + ", content='" + content + '\'' + ", thumb='" + thumb + '\'' + '}'; }
Servlet中
@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Object newsCount=req.getParameter("news"); resp.setContentType("text/html;charset=utf-8"); ArrayList<New> newsList=new T_NewImpl().queryForHpPages(1,Integer.parseInt(newsCount.toString())); JSONArray jsonArray=new JSONArray(); for(New i:newsList){ JSONObject jsonObject=JSONObject.fromObject(i.toString()); jsonArray.add(jsonObject); } JSONObject result=new JSONObject(); result.put("result",jsonArray); resp.getWriter().println(result); }
關於客戶端使用okhttp爲RecyclerView加載數據,以前作過了gson解析json
這裏涉及線程或協程,還須要多瞭解一點
有個問題也是糾結了我好久,以前上傳圖片的時候,在後臺把流數據轉換成utf-8防止中文亂碼,結果圖片就上傳不完整了。而若是圖片不完整,在本地電腦會顯示缺角什麼的,可是用Picasso或者Glide就加載不出來了,好比提示
class com.bumptech.glide.load.engine.GlideException: Failed to load resource
There were 4 causes:
java.io.IOException(java.lang.RuntimeException: setDataSource failed: status = 0x80000000)
後來就只把非圖片二進制流的部分轉成utf-8
另外,還有個坑。我在寫後臺的時候,設置圖片的虛擬地址,把idea目錄下的真實地址,映射成 /thumb。那關掉idea以後,http://localhost/thumb,訪問的仍是idea目錄下的。既然項目已經拷貝到tomcat目錄下,那就不要虛擬地址了。
效果:
前三張圖片沒顯示,是由於上傳的圖片不完整。最後一條仍是亂碼了,說明仍是沒有處理好。代碼結構也很亂了,有時間會重寫一遍