一、实验预习内容

  1. Web页面中都可以使用哪些方式来发送HTTP请求?
    (1)用户在浏览器的地址栏中输入URL并按回车键;
    (2)用户点击了HTML页面中的超链接;
    (3)用户在HTML页面中添写一个表单并提交.

  2. GET与POST两种请求方式有什么区别?分别适用于什么情况?
    (1)GET方法用来检索资源.它的含义是”获得由该URI标识的资源”.GET方法请求的资源通常是静态资源.使用GET也可以请求动态资源,但一般要提供少量的请求参数.
    (2)POST方法用来向服务器发送需要处理的数据,它的含义是”将数据发送到由该URI标识的动态资源”.

  3. HTTP响应内容的类型都有哪些?如何设置HTTP响应内容的类型?
    (1)类型有:
    1)public PrintWriter getWriter():返回一个PrintWriter对象用于向客户发送文本数据.
    2)public ServletOutStream getOutputStream() throws IOException:返回一个输出流对象,它用来向客户发送二进制数据.
    3)public void setContentType(String type):设置发送到客户端响应的MIME内容类型.
    (2)设置方法:
    设置响应数据内容类型应该使用相应对象的setContentType(),如果没有调用该方法,内容类型将使用默认值text/html,即HTML文档.
    可以调用响应对象response的setCharacterEncoding()设置响应的字符编码.如果没有指定响应的字符编码,PrintWriter将使用ISO-8859-1编码.
    如果不使用默认的响应的内容类型和字符编码,应该先调用响应的setContentType(),然后再调用getWriter()或getOutputStream()获得输出流对象.

  4. 什么是ServletContext对象,它的生存周期如何? Web容器在启动时会加载每个Web应用程序,并为每个Web应用程序创建一个唯一的ServletContext实例对象,该对象称为Servlet上下文对象。
    ServletContext是一个作用域对象,使用它可以存储数据,它的作用域是整个应用程序。

  5. ServletContext与ServletRequest的getRequestDispatcher()方法有什么区别?
    区别是:对ServletContext的getRequestDispatcher()只能传递以”/”开头的路径,而对ServletRequest的getRequestDispatcher(),可以传递一个相对路径.

二、实验内容与步骤

  1. 简单的综合应用,掌握Servlet将请求转发给另一个Servlet的方法。
    【步骤1】创建一个名为input.html的HTML页面,其中包括一个表单,表单中包含两个文本域,分别供用户输入学号和姓名,该页面也包含提交和重置按钮。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body style="text-align:center;">
<form action="FirstServlet" method="post">
<p>	学号:<input type="text" name="sno" size="20"></p>
<p>姓名:<input type="text" name="name" size="20"></p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="submit" value="登录"/>
&nbsp;&nbsp;&nbsp;&nbsp;<input type="reset" value="取消"/>
</form>
</body>
</html>

【步骤2】 定义一个名为com.demo.Student类,其中包括学号sno和姓名name两个private的成员变量,定义访问和修改sno和name的方法。

package com.demo;

public class Student {
	private String sno;
	private String name;
	public void setSno(String sno) {
		this.sno = sno;
	}
	public String getSno() {
		return sno;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Student(String sno,String name) {
		this.sno = sno;
		this.name = name;
	}
}

【步骤3】编写名为FirstServlet的Servlet,要求当用户在input.html中输入信息后点击“提交”按钮,请求FirstServlet对其处理。在FirstServlet中使用表单提交的请求参数(学号和姓名)创建一个Student对象并将其作为属性存储在请求作用域中,然后通过请求对象的getRequestDispatcher()方法获得RequestDispatcher()对象,将请求转发到SecondServlet。

package com.demo;


import java.io.IOException;

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 FirstServlet
 */
@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public FirstServlet() {
        // 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
		String sno=request.getParameter("sno");
		String name=request.getParameter("name");
		Student student = new Student(sno,name);
		request.setAttribute("student", student);
		RequestDispatcher rd = request.getRequestDispatcher("/SecondServlet");
		rd.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);
	}

}

package com.demo;

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

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 SecondServlet
 */
@WebServlet("/SecondServlet")
public class SecondServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SecondServlet() {
        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
		Student student= (Student)request.getAttribute("student");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();	
		out.println("学号"+student.getSno()+"<br/>");
		out.println("姓名"+new String(student.getName()+"<br/>"));
		response.setHeader("Refresh","5;url=input.html");
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

【步骤4】在SecondServlet中取出请求作用域中存储的Student对象,并显示输出该学生的学号和姓名,5秒钟之后,自动返回input.html页面。
在这里插入图片描述
在这里插入图片描述
2. 编写一个Servlet,显示所有请求头信息:
【步骤1】在exp01项目下编写一个名为ShowHeadersServlet.java的Servlet程序,使其能够检索所有的请求头,并且能够以表格的形式将请求头的参数名和参数值显示出来。

package com.demo;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

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 ShowHeadersServlet
 */
@WebServlet("/ShowHeadersServlet")
public class ShowHeadersServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ShowHeadersServlet() {
        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.setContentType( "text/html;charset=UTF-8");
		PrintWriter out=response.getWriter();
		out.print( "<html><head>");
		out.print( "<head><title>HTTP Header</ head></title>");out.print( "<body>");
		out.print( "<table border=\"1\">");
		out.print( "<tr><td>Header名称</td>");
		out.print( "<td>Header值</td></tr>");
		Enumeration <String> headers=request.getHeaderNames();
		while(headers.hasMoreElements()){
			String paramName = ( String)headers.nextElement();
			out.print( "<tr><td>" + paramName+"&nbsp&nbsp"+ "</td>\n");
			String paramValue = request.getHeader(paramName);
			out.println("<td> " + paramValue +"&nbsp&nbsp"+ "</td></tr>\n");
		}
		out.print( "</table></body></ html>");	}

	/**
	 * @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);
	}

}

【步骤2】在浏览器地址栏中输入正确的URL,访问并测试该Servlet。
在这里插入图片描述
3.编写一个名为ExcelServlet的Servlet程序,通过设置响应内容类型和输出流,向客户端浏览器响应一个带数据的Excel电子表格,程序的运行结果要求如下图所示。

package com.demo;

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

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 ExcelServlet
 */
@WebServlet("/ExcelServlet")
public class ExcelServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ExcelServlet() {
        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.setContentType("application/vnd.ms-excel ;charset=utf-8");
        Stu s1=new Stu("201603","YangJie","man",20,"Math");
        Stu s2=new Stu("201602","XiaoHan","woman",19,"Computer");
        PrintWriter wr=response.getWriter();
        wr.println("Sno\t"+"Name\t"+"Age\t"+"Type\t");
        wr.println(s1.getSno()+"\t"+s1.getName()+"\t"+s1.getAge()+"\t"+s1.getType());
        wr.println(s2.getSno()+"\t"+s2.getName()+"\t"+s2.getAge()+"\t"+s2.getType());
	}

	/**
	 * @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);
	}

}

package com.demo;

public class Stu {
	private String sno;
	private String name;
	private String sex;
	private int age;
	private String type;
	
	public String getSno() {
		return sno;
	}
	public void setSno(String sno) {
		this.sno = sno;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	
	public Stu(String sno,String name,String sex,int age,String type) {
		this.sno = sno;
		this.name = name;
		this.sex = sex;
		this.age = age;
		this.type = type;
	}
}

在这里插入图片描述
4. 使用ServletConfig检索Servlet的初始化参数。
【步骤1】编写ConfigDemoServlet程序,通过注释为其添加初始化参数email、telephone,在Servlet中读取该servlet的名称和初始化参数email、telephone,并将这两个参数的值在响应的HTML文本中输出。

package com.demo;

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

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ConfigDemoServlet
 */
@WebServlet(
		urlPatterns = { "/config-demo" }, 
		initParams = { 
				@WebInitParam(name = "email", value = "hacker@163.com"), 
				@WebInitParam(name = "telephone", value = "8899123")
		})
public class ConfigDemoServlet extends HttpServlet {
	String servletName = null;
	ServletConfig config = null;
	String email = null;
	String telephone = null;
	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		this.config = config;
		servletName = config.getServletName();
		email = config.getInitParameter("email");
		telephone = config.getInitParameter("telephone");
	}
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		out.println("<head><title>配置对象</title></head>");
		out.println("Servlet名称:"+servletName+"<br>");
		out.println("Email地址:"+email+"<br>");	
		out.println("电话:"+telephone);
		out.println("</body></html>");
	}

}

【步骤3】在浏览器的地址栏中输入下面URL请求该Servlet:
http://localhost:8080/ exp01/configDemo.do
在这里插入图片描述
5. 为ServletContext配置初始化参数并进行访问。
在web.xml文件中为当前web应用添加两个名为admin-email和admin-tel的ServletContext初始化参数,在ConfigDemoServlet中获取这两个参数的参数值,使用ServletContext对象将admin-email和admin-tel的参数值写入日志文件中,并查看日志文件。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>chapter02</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>
  <context-param>
  <param-name>admin-email</param-name>
  <param-value>webmaster@163.com</param-value>
  </context-param>
  <context-param>
   <param-name>admin-tel</param-name>
  <param-value>100000</param-value>
  </context-param>
</web-app>
package com.demo;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class ServletContextDemo
 */
@WebServlet(
		urlPatterns = { "/ServletContext" }
		)
public class ServletContext extends HttpServlet {
	private static final long serialVersionUID = 1L;
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		PrintWriter out=response.getWriter();
		javax.servlet.ServletContext context=getServletConfig().getServletContext();
		String admin_Email=(String)context.getInitParameter("admin-email");
		String admin_tel=(String)context.getInitParameter("admin-tel");
		context.log(admin_tel);
		context.log(admin_Email);
	}

}

在这里插入图片描述
6. 编写一个名为CountServlet的Servlet程序:
1)使用成员变量保存该Servlet被访问的次数,试打开多个浏览器窗口模拟多个用户同时访问该Servlet,观察该Servlet被访问次数的变化。
2)修改该Servlet,通过ServletContext属性保存被多用户同时访问的次数,体会用ServletContext在应用作用域共享数据的方法。

package com.demo;

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

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 CountServlet
 */
@WebServlet("/CountServlet")
public class CountServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CountServlet() {
        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
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		javax.servlet.ServletContext servletContext = this.getServletContext();
		Integer count = (Integer) servletContext.getAttribute("count");
		if( servletContext.getAttribute("count") == null) {
			count = 1;
			servletContext.setAttribute("count", count);
		}else {
			servletContext.setAttribute("count", count+1);
		}
		PrintWriter out =response.getWriter();
		out.print("<!DOCTYPE html>");
		out.print("<html>");		
		out.print( "<head>");		 
		out.print("<meta charset=\"UTF-8\">");		
		out.print("<title>登陆网页次数统计</title>");		  
		out.print("</head>");		
		out.print("<body>");		 
		out.print("<h1>");
		out.print("您是第 "+ servletContext.getAttribute("count")+"位访客");
		out.print("<h1>");
		out.print("</body>");
		out.print("</html>");		 
	}

	/**
	 * @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);
	}

}

在这里插入图片描述
在这里插入图片描述

三、思考题

  1. 请求中的参数如果是中文,如何正常显示中文参数值?
    答:response.setContentType(“text/html;charset=UTF-8”);
  2. 使用RequestDispatcher的forward()方法转发请求和使用HttpServletResponse的sendRedirect()方法重定向请求有什么区别?
    答:前者URL不改变,后者URL改变。前者运行在服务器端,后者运行在客户端.
  3. 什么是Web归档文件?如何为一个Web应用创建一个WAR文件?如何发布WAR文件? 答:即应用程序打包文件,jar -cvf blog.war *
  4. 如何编写线程安全的Servlet?
    答:使用ServletContext中属性参数
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐