尝试用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目录下,那就不要虚拟地址了。

效果:

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

相关文章
相关标签/搜索