## Servlet笔记02

Servlet学习02

request与response的区别

在这里插å¥å›¾ç‰‡æè¿°

1.响应对象响应文本数据

1.代码实现:
@WebServlet(name = "Servlet",value = "/demo")
public class Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter writer = response.getWriter();
        //request写回浏览器的对象
        writer.write("<h1>这是一条来自服务器的一条数据</h1>");
        //这是一条使用响应对象返回浏览器的一次响应
    }

html通过超文本协议(http协议)向客户端的浏览器响应数据。

2.中文乱码:

**产生原因:**服务器解码没有使用utf-8解码规则

**解决方法:**设置服务器的解码规则,设置为utf-8解码的规则

代码显示:

//设置响应头,告诉浏览器使用utf-8进行解码
response.setHeader("Content-Type","text/html;charset=utf-8");
//或者
response.setContentType("text/html;charset=utf-8");

注意:get请求下和tomcat版本在8.0之后,不需要设置服务器端的编码规则,需要设置响应头设置浏览器的解码方式

2.响应对象响应字节数据

如果要获取或者访问WEB-INF中的文件,需要通过servlet的方式访问文件

注意: 1.浏览器可以直接访问web目录下的文件 2.浏览器不能访问WEB-INF文件夹里面的文件

案例:获取WEB-INF中的文件夹中的图片

  1. 给前台响应一张图片
  2. 动态获取WEB-INF下文件的路径,然后使用流将文件封装起来
  3. 通过响应的输出流写回浏览器

代码实现:

@WebServlet(name = "Servlet",value = "/demo")
public class Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //动态获取WEB-INF下面的demo.png的真实路径
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/WEB-INF/demo.png");
        //注意在这里查找文件的路径时要加上web-inf这一级的文件名
        
        //将文件封装到流里面
        FileInputStream in = new FileInputStream(realPath);
        //获取响应中的输出流
        ServletOutputStream out = response.getOutputStream();
        //进行读写操作,将WEB-INF中的文件封装起来的内容
        int len=0;
        byte[] bytes = new byte[1024];
        while ((len=in.read(bytes))!=-1){
            out.write(bytes,0,len);
            out.flush();
        }
        in.close();
        out.close();
    }

3.验证码图片的制作

模板代码:

@WebServlet(name = "CheckCodeDemo",value = "/imgs")
//注解:可以不用使用web.xml配置servlet的虚拟路径
public class CheckCodeDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int width=300;
        int heigh=200;
        //定义验证码图片的宽和高
        BufferedImage image = new BufferedImage(width, heigh, BufferedImage.TYPE_4BYTE_ABGR);
        //定义验证码图片的类型,类型为枚举类型
        Graphics graphics = image.getGraphics();
        //获取画笔
        graphics.setColor(Color.gray);
        //将画笔设置为灰色
        graphics.setFont(new Font("微软雅黑",Font.ITALIC,30));
        //设置字体的类型,格式(斜体/粗体..),字体的大小
        graphics.fillRect(0,0,width,heigh);
        //用画笔设置背景图片的颜色
        graphics.setColor(Color.red);
        //将画笔设置为红色
        graphics.drawRect(0,0,width-1,heigh-1);
        //设置验证码图片的边框颜色
        String str="ascsndjjdkkeioqoiomc1234567890";
        //创建  "字库"
        graphics.setColor(Color.BLACK);
        Random random = new Random();
        //定义随机数对象
        StringBuffer strb = new StringBuffer();
        //创建一个字符串容器
        //遍历四个随机数
        for (int i = 1; i <=4; i++) {
            int num = random.nextInt(str.length());
            char charAt = str.charAt(num);
            graphics.drawString(charAt+"",width/5*i,heigh/2);
            //使用画笔的写字方法,参数1为字符串,参2为字符串在图片的宽的位置,参3为字符在高方向上的位置
            strb.append(charAt+"");
            //将使用的随机数取出的字符放到容器中
        }
            //设置干扰线(10条)
        for (int j = 0; j < 10; j++) {
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(heigh);
            int x2 = random.nextInt(width);
            int y2 = random.nextInt(heigh);
            //利用随机数创建两个点的位置
            graphics.drawLine(x1,y1,x2,y2);
            //使用画笔将两个随机点进行来连接,即可生成10条干扰线
        }
        //因为在注册阶段需要验证码,因此将验证码存放在全局域中
        ServletContext servletContext = this.getServletContext();
        servletContext.setAttribute("imgcode",strb.toString());
        //使用ImageIO中的静态方法将画笔中的数据创建成jpg格式的图片并将图片,反映回页面
        ImageIO.write(image,"jpg",response.getOutputStream());
    }

4.重定向的学习

1.作用:

可以用来进行页面的跳转

2.特点:
  1. 两次请求,两次响应
  2. 地址会发生变化
  3. 既可以跳转外部资源,也可以跳转内部资源
3.代码实现的两种方式:
response.sendRedirect("home.html");

5.请求转发(内部转发)

1.特点:
  1. 一次请求,一次响应
  2. 地址栏不发生变化
  3. 只能跳转内部资源
2.代码实现:
request.getRequestDispatcher("/login").forward(request,response);
3.请求跳转和重定向的区别:

在使用请求域中的数据时,重定向因为是两次请求,两次转发,因此不能获取到请求域中的内容,但是使用内部转发可以获取到请求域中的内容,因为在不断的转发对象。
WEB-INF中的资源,重定向不能访问,内部可以访问

6.路径的书写

页面上的需要写项目路径,重定向的路径需要写项目路径
内部转发不要写项目路径

7.利用注解配置web.xml中的内容

可以代替web.xml中的中的内容

@WebServlet(value = "/demo")
//缩写形式
@WebServlet("/demo")
//一个servlet可以配置多个虚拟路径
@WebServlet(value = {"/home","/demo","/ha"})
//除了value也可以使用urlpatterns这个属性
@WebServlet(urlPatterns = "/demo")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值