尝试用kotlin做一个app(六)

还是关于JSP后台管理系统的,有几个问题要解决一下

使用虚拟路径访问本地图片

之前在kindeditor编辑框插入图片时,是把图片文件转换为base64编码的形式;还有一种方法是使用虚拟地址。另外图片在数据库中存储的时候,应该是存储图片的虚拟地址(当然也可以是图片的二进制流数据)。

可以参考

idea设置tomcat虚拟路径的两种方法

配置好了之后,就得把图片的路径上传到数据库中,更新表t_hp_new的thumb字段

后台登录状态验证

这里先不做,因为程序还在调试,每次进入要登录也是很麻烦了。

为客户端创建网络请求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目录下,那就不要虚拟地址了。

效果:

尝试用kotlin做一个app(六)

尝试用kotlin做一个app(六)

前三张图片没显示,是因为上传的图片不完整。最后一条还是乱码了,说明还是没有处理好。代码结构也很乱了,有时间会重写一遍