Fork me on GitHub

Java Servlet入门[1]

参考文献:http://www.runoob.com/servlet

tomcat安装

为啥又安装,因为它又又又死了。下载解压就不说了。

  • 双击bin目录下的java8w.exe出现unable to open the service tomcat8
    解决方法:在bin目录下运行service.bat install
  • 在logs目录下,发现问题为"Address already in use: JVM_Bind"
    解决方法:
    1
    2
    3
    netstat -ano |findstr "8080"  #查看被占用的端口
    tasklist |findstr "4760" #查看进程名
    taskkill /f /im 进程名 #关闭进程

最后双击startup.bat启动 Tomcat。

Servlet

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自Web 浏览器或其他HTTP 客户端的请求HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。(莫名感觉和php的作用有点像)

Servlet 执行以下主要任务:

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

eclipse创建Servlet实例

  • File-->New-->Servlet

①hello world

  • 在自动创建的HelloServlet.javadoGet()函数中添加

    1
    response.getWriter().write("Hello world");
  • web.xml中添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <servlet>  
    <!-- 类名 -->
    <servlet-name>HelloServlet</servlet-name>
    <!-- 所在的包 -->
    <servlet-class>cn.sheng.test.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <!-- 访问的网址 -->
    <url-pattern>/test/HelloServlet</url-pattern>
    </servlet-mapping>
  • 访问http://localhost:8080/test/HelloServlet得到Hello world

👂用get方式提交数据

  • 在自动创建的HelloServlet.javadoGet()函数中添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    response.setContentType("text/html;charset=UTF-8");  // 设置响应内容类型
    PrintWriter out = response.getWriter();
    String title = "使用 GET 方法读取表单数据";
    String name =new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8"); // 处理中文
    String docType = "<!DOCTYPE html> \n";
    out.println(docType +
    "<html>\n" +
    "<head><title>" + title + "</title></head>\n" +
    "<body bgcolor=\"#f0f0f0\">\n" +
    "<h1 align=\"center\">" + title + "</h1>\n" +
    "<ul>\n" +
    " <li><b>站点名</b>:"
    + name + "\n" +
    " <li><b>网址</b>:"
    + request.getParameter("url") + "\n" +
    "</ul>\n" +
    "</body></html>");
  • web.xml中添加的内容同上

  • 访问http://localhost:8080/test/HelloServlet?name=123&url=www.123.com得到get方式提交的内容

🌂用表单的POST 方法提交数据

  • WebContent目录下创建post.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>测试界面</title>
    </head>
    <body>
    <form action="HelloServlet" method="POST">
    网址名:<input type="text" name="name">
    <br />
    网址:<input type="text" name="url" />
    <br />
    <input type="checkbox" name="runoob" checked="checked" /> 菜鸟教程
    <input type="checkbox" name="google" /> Google
    <input type="checkbox" name="taobao" checked="checked" /> 淘宝
    <input type="submit" value="提交" />
    </form>
    </body>
    </html>
  • HelloServlet.java中的doGet()方法中添加。

    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
    response.setContentType("text/html;charset=UTF-8");

    PrintWriter out = response.getWriter();
    String title = "接收全部数据";
    String name =new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8"); // 处理中文
    String docType = "<!DOCTYPE html> \n";
    out.println(docType +
    "<html>\n" +
    "<head><title>" + title + "</title></head>\n" +
    "<body bgcolor=\"#f0f0f0\">\n" +
    "<h1 align=\"center\">" + title + "</h1>\n" +
    "</ul>\n" +
    "<table width=\"100%\" border=\"1\" align=\"center\">\n" +
    "<tr bgcolor=\"#949494\">\n" +
    "<th>参数名称</th><th>参数值</th>\n"+
    "</tr>\n");

    Enumeration paramNames = request.getParameterNames();

    while(paramNames.hasMoreElements()) {
    String paramName = (String)paramNames.nextElement();
    out.print("<tr><td>" + paramName + "</td>\n");
    String[] paramValues =
    request.getParameterValues(paramName);
    if (paramValues.length == 1) { // 读取单个值的数据
    String paramValue = paramValues[0];
    if (paramValue.length() == 0)
    out.println("<td><i>没有值</i></td>");
    else
    out.println("<td>" + paramValue + "</td>");
    } else { // 读取多个值的数据
    out.println("<td><ul>");
    for(int i=0; i < paramValues.length; i++) {
    out.println("<li>" + paramValues[i]);
    }
    out.println("</ul></td>");
    }
    out.print("</tr>");
    }
    out.println("\n</table>\n</body></html>");
    }
  • 在web.xml中添加的内容同上

  • 访问http://localhost:8080/test/post.html打开html界面,向表单中添加数据并提交。

④使用HttpServletRequestgetHeaderNames()方法读取 HTTP 头信息

  • HelloServlet.java中的doGet()方法中添加。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    String title = "HTTP Header请求";
    String docType =
    "<!DOCTYPE html> \n";
    out.println(docType +
    "<html>\n" +
    "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+
    "<body bgcolor=\"#f0f0f0\">\n" +
    "<h1 align=\"center\">" + title + "</h1>\n" +
    "<table width=\"100%\" border=\"1\" align=\"center\">\n" +
    "<tr bgcolor=\"#949494\">\n" +
    "<th>Header 名称</th><th>Header 值</th>\n"+
    "</tr>\n");
    Enumeration headerNames = request.getHeaderNames();
    while(headerNames.hasMoreElements()) {
    String paramName = (String)headerNames.nextElement();
    out.print("<tr><td>" + paramName + "</td>\n");
    String paramValue = request.getHeader(paramName);
    out.println("<td> " + paramValue + "</td></tr>\n");
    }
    out.println("</table>\n</body></html>");
  • web.xml中添加的内容同上

  • 打开网址http://localhost:8080/test/HelloServlet可以看到HTTP 头信息

🌫HTTP Header 响应实例
PS:data导入的jar包:import java.util.Date;

  • HelloServlet.java中的doGet()方法中添加。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    response.setIntHeader("Refresh", 5);  // 设置刷新自动加载时间为 5 秒
    response.setContentType("text/html;charset=UTF-8"); // 设置响应内容类型
    Calendar cale = Calendar.getInstance(); //使用默认时区和语言环境获得一个日历
    Date tasktime=cale.getTime(); //将Calendar类型转换成Date类型
    SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期输出的格式
    String nowTime = df.format(tasktime); //格式化输出
    PrintWriter out = response.getWriter();
    String title = "自动刷新 Header 设置";
    String docType =
    "<!DOCTYPE html>\n";
    out.println(docType +
    "<html>\n" +
    "<head><title>" + title + "</title></head>\n"+
    "<body bgcolor=\"#f0f0f0\">\n" +
    "<h1 align=\"center\">" + title + "</h1>\n" +
    "<p>当前时间是:" + nowTime + "</p>\n");
    }
  • web.xml中添加的内容同上

  • 打开网址http://localhost:8080/test/HelloServlet可以看到时间且5秒刷新一次

⑥HTTP 状态码实例

1
response.sendError(404, "页面不存在" );

  • web.xml中添加的内容同上
  • 打开网址http://localhost:8080/test/HelloServlet可以看到404页面

⑦Servlet 过滤器实例

  • test(项目)-->New-->Filter
  • Filter.java

    1
    2
    3
    4
    5
    6
    7
    8
    public void init(FilterConfig fConfig) throws ServletException {
    String site = fConfig.getInitParameter("Site"); // 获取初始化参数
    System.out.println("网站名称: " + site); // 输出初始化参数
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
    System.out.println("站点网址:http://www.runoob.com"); // 输出站点名称
    chain.doFilter(request,response); // 把请求传回过滤链
    }
  • web.xml添加以下内容,其他同上

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      <filter>
    <filter-name>Filter</filter-name>
    <filter-class>cn.sheng.test.Filter</filter-class>
    <init-param>
    <param-name>Site</param-name>
    <param-value>百度</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>Filter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

web.xml中的元素:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<filter>指定一个过滤器。
<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class>元素用于指定过滤器的完整的类名。
<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>指定过滤器所拦截的Servlet名称。
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。
<dispatcher>子元素可以设置的值及其意义
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

  • 访问http://localhost:8080/test/test/HelloServlet在控制台会出现一次网站名称:百度和两次站点网址:http://www.baidu.com

PS:使用多个过滤器的话就像上面一样添加就行,filter-mapping 元素的顺序决定了 Web 容器应用过滤器到Servlet 的顺序

⑧Servlet 错误处理程序实例

  • File-->New-->Servlet创建一个ErrorHandler实例
  • ErrorHandler.java中的doGet()方法中添加

    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
    Throwable throwable = (Throwable)
    request.getAttribute("javax.servlet.error.exception");
    Integer statusCode = (Integer)
    request.getAttribute("javax.servlet.error.status_code");
    String servletName = (String)
    request.getAttribute("javax.servlet.error.servlet_name");
    if (servletName == null){
    servletName = "Unknown";
    }
    String requestUri = (String)
    request.getAttribute("javax.servlet.error.request_uri");
    if (requestUri == null){
    requestUri = "Unknown";
    }
    response.setContentType("text/html;charset=UTF-8"); // 设置响应内容类型
    PrintWriter out = response.getWriter();
    String title = "Error/Exception 信息";
    String docType = "<!DOCTYPE html>\n";
    out.println(docType +
    "<html>\n" +
    "<head><title>" + title + "</title></head>\n" +
    "<body bgcolor=\"#f0f0f0\">\n");
    if (throwable == null && statusCode == null){
    out.println("<h2>错误信息丢失</h2>");
    out.println("请返回 <a href=\"" +
    response.encodeURL("http://localhost:8080/") + "\">主页</a>。");
    }else if (statusCode != null) {
    out.println("错误代码 : " + statusCode);
    }else{
    out.println("<h2>错误信息</h2>");
    out.println("Servlet Name : " + servletName + "</br></br>");
    out.println("异常类型 : " + throwable.getClass( ).getName( ) + "</br></br>");
    out.println("请求 URI: " + requestUri + "<br><br>");
    out.println("异常信息: " + throwable.getMessage( ));
    }
    out.println("</body>");
    out.println("</html>");
  • web.xml中添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     <servlet>
    <servlet-name>ErrorHandler</servlet-name>
    <servlet-class>cn.sheng.test.ErrorHandler</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>ErrorHandler</servlet-name>
    <url-pattern>/test/ErrorHandler</url-pattern>
    </servlet-mapping>
    <error-page>
    <error-code>404</error-code>
    <location>/test/ErrorHandler</location>
    </error-page>
    <error-page>
    <exception-type>java.lang.Throwable</exception-type >
    <location>/ErrorHandler</location>
    </error-page>
  • 访问http://localhost:8080/test/ErrorHandler/12,可以看到错误代码 : 404

-------------本文结束感谢您的阅读-------------