zoukankan      html  css  js  c++  java
  • Servlet 使用介绍(3)

    说明

    本篇记录一个Servlet的创建过程和基本使用.由于,Servlet是基于Http协议使用的,所以,可以在http协议的基础上作一些改变,来修改适用我自己的servlet.

    Servlet使用

    接下来实现一个简单的Servlet创建和通信,服务端创建一个Servlet来接受Post、get请求,为了便于测试客户端,我使用一个python文件模拟客户端请求。

    Servlet创建

    • 创建ServletDemo工程

      ServletDemo工程选用Eclipse通用动态网页工程结构,目录如下:

      ServletDemo
      --src
      --cn.enjoytoday
       --Servlet_one.java
      --WebContent
      --META_INF
       --MANIFEST.MF
      --WEB_INF
       --lib
       --web.xml
      --index.xml
      
    • 创建Servlet类

      Servlet选择继承HttpServlet,便于直接重写doGet和doPost方法,代码如下:

    package cn.enjoytoday;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.Reader;
    import java.util.Enumeration;
    import java.util.logging.Logger;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     *
     * @author hfcai
     *@date 2017/8/7
     *继承HttpServlet实现Servlet
     *
     */
    public class Servlet_one extends HttpServlet {
    
    
        /**
         * get方法回调
         */
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // TODO Auto-generated method stub
            System.out.println("doGet,and request url:"+req.getRemoteAddr());
          readString(req.getReader());
          getInitParmas();
            response(resp.getWriter(), "Servlet_one doGet");
    
        }
    
    
    
        /**
         * post 方法回调
         */
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("doPost,and request url:"+req.getRemoteAddr());
            readString(req.getReader());
        getInitParmas();
            response(resp.getWriter(), "Servlet_one doPost");
        }
    
        private void  getInitParmas() {
             Enumeration<String>names=  getInitParameterNames();
             while (names.hasMoreElements()) {
                String name = (String) names.nextElement();
                System.out.println("initParam name:"+name+",and value is:"+getInitParameter(name));
    
            }
    
        }
    
    
        private void readString(BufferedReader bufferedReader) throws IOException {
    
            String line=null;
            StringBuffer stringBuffer=new StringBuffer();
            System.out.println("one line:"+bufferedReader.readLine());
            while( (line=bufferedReader.readLine())!=null) {
                stringBuffer.append(line+"
    ");
            }
            System.out.println("get request String:"+stringBuffer.toString());
        }
    
    
    
        private void  response(PrintWriter writer,String content) {
            writer.append(content).flush();
        }
    
    
    
    }
    
    • 创建web.xml文件

      配置web.xml文件,让serlvet可以被解析访问,配置信息如下:

      
      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://java.sun.com/xml/ns/javaee"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      id="WebApp_ID" version="3.0">
      
      <display-name>ServletDemo</display-name>
      
      
      <welcome-file-list>
         <welcome-file>index.html</welcome-file>
      </welcome-file-list>
      
      
      
      <servlet>
        <servlet-name>one</servlet-name>
        <servlet-class>cn.enjoytoday.Servlet_one</servlet-class>
      
        <!--  初始化参数 -->
        <init-param>
                <param-name>info</param-name>
                <param-value>basic httpServlet demo.</param-value>
        </init-param>
        <!-- servlet加载启动设置,当其大于等于0时表示应用启动时加载,否则则表示访问时加载,初始加载时的数值设置越小加载优先级越高. -->
        <load-on-startup>1</load-on-startup>
      </servlet>
      
      <servlet-mapping>
        <servlet-name>one</servlet-name>
        <url-pattern>/one</url-pattern>
      </servlet-mapping>
      </web-app>
      

      需要注意的是load-on-startup标签位加载启动设置,init-param为启动传入参数.url开始为当前项目定位url.

      • Tomcat 启动
        可以通过eclipse 将web应用发布在tomcat中。

    Servlet_Client创建

    为了方便,访问客户端,采用python完成,代码如下:

    #!/usr/bin/env python
    # -*-encoding:utf-8 -*-
    import  socket
    
    
    IP_ADDRESS="127.0.0.1"
    IP_PORT=8080
    
    
    def main(data):
        '''
         default test method to Servlet.such as use xmpp protocol to request .
        :return:
        '''
    
        socket_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        socket_client.connect((IP_ADDRESS,IP_PORT))
        socket_client.send(data+"
    ")
        response=socket_client.recv(1024)
        socket_client.close()
        print "get response %s" % response
    
    
    
    def doHttp(method,url):
        data='''%s /ServletDemo/%s HTTP/1.1
    Host: %s:%s
    Connection: keep-alive
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    
    this is a test about %s
    test of servlet
    ''' % (method,url,IP_ADDRESS,IP_PORT,method)
        return data
    
    
    
    if __name__ == '__main__':
        print "begin socket conneted."
        main(doHttp("GET","one"))
        # main(doHttp("POST","one"))
    

    如上,可以通过控制访问方法对servlet进行响应的调整。可通过如下命令发起访问:

    # python servlet_client.py

    返回结果如下:

    
    begin socket conneted.
    get response HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Transfer-Encoding: chunked
    Date: Tue, 08 Aug 2017 00:09:49 GMT
    
    11
    Servlet_one doGet
    

    测试成功.

    源码地址:https://github.com/fishly/JavaWeb/tree/master/ServeltDemo
    Enjoytoday,Enjoycoding

  • 相关阅读:
    Ubuntu下systemd服务的配置
    编译压缩代码 MFCompress-src-1.01 :对‘***’未定义的引用
    德尔福 基础
    德尔福 XE5 安卓权限设置
    德尔福 XE5 安卓调试
    复制任意文件或文件夹到剪贴板
    无法完成安装:'Cannot access storage file '/
    Centos7.4安装kvm虚拟机(使用virt-manager管理)
    MSYS2 使用
    线程
  • 原文地址:https://www.cnblogs.com/amiko/p/7906211.html
Copyright © 2011-2022 走看看