servlet容器如何处理此http请求?

时间:2015-05-31 17:02:37

标签: java jsp servlets

我第一次使用Eclipse创建了Dynamic Web Project来使用servlet和jsp。

下面是servlet代码,

package com.example.tutorial;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ServletExample extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        String firstName = request.getParameter("firstname");
        String lastName = request.getParameter("lastname");

        out.println(firstName + " " + lastName);
    }

}

和相应的web.xml,

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>ServletsJSPExample</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>ServletExample</display-name>
    <servlet-name>ServletExample</servlet-name>
    <servlet-class>com.example.tutorial.ServletExample</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletExample</servlet-name>
    <url-pattern>/servletexample</url-pattern>
  </servlet-mapping>
</web-app>

我还写了index.jsp,其形式如下:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Insert title here</title>
</head>
<body>
    <form action="servletexample" method="post" >
       <table border="0">
         <tr>
            <td>First Name:</td> <td><input type="text" name="firstname" /></td>
         </tr>
         <tr>
            <td>Last Name:</td> <td><input type="text" name="lastname"  /></td>
         </tr>
         <tr>
            <td colspan="2"> <input type="submit" value="Submit" /></td>
         </tr>
       </table>
    </form>
</body>
</html>

在我的第一个案例中,在eclipse中,如果我选择Run As -> Run On Server,eclipse中的浏览器会显示带有URI的index.jsp呈现代码:http://localhost:8081/ServletsJSPExample/

我稍后在servlet中添加以下代码行,

this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);

如下图所示,

public class ServletExample extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();

        this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);

        String firstName = request.getParameter("firstname");
        String lastName = request.getParameter("lastname");

        out.println(firstName + " " + lastName);
    }

}

在第二种情况下,在eclipse中,如果我选择Run As -> Run On Server,eclipse中的浏览器会显示带index.jsp的{​​{1}}的呈现代码:http://localhost:8081/ServletsJSPExample/servletexample

所以,

这两个案例,这个URI如何变化? 在添加此行代码ServletsJSPExample之前和之后,控制如何从servlet容器流向我的应用程序this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);

请帮助我理解这个!!!

注意:ServletsJSPExample是eclipse中的“动态网络项目”名称

2 个答案:

答案 0 :(得分:1)

URI不会改变。响应的内容有何变化。

使用时:

PrintWriter out = response.getWriter();

这意味着您将手动编写此请求的响应内容。您在out中撰写的所有内容都将成为回复的一部分。这就是为什么,如果你只写这个:

out.println(firstName + " " + lastName);

响应中唯一的文本是此文本,根本没有HTML。当调用http://localhost:8081/ServletsJSPExample/servletexample时,浏览器将显示此纯文本,这就是全部。

使用时:

getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);

这意味着index.jsp的内容将用作响应的一部分。 index.jsp的内容将使用HttpServletRequest request中的属性进行解析(因此替换表达式语言的内容,这些表达式包含在${}中)。

答案 1 :(得分:1)

首先,忘记Eclipse以及如何在其中启动程序。这是关于Servlets,它们的url-mappings,以及你击中的url。

在你的第一个样本中,你点击了

http://localhost:8081/ServletsJSPExample/

假设ServletsJSPExample是您的上下文根,您就会到达应用的根目录。由于您已注册welcome-file(这是一个JSP)

<welcome-file>index.jsp</welcome-file>

Servlet容器将直接提供它。

在第二种情况下,您将请求发送到

http://localhost:8081/ServletsJSPExample/servletexample

的路径为/servletexample。您将ServletExample servlet映射到

<url-pattern>/servletexample</url-pattern>

所以Servlet容器选择这个ServletExample servlet来处理请求。处理请求意味着调用其service方法,该方法继续调用

this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);

调用getRequestDispatcher容器

  

返回一个RequestDispatcher对象,该对象充当位于给定路径的资源的包装器。

在这种情况下,位于给定路径的资源是JSP(另一个Servlet)。通过调用forward,您就可以在JSP servlet上调用service了。这将呈现JSP的内容并将其作为响应主体发送。