1,请求转发:一种在服务器内部资源跳转方式
转发的图分析:
(1)步骤
通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher (string path)
使用RequestDispatcher 对象进行转发:forWord(servlet Request ,ServletResponse respponse)
(2)特点:
*浏览器地址栏路径不发生变化
*只能转发当前服务器内部资源中
转发一次请求
package com.Demo1.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
@WebServlet("/RequseDemo7")
public
class RequseDemo7 extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
System .out .println( "Demo7被访问了---" );
request .getRequestDispatcher("/RequseDemo8") .forward( request,response );
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}
2,共享数据
图片分析:
(1)域对象:一个有作用范围的对象,可以在范围内共享数据
(2)request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据。
(3)方法:
*void setAttribute(string name,object obj):存储数据
*object getAttribute(string name):通过键获取值
*void removeAttritubute(string name):通过键移除值对
package com.Demo1.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
@WebServlet("/RequseDemo7")
public
class RequseDemo7 extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
System .out .println( "Demo7被访问了---" );
request .setAttribute( "msg","hello" );
request .getRequestDispatcher("/RequseDemo8") .forward( request,response );
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}
package com.Demo1.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
@WebServlet("/RequseDemo8")
public
class RequseDemo8 extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
System.out .println("Demo8被访问了---");
Object msg=request.getAttribute( "msg" );
System .out .println(msg);
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}
3,获取servletContext
ServletContext getServletContext()
package com.Demo1.Servlet;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/RequseDemo9")
public
class RequseDemo9 extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
ServletContext servletContext=request .getServletContext();
System.out .println(servletContext) ;
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}
获取结果:org.apache.catalina.core.ApplicationContextFacade@60d617d8
3,HTTP协议:响应消息
(1)请求消息:客户端发送给服务器端的数据
数据格式*请求行
*请求头
*请求空行
*请求体
(2)响应消息:服务器端发送给客户端的数据
数据格式:响应行
?组成:协议/版本 响应状态码 状态码描述
?响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
状态码都是三位数字。
分类
1:1XX:服务器就收客户端消息,但是没有接收完成,等待一段时间 后发生1xx多状态码。
2:2xx:成功。代表:200
3:3XX:重定向。代表:302(重定向),304(访问缓存)
4:4XX:客户端错误
代表:404(请求路径没有对应的资源)
405(请求方式没有对应的doxx方法
5:5XX:服务器错误。代表:500(服务器内部出现异常)
*
响应头
1,格式:头名称:值
2,常见的响应头:
1,content-Type:服务器告诉客户端本次响应体的数据格式以及编码格式。
2,content-disposition:服务器告诉客户端以什么格式打开响应体数据。
*值
in-line:默认值,在当前页面内打开
sttachment;filename=xxx:以附件形式打开响应体。文件下载。
*响应空行
*响应体:传输的数据
4,Response对象
功能:设置响应消息
设置响应行
1,格式:HTTP/1.1 200 ok
2,设置状态码:setstatus(int sc)
设置响应头:
setHeader(string name ,string value)
设置响应体:
使用步骤:
1:获取输出流
*字符输出流:PrintrtWriter getWriter( )
*字节输出流:servletoutputstream getoutputstream( )
2:使用输出流,将数据输出到客户端浏览器
案例:
重定向:
package com.Demo1.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/RequseDemo10")
public
class RequseDemo10 extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
System.out.println( "RequseDemo10----" );
//从RequseDemo10跳转到RequseDemo11
//设置状态码
response.setStatus(302);
//设置响应的路径
response.setHeader( "location","/Demo/RequseDemo11" );
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}
package com.Demo1.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/RequseDemo11")
public
class RequseDemo11 extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
System.out.println( "RequseDemo11---" );
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}
简单的重定向:
response.sendRedirect( “重定向的路径” );
package com.Demo1.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/RequseDemo10")
public
class RequseDemo10 extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
System.out.println( "RequseDemo10101010----" );
//简单的重定向
response.sendRedirect( "/Demo/RequseDemo11" );
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}
重定向特点:
1,地址栏发生变化
2,重定向可以访问其他站点的(服务器)的资源
3,重定向是两次请求,不能使用request对象共享数据
转发特点:
1浏览器地址栏路径不发生变化
2只能转发当前服务器内部资源中
3转发一次请求,可以使用request对象来共享数据
路径书法:
1,路径分类
1,相对路径:通过相对路径不可以确定唯一资源
./index.html
不以/开头,以.开头路径
规则:找到当前的资源和目标资源之间的相对位置关系
./:当前目录
../:后退一级目录
2,绝对路径:通过相对路径可以确定唯一资源
*http://localhost:8080/Demo/login.html /Demo/login.html
* 以/开头的路径
规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
建议虚拟目录动态获取:request.getContextpath( )
给服务器使用:不需要加虚拟目录
转发路径
服务器输出字符数据到浏览器
步骤:
1,获取字符输出流
2,输出数据
package com.Demo1.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/RequseDemo12")
public
class RequseDemo12 extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
//获取字符输出流
PrintWriter printWriter=response.getWriter();
//输出数据
printWriter.write("hello" );
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}
注意:
乱码问题:
1: PrintWriter printWriter=response.getWriter();获取的流默认编码是ISO-8859-1
2:设置该流的默认编码
3,告诉浏览器响应体使用的编码
//简单的形式,设置编码
response.setContentType( “text/html;charset=utf-8” );
package com.Demo1.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/RequseDemo12")
public
class RequseDemo12 extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
//获取流对象之前,设置流默认编码:ISO-8859-1设置为:GBK
// response.setCharacterEncoding( "utf-8" );
//告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码
//response.setHeader( "content-type","text/html;charset=utf-8" );
//简单的形式,设置编码
response.setContentType( "text/html;charset=utf-8" );
//获取字符输出流
PrintWriter printWriter=response.getWriter();
//输出数据
printWriter.write("hello" );
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}
服务器输出字节数据到浏览器
//获取字节输出流
ServletOutputStream servletOutputStream = response.getOutputStream();
//输出数据
servletOutputStream.write(“hello”.getBytes() );
package com.Demo1.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/RequseDemo12")
public
class RequseDemo12 extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
// response.setContentType( "text/html;charset=utf-8" );
//获取字节输出流
ServletOutputStream servletOutputStream = response.getOutputStream();
//输出数据
servletOutputStream.write("hello".getBytes() );
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}
验证码
1,本质:图片
2,目的:防止恶意表单注册
package com.Demo1.Servlet;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Random;
@WebServlet("/pictuerServlet")
public
class pictuerServlet extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
int width=100;
int height=50;
//1,创建一对象,在内存中图片(验证码图片对象)
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB );
//2,美化图片
//2.1填充背景色
Graphics graphics = image .getGraphics();//画笔对象
graphics.setColor( Color.PINK );//设置画笔颜色
graphics.fillRect(0,0,width,height );
//2.2画边框
graphics.setColor( Color.BLUE );
graphics.drawRect( 0,0,width-1,height-1 );
String string="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//生成随机坐标
Random random=new Random( );
for (int i=1;i<=4;i++)
{
int index=random.nextInt(string.length());
char ch=string.charAt( index );
//2.3写验证码
graphics.drawString( ch+"",width/5*i,height/2 );
}
//2.4画干扰线
graphics.setColor( Color.GREEN );
//随机生成坐标点
for(int i=0;i<10;i++)
{
int x1= random.nextInt(width);
int x2= random.nextInt(width);
int y1= random.nextInt(height);
int y2= random.nextInt(height );
graphics.drawLine(x1,y1,x2,y2 );
}
//3,将图片输出到页面显示
ImageIO.write( image, "jpg",response.getOutputStream());
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
<script>
window.onload=function () {
var img=document.getElementById("checkCode");
//绑定单击事件
img.onclick=function () {
var date=new Date().getTime();
img.src="/Demo/pictuerServlet?"+date;
}
}
</script>
</head>
<body>
<form action="/Demo/RequseDemo5" method="post">
<input type="text" placeholder="请输入用户名" name="username">
<br>
<input type="text" placeholder="请输入密码" name="password">
<br>
<input type="text" placeholder="请输入验证码" name="mail">
<img src="/Demo/pictuerServlet" id="checkCode">
<a id="change" href="" >看不清换一张</a>
<br>
<input type="submit" value="注册">
<input type="reset" value="提交">
</form>
</body>
</html>
5,Servletcontext对象
1,概念:代表整个web应用,可以和服务器来通信
2,获取:
1,通过request对象获取
request.getServletContext( );
2,通过HttpServlet获取
this.getServletContext( );
package com.Demo1.servletcontext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ServletContext")
public
class ServletContext extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
/*
1,通过request对象获取
request.getServletContext( );
2,通过HttpServlet获取
this.getServletContext( );
*/
//通过request对象获取
javax.servlet.ServletContext servletContext=request.getServletContext();
// 2,通过HttpServlet获取
javax.servlet.ServletContext servletContext11= this.getServletContext();
System.out.println( servletContext==servletContext11 );
System.out .println( servletContext );
System.out.println( servletContext11 );
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}
3:功能:
1:获取MIME类型:
1,MIME类型:在互联网中定义的一种文件数据类型
格式:大类型/小类型 text/html
2,获取:string getMineType(string file)
`package com.Demo1.servletcontext;
import javax.naming.Context;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ServletContext1")
public
class ServletContext1 extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
/*
1:获取MIME类型:
1,MIME类型:在互联网中定义的一种文件数据类型
格式:大类型/小类型 text/html
2,获取:string getMineType(string file)
2;域对象:共享数据
3,获取文件的真实(服务器)路径
*/
// 2,通过HttpServlet获取
ServletContext servletContext11= this.getServletContext();
//3,定义文件名称
String filename="a.jpg";
//获取MIME类型
String mimeType=servletContext11.getMimeType( filename );
System.out.println( servletContext11 );
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{this.doPost( request ,response );
}
}
`
2;域对象:共享数据
*void setAttribute(string name,object obj):存储数据
*object getAttribute(string name):通过键获取值
*void removeAttritubute(string name):通过键移除值对
ServletContext对象范围:所有用户请求的数据
3,获取文件的真实(服务器)路径
1,方法:getRealPath( )
package com.Demo1.servletcontext;
import javax.naming.Context;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
@WebServlet("/ServletContext2")
public
class ServletContext2 extends HttpServlet {
protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
// 2,通过HttpServlet获取
ServletContext servletContext11= this.getServletContext();
//获取文件的服务器路径
String realpath=servletContext11.getRealPath( "/b.txt" );//web目录下的资源访问
System.out.println( realpath );
// File file=new File( realpath );
String c=servletContext11.getRealPath( "/WEB-INF/c.txt" );//WEB-INF目录下的资源访问
System.out .println( c );
String a=servletContext11 .getRealPath( "WEB-INF/classes/a.txt" );//src下的资源
System.out .println( a );
}
protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doPost( request ,response );
}
}