javaweb--servlet

Servlet简介:

  Servlet是Sun公司开发动态Web的一门技术

  sun在这些API中提供一个接口叫Servlet,开发servlet程序需要下面两个步骤:

    1.编写一个类,实现servlet接口(实现HttpServlet接口就行)

    2.将写好的java类部署到web服务器中

构建HelloServlet项目:

1.导入依赖

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.3</version>
    </dependency>

2.创建类实现httpServlet接口

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();//响应流
        writer.print("helloword");
    }

3.在web.xml编写映射关系

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

4.配置tomcat服务器

5.运行ok

 

Servlet原理:

  Servlet是由Web服务器调用,Web服务器在收到请求后

 

 

ServletContext:

  Web容器在启动时,他会为每个web程序创建一个对应的Servletcontext对象,他代表了当前的web应用。

  1.共享数据:在这个servlet中保存的数据,可以在另一个servlet中拿到

 存放数据: 

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //相应编码的格式
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        ServletContext context = this.getServletContext();//获取上下文
        String username="张三";
        context.setAttribute("username", username);
//        String  user = (String)context.getAttribute(username);
//        resp.getWriter().print("名字:"+user);
    }

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

    }

取出数据:

public class GetServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //相应编码
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        ServletContext context = this.getServletContext();
        String username = (String)context.getAttribute("username");//强转为string类型
        resp.getWriter().print("你的名字是:"+username);
    }

注册映射路径:

<servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.zhs.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>getc</servlet-name>
        <servlet-class>com.zhs.servlet.GetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hellos</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>getc</servlet-name>
        <url-pattern>/getname</url-pattern>
    </servlet-mapping>

运行,先进入/hellos存入数据,在进入/getname,可以拿到在第一个servlet中的数据

  2.获取初始化参数

创建类:

public class ServletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        resp.getWriter().print(url);
    }

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

    }

配置要获取的参数

<context-param>
        <param-name>url</param-name>
        <param-value>123456hello</param-value>
    </context-param>

配置映射

 <servlet>
        <servlet-name>demo1</servlet-name>
        <servlet-class>com.zhs.servlet.ServletDemo1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/getdemo1</url-pattern>
    </servlet-mapping>

运行成功获取参数

123456hello

 

  3.请求转发

public class ServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
       context.getRequestDispatcher("/getdemo1").forward(req, resp);
    }

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

    }
<servlet>
        <servlet-name>demo2</servlet-name>
        <servlet-class>com.zhs.servlet.ServletDemo2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo2</servlet-name>
        <url-pattern>/getdemo2</url-pattern>
    </servlet-mapping>

运行成功跳转到另一个页面

  4.读取资源文件

package com.zhs.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/dd.properties");
        Properties prop=new Properties();
        prop.load(is);
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        resp.getWriter().print(username+password);


    }

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

    }
}
<servlet>
        <servlet-name>demo3</servlet-name>
        <servlet-class>com.zhs.servlet.ServletDemo3</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo3</servlet-name>
        <url-pattern>/getdemo3</url-pattern>
    </servlet-mapping>

运行获取文件流

 

Response下载文件步骤:

  1.要获取下载文件的路径

  2.下载的文件名是啥

  3.设置想办法让浏览器能够支持下载我们的东西

  4.获取下载文件的输入流

  5.创建缓存区

  6.获取OutputStream对象

  7.将FileOutputStream流写入到buffer缓存区

  8.使用outputStream将缓存区的数据输入到客户端

package com.zhs.servlet;

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.FileInputStream;
import java.io.IOException;

public class ResponseDown extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1.要获取下载文件的路径E:\JavaBase\javawebservlet\response_downFile\target\classes\monster.png
        String realPath = "E:\\JavaBase\\javawebservlet\\response_downFile\\target\\classes\\monster.png";
        System.out.println("下载文件的路径:"+realPath);
//      2.下载的文件名是啥
        String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);
//      3.设置想办法让浏览器能够支持(Content-Disposition)下载我们的东西
        resp.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(filename, "utf-8")); 

//   4.获取下载文件的输入流 FileInputStream in = new FileInputStream(realPath);

//   5.创建缓存区 int len=0; byte[] buffer = new byte[1024];

//   6.获取OutputStream对象 ServletOutputStream out = resp.getOutputStream();

//   7.将FileOutputStream流写入到buffer缓存区,使用outputStream将缓存区的数据输入到客户端

while ((len=in.read(buffer))>0){ out.write(buffer,0,len); }

in.close(); out.close(); } }
<servlet>
    <servlet-name>re</servlet-name>
    <servlet-class>com.zhs.servlet.ResponseDown</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>re</servlet-name>
    <url-pattern>/down</url-pattern>
  </servlet-mapping>

正常弹出下载提示

 

 

Response验证码实现:

 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //让浏览器每三秒刷新一次
        resp.setHeader("refresh", "3");
        //在内存中创建一个图片
        BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_BGR);
        //得到图片
        Graphics2D g = (Graphics2D) image.getGraphics();
        //设置图片背景颜色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, 80, 20);
        //给图片写数据
        g.setColor(Color.BLUE);
        g.setFont(new Font(null, Font.BOLD, 20));
        g.drawString(makeNum(), 0, 20);
        //告诉浏览器图片的打开方式
        resp.setContentType("image/jpeg");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("expires", -1);
        resp.setHeader("Pragma", "no-cache");
        //把图片写给浏览器
        ImageIO.write(image, "jpg", resp.getOutputStream());
    }
        //生成随机数
    public String makeNum(){
        Random random = new Random();
        String num=random.nextInt(9999999)+ "";
        StringBuffer sb=new StringBuffer();
        for (int i = 0; i < 7-num.length(); i++) {
            sb.append("0");
        }
        num=sb.toString()+num;
        return num;
    }
<servlet>
    <servlet-name>img</servlet-name>
    <servlet-class>com.zhs.servlet.ImaageServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>img</servlet-name>
    <url-pattern>/img</url-pattern>
  </servlet-mapping>

 

 

 

posted @ 2020-10-27 11:08  lemmon_water  阅读(106)  评论(0)    收藏  举报