尝试用kotlin做一个app(六)
还是关于JSP后台管理系统的,有几个问题要解决一下
使用虚拟路径访问本地图片
之前在kindeditor编辑框插入图片时,是把图片文件转换为base64编码的形式;还有一种方法是使用虚拟地址。另外图片在数据库中存储的时候,应该是存储图片的虚拟地址(当然也可以是图片的二进制流数据)。
可以参考
配置好了之后,就得把图片的路径上传到数据库中,更新表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目录下,那就不要虚拟地址了。
效果:
前三张图片没显示,是因为上传的图片不完整。最后一条还是乱码了,说明还是没有处理好。代码结构也很乱了,有时间会重写一遍