JavaWeb-01

JavaWeb

三高问题:
高并发、高性能、高可用

服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息。

Servlet

Servlet是sun公司开发动态web的一门技术
Sun公司在这些API中提供一个接口叫做Servlet,实现步骤:

  1. 编写一个类,实现Servlet接口
  2. 把开发好的java类部署到web服务器
    把实现了Servlet接口的Java程序叫做Servlet

Request会从service(请求)拿到请求并且把请求之后的响应交给Response
service(ServletRequest var1,ServletResponse var2)

Mapping

  1. 一个Servlet可以指定一个映射路径

  2. 一个Servlet可以指定多个映射路径

  3. 一个servlet可以指定通用映射路径

  4. 可以指定一些后缀或者前缀等等。“ * ” 前面不能加项目映射的路径 /hello/ * .do 是不可以的 ,但是/hello/hi.do是可以的

  5. 优先级问题
    指定的固定的映射优先级最高,找不到会走默认的处理请求。

ServletContext

  1. HelloServlet.class
package com.kang.servlet;


import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {

    //由于get或post只是请求实现的不同方式,可以互相调用,业务逻辑都一样

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        PrintWriter writer = resp.getWriter();
//        writer.print("hello");

//        this.getServletConfig();   //servlet配置
//        this.getServletContext(); //servlet上下文
//        this.getInitParameter();  //初始化参数
        ServletContext context = this.getServletContext();
        String username = "玉树临风";
        context.setAttribute("username",username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

  1. GetServlet.class
package com.kang.servlet;


import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {

    //由于get或post只是请求实现的不同方式,可以互相调用,业务逻辑都一样

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        PrintWriter writer = resp.getWriter();
//        writer.print("hello");

//        this.getServletConfig();   //servlet配置
//        this.getServletContext(); //servlet上下文
//        this.getInitParameter();  //初始化参数
        ServletContext context = this.getServletContext();
        String username = "玉树临风";
        context.setAttribute("username",username);


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

  1. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">

    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.kang.servlet.HelloServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>getC</servlet-name>
        <servlet-class>com.kang.servlet.GetServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>getC</servlet-name>
        <url-pattern>/getc</url-pattern>
    </servlet-mapping>
    
</web-app>

先跳转/hello设置值,然后跳转/getc 输出内容

转发和重定向

转发:A把请求转发给B,B向C请求,然后C返回给B,B再转发给A
在这里插入图片描述

重定向:A请求一个资源,B让A去找C请求,A去找C获取资源。 路径会发生变化
在这里插入图片描述

读取资源文件:

需要一个文件流

public class ServletDemo05 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties prop = new Properties();
        prop.load(is);

        String user = prop.getProperty("username");
        String pwd = prop.getProperty("password");
        resp.getWriter().print(user+" "+pwd);


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      doGet(req, resp);
    }
}
    <servlet>
        <servlet-name>sd5</servlet-name>
        <servlet-class>com.kang.servlet.ServletDemo05</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>sd5</servlet-name>
        <url-pattern>/sd5</url-pattern>
    </servlet-mapping>

HttpServletResponse:

web客户端接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse

  • 如果获取客户端请求过来的参数 :找HttpServletResponse
  • 如果要给客户端响应一些信息:找HttpServletResponse
  1. 简单分类

负责向浏览器发送数据的方法

负责向浏览器发送响应头的方法

应用:

  • 向浏览器输出信息
  • 下载文件

public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1.获取下载文件的路径
        String realPath = this.getServletContext().getRealPath("E:\\2345Downloads\\1.jpg");
        System.out.println("path: " + realPath);
//        2.下载的文件名是啥?
        String filename = realPath.substring(realPath.lastIndexOf("\\"+1 ));
//        3.设置想办法让浏览器能都支持我们下载的东西 文件名是中文的时候,可以设置URLEncoder.encode(fileName, "UTF-8"),否则有可能乱码
        resp.setHeader("Content-Dispositon", "attachment;filename=" + filename);
//        4.获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
//        5.创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
//        6.获取OutputStrem对象
        ServletOutputStream out = resp.getOutputStream();
//        7.将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
        out.flush();
        in.close();
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

  <servlet>
    <servlet-name>filedown</servlet-name>
    <servlet-class>com.kang.servlet.FileServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>filedown</servlet-name>
    <url-pattern>/down</url-pattern>
  </servlet-mapping>

验证码

生成随机的验证码图片

public class ImageServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //让浏览器三秒刷新一次
        resp.setHeader("refresh", "3");

        //在内存中创建一个图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
        //得到图片
        Graphics2D g = (Graphics2D) image.getGraphics();//笔
        //设置图片的背景颜色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, 80, 80);
        //给图片写数据
        g.setColor(Color.BLUE);
        g.setFont(new Font(null,Font.BOLD,10));
        g.drawString(makeNum(),0,20);

        //告诉浏览器这个请求用图片的方式打开
        resp.setContentType("image/jpeg");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("expires",-1);


        boolean write = ImageIO.write(image,"jpg", resp.getOutputStream());

    }

    private String makeNum() {
        Random random = new Random();
        String s = random.nextInt(9999999) + " ";
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 7 - s.length(); i++) {
            sb.append("0");
        }
        s = sb.toString() + s;
        return s;

    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

<servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>com.kang.servlet.ImageServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/img</url-pattern>
  </servlet-mapping>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值