web day08(servlet、request、response)

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);
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值