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

  • 相关阅读:
    Shared Memory in Windows NT
    Layered Memory Management in Win32
    软件项目管理的75条建议
    Load pdbs when you need it
    Stray pointer 野指针
    About the Rebase and Bind operation in the production of software
    About "Serious Error: No RTTI Data"
    Realizing 4 GB of Address Space[MSDN]
    [bbk4397] 第1集 第一章 AMS介绍
    [bbk3204] 第67集 Chapter 17Monitoring and Detecting Lock Contention(00)
  • 原文地址:https://www.cnblogs.com/amiko/p/7906211.html
Copyright © 2011-2022 走看看