1.Servlet概念
a.Sun公司提供的一个动态资源开发的技术。Servlet本质就是一个Java文件,需要先编译后执行,并且需要存储在Servlet容器中
b.Servlet容器:存储并运行Servlet的环境称之为Servlet容器,classes编译文件、tomcat
c.web容器:存储并运行web资源的环境称之为web容器。tomcat
在myeclipse中开发servlet
1.安装myeclipse
2.创建web工程–作为web应用使用
3.查看web工程目录结构
4.创建servlet
5.查看源代码
通过查看源代码,确定创建的类实现了servlet接口,所以为一个servlet文件
在类中实现了doGet和doPost方法,查看源码后确定,执行这两个方法就是执行service方法。get提交调用doGet,post提交调用doPost
6.myeclipse添加tomcat
7.通过myeclipse的tomcat发布web应用
Servlet继承机构和运行过程
1.Servlet继承结构
更改应用的虚拟路径
获取请求资源案例:
package cn.tedu.request;
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 RequestDemo1 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
StringBuffer url = request.getRequestURL();
System.out.println("url:"+url.toString());
String uri = request.getRequestURI();
System.out.println("uri"+uri);
String qs = request.getQueryString();
System.out.println("qs:"+qs);
String ip = request.getRemoteAddr();
System.out.println("ip:"+ip);
String method = request.getMethod();
System.out.println("method:"+method);
String cp = request.getContextPath();
System.out.println("path:"+cp);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
获取请求头的案例:
package cn.tedu.request;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
//请求头
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo2 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//根据请求头的名称获取对应值的操作
String header = request.getHeader("Host");
System.out.println("header:"+header);
//根据请求头的名称获取对应值的操作---多个相同名称的请求头
Enumeration<String> headers = request.getHeaders("host");
while (headers.hasMoreElements()) {
String name = headers.nextElement();
System.out.println("name:"+name);
}
//获取全部请求头的名称
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String head = (String) headerNames.nextElement();
String value=request.getHeader(head);
System.out.println("headername:"+head+">>value:"+value);
}
//getIntHeader(name)----int
//getDateHeader(name)----long (日期对应的毫秒)
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
浏览器与服务器之间字符集的编码与解码:
案例:
<!DOCTYPE html>
<html>
<head>
<title>paraml.html</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<h1>GET提交</h1>
<form action="/day09-reqres/servlet/RequestDemo3" method="GET">
用户名:<input type="text" name="username"/>
昵称:<input type="text" name="nickname"/>
<input type="submit" value="提交">
</form>
<h1>POST提交</h1>
<form action="/day09-reqres/servlet/RequestDemo3" method="POST">
用户名:<input type="text" name="username"/>
昵称:<input type="text" name="nickname"/>
爱好:<input type="checkbox" name="like" value="lanqiu"/>篮球
<input type="checkbox" name="like" value="zuqiu"/>足球
<input type="checkbox" name="like" value="taiqiu"/>台球
<input type="submit" value="提交">
</form>
</body>
</html>
package cn.tedu.request;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo3 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//通知服务器用utf-8接受数据(get请求无效)post可以
//request.setCharacterEncoding("utf-8");
String username=request.getParameter("username");
byte[] bytes=username.getBytes("iso8859-1");
username=new String(bytes,"utf-8");
System.out.println("uername:"+username);
//getParameterValues 根据请求参数名获取一组请求参数值
String[] likes = request.getParameterValues("like");
System.out.println("likes:"+Arrays.toString(likes));
//getParameterMap 将所有的请求参数获取到map中
Map<String,String[]> map=request.getParameterMap();
//getparameterNames 获取全部请求参数的名称
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
String[] values=request.getParameterValues(name);
System.out.println("name:"+name+">>value:"+Arrays.toString(values));
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
请求转发:
案例:
package cn.tedu.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo4 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//只能在web应用内部跳转
//创建一个调度器
RequestDispatcher rd = request.getRequestDispatcher("/servlet/RequestDemo5");
//利用调度器实现请求转发
System.out.println("RequestDemo4 start...");
rd.forward(request, response);
System.out.println("RequestDemo4 end...");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package cn.tedu.request;
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;
//与Demo4一组--请求转发
public class RequestDemo5 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//向页面展示数据
response.getWriter().write("这是一个 RequestDemo5!");
//在同一个servlet中,不可以多次请求转发,会造成异常。(转发会有响应,转发前不能有响应)
System.out.println("RequestDemo5 start...");
request.getRequestDispatcher("/servlet/RequestDemo6").forward(request, response);
//request.getRequestDispatcher("/servlet/RequestDemo7").forward(request, response);
System.out.println("RequestDemo5 end...");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package cn.tedu.request;
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 RequestDemo6 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//在请求转发之前,如果response缓冲区中有数据,
//则在请求转发的时候会将这些数据清空
response.getWriter().write("这是一个RequestDemo6!");
//冲刷缓冲区,会造成一次响应,使得请求转发无法继续执行
//response.flushBuffer();
//由demo4,跳转到demo5,在跳转到demo6,最后跳转到demo7,形成一个请求链
//这种转发称之为多重转发
System.out.println("RequestDemo6 start...");
request.getRequestDispatcher("/servlet/RequestDemo7").forward(request, response);
System.out.println("RequestDemo6 end...");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package cn.tedu.request;
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 RequestDemo7 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
response.getWriter().write("这是一个RequestDemo7!");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
请求包含:
可以将两个servlet结果合并为一个结果输出
案例:
package cn.tedu.request;
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 RequestDemo8 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//请求包含
response.getWriter().write("这是一个RequestDemo8");
request.getRequestDispatcher("/servlet/RequestDemo9").include(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package cn.tedu.request;
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;
//与RequestDemo8一组,请求包含
public class RequestDemo9 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
response.getWriter().write("这是一个RequestDemo9");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
request功能
c.练习:在servlet中设置域属性,在index.jsp页面获取域属性
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<h3>在index.jsp中获取域属性</h3>
姓名:<%=request.getAttribute("name") %>
年龄:<%=request.getAttribute("age") %>
性别:<%=request.getAttribute("gender") %>
妻子:<%=request.getAttribute("wife") %>
<br>
</body>
</html>
package cn.tedu.request;
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;
//request作为域对象使用
public class RequestDemo10 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//在servlet中设置域属性
//在index.jsp中获取域属性
request.setAttribute("name", "曹阳");
request.setAttribute("age", 18);
request.setAttribute("gender", "女");
request.setAttribute("wife", "丽丽");
//为了能够让当前servlet和index.jsp页面共享一个范围,需要实现请求转发
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
d.生命周期:
当请求链开始的时候,request对象创建;当请求链结束的时候request对象销毁
e.作用范围:
整个请求链
f.主要功能:
在整个请求链共享数据
response
案例:
package cn.tedu.response;
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 ResponseDemo1 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*//通知浏览器使用utf-8字符集
response.setHeader("Content-Type", "text/html;charset=utf-8");
//字节流
response.getOutputStream().write("中国".getBytes("utf-8"));*/
//字符流
//通知服务器发送数据时的字符集
//response.setCharacterEncoding("utf-8");
//通知浏览器接受数据时的字符集(不管是字符还是字节只通知浏览器即可)
response.setContentType("text/html;charset=utf-8");
//response.setHeader("Content-Type", "text/html;charset=utf-8");
response.getWriter().write("中国");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
请求重定向的特点:
两次请求 两次相应
两个请求对象 两个响应对象
服务器之间的资源跳转方式
浏览器地址栏会发生改变
案例:
package cn.tedu.response;
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 ResponseDemo2 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//实现原理:302+location
response.setStatus(302);
//response.setHeader("location", "/day09-reqres/servlet/RequestDemo9");
//response.setHeader("location", "http://www.tmooc.cn");
response.sendRedirect("http://www.youkuaiyun.com");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
定时刷新:
概念:定时刷新时一种资源跳转方式,可以在服务器之间进行跳转
实现原理:设置refresh响应头
代码实现:
package cn.tedu.response;
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 ResponseDemo3 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//处理响应的乱码
response.setContentType("text/html;charset=utf-8");
//设置响应的内容
response.getWriter().write("<h3 align='center'><font color='red'>恭喜注册成功,三秒之后跳转!</font></h3>");
//定时刷新实现原理:设置refresh响应头
response.setHeader("refresh", "3;url=http://www.tmooc.cn");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
定时刷新特点:
两个请求 两个响应
两个请求对象 两个响应对象
服务器之间的资源跳转方式
浏览器地址会发生改变
控制浏览器缓存
案例:
需要设置浏览器(IE)的Internet设置
浏览历史记录—>设置
package cn.tedu.response;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//控制浏览器缓存
public class ResponseDemo4 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//乱码处理
response.setContentType("text/html;charset=utf-8");
/*//控制浏览器不使用缓存
//表示1970年1月1日0点到现在的毫秒值再减去一毫秒。此事件无效,所以会加载最新资源
response.setDateHeader("Expires", -1);
//不使用缓存
response.setHeader("Cache-control", "no-cache");
//不使用缓存
response.setHeader("pragma", "no-cache");
Date date=new Date();
String time=date.toLocaleString();
response.getWriter().write("time"+time);*/
//控制浏览器使用缓存--不更新
response.setDateHeader("Expires", System.currentTimeMillis()+1000*60*60*24);
//response.setHeader("Cache-control", "max-age=5");//5秒
Date date=new Date();
String time=date.toLocaleString();
response.getWriter().write(time);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}