2019年8月14日暑假训练

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值