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