一、定义
1. 服务器上一个Servlet把数据传递到另一个Servlet的这种数据传递,我们称为服务器上的数据传递。
2. 程序把需要传递的数据进行保存:request.setAttribute(String“属性名”, Object o);(o是可以各种数据类型的对象,但设置后会作为Object类型保存在属性中)
3. 进行转发。转发:把当前程序的请求和响应对象传递给下面的程序,并运行调用下面这个程序。request.getRequestDispatcher("Servlet2").forward(request, response)
4. 程序获取数据:request.getAttribute(String“属性名”);接受到的值是Object类型对象,需要强制类型转换。
5. 处理之后再生成响应给浏览器。
二、上课例子——从Servlet1传递数据给Servlet2,并在网页上进行显示。
1. 按照以下文件目录进行Servlet1和Servlet2的文件创建。
2. Servlet1的编程代码如下:
package x;
import java.io.IOException;
import java.util.Date;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Servlet1
*/
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Servlet1() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
// 创建需要传递给另外一个Serlvet的数据
String s = "Servlet1中的字符串";
Date d = new Date();
// 创建传递对象
request.setAttribute("aa", s);
request.setAttribute("bb", d);
// 创建响应对象
RequestDispatcher rd= request.getRequestDispatcher("Servlet2");
rd.forward(request, response);
// 上面两句语句可以转换为下面一句话
// request.getRequestDispatcher("Servlet2").forward(request, response)
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
3. Servlet2的编程代码如下:
package x;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Servlet2
*/
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Servlet2() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
// 接收另外一个servlet传递过来的数据(接收时需要进行类型转换)
String s = (String)request.getAttribute("aa");
Date d = (Date)request.getAttribute("bb");
// 解决将数据传递给网页时的中文显示问题
response.setContentType("text/html;charset=UTF-8");
// 以下为服务器上html网页的标准写法
//---------------------------------------------------------------------//
// 进行网页显示代码编辑
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head><title>first servlet</title></head>");
out.println("<body>");
out.println("<p><h1>服务器上的数据传递</h1></p>");
out.println("<div style = color:red>");
out.println("<p>接收到的第一个数据是:" + s + "</p>");
out.println("<div style = color:blue>");
out.println("<p>接收到的第二个数据是:" + d + "</p>");
out.println("</body>");
out.println("</html>");
}finally {
out.close();
}
//---------------------------------------------------------------------//
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
4. 网页展示如下:
三、上课练习题
1. 题目:用表单提交一个数字给Servlet1,在Servlet1中写算法判断这个数字是否是素数,后把数字和结果转发给Servlet2,Servlet2生成网页发给。
2. 创建文件目录如下:
3. NewFile.html代码编辑如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<from>
<!-- 将网页生成的数据传递到以下的url中,该url由servlet文件创建的 -->
<form action="Servlet1">
<!-- 用户名输入框 -->
输入一个需要传递的数据:<input type="text" name="n"><br>
<!-- 提交按钮 -->
<input type="submit">
</form>
</body>
</html>
4. Servlet1编程代码如下:
package x;
import java.io.IOException;
import java.util.Date;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Servlet1
*/
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
/*
* @see HttpServlet#HttpServlet()
*/
public Servlet1() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
// 创建需要传递给另外一个Serlvet的数据
int s = Integer.valueOf(request.getParameter("n"));
String jg = "是素数";
// 判断一个数是否为素数
for(int i=2; i<s; i++) {
if(s % i == 0) {
jg = "不是素数";
break;
}
}
// 创建传递对象
request.setAttribute("aa", s);
request.setAttribute("bb", jg);
// 创建响应对象
RequestDispatcher rd= request.getRequestDispatcher("Servlet2");
rd.forward(request, response);
// 上面两句语句可以转换为下面一句话
// request.getRequestDispatcher("Servlet2").forward(request, response)
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
5. Servlet2编程代码如下:
package x;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Servlet2
*/
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Servlet2() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
// 接收另外一个servlet传递过来的数据(接收时需要进行类型转换)
int s = (int) request.getAttribute("aa");
String jg = (String) request.getAttribute("bb");
// 解决将数据传递给网页时的中文显示问题
response.setContentType("text/html;charset=UTF-8");
// 以下为服务器上html网页的标准写法
//---------------------------------------------------------------------//
// 进行网页显示代码编辑
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head><title>first servlet</title></head>");
out.println("<body>");
out.println("<p><h1>服务器上的数据传递</h1></p>");
out.println("<div style = color:red>");
out.println("<p>从网页上接收到的数字是:" + s + "</p>");
out.println("<div style = color:blue>");
out.println("<p>接收到数字" + s + jg + "。</p>");
out.println("</body>");
out.println("</html>");
}finally {
out.close();
}
//---------------------------------------------------------------------//
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
6. 网页展示如下: