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

效果:

技术图片

技术图片

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

 

相关文章