一、环境
- Eclipse Java EE IDE for Web Developers.
Version: Neon.1a Release (4.6.1)
- Apache Tomcat version: 8.0.39
二、总结知识点
2.1、认识Servlet API:
Servlet API 由两个软件包组成:Javax.servlet 包和 Javax.servlet.http 包。其中 Javax.servlet 包主要存放与 http 协议无关的一般性的 servlet 类, Javax.servlet.http 包主要存放与 http 协议相关的功能的类。(两个软件包都位于Tomcat的 servlet-api.jar 中)
2.2、本次主要说明的东西如下:
- Javax.servlet.http包中的接口:
- HttpServletRequest接口:提供http请求信息。
- HttpServletResponse接口:提供http响应。
- Javax.servlet包中的接口:
- ServletConfig接口:在初始化的过程中由Servlet容器使用。
- ServletContext接口:定义Servlet用于获取来自其容器的信息的方法。
- ServletRequest接口:向服务器提交请求。
- ServletResponse接口:响应客户端请求。
- Javax.servlet包中的类:
- ServletInputStream类:用于从客户端读取二进制数据。
- ServletOutputStream类:用于将二进制数据发送到客户端。
- ServletException类:用于异常处理的类。
- UnavailableException类:当servlet或filter不能用时,处理异常的类。
2.3、HttpServletRequest接口
HttpServletRequest接口对应客户端http的请求。当客户端通过http访问服务器时,http请求中的所有信息都封装在HttpServletRequest对象中,我们可以通过该对象一些方法获取很多信息,其中获取客户机信息,获取请求头信息,获取请求参数等,这主要说明这三种。
2.3.1、获取客户机信息:
- getRequestURL方法返回客户端发出完整请求的URL
- getRequestURI方法返回请求行中的资源名部分
- getQueryString方法返回请求行中的参数部分
- getRemoteAddr方法返回发出请求的客户机的IP地址
- getMethod得到客户机请求方式
- getContextPath获得工程虚拟目录名称
部分代码如下所示:
public class RequestServletDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(request.getRequestURI()); System.out.println(request.getRequestURL()); System.out.println(request.getQueryString()); System.out.println("您的ip是:" + request.getRemoteAddr()); System.out.println("您的请求方式是: " + request.getMethod()); System.out.println("工程虚拟目录:" + request.getContextPath()); System.out.println("当前资源:" + request.getServletPath()); System.out.println("uri is:"+request.getRequestURI()); System.out.println("当前资源: "+ request.getRequestURI().substring(request.getContextPath().length())); } }
|
2.3.2、获取请求头信息:
- getHeader(name)—String
- getHeaders(String name)方法—Enumeration
- getHeaderNames方法—Enumeration
部分代码如下:
public class RequestServletDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Enumeration<String> names = request.getHeaderNames(); while (names.hasMoreElements()) { String name = names.nextElement(); System.out.println(name + ":" + request.getHeader(name)); } System.out.println("--------------------------------------"); System.out.println(request.getHeader("User-Agent")); }
|
2.3.3、获取请求参数:
- getParameter(name)—String 通过name获得值
- getParameterValues—String[]通过name获得多值checkbox
- getParameterNames—Enumeration获得所有name
- getParameterMap—Map<String, String[]> key :name value:多值
部分代码如下:
public class RequestServletDemo3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); String password = request.getParameter("password"); System.out.println("name=" + name); System.out.println("password=" + password); if (name == null || name.trim().length() == 0) { request.getRequestDispatcher("/request/request3.html").forward( request, response); return; } System.out.println(request.getParameter("hobby")); String[] arr = request.getParameterValues("hobby"); System.out.println(Arrays.toString(arr));
System.out.println("---------------------------------------");
Enumeration<String> names = request.getParameterNames(); while (names.hasMoreElements()) { String parameterName = names.nextElement(); String[] parameterValues = request.getParameterValues(parameterName); System.out.println(parameterName + ":"+ Arrays.toString(parameterValues)); }
Map<String, String[]> map = request.getParameterMap(); System.out.println("getParameterMap keySet----------------------"); Set<String> keySet = map.keySet(); for (String key : keySet) { String[] values = map.get(key); System.out.println(key + ": " + Arrays.toString(values)); } System.out.println("getParameterMap entrySet----------------------"); Set<Entry<String, String[]>> entrySet = map.entrySet(); for (Entry<String, String[]> entry : entrySet) { System.out.println(entry.getKey() + ": "+ Arrays.toString(entry.getValue())); } } }
|
2.4、HttpServletResponse接口
HttpServletResponse对象提供服务器对客户端的http响应,它封装了向客户端提供数据、发送响应头、发送相应状态码等方法,这里主要说明指定状态码&头信息,状态码和头信息应用以及它生成响应等操作。
2.4.1、指定状态码&头信息以及头信息应用:
部分代码如下:
public class ResponseServletDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setStatus(HttpServletResponse.SC_FOUND); response.sendRedirect("/lesson9_jsp/index.jsp"); response.setHeader("refresh", "3;url=/lesson9_jsp/index.jsp"); response.setContentType("text/html;charset=utf-8"); response.getWriter().println("页面将在3秒后 自动跳转index.jsp, 如果没有跳转请点击<a href='/lesson9_jsp/index.jsp'>这里</a>"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", -1); } }
|
2.4.2、response生成响应:
部分代码如下所示:
public class ResponseServletDemo5 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); response.setCharacterEncoding("UTF-8");
} }
|
2.5、ServletConfig接口与ServletContext接口
2.5.1、关于ServletConfig接口:
在Servlet的配置文件中,可以使用一个或者多个标签为servlet配置一些初始化参数,当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig的对象传递给servlet,进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息,从一个servlet实例化之后,对任何客户端的任何时候访问都有效,一个servlet的ServletConfig不能被其他servlet访问。
部分代码如下所示:
public class ServletConfigDemo1 extends HttpServlet { @Override public void init() throws ServletException { System.out.println("init " + getServletConfig().getInitParameter("uname")); System.out.println("init " + getServletConfig().getInitParameter("password")); } @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet "+ getServletConfig().getInitParameter("uname")); System.out.println("doGet "+ getServletConfig().getInitParameter("password")); } }
|
2.5.2、关于ServletContext接口:
在WEB容器启动的时候,他会为每一个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。ServletCofig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。由于一个WEB应用中的所有Servlet共享同一个ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。ServletContext对恩赫servlet,任何人在任何时间都有效,是真正的全部对象。
部分代码如下:
public class ServletContextCountDemo1 extends HttpServlet { @Override public void init() throws ServletException { ServletContext context = getServletContext(); context.setAttribute("count", 0); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); int count = (Integer) context.getAttribute("count"); count++; context.setAttribute("count", count); System.out.println("网站被访问次数为" + count); response.setContentType("text/html;charset=utf-8"); response.getWriter().println("Demo1网站被访问次数为" + count); } }
|