我第一次使用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中的“动态网络项目”名称
答案 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);
返回一个
RequestDispatcher
对象,该对象充当位于给定路径的资源的包装器。
在这种情况下,位于给定路径的资源是JSP(另一个Servlet
)。通过调用forward
,您就可以在JSP servlet上调用service
了。这将呈现JSP的内容并将其作为响应主体发送。