IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> javaweb:servlet -> 正文阅读

[Java知识库]javaweb:servlet

Servlet技术

什么是servlet

①servlet是javaee规范之一,规范就是接口
②servlet是javaweb三大组件之一。三大组件分别是:servlet程序,Filter过滤器,listener监听器
③servlet是运行在服务器上的一个java小程序,它可以接受客户端发送过来的请求,并相应数据给客户端

手动实现servlet程序

①编写一个类去实现servlet接口
②实现service方法,处理请求,并响应程序
③到web.xml中去配置servlet程序的访问地址

url地址定位到服务器

在这里插入图片描述

Servlet的生命周期

①执行Servlet构造器方法
②执行int初始化方法
第一、二步是在第一次访问的时候创建servlet
③执行service方法
第三步,每次访问都会调用
④执行destroy销毁方法
第四步,在web工程停止的时候调用

GET和POST请求的分发处理

public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    //类型转换(因为它有getMethod()方法)
    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;

    //获取请求的方式
    String method = httpServletRequest.getMethod();
    System.out.println(method);
}

通过继承HttpServlet实现Servlet程序

一般在实际项目开发中,都是使用继承HttpServlet类的方式去实现Servlet程序
①编写一个类去继承HTTPServlet类
②根据业务需要重写doGet或doPost方法
③到web.xml中配置servlet程序的访问地址
servlet类

public class helloServlet2 extends HttpServlet {
    public helloServlet2() {

    }

    /**
     * doPost() 在post请求的时候调用
     * doGet()  在get请求的时候调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("helloServler2 的doGet方法");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("helloServler2 的doPost方法");
    }
}

xml配置

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.servlet.helloServlet2</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello2</url-pattern>
</servlet-mapping>

使用IDEA创建servlet程序

在这里插入图片描述

Servlet类的继承体系

在这里插入图片描述

ServletConfig类

Servlet程序的配置信息类
Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用。
Servlet程序默认第一次访问的时候创建,ServletConfig是每个程序创建时,就创建一个对应的ServletConfig对象

ServletConfig类的三大所用

①可以获取Servlet程序的别名servlet-name的值
②获取初始化参数init-param
③获取ServletContext对象
web.xml配置

<init-param>
    <!--参数名-->
    <param-name>username</param-name>
    <!--参数值-->
    <param-value>root</param-value>
</init-param>

servlet类

//1.获取servlet程序的别名serv-name的值
    System.out.println("helloServlet程序的别名是:"+servletConfig.getServletName());
    //2.获取初始化参数init-param
    System.out.println("初始化参数uesename的参数值:"+    servletConfig.getInitParameter("username"));
    //3.获取ServletContext对象
    System.out.println(servletConfig.getServletContext());

注意:重写init方法一定要调用父类的init(ServletConfig)操作

@Override
public void init(ServletConfig config) throws  ServletException{
    super.init(config);
    System.out.println("重写init初始化方法");
}

ServletContext类

什么是ServletContext接口

①ServletContext是一个接口,它表示Serv上下文对象
②一个web工程只有一个ServContext对象实例
③ServletContext对象是一个域对象(域对象是可以像Map一样存储数据的对象,“域”指的是存取数据的操作范围)

存数据取数据删除数据
Mapput()get()remove()
域对象setAttribute()getAttribute()removeAttribute()

ServletContext类的作用

①获取web.xml中配置的上下文参数context-param
②获取当前的工程路径,格式:/工程路径
③获取工程部署后在服务器硬盘上的绝对路径
④像Map一样存取数据

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//      获取web.xml中配置的上下文参数context-param
        ServletContext context = getServletConfig().getServletContext();
        String username = context.getInitParameter("username");
        System.out.println("context-param参数username的值是:"+username);
        System.out.println("context-param参数password的值是:"+context.getInitParameter("password"));

//      获取当前的工程路径,格式:/工程路径
        System.out.println("当前工程路径:" + context.getContextPath());
//      获取工程部署后在服务器硬盘上的绝对路径
        /**
         * / 斜杠被服务器解析地址为:http://ip:port/工程名/  映射到idea代码的web目录
         */
        System.out.println("工程部署的路径是:" + context.getRealPath("/"));
//      像Map一样存取数据

    }

contextServlet1

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取ServletContext对象
    ServletContext context = getServletContext();

    context.setAttribute("key1","value1");

    System.out.println("context中获取域数据key1的值是:" + context.getAttribute("key1"));
}

contextServlet2

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = getServletContext();
    System.out.println("context2 中获取域数据key1的值是:" + context.getAttribute("key1"));
}

结果:第一次运行contextServlet2时,未给key1设定值,所以结果为null;运行contextServlet1后,给key1设定了值,再次运行发现contextServlet2中获取到了key1的值,说明context是可以在module中任意调用的。

HttpServletResponse

Web服务器接收到客户端的http请求,会针对这个请求分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse对象。
获取客户端请求过来的参数,找HttpServletRequest
给客户端响应一些信息:找HttpServletResponse

简单分类

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

servletOutStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;

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

void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);

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

Void setCharacterEncoding(String var)
Void setContentLength(int var1)
Void setCointentLengthLong(long val)
Void setContentType(Stirng var1)
Void setDateHeader(String var1,long var2)
Void addDateHeader(String var1,long var2)
Void setHeader(String var1,String var2)
Void addHeader(String var1,String var2)
Void setIntHeader(String var1,int var2)
Void addIntHeader(String var1,int var2)

常见应用

向浏览器输出信息

下载文件

a.获取下载文件的路径
b.下载的文件名
c.设置浏览器能够支持下载的东西
d.获取下载文件的输入流
e.创建缓冲区
f.获取OutputStream
g.将FileOuputStream流写入到buffer缓冲区
h.使用OutputStream将缓冲区总的数据输出到客户端

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //a.获取下载文件的路径
    String realPath = "D:\\javawebstudy\\servletStudy\\servletDemo\\src\\main\\resources/background.JPG";
    System.out.println("下载文件的路径:"+realPath);
    //b.下载的文件名
    String fileName = realPath.substring(realPath.lastIndexOf("//")+1);
    //c.设置浏览器能够支持下载的东西
    resp.setHeader("Content-Disposition","attachment;filename="+fileName);
    //d.获取下载文件的输入流
    FileInputStream in = new FileInputStream(realPath);
    //e.创建缓冲区
    int len = 0;
    byte[] buffer = new byte[1024];
    //f.获取OutputStream
    ServletOutputStream out = resp.getOutputStream();
    //g.将FileOuputStream流写入到buffer缓冲区
    while(in.read(buffer) > 0){
        out.write(buffer,0,len);
    }
    in.close();
    out.close();
}

验证码功能

后端实现:java的图片类,生成一个图片

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

    //如何让浏览器5秒自动刷新一次
    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,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("Cache-Control","no-cache");
    resp.setHeader("Pragma","no-Cache");

    //把图片写给浏览器
    ImageIO.write(image,"jpg",resp.getOutputStream());

}

//生成随机数
private 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");
    }
    String s = sb.toString()+num;
    num = sb.toString()+num;
    return num;
}

在这里插入图片描述

response重定向

在这里插入图片描述

一个web资源收到客户端请求后,他会通知客户端去访问另外一个web资源C,这个过程叫做重定向
常见场景:用户登录

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    /*
    resp.setHeader("Location","/servletDemo_war_exploded/img");
    resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);//等价于302
    */
    resp.sendRedirect("/servletDemo_war_exploded/img");
}

重定向和转发的区别:
相同点:页面都会实现跳转
不同点:①请求转发的时候,url不会产生变化②重定向的时候,url地址栏会发生变化

测试
.jsp

<%--这里提交的路径,需要寻找到项目的路径--%>
<%--${pageContext.request.contextPath} 代表当前项目--%>
<form action="${pageContext.request.contextPath}/request" method="get">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit">
</form>

.java

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

    //处理请求
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    System.out.println(username + ":" + password);

    //重定向要注意路径问题,否则404
    resp.sendRedirect("/servletDemo_war_exploded/success.jsp");
}

HttpServletRequest

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息。

获取前端传递的参数,请求转发

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

    //后台接收中文乱码问题
    req.setCharacterEncoding("UTF-8");
    resp.setCharacterEncoding("UTF-8");

    String username = req.getParameter("username");
    String password = req.getParameter("password");
    String[] hobby = req.getParameterValues("hobbies");
    System.out.println("====================");
    System.out.println(username);
    System.out.println(password);
    System.out.println(Arrays.toString(hobby));
    System.out.println("====================");

    //通过请求转发
    //这里的 / 代表当前的web应用
    req.getRequestDispatcher("/success.jsp").forward(req,resp);
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-29 12:51:50  更:2021-10-29 12:51:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:09:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码