09__Request&Response

Request&Response

request:代表请求,在浏览器的地址栏输入地址,点击回车,这个过程称为一次请求
response:代表响应,服务器端根据的请求,返回数据到浏览器中进行显示,这个过程称为一次响应

1. response的简介

1.1 HttpServletResponse,是一个接口,父接口是ServletResponse,代表响应对象。
1.2 http的响应包含三部分组成
第一部分:响应行
(1)状态码
(2)主要的方法
= setStatus(int sc) :设置状态码的方法
* response.setStatus(302)
第二部分:响应头
(1)是key-value结构,一个key可以有一个value,一个key也可以有多个value
(2)方法
= setHeader(java.lang.String name, java.lang.String value) :设置响应头
* 两个参数:第一个参数是响应名称;第二个参数值
* 针对一个key和一个value情况
* setHeader(“aa”,“11”);
setHeader(“aa”,“22”);
结果:名称 aa ,值 22
= 针对特殊的类型,设置头的方法
= setIntHeader(java.lang.String name, int value) :针对int类型值的方法
= setDateHeader(java.lang.String name, long date) :值long类型,是毫秒数(1970 1 1至今的毫秒数)
= addHeader(java.lang.String name, java.lang.String value) :设置响应头
* 两个参数:第一个参数是响应名称;第二个参数值
* 针对一个key和多个value的情况
* addHeader(“bb”,“55”);
addHeader(“bb”,“66”);
结果:名称 bb ,值 55,66
= 针对特殊的类型,设置头的方法
= addIntHeader(java.lang.String name, int value) :针对int类型值的方法
= addDateHeader(java.lang.String name, long date) :值long类型,是毫秒数
第三部分:响应体
(1)向页面显示的内容
(2)方法
= getWriter():使用字符流向页面输出内容
= getOutputStream():使用字节流向页面输出内容

2. 重定向的案例

2.1 使用重定向实现登录的操作
(1)需求的描述:
在登录页面中,输入用户名和密码,判断输入的用户名和密码是否正确;
如果用户名和密码都正确,登录成功,向页面输出内容;
如果用户名或者密码有一个是错误的,重定向到登录页面。
(2)实现的步骤:
第一步:创建登录页面,写表单,在表单里面写两个输入项,一个输入用户名,一个输入密码,提交到一个servlet里面。登录功能需要做个校验,不让账号和密码为空。当我们用submit提交的时候,可以在form标签中添加一个onsubmit事件来做校验。
第二步:创建servlet,在这个servlet里面首先获取到输入的用户名和密码,根据用户名和密码进行判断(用户名如果是admin,密码如果是123456表示正确的)。
如果用户名和密码都正确,登录成功,向页面输出内容;
response.getWriter().write("login success");
否则重定向到登录页面
//设置状态码
response.setStatus(302);
//使用头Location完成重定向
response.setHeader("Location", "/day08-1/login.html");
(3)代码实现
//得到输入的用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//根据用户名和密码判断,(用户名admin、密码123456)
if("admin".equals(username) && "123456".equals(password)) {
//向页面输出内容
response.getWriter().write("login success");
} else { //重定向到登录页面
//设置状态码
response.setStatus(302);
//使用头Location完成重定向
response.setHeader("Location", "/day08-1/login.html");
}
(4)重定向的代码简写的方式
response.sendRedirect(“要重定向到的页面的路径”);
* response.sendRedirect("/day08-1/login.html");

<!DOCTYPE html>
<html>
  <head>
    <title>login.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

  </head>
  
  <body>
   	<h1>登录页面</h1>
   	<form action="/day08-1/login" method="post" onsubmit="return checkUser();">
   		username:<input type="text" name="username" id="usernameid"/>
   		<br/>
   		password:<input type="password" name="password" id="passwordid"/>
   		<br/>
   		<input type="submit" value="登录"/>
   	</form>
  </body>
  <script type="text/javascript">
  		//表单的校验
  		function checkUser() {
  			var username = document.getElementById("usernameid").value;
  			var password = document.getElementById("passwordid").value;
  			if(username == "") {
  				alert("username不能为空");
  				return false;
  			}
  			if(password == "") {
  				alert("password不能为空");
  				return false;
  			}
  			return true;
  		}
  </script>
</html>

package cn.itcast.response;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
	/**
	 * 实现登录的操作
	 * 1.得到通过表单提交的用户名和密码
	 * 	request.getParameter("name的值");
	 * 2.根据获取的用户名和密码,进行判断(用户名admin、密码123456)
	 * 3.如果用户名和密码都正确,向页面输出 success
	 * 	使用字节流或者字符流向页面输出
	 * 4.如果用户名或者密码有一个是不正确,重定向到登录页面
	 * 	* 使用 302 + 头信息Location实现重定向的操作
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//得到输入的用户名和密码
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		//根据用户名和密码判断,(用户名admin、密码123456)
		if("admin".equals(username) && "123456".equals(password)) {
			//向页面输出内容
			response.getWriter().write("login success");
		} else { //重定向到登录页面
			//设置状态码
			//response.setStatus(302);
			//使用头Location完成重定向
			//response.setHeader("Location", "/day08-1/login.html");
			//简写方式
			response.sendRedirect("/day08-1/login.html");
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

3. 定时跳转的案例

3.1 当注册一个网站,注册完成之后,5秒之后跳转到登录页面
3.2 实现方式
(1)使用头信息Refresh实现
(2)写法: response.setHeader(“Refresh”,“在几秒值后跳转;url=要跳转到页面的路径”);
3.3 创建servlet,在servlet实现,在五秒之后跳转到一个页面
* response.setHeader("Refresh", "5;url=/day08-1/login.html");

package cn.itcast.response;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RefreshServlet extends HttpServlet {
	/**
	 * 定时跳转
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//使用头信息Refresh实现
		response.setHeader("Refresh", "5;url=/day08-1/login.html");
		//提示
		//为了解决输入乱码的问题
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("将在5秒之后跳转到登录页面");
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

3.4 倒计时的效果
(1)直接在html页面中实现操作
在html中使用meta标签实现页面的定时跳转
* <meta http-equiv="Refresh" content="3;url=/day08-1/login.html">
(2)倒计时
//每一秒向span标签里面写内容
//bom里面widow对象里面 setInterval方法
var m = 5;
function loadTime() {
//得到span标签
var span1 = document.getElementById("spanid");
//向span里面写内容
span1.innerHTML = m;
m--;
}
setInterval("loadTime();",1000);

<!DOCTYPE html>
<html>
  <head>
    <title>refresh.html</title>
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <!-- response.setContentType("text/html;charset=utf-8"); -->
    <!-- response.setHeader("Refresh", "5;url=/day08-1/login.html"); -->
    <meta http-equiv="Refresh" content="5;url=/day08-1/login.html">

  </head>
  
  <body>
    <h1>页面将在<span id="spanid"> </span>秒之后跳转</h1>
  </body>
  <script type="text/javascript">
  	//每一秒向span标签里面写内容
  	//bom里面widow对象里面 setInterval方法
  	var m = 5;
  	function loadTime() {
  		//得到span标签
  		var span1 = document.getElementById("spanid");
  		//向span里面写内容
  		span1.innerHTML = m;
  		m--;
  	}
  	setInterval("loadTime();",1000);
  </script>
</html>

4. 设置响应体(向页面输出内容)

4.1 使用字节流向页面输出内容
(1)getOutputStream()
(2)代码
response.getOutputStream().write("输出的内容".getBytes());
(3)如果向页面输出中文,根据不同的浏览器的编码设置会产生乱码问题
// 解决方法:
/*
* 1. 设置浏览器的编码
* 2. 设置字节数组的编码
* 让浏览器的编码和字节数组的编码一致
* */
//设置浏览器的编码 使用头信息 Content-Type
response.setHeader("Content-Type", "text/html;charset=utf-8");
//设置字节数组的编码
response.getOutputStream().write("字节流中文".getBytes("utf-8"));

package cn.itcast.response;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo1 extends HttpServlet {
	/**
	 * 使用字节流向页面输出内容
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//response.getOutputStream().write("hello".getBytes());
		//向页面输出中文,是否会中文乱码?
		//不一定.和浏览器的编码有关系. 浏览器->右键->编码(默认简体中文GB2312则显示OK)
		// 解决方法:
		/*
		 * 1. 设置浏览器的编码
		 * 2. 设置字节数组的编码
		 * 让浏览器的编码和字节数组的编码一致
		 * */
		//设置浏览器的编码 使用头信息 Content-Type
		response.setHeader("Content-Type", "text/html;charset=utf-8");
		//设置字节数组的编码
		response.getOutputStream().write("字节流中文".getBytes("utf-8"));
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

4.2 使用字符流向页面输出内容
(1)getWriter()
(2)代码
response.getWriter().write("response");
(3)如果使用字符流向页面输出中文,一定会有乱码
//使用字符流向页面输出中文,是否会产生中文乱码?
//一定会
/*
* 使用字符流向页面输出内容;首先会把内容放到response缓冲区里面,response缓冲区默认的编码是 iso8859-1
* 这个编码不支持中文,一定会有乱码
* 解决方法:
* 1. 设置response缓冲区的编码
* 2. 设置浏览器的编码
* response缓冲区的编码和浏览器的编码一致
* */
//设置response缓冲区的编码
response.setCharacterEncoding("utf-8");
//设置浏览器的编码
response.setHeader("Content-Type", "text/html;charset=utf-8");
response.getWriter().write("字符流中文");

package cn.itcast.response;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo2 extends HttpServlet {
	/**
	 * 使用字符流向页面输出内容
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//response.getWriter().write("response");
		//使用字符流向页面输出中文,是否会产生中文乱码?
		//一定会
		/*
		 * 使用字符流向页面输出内容;首先会把内容放到response缓冲区里面,response缓冲区默认的编码是 iso8859-1
		 * 这个编码不支持中文,一定会有乱码
		 * 
		 * 解决方法:
		 * 1. 设置response缓冲区的编码
		 * 2. 设置浏览器的编码
		 * response缓冲区的编码和浏览器的编码一致
		 * */
		//设置response缓冲区的编码
		response.setCharacterEncoding("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);
	}
}

5. 使用response的流的注意事项

5.1 使用字符流向页面输出中文乱码问题解决,简写方式
response.setContentType("text/html;charset=utf-8");

5.2 字节流和字符流是互斥的

5.3 使用字符流不能直接向页面输出数字
//根据数字到码表中查询数字对应的字符,把字符输出
response.setCharacterEncoding("utf-8");
response.getWriter().write(111);

package cn.itcast.response;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo1 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//使用字符流向页面输出数字
		//根据数字到码表中查询数字对应的字符,把字符输出
		response.setCharacterEncoding("utf-8");
		//这样带引号的输出其实是输出字符串
		response.getWriter().write("111");
	}

	//字节流和字符流互斥
	private void test2(HttpServletResponse response) throws IOException {
		//使用字符流输出
		response.getWriter().write("aaa");
		//字节流和字符流是互斥的
		response.getOutputStream().write("hello".getBytes());
	}

	//使用字符流向页面输出中文乱码解决,简写方式
	private void test1(HttpServletResponse response) throws IOException {
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("字符流中文");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

6. 验证码的案例

6.1 什么验证码:防止恶意注册
6.2 实现验证码的步骤(画图分析)
在这里插入图片描述
第一步:生成图片
第二步:生成随机的数字和字母
第三步:把数字和字母画到图片上
第四步:把图片显示到页面上
6.3 代码实现验证码

package cn.itcast.response;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CodeServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//生成图片
		int width = 150;
		int height = 60;
		BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
		//得到画笔
		Graphics2D g2d = (Graphics2D) bufferedImage.getGraphics();
		//生成四个随机的数字和字母
		String words = "asdfghjklqwertyuiopzxcvbASDFGHJKLQWERTYUIOPZXCVB1234567890";
		//创建Random对象
		Random r = new Random();
		int x = 25;
		int y = 25;
		//设置颜色
		g2d.setColor(Color.YELLOW);
		//设置字体的样式
		g2d.setFont(new Font("宋体",Font.BOLD,25));
		//rotate(double theta, double x, double y) 
		//弧度=角度*3.14/180
		for(int i=1;i<=4;i++) {
			int idx = r.nextInt(words.length());			
			//根据位置得到具体的字符
			char ch = words.charAt(idx);
			
			//旋转+- 30度
			int jiaodu = r.nextInt(60)-30;
			double hudu = jiaodu*Math.PI/180;
			//旋转的效果
			g2d.rotate(hudu, x, y);
			//把字符画到图片上
			g2d.drawString(ch+"", x, y);
			
			x += 25;
			
			//转回去
			g2d.rotate(-hudu, x, y);
		}
		
		//生成三条干扰线
		g2d.setColor(Color.green);
		int x1,y1,x2,y2;
		for(int m=1;m<=3;m++) {
			x1 = r.nextInt(width);
			y1 = r.nextInt(height);

			x2 = r.nextInt(width);
			y2 = r.nextInt(height);
			g2d.drawLine(x1, y1, x2, y2);
		}
		//把图片显示到页面上
		ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

6.4 显示验证码
(1)把验证码显示到登录的页面中
<img src="验证码的servlet的路径"/>
(2)实现看不清换一张
//实现看不清换一张
function loadCode() {
//得到img标签
var img1 = document.getElementById("img1");
img1.src = "/day08-5/code?"+new Date().getTime();
}

<!DOCTYPE html>
<html>
  <head>
    <title>login.html</title>
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
  </head>
  
  <body>
    <h1>登录页面</h1>
   	<form method="post">
   		username:<input type="text" name="username" id="usernameid"/>
   		<br/>
   		password:<input type="password" name="password" id="passwordid"/>
   		<br/>
   		code:<input type="text" name="code"/>
   		<a href="#" onclick="loadCode();"><img id="img1" src="/day08-5/code"/></a>
   		<br/>
   		<input type="submit" value="登录"/>
   	</form>
  </body>
  <script type="text/javascript">
  	//实现看不清换一张
  	function loadCode() {
  		//得到img标签
  		var img1 = document.getElementById("img1");
  		img1.src = "/day08-5/code?"+new Date().getTime();
  	}
  </script>
</html>

7. 文件下载的案例

7.1 文件下载的基本实现的步骤
(0)设置头信息 Content-Disposition,无论是什么格式的文件都以下载方式打开
(1)在服务器上面有一个可以下载的文件
(2)从服务器上拿到这个文件(使用文件输入流得到文件)
(3)使用输出流把文件写到浏览器
7.2 代码实现文件的下载
//得到要下载文件的路径
String path = getServletContext().getRealPath("/down/a.zip");
//得到文件的名称
//得到最后一个\位置,根据位置进行截取
int lens = path.lastIndexOf("\\");
String filename = path.substring(lens+1);
//设置头信息
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//得到文件的输入流
InputStream in = new FileInputStream(path);
//使用输出流操作
OutputStream out = response.getOutputStream();
//流对接
int len = 0;
byte[] b = new byte[1024];
while((len=in.read(b))!=-1) {
out.write(b, 0, len);
}
//关闭流
in.close();

package cn.itcast.response;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownServlet extends HttpServlet {

	/**
	 * 实现文件的下载
	 * 1、得到要下载文件的输入流
	 *  * 得到要下载文件的完全路径 (使用servletContext里面getRealPath方法)
	 * 2、使用输出流把文件写到浏览器(response方法getOutputStream())
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//得到要下载文件的路径
		String path = getServletContext().getRealPath("/down/a.zip");
		//System.out.println(path); 
		//c:\Users\asus\Desktop\javaweb\day06\apache-tomcat-7.0.53\webapps\day08-6\down\a.png
		//得到文件的名称
		//得到最后一个\位置,根据位置进行截取
		int lens = path.lastIndexOf("\\");
		String filename = path.substring(lens+1);
		//设置头信息
		response.setHeader("Content-Disposition", "attachment;filename="+filename);
		//得到文件的输入流
		InputStream in = new FileInputStream(path);
		//使用输出流操作
		OutputStream out = response.getOutputStream();
		//流对接
		int len = 0;
		byte[] b = new byte[1024];
		while((len=in.read(b))!=-1) {
			out.write(b, 0, len);
		}
		//关闭流
		in.close();
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

8. request对象

8.1 代表请求的对象,HttpServletRequest接口,父接口是ServletRequest
8.2 获取请求行的信息
(1)getMethod() :得到http请求方式
(2)getRequestURI() :得到请求地址(不包含ip+端口号)
(3)getProtocol() :得到http的版本

// getMethod() => method:GET
String method = request.getMethod();
System.out.println("method: "+method);
		
//getRequestURI() => method:/day08-7/demo1
String uri = request.getRequestURI();
System.out.println("requesturi: "+uri);
		
//getProtocol() => method:HTTP/1.1
String protocol = request.getProtocol();
System.out.println("protocol: "+protocol);

8.3 获取请求头的信息
(1)getHeader(java.lang.String name) :根据名称得到请求头的值
= 头信息 User-Agent:获取当前请求的浏览器的类型
= String agent = request.getHeader(“User-Agent”);

String agent = request.getHeader("User-Agent");
System.out.println(agent);

8.4 获取客户机的信息
(1)getContextPath() :请求项目的名称
(2)getRequestURL() :客户端发送的请求的路径
(3)getRemoteAddr() :获取当前客户端的ip地址

//getContextPath() => /day08-7
String path = request.getContextPath();
System.out.println(path);
		
//getRequestURL() => http://127.0.0.1/day08-7/demo3
StringBuffer url = request.getRequestURL();
System.out.println(url.toString());
		
//getRemoteAddr() => 127.0.0.1
String ip = request.getRemoteAddr();
System.out.println(ip);

8.5 获取表单提交的数据
(1)String getParameter(java.lang.String name) :参数是表单输入项name属性的值,根据名称得到输入的值
= 代码
String username = request.getParameter("username");
String password = request.getParameter("password");
(2)String[] getParameterValues(java.lang.String name) :参数是表单输入项name的值,针对复选框的情况
= 代码
String[] loves = request.getParameterValues("love");
(3)Map<java.lang.String,java.lang.String[]> getParameterMap() :
= 返回的是map集合,key是表单输入项name属性的值,value是输入的值
= 代码
Map<String,String[]> map = request.getParameterMap();
//得到map集合里面的key和value,遍历map
Set<String> keys = map.keySet();
//遍历set集合
for (String key : keys) {
//根据key得到value
String[] values = map.get(key);
//key和对应的value输出(表单输入项name的属性值和输入的值)
System.out.println(key+" :: "+Arrays.toString(values));
}
(4)Enumeration<java.lang.String> getParameterNames()

<!DOCTYPE html>
<html>
  <head>
    <title>form01.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    <form action="/day08-8/requestDemo1" method="post">
    	username:<input type="text" name="username"/>
    	<br/>
    	password:<input type="password" name="password"/>
    	<br/>
    	love: <input type="checkbox" name="love" value="lanqiu"/>篮球
    	<input type="checkbox" name="love" value="pingpang"/>乒乓球
    	<input type="checkbox" name="love" value="yumaoqiu"/>羽毛球
    	<br/>
    	<input type="submit" value="提交"/>
    </form>

    <form action="/day08-8/requestDemo2" method="post">
    	username:<input type="text" name="username"/>
    	<br/>
    	password:<input type="password" name="password"/>
    	<br/>
    	love: <input type="checkbox" name="love" value="lanqiu"/>篮球
    	<input type="checkbox" name="love" value="pingpang"/>乒乓球
    	<input type="checkbox" name="love" value="yumaoqiu"/>羽毛球
    	<br/>
    	<input type="submit" value="提交"/>
    </form>
  </body>
</html>

package cn.itcast.request;
import java.io.IOException;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 使用request里面的方法获取表单提交的数据
 */
public class RequestDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		test2(request);
	}
	
	//getParameterValues(java.lang.String name)
	private void test2(HttpServletRequest request) {
		//得到复选框的值
		String[] loves = request.getParameterValues("love");
		System.out.println(Arrays.toString(loves));
	}

	//getParameter(java.lang.String name)
	private void test1(HttpServletRequest request) {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println(username);
		System.out.println(password);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}


package cn.itcast.request;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo2 extends HttpServlet {
	/**
	 * Map<java.lang.String,java.lang.String[]> getParameterMap()
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Map<String,String[]> map = request.getParameterMap();
		//得到map集合里面的key和value,遍历map
		Set<String> keys = map.keySet();
		//遍历set集合
		for (String key : keys) {
			//根据key得到value
			String[] values = map.get(key);
			//key和对应的value输出(表单输入项name的属性值和输入的值)
			System.out.println(key+" :: "+Arrays.toString(values));
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

8.6 获取表单提交的中文数据乱码问题的解决
(1)post提交方式解决方法
= 使用post提交数据时候,会把数据放到request缓冲区里面,
request缓冲区默认的编码 iso8859-1,不支持中文
= 解决方法:
设置request缓冲区的编码
= 代码:
request.setCharacterEncoding("utf-8");
(2)get提交中文乱码解决
= 有三种方式
第一种:修改tomcat的配置文件 => conf/server.xml
== <Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>
第二种:把数据先编码,再进行解码
第三种:使用string构造进行编码
new String("");
= 代码:
username = new String(username.getBytes("iso8859-1"),"utf-8");

<!DOCTYPE html>
<html>
  <head>
    <title>form01.html</title>
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  
  <body>
    <form action="/day08-9/demo1" method="post">
    	username:<input type="text" name="username"/>
    	<br/>
    	password:<input type="password" name="password"/>
    	<br/>
    	<input type="submit" value="post提交"/>
    </form>
    
    <hr/>
   <form action="/day08-9/demo2" method="get">
    	username:<input type="text" name="username"/>
    	<br/>
    	password:<input type="password" name="password"/>
    	<br/>
    	<input type="submit" value="get提交"/>
    </form>
  </body>
</html>


package cn.itcast.request;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo1 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * 使用post提交中文乱码问题的解决
		 * * 会把数据放到request缓冲区里面,request缓冲区默认的编码 iso8859-1,不支持中文
		 * * 解决方法:
		 * 设置request缓冲区的编码
		 * */
		//设置request缓冲区的编码
		request.setCharacterEncoding("utf-8");
		//获取表单输入项的值
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println(username);
		System.out.println(password);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}


package cn.itcast.request;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo2 extends HttpServlet {
	/**
	 * 使用get提交中文数据乱码问题的解决
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String username = request.getParameter("username");
		username = new String(username.getBytes("iso8859-1"),"utf-8");
		String password = request.getParameter("password");
		System.out.println(username);
		System.out.println(password);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

8.7 request是域对象
(1)域对象:在一定的范围内,可以存值和取值
(2)servletContext域对象:范围是整个web项目,存值 setAttribute方法 和取值 getAttribute方法
(3)request也是一个域对象:范围是一次请求,存值和取值
= 向request域里面存值的方法:setAttribute(java.lang.String name, java.lang.Object o)
= 从request域里面取值的方法:getAttribute(java.lang.String name)
(4)request域对象范围是一次请求,经常和转发一起使用
= 格式 request.getRequestDispatcher("转发的路径 不带项目名称").forward(..);
= 代码 request.getRequestDispatcher("/servlet2").forward(request, response);
(5)举例演示request域对象
= 创建servlet1,在servlet1里面向request域里面设置一个值,最后转发到servlet2里面
== //向request域里面设置一个值
request.setAttribute("msg", "itcast100");
//转发到servlet2
request.getRequestDispatcher("/servlet2").forward(request, response);
= 创建servlet2,在servlet2里面获取通过servlet1向request域里面设置的那个值
== //获取通过servlet1向request里面设置的值
response.getWriter().write(""+request.getAttribute("msg"));

package cn.itcast.request;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet1 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//向request域里面设置一个值
		request.setAttribute("msg", "itcast100");
		//转发到servlet2 => 输出 itcast100
		//request.getRequestDispatcher("/servlet2").forward(request, response);
		
		//使用重定向到servlet2 => 输出 null
		response.sendRedirect("/day08-10/servlet2");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}


package cn.itcast.request;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet2 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取通过servlet1向request里面设置的值
		response.getWriter().write(""+request.getAttribute("msg"));
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

8.8 重定向和转发的区别
(1)重定向
= 重定向请求两次,请求的地址带项目名称
= 302+Location实现重定向的操作
= response.sendRedirect(“路径 带项目名称”);
(2)转发
= 转发请求一次,路径不需要带项目名称(在服务器内部进行操作)
= request.getRequestDispatcher(“转发的路径 不带项目名称”).forward(request, response);
(3)重定向:从一个网站到另外的一个网站
转发:请求的过程中需要携带数据操作

9. 转发的案例

9.1 使用request域对象+转发实现登录功能
(1)创建登录页面,在登录页面中写表单,提交到servlet里面
(2)创建servlet,在servlet里面获取表单提交的数据,判断用户名和密码是否正确
(3)如果用户名和密码都正确,表示登录成功,向页面输出内容
(4)如果用户名或者密码错误,表示登录失败,转发到登录页面(同时向页面显示错误信息)
= 转发的代码:request.getRequestDispatcher(“登录的页面 不带项目名称”).forward(request, response);
= 传递数据的页面:首先把显示内容放到request域里面,使用转发到登录页面,在登录页面中使用el表达式获取
request域里面的值
9.2 知识的引入
(1)jsp:sun公司用于动态网站的技术,jsp就是servelt,最终会编译成servlet
(2)el表达式:用于获取域对象里面的值 ${名称}
9.3 代码的实现
1、创建页面,写表单,表单里面写两个输入项,提交到servlet里面
2、创建servlet,在servlet获取表单数据,判断(用户名 admin,密码 123456)是否正确
3、如果都正确,向页面输出success
4、如果有一个错误的,转发到登录页面,同时携带错误信息到页面中显示
9.4 代码
//获取表单提交的用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//判断 用户名 admin,密码 123456
if("admin".equals(username) && "123456".equals(password)) {
//登录成功
response.getWriter().write("login success");
} else { //登录失败
//转发到登录页面,同时向页面传递错误的信息
//把错误信息存到request域里面
request.setAttribute("msg", "用户名或者密码错误");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'login.jsp' starting page</title>
  </head>
  
  <body>
    <h1>登录页面</h1>
    <h2><font color="red">${msg }</font></h2>
    <form action="/day08-11/login" method="post">
    	用户名:<input type="text" name="username"/>
    	<br/>
    	密码:<input type="password" name="password"/>
    	<br/>
    	<input type="submit" value="登录"/>
    </form>
  </body>
</html>


package cn.itcast.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
	/**
	 * 实现登录的操作
	1、创建servlet,在servlet获取表单数据,判断(用户名 admin,密码 123456)是否正确
	2、如果都正确,向页面输出success
	3、如果有一个错误的,转发到登录页面,同时携带错误信息到页面中显示
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取表单提交的用户名和密码
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		//判断 用户名 admin,密码 123456
		if("admin".equals(username) && "123456".equals(password)) {
			//登录成功
			response.getWriter().write("login success");
		} else { //登录失败
			//转发到登录页面,同时向页面传递错误的信息
			//把错误信息存到request域里面
			request.setAttribute("msg", "用户名或者密码错误");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左绍骏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值