嘗試用kotlin作一個app(六)

仍是關於JSP後臺管理系統的,有幾個問題要解決一下html

使用虛擬路徑訪問本地圖片java

以前在kindeditor編輯框插入圖片時,是把圖片文件轉換爲base64編碼的形式;還有一種方法是使用虛擬地址。另外圖片在數據庫中存儲的時候,應該是存儲圖片的虛擬地址(固然也能夠是圖片的二進制流數據)。web

能夠參考數據庫

idea設置tomcat虛擬路徑的兩種方法json

配置好了以後,就得把圖片的路徑上傳到數據庫中,更新表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目錄下,那就不要虛擬地址了。

效果:

前三張圖片沒顯示,是由於上傳的圖片不完整。最後一條仍是亂碼了,說明仍是沒有處理好。代碼結構也很亂了,有時間會重寫一遍

相關文章
相關標籤/搜索