因为所在项目的框架是由内部人员开发的openx框架,即js+abstractServlet封装了servlet层,面向接口编程mvc框架。
而今天又收到任务因为ios端和android端的配置中心任务,要单独写一个Servlet接发请求。
在这个过程中遇到几个没碰到的异常,特地记录一下。
一个是servlet版本异常。
因为用的是maven构建的项目,因此提示使用2.5的servlet-api。但是会报错。
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency>所以改用
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>并且scope为provided,编译时通过,运行时不通过。即可解决。
第二个是servlet引用mybatis的dao层接口。
一般习惯是直接autowired。但是servlet有自己的容器,无法直接引用spring的注释。
所以使用
protected ConfDao confDao; protected ConfItemDao confItemDao; protected AppVersionDao appVersionDao; protected StageDao stageDao;
@Override public void init() throws ServletException{ super.init(); ServletContext servletContext = this.getServletContext(); WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext); confDao = (ConfDao)context.getBean("confDao"); confItemDao = (ConfItemDao)context.getBean("confItemDao"); appVersionDao = (AppVersionDao)context.getBean("appVersionDao"); stageDao = (StageDao)context.getBean("stageDao"); }的方式获取到spring容器中注入的bean。
第三个是通过拿到的对象数据解析成json数组返回
JSONStringer stringer = new JSONStringer();
stringer.array(); for(ConfItem item:query(entity.getId()).getItems()){ stringer.object().key(item.getKey()).value(item.getValue()).endObject(); } stringer.endArray();resp.getOutputStream().write(stringer.toString().getBytes("utf-8")); resp.setContentType("text/json; charset=UTF-8");