• Servlet入门外2


    Servlet入门外2 
    Servlets 执行 javax.servlet.Servlet interface. 当servlet编写者可以通过直接implement interface开发servlet, 但这样通常没有必要. 因为大多数servlet是针对用HTTP协议的web服务器, 这样最通用开发servlet办法是用 javax.servlet.http.HttpServlet 内. 

    HttpServlet 类通过extend GenericServlet基类执行 Servlet interface, 提供了处理HTTP协议的功能. 他的service方法支持标准HTTP/1.1请求. 

    一般地, 用HttpServlet指定的类编写的servlets可以多线程地并发运行 service方法. 

    2.1 与客户端的交互性 

    Servlet编写者注意HttpServlet类有几个欠缺的方法,你可以自己定义方法中内容,但是必须使用这些方法名称以使servlet知道你想做什么, 

    doGet, 用于处理 GET、有条件的GET 和头部 HEAD请求 

    doPost, 用户处理 POST 请求 

    doPut, 用于处理 PUT 请求 

    doDelete, 用于处理 DELETE请求 

    HttpServlet的service方法, 一般地, 当它接收到一个OPTIONS请求时,会调用doOptions 方法, 当接收一个TRACE请求是调用doTrace . doOptions缺省执行方式是自动决定什么样的HTTP被选择并且返回哪个信息. 

    在你使用这些方法时,必须带两个阐述. 第一个包含来自客户端的数据 HttpServletRequest. 第二个参数包含客户端的响应HttpServletResponse. 在下例中是这样的情况. 

    一个HttpServletRequest对象提供到达HTTP 头部数据, 也允许你获取客户端的数据. 怎样获取这些数据取决于HTTP端请求方法. 

    不管任何HTTP方式, 你可以用 getParameterValues 方法, 这个用来返回特定名称的参数值. 对于用 HTTP GET 请求的方式, 这个 getQueryString 方法将会返回一个可以用来解剖分析的. 

    对于用HTTP POST, PUT, 和 DELETE请求的方式, 你有两种方法可以选择. 如果是文本数据,你能通过getReader方法用BufferedReader获取 ; 如果是二进制数据, 能通过getReader 方法用 ServletInputStream获取. 

    为了响应客户端, 一个HttpServletResponse对象提供返回数据给用户的两个方法. 你可以用getWriter 方法返回,或者 getOutputStream 方法以输出流返回. 你应该用getWriter返回文本数据,而用getOutputStream返回二进制数据. 

    在使用Writer 或 OutputStream之前, HTTP 头部应该先被设置. HttpServletResponse内提供这样一个方法,之后可以用writer 或 outputstream 将响应主体部分发回用户. 完成后要关闭 writer 或 output stream以便让服务器知道响应已经完毕. 

    2.2 一个HTTP Servlet处理GET和HEAD方法的例子 



    public class SimpleServlet extends HttpServlet { 

    public void doGet(HttpServletRequest req, HttpServletResponse res) 
    throws ServletException, IOException 

    // 首先设置头部 
    res.setContentType("text/html"); 

    // 用 writer方法返回响应数据 
    PrintWriter out = res.getWriter(); 
    out.println("<HEAD><TITLE> SimpleServlet Output</TITLE></HEAD><BODY>"); 
    out.println("<h1> SimpleServlet Output </h1>"); 
    out.println("<P>This is output is from SimpleServlet."); 
    out.println("</BODY>"); 
    out.close(); 


    public String getServletInfo() { 
    return "A simple servlet"; 




    这个例子完整地现实了一个servlet. 
    2.3 一个HTTP Servlet处理POST方式的例子 

    这里是个用HTML带POST表单的例子: 


    <html> 
    <head><title>JdcSurvey</title></head> 
    <body> 
    <form action=http://demo:8080/servlet/survey method=POST> 
    <input type=hidden name=survey value=Survey01Results> 

    <BR><BR>How Many Employees in your Company?<BR> 
    <BR>1-100<input type=radio name=employee value=1-100> 
    <BR>100-200<input type=radio name=employee value=100-200> 
    <BR>200-300<input type=radio name=employee value=200-300> 
    <BR>300-400<input type=radio name=employee value=300-400> 
    <BR>500-more<input type=radio name=employee value=500-more> 

    <BR><BR>General Comments?<BR> 
    <BR><input type=text name=comment> 

    <BR><BR>What IDEs do you use?<BR> 
    <BR>JavaWorkShop<input type=checkbox name=ide value=JavaWorkShop> 
    <BR>J++<input type=checkbox name=ide value=J++> 
    <BR>Cafe'<input type=checkbox name=ide value=Cafe'> 

    <BR><BR><input type=submit><input type=reset> 
    </form> 
    </body> 
    </html> 

    这里的servlet将表单数据写入一个文件,并且用一个thank you信息响应用户. 这里servlet的方法,如下例: 


    public void doPost(HttpServletRequest req, HttpServletResponse res) 
    throws ServletException, IOException 

    // 首先设置响应的 "content type" 头部 
    res.setContentType("text/html"); 

    //得到响应的 PrintWriter以返回文本给客户端. 
    PrintWriter toClient = res.getWriter(); 

    try { 
    //打开一个文件写入Survey的结果. 
    String surveyName = req.getParameterValues("survey")[0]; 
    FileWriter resultsFile = new FileWriter(resultsDir 
    + System.getProperty("file.separator") 
    + surveyName + ".txt", true); 
    PrintWriter toFile = new PrintWriter(resultsFile); 

    // 从客户端得到表单数据 & 存贮在这个文件中 
    toFile.println(""); 
    Enumeration values = req.getParameterNames(); 
    while(values.hasMoreElements()) { 
    String name = (String)values.nextElement(); 
    String value = req.getParameterValues(name)[0]; 
    if(name.compareTo("submit") != 0) { 
    toFile.println(name + ": " + value); 


    toFile.println(""); 

    //关闭文件. 
    resultsFile.close(); 

    // 用一个thank you返回客户端 
    toClient.println(""); 
    toClient.println(""); 
    toClient.println("Thank you for participating"); 
    toClient.println(""); 

    } catch(IOException e) { 
    e.printStackTrace(); 
    toClient.println( 
    "A problem occured while recording your answers. " 
    + "Please try again."); 


    // 关闭writer; 响应完成. 
    toClient.close(); 


    这个doPost方法是用getParameterNames和getParameterValues方法来从表单中获取数据的. 因为它返回文本给客户端, doPost 将调用 getWriter 方法. 在写入响应主体部分之前,它设置了响应头部字段的设置, 但响应完成后,关闭. 

    Love馨蕊
  • 相关阅读:
    重写System.IO.MemoryStream类, 实现LumiSoft.Net.POP3.Client单封邮件的下载进度显示
    获取页面来源URL ,源页面URL,Request.UrlReferrer为空的问题
    JavaScript BOM 随笔谈
    Android 端 博客园闪存——alpha版
    除余取模的算术变化特点,模的变化特点
    EF Code First 更新部分字段时 未更新字段的验证问题
    Android 端闪存 应用——alpha 2.0 版
    简化C#版Junit
    利用 Vs2012 编译MSOpenTech/Redis ——以服务方式运行Redis
    Android requires compiler compliance level 5.0. Please fix project properties.错误
  • 原文地址:https://www.cnblogs.com/yuan211/p/8350974.html
Copyright © 2020-2023  润新知