java web开发(四) 接口开发补坑1

   好久都没写博客了,最近的工作重点是H5以及JavaScript方面的!后面要是有时间,会一直推出博文!

    今天的博文是补坑的!之前写了几篇有关java web接口开发的文章,有的朋友留言,说项目导入的时候有问题,或者说代码有的地方看不懂,等等其他问题。那么今天就来说说这些问题!如果你还没了解之前的接口博文,请先看java web开发(二) 接口开发

一、项目导入报错。

  从csdn资源下载的代码,由Eclipse导入后,正常情况下,应该是会报错的!这个主要是我在导入项目的时候,没有将依赖的jar导入至lib目录中,所以导入项目的时候,很有可能会报错报错截图如下,


因为这个javax.servlet.*  包用的是Tomact下的 servlet-api.jar。

这个问题的解决办法是有2种,

方法1,从Tomact中的lib中找到这个servlet-api.jar,复制到项目的lib目录下,然后在这个jar上右键--->Build Path--->Add Build Path,即可!

方法2, 选项目右键--->Properties--->Java Build Path--->Libraries--->Add Library--->Server RunTime点击next,然后选择你的本地Tomact server--->Finish,最后点击Apply--->OK即可!


大功告....!结果可能还是报错了!就像这样的,看截图


这个错误是说,这个项目之前使用的是Tomact v6.0,而我现在给他配置的是 Tomact v8.5!

这个解决方法网上就比较多了!打开项目settings目录 org.eclipse.wst.common.project.facet.core.xml文件,


删除   <runtime name="Apache Tomcat v6.0"/> 这一行,保存!然后刷新项目!这个错误就没了!但是,你可能还会遇到其他的错误,例如提示说,jre的版本不匹配,那么就需要修改项目使用的jre版本!

这里就不详细列举各种各样的问题的解决方法了,如果有问题,就自行百度吧!相信,你可以的!

二、项目代码详解。

    这个地方主要是把之前在 java web开发(二) 接口开发写的中的代码,再次梳理!让小伙伴们在本篇博文中就可以直观的看出项目结构,以及主要代码!下面先给出整个项目的目录结构树,如下图所示,


下面一一来介绍这些包以及类,

1. cn.xinxing.action.student 这个包中是放置接口的,也就是向外部调用提供接口!下面我们就看看具体接口的代码,

[java]  view plain  copy
  1. package cn.xinxing.action.student;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.List;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. import cn.xinxing.business.StudentBusiness;  
  12. import cn.xinxing.json.core.ListObject;  
  13. import cn.xinxing.json.responseUtils.ResponseUtils;  
  14. import cn.xinxing.json.status.StatusHouse;  
  15. import cn.xinxing.json.utils.JackJsonUtils;  
  16. import cn.xinxing.model.Students;  
  17.   
  18. /** 
  19.  * Servlet implementation class StudentInq 
  20.  */  
  21. public class StudentInq extends HttpServlet {  
  22.     private static final long serialVersionUID = 1L;  
  23.          
  24.     /** 
  25.      * @see HttpServlet#HttpServlet() 
  26.      */  
  27.     public StudentInq() {  
  28.         super();  
  29.         // TODO Auto-generated constructor stub  
  30.     }  
  31.   
  32.     /** 
  33.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
  34.      */  
  35.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  36.         // TODO Auto-generated method stub  
  37.         List<Students> list = StudentBusiness.getAllStudents();  
  38.         ListObject listObject=new ListObject();  
  39.         listObject.setItems(list);  
  40.         listObject.setStatusObject(StatusHouse.COMMON_STATUS_OK);  
  41.         String responseText = JackJsonUtils.toJson(listObject);  
  42.         ResponseUtils.renderJson(response, responseText);  
  43.     }  
  44.   
  45.     /** 
  46.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
  47.      */  
  48.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  49.         // TODO Auto-generated method stub  
  50.         doGet(request, response);  
  51.     }  
  52.   
  53. }   
代码比较简单,就不多说了,相信看过 java web开发(二) 接口开发 的知道。但是,为了这篇文章,还是多说一句吧! 偷笑 这个类是继承自HttpServlet的,也就是说这个类其实是一个Servlet类,它内部提供了doGet()和doPost()方法,这两个方法其实就是我们经常所说的get请求和post请求,而get请求和post请求这两种请求方式,相信了解http请求的,都知道,get请求就是将请求参数直接放到请求路径后,post请求是将请求参数放置到请求的body中,当然他们还有其他一些区别,这里就不多说了!我们经常使用的是post请求。而demo中为了方便测试,就只实现了get请求。下面看看doGet()方法,

[java]  view plain  copy
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.     // TODO Auto-generated method stub  
  3.     List<Students> list = StudentBusiness.getAllStudents(); // 从数据库获取学生数据列表  
  4.     ListObject listObject=new ListObject(); // 创建一个返回对象  
  5.     listObject.setItems(list);// 将数据列表设置给返回对象的items属性  
  6.     listObject.setStatusObject(StatusHouse.COMMON_STATUS_OK);// 设置返回对象的响应状态码  
  7.     String responseText = JackJsonUtils.toJson(listObject);//将返回对象转换为json字符串  
  8.     ResponseUtils.renderJson(response, responseText);//将结果返回会调用者  
  9. }  
每一行代码都加入了注释,不难理解!有一个地方需要强调一点,就是设置返回的响应状态码,好多小伙伴对这儿疑问比较大,这里再强调一下,这里设置的响应状态码是主要为了让调用者收到返回的json结果字符串后解析json时用的,简单来说,就是,

a). 如果响应状态码等于‘ok’时,调用者才去解析结果字符串;

b).如果是其他状态码,就直接显示结果字符串中的‘msg’。

这个是我自己定义的规则!大家自己在实际开发中,完全可以按照自己的方式去定义解析规则!

好了,有关对外提供的接口类,就说到这里。

2. cn.xinxing.business 这个包是和数据相关的。连接数据库以及从数据库中获取数据!其中DBHelper这个类是连接数据库的。这里我没有使用引入其他框架来维护数据库以及数据处理!下面看看这个类的具体实现,

[java]  view plain  copy
  1. package cn.xinxing.business;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.SQLException;  
  7.   
  8.   
  9. /** 
  10.  */  
  11. public class DBHelper {  
  12.       
  13.      public static final String url = "jdbc:mysql://localhost:3306/students_manage";  //数据库url  
  14.         public static final String name = "com.mysql.jdbc.Driver";  //JDBC driver name  
  15.         public static final String user = "root";  //数据库用户名  
  16.         public static final String password = "111111";//  数据库密码  
  17.         
  18.         public Connection conn = null;  //数据库连接对象  
  19.         public PreparedStatement pst = null;  //对象  
  20.         
  21.         /** 
  22.          * @param sql 
  23.          */  
  24.         public DBHelper(String sql) {    
  25.             try {    
  26.                 Class.forName(name);//注册JDBC driver  
  27.                 conn = DriverManager.getConnection(url, user, password);//打开一个数据库连接  
  28.                 pst = conn.prepareStatement(sql);//执行sql后,创建了preparedStatemen对象  
  29.             } catch (Exception e) {    
  30.                 e.printStackTrace();    
  31.             }    
  32.         }    
  33.         
  34.         /** 
  35.          * 关闭数据库 
  36.          */  
  37.         public void close() {    
  38.             try {    
  39.                 this.conn.close();  //关闭连接  
  40.                 this.pst.close();  //关闭对象  
  41.             } catch (SQLException e) {    
  42.                 e.printStackTrace();    
  43.             }    
  44.         }    
  45.   
  46. }   
通过JDBC连接至MySql数据库,然后获取到一个PreparedStatement对象,通过这个对象来发送sql命令,并且从数据库接收数据的属性和方法,换句话说,通过这个对象,我们就可以拿到数据库中的相关数据。

接着看StudentBusiness是如何获取数据的,还是上代码,

[java]  view plain  copy
  1. package cn.xinxing.business;  
  2.   
  3. import java.sql.ResultSet;  
  4. import java.sql.SQLException;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import cn.xinxing.model.Students;  
  9.   
  10. /** 
  11.  * 从数据库中获取数据 
  12.  */  
  13. public class StudentBusiness {  
  14.   
  15.     /** 
  16.      * 获取所有的学生数据 
  17.      * @return 
  18.      */  
  19.     public static List<Students> getAllStudents() {  
  20.         List<Students> list = new ArrayList<Students>();//list对象  
  21.         String sql = null;  
  22.         DBHelper db1 = null;  
  23.         sql = "select *from student";// SQL  
  24.         db1 = new DBHelper(sql);//创建DBHelper对象  
  25.         ResultSet ret = null;//创建结果集对象,执行sql后返回的数据集合  
  26.         try {  
  27.             ret = db1.pst.executeQuery();//这个方法就类似于执行了SELECT语句一样!  
  28.             while (ret.next()) {  
  29.                 int id = ret.getInt(1);//第一列是id  
  30.                 String name = ret.getString(2);//第二列是name  
  31.                 int age = ret.getInt(3);//第三列是age  
  32.                 int sex = ret.getInt(4);//第四列是sex  
  33.                 Students students = new Students();//创建students对象  
  34.                 students.setId(id);//设置id  
  35.                 students.setName(name);//设置name  
  36.                 students.setAge(age);//设置age  
  37.                 students.setSex(sex);//设置sex  
  38.                 list.add(students);//将students对象放置到列表中  
  39.             } //循环从结果集中获取数据并设置到list列表对象中  
  40.             ret.close();//关闭对象  
  41.             db1.close();//关系数据库连接  
  42.         } catch (SQLException e) {  
  43.             // TODO Auto-generated catch block  
  44.             e.printStackTrace();  
  45.         } //  
  46.   
  47.         return list;//返回结果  
  48.     }  
  49.   
  50.     /** 
  51.      * 通过id来获取某个学生数据 
  52.      * @param _id 
  53.      * @return 
  54.      */  
  55.     public static Students getStudentInfoById(String _id) {  
  56.         String sql = null;  
  57.         DBHelper db1 = null;  
  58.         sql = "select * from student where id =" + _id;// sql  
  59.         db1 = new DBHelper(sql);//创建DBHelper对象  
  60.         ResultSet ret = null;//创建结果集对象  
  61.         Students students = new Students();//创建对象  
  62.         try {  
  63.             ret = db1.pst.executeQuery();//正常来说,这个结果集只有一个对象  
  64.             while (ret.next()) {  
  65.                 int id = ret.getInt(1);//第一列是id  
  66.                 String name = ret.getString(2);//第二列是name  
  67.                 int age = ret.getInt(3);//第三列是age  
  68.                 int sex = ret.getInt(4);//第四列是sex  
  69.                 int mobile = ret.getInt(5);//第五列是mobile  
  70.                 students.setId(id);//设置id  
  71.                 students.setName(name);//设置name  
  72.                 students.setAge(age);//设置age  
  73.                 students.setSex(sex);//设置sex  
  74.                 students.setMobile(mobile);//设置mobile  
  75.             } //循环从结果集中获取数据并设置到对象中(正常来说,这个循环只执行一次)  
  76.             ret.close();//关闭对象  
  77.             db1.close();//关系数据库连接  
  78.         } catch (SQLException e) {  
  79.             // TODO Auto-generated catch block  
  80.             e.printStackTrace();  
  81.         } //   
  82.         return students;//返回结果  
  83.     }  
  84. }  

这个类提供了两个方法获取数据,一个方法是获取数据库中学生表中的所有数据,一个根据id参数获取某一个学生的数据。这里用到了PreparedStatement对象,如果对这个对象了解更多,请看JDBC教程

最后补上,例子下载地址

由于篇幅问题,下篇文章将继续来详解demo项目的代码! 博文中如果有误,欢迎指出! java web开发(五) 接口开发补坑2已经推出了!欢迎大家收看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值