Servlet 使用介绍(3)

来源:互联网 发布:知乎 显微镜原理 编辑:程序博客网 时间:2024/06/05 14:07

说明

本篇记录一个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+"\n");        }        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  socketIP_ADDRESS="127.0.0.1"IP_PORT=8080def 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+"\n")    response=socket_client.recv(1024)    socket_client.close()    print "get response %s" % responsedef doHttp(method,url):    data='''%s /ServletDemo/%s HTTP/1.1Host: %s:%sConnection: keep-aliveUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8this is a test about %stest of servlet''' % (method,url,IP_ADDRESS,IP_PORT,method)    return dataif __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 OKServer: Apache-Coyote/1.1Transfer-Encoding: chunkedDate: Tue, 08 Aug 2017 00:09:49 GMT11Servlet_one doGet

测试成功.

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