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

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

  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.Driver
url=jdbc:mysql://localhost:3306/testdatabase?useUnicode=true&characterEncoding=UTF-8
username=root
password=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谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值