java 服务器接口快速开发之servlet详细教程

来源:互联网 发布:移动wifi网络不稳定 编辑:程序博客网 时间:2024/05/08 01:26

又是许久没更新博客了。但最近好在有些事情忙完了。今天针对我在做的个人项目后台技术进行详细的记录。希望可以帮助一些想自己搭建简易接口开发的同学,更好的了解客户端的网络请求机制。

  1. 首先我们需要的开发工具和环境(这里不区分mac和windows,区别不大) 
    由于我们的接口开发语言是java,那么当然还是以eclipse为主。这里我使用的是带有web插件的eclipse。我们俗称javaEE。(当然很多人会使用myeclipse这也不错) 
    想要搭建服务器,tomcat当然必不可少。这里使用的是7.0,而且是以插件的形式存在于eclipse中。 
    做服务器开发的同学当然知道数据库也是必不可少的,咱不能做一个没有真实数据的接口。数据库用的mysql。 
    这些工具网上都是可以百度进行下载的。这里不赘述了。

  2. 数据库创建以及java中jdbc驱动加载数据库 
    不熟悉数据库的小伙伴可以下载一个可视化的数据库操作界面。比如sqlGUI、navicat for mysql 等等都是不错的操作界面,也很简单。我们可以通过这些可视化工具来建表,增加数据等等。当然有些同学可能数据库语句很熟悉了,可以通过shell指令来操作。 
    以mac为例:安装好mysql后可点击系统偏好设置能看到mysql服务,如图: 
    这里写图片描述 
    然后点击图标可以看到服务是否启动,没有启动就点击启动就可以了。如图这个是启动了: 
    这里写图片描述 
    接下来打开终端:首先输入mysql所在目录PATH=”$PATH”:/usr/local/mysql/bin 
    回车后输入如下:mysql -u root -p ,回车会提示输入密码。输入密码后回车就成功链接mysql 服务了。如图: 
    这里写图片描述 
    这时候我们可以创建数据库,创建表格等等。

  3. 接下来就是我们重点的接口工程的创建了 
    我们打开下载好的带插件的javaEE 右击创建动态web项目。新建好的目录工程如图: 
    这里写图片描述 
    我们需要关心的目录主要在src 目录,里面存放正常的java代码。然后是WebContent目录下的Web—INF目录。这里我们看到已经存在lib目录了,其实就是存放第三方jar包的。我们还需要手动创建config文件夹,其中创建一个config.properties文件用于存放链接数据库驱动的配置文件。具体的内容如下:
driverclass=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/testdatabase?useUnicode=true&characterEncoding=UTF-8username=rootpassword=12345
  • 1
  • 2
  • 3
  • 4

这里就是加载mysqljdbc驱动的关键代码,其中数据库名称,用户名密码等都必须正确不然是无法连接的。如图: 
这里写图片描述 
当然我们还得知道webContent目录下可以存放我们web工程的html、jsp、js、css等页面。 
接下来有个重点的关于servlet接口的配置文件,结构如图: 
这里写图片描述 
其中具体配置如下:

<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">    //静态配置文件,整个项目的入口    <listener>        <listener-class>com.szh.utils.ListenerLoadConfig</listener-class>    </listener>    <servlet>        //别名 最终客户端访问的接口的名称后缀        <servlet-name>Test</servlet-name>        //接口的具体类名,路径必须正确        <servlet-class>com.szh.servlets.Test</servlet-class>    </servlet>    <servlet-mapping>        //别名须统一        <servlet-name>Test</servlet-name>        <url-pattern>/Test</url-pattern>    </servlet-mapping></web-app>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

代码中注释已经很详细了。其实接口的名称就是别名挂钩的,所以一定要注意。当然很多小伙伴可能不明包listener配置。接下来会详细解释。 
配置代码结构如图: 
这里写图片描述 
DBUtil代码:

package com.szh.utils;import static com.szh.utils.LoadDBconfig.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;/**  数据库操类  */public class DBUtil {    /**     * 连接数据库     * @return     */    public static Connection getConn(){        Connection conn=null;        try {            //加载驱动            Class.forName(getDBValue("driverclass"));            String url=(getDBValue("url"));            String user=(getDBValue("username"));            String password=(getDBValue("password"));            conn=DriverManager.getConnection(url, user, password);        } catch (Exception e) {            e.printStackTrace();        }        return conn;    }    /**     * 关闭连接     * @param rs     * @param stat     * @param conn     */    public static void closeConn(ResultSet rs,Statement stat,Connection conn){        try {            // 关闭 ctrl+shift+F format            if (rs != null) {                rs.close();            }            if (stat != null) {                stat.close();            }            if (conn != null) {                conn.close();            }        } catch (SQLException e) {            e.printStackTrace();        }    }    public static void closeConn(Statement stat,Connection conn){        try {            if (stat != null) {                stat.close();            }            if (conn != null) {                conn.close();            }        } catch (SQLException e) {            e.printStackTrace();        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

ListenerLoadConfig代码如下:

package com.szh.utils;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;/** 监听上下文加载配置  */public class ListenerLoadConfig implements ServletContextListener {    public static final long TOKEN_CHECKED_TIME=24*60*60*1000;    @Override    public void contextDestroyed(ServletContextEvent sce) {    }    @Override    public void contextInitialized(ServletContextEvent event) {        String path=event.getServletContext().getRealPath("/WEB-INF/config/dbconfig.properties");        LoadDBconfig.load(path);        System.out.println(DBUtil.getConn());    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

LoadDBconfig代码如下:

package com.szh.utils;import java.io.FileInputStream;import java.util.HashMap;import java.util.Properties;/**  加载配置  @author quanmin   */public class LoadDBconfig {    //存储配置文件中的值    private static HashMap<String,String> dbMap=new HashMap<String,String>();    public static String getDBValue(String name){        return dbMap.get(name);    }    public static void load(String path){        try {            //加载配置dbconfig.properties            Properties pro=new Properties();            //加载文件            pro.load(new FileInputStream(path));            //取值            String driverclass=pro.getProperty("driverclass");            dbMap.put("driverclass", driverclass);            String url=pro.getProperty("url");            dbMap.put("url", url);            String username=pro.getProperty("username");            dbMap.put("username", username);            String password=pro.getProperty("password");            dbMap.put("password", password);        } catch (Exception e) {            e.printStackTrace();        }     }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

代码就不详细解释了。其实ListenerLoadConfig这里就在刚才的web。xml中用到了。这个就是入口,因为其实现了ServletContextListener这个接口那么程序启动的时候就会从这开始。而这里面做的也就是读取配置文件的路径然后通过LoadDBconfig来加载驱动。然后通过DBUtil来创建链接。

  1. 接下来就是接口介绍了。 
    我们之前已经说到了,我们接口使用的servlet技术,servlet技术其实是java接口的最核心的技术,spring框架其实也就是对servlet的封装。 
    首先我们需要继承自servlet:代码如下:
import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Test extends HttpServlet {    private static final long serialVersionUID = 1L;    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        request.setCharacterEncoding("UTF-8");        response.setCharacterEncoding("UTF-8");    }    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        this.doGet(request, response);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

继承自HttpServlet之后会自动实现get和post方法。这就是我们常说的http请求中的方法。客户端做网络请求就会到这两个方法中。我们可以看到有两个参数HttpServletRequest,和HttpServletResponse。这两个就分别对应http请求中的请求参数,和返回接口,也就是客户端请求的参数都在HttpServletRequest中我们可以拿到,而服务器返回的接口都可以存放在HttpServletResponse,中这样客户端就能拿到想要的数据了。是不是觉得很简单。那么接下来我们来一个简单的例子。 
2. 注册接口的demo测试: 
代码如下:

@Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //注册请求传过来的参数获取        String username=req.getParameter("username");        String password=req.getParameter("password");        //数据库操作插入 用户信息        RegistDao daoModel=new RegistDao();        boolean result=daoModel.insertData(username, password);        PrintWriter pw = resp.getWriter();        String prtStr="";        if(result){            prtStr="注册成功啦!";        }else{            prtStr="注册失败啦!";        }        pw.print(prtStr);        System.out.println(prtStr);    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

数据库RegistDao 代码:

package com.szh.daos;import java.sql.Connection;import java.sql.PreparedStatement;import com.szh.utils.DBUtil;public class RegistDao extends DBUtil{    public boolean insertData(String username,String password ) {        Connection conn=null;        PreparedStatement stat=null;         int rowCount=0;        try {            conn=getConn();            String sql="insert into t_user(userphone, userpasss) value(?,?)";            stat=conn.prepareStatement(sql);            //设置值            stat.setString(1, username);            stat.setString(2, password);            //执行            rowCount=stat.executeUpdate();        } catch (Exception e) {            e.printStackTrace();        }finally{            closeConn(stat, conn);        }        if(rowCount>0){            return true;        }        return false;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

需要实战练习的同学可以看我的github,其中有详细的项目源码。 
这个是后台的项目地址:https://github.com/MrHangVIP/ZSXBiSHe 
这个是配合后台的对应客户端源码,客户端是安卓的项目。整个客户端都是开源的需要的童鞋自己下载https://github.com/MrHangVIP/AiYaMaYa 
当然,如果觉得写得好的话可以star谢谢!

原创粉丝点击