• 【JavaWeb】Servlet,Request,Responce


    【JavaWeb】核心技术

    Tomcat

    1.安装配置目录使用部署创建

    image-20220704123439263

    配置:修改启动端口号:conf/server.xml

    port="8080" protocol="HTTP/1.1"可以将8080改为80默认端口

    项目部署:将项目放到webapps目录下,即部署完成。

    一般javaweb项目会被打包成war包,然后将war包放到webapps目录下,Tomcat会自动解压缩war文件

    image-20220704172709333

    image-20220704173026043

    2.idea集成Tomcat

    1.直接添加本地Tomcat

    image-20220704211735335

    添加服务配置项,选择Tomcat路径,然后再添加一个项目模板就可以了。

    2.使用maven配置项添加Tomcat

    <plugins>
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>common-tomcat-maven-plugin</artifactId>
            <version>2.2</version>
          </plugin></plugins>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Servlet

    java提供的一门动态web资源开发技术

    例子:

    localhost:8080/web/login?username=1
    localhost:8080/web/login?username=2
    localhost:8080/web/login?username=3
    这三个页面所返回的内容不同,这就是动态web资源
    
    • 1
    • 2
    • 3
    • 4

    Servlet是JavaEE的规范之一,是一个接口,将来需要定义Servlet类来实现Servlet接口,并由web服务器运行Servlet。

    Servlet快速入门

    1.创建web项目,导入Servlet依赖坐标

    <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.创建:定义一个类,实现Servlet接口,重写接口中的所有方法,并在service方法中输入一句话

    public void service() {
            System.out.println("Servlet hello world~");
        }
    
    • 1
    • 2
    • 3

    3.配置:在类上使用@webServlet注解,配置访问路径 /demo1

    @WebServlet("/demo1")
    public class aaa implements Servlet {
    
    • 1
    • 2

    4.访问:启动Tomcat,访问Servlet

    package com.lyp.web;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebServlet;
    import java.io.IOException;
    
    @WebServlet("/demo1")
    public class aaa implements Servlet {
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("Servlet hello world~");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
    
        }
    
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
    
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    Servlet生命周期

    1.加载和实例化,Servlet第一次被访问的时候,由容器创建Servlet对象

    2.初始化:init()方法,只调用一次。

    3.请求处理:每次请求Servlet时,都会调用service()方法请求处理

    4.服务终止:destroy()方法释放资源,释放Servlet实例。

    	@Override
        public void init(ServletConfig servletConfig) throws ServletException {
    
        } 	
     	
     	@Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) 	throws ServletException, IOException {
            System.out.println("Servlet hello world~");
        }
     	
     	@Override
        public void destroy() {
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    	//获取Servelet信息,基本不用
    	@Override
        public String getServletInfo() {
            return null;
        }
        //获取ServletConfig对象,Servlet配置信息
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    两个方法共同使用一个变量:

    public class aaa implements Servlet {
        private ServletConfig config;
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            this.config=config;
            System.out.println("init...");
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return config;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Servlet体系结构

    image-20220704221657247

    @WebServlet("/demo4")
    public class Servlet_demo extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("GET...");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("POST...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    为什么要根据请求方式的不同,调用不同的方法?

    get和post请求参数的位置不同,service方法要先获取请求方式,再分别写处理逻辑,这些逻辑代码或很繁琐

    可以直接extends HttpServlet类来实现这些不同方式的逻辑代码。

    如何调用?

    获取请求方式来进行逻辑判断。根据不同请求方式,调用不同的doxxx方法

    Servlet urlPattern配置

    配置访问路径(urlPattern)

    1.一个Servlet可以配置多个urlPattern

    @WebServlet(urlPatterns = {"/demo1" , "/demo2"})
    
    • 1

    2.urlPattern配置规则

    1. 精确匹配
    2. 目录匹配
    3. 扩展名匹配
    4. 任意匹配

    image-20220704223610111

    image-20220704223714587

    XML配置Servlet

    可以直接在web.xml里配置Servlet的路径

    <!--
      Servlet 全类名
      -->
      <servlet>
        <servlet-name>demo4</servlet-name>
        <servlet-class>com.lyp</servlet-class>
      </servlet>
      <!--
      Servlet 访问路径
      -->
      <servlet-mapping>
        <servlet-name>demo4</servlet-name>
        <url-pattern>/demo4</url-pattern>
      </servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Request,Responce

    把请求数据和返回数据放在一个对象里。

    例子:

    @WebServlet("/name1")
    public class requ_resp extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //使用res对象,获取请求数据,这是一个get方式的数据
            String name = req.getParameter("name");//localhost:8080/name1?name=aaa
    
            //使用resp对象,设置响应数据
            resp.setHeader("content-type","text/html;charset=utf-8");
            resp.getWriter().write("<h1>"+name+"欢迎您!</h1>");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    image-20220704230533593

    image-20220704230627265

    request继承体系

    image-20220704232449607

    接口不能直接用,要继承,我们用的都是类和类实例化之后的对象

    实现类要Tomcat来定义,因为实现类是Tomcat解析的,不是java语言本身

    Tmocat解析请求数据,封装成request对象创建request对象传递到service方法里面去。

    request获取请求数据

    1.获取请求行数据

    例如这样的请求行:

    GET /day14/demo1?name=zhangsan HTTP/1.1
    
    • 1

    方法:

    1. 获取请求方式:GET

      String getMethod()
      
      • 1
    2. 获取虚拟目录: /day14

      String getContextPath()
      
      • 1
    3. 获取Servlet路径:/demo1

      String getServletPath()
      
      • 1
    4. 获取get方式请求参数:name=zhangsan

      String getQueryString()
      
      • 1
    5. 获取请求URI:/day14/demo1

      String getRequestURI() :   /day14/demo1     URI:统一资源标识符
      StringBuffer getRequestURL() :   http://localhost/day14/demo1    URL:统一资源定位符
      
      • 1
      • 2
    6. 获取协议及版本:HTTP/1.1

      String getProtocol()
      
      • 1
    7. 获取客户机ip地址

      String getRemoteAddr()
      
      • 1

      2.获取请求头数据

      例:

      user-agent: Mozilla/5.0 Chrome/105.0.0.0 
      
      • 1

      方法:

      String getHeader(String name):通过请求头名称获取请求头的值
      String header = req.getHeader("user-agent");
          
      Enumeration<String> getHeaderName():获取所有的请求头名称
      
      • 1
      • 2
      • 3
      • 4

      3.获取请求体数据

      请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数

      username=admin&password=123456
      
      • 1

      步骤:

      1.获取流对象

      BufferedReader getReader() :获取字节输入流
          
      BufferedReader br = req.getReader();
      
      • 1
      • 2
      • 3

      2.再从流对象中读取数据

      String line = br.readline();
      System.out.println(line);
      
      • 1
      • 2

      4.统一方式获取请求参数

      doget和dopost里面都可以用的方法

      可以把代码直接copy过去(要传递一下req和resp this.doget(req,resp)

      1. String getParameter(String name): 根据参数名称获取参数值
      2. String[] getParameterValues(String name): 根据参数名称获取参数值的数组
      3. Enumeration<String> getParameterValueNames(): 获取所有的参数名称
      4. Map<String, String[]> getParameterMap(): 获取所有参数的键值对集合
      
      • 1
      • 2
      • 3
      • 4

    request请求转发

    一种在服务器内部的资源跳转方式。

    image-20220705141036051

    步骤:

    1. 通过request对象来获取请求转发器对象:

      RequestDispatcher getRequestDispatcher(String path)
      
      • 1
    2. 使用RequestDispatcher对象进行转发:

      forward(ServletRequest request, ServletResponse response)
      
      • 1

    一行代码:

    req.getRequestDispatcher("/demo6").forward(request,response);
    
    • 1

    特点:

    1. 浏览器地址栏路径不发生变化
    2. 只能转发到当前的服务器内部资源中
    3. 转发是一次请求

    资源之间怎么共享数据:request对象

    1. void setAttribute(String name, Object obj): 存储数据
    2. Object getAttribute(String name): 通过键获取值
    3. void removeAttribute(): 通过键移除键值对
    
    • 1
    • 2
    • 3

    responce设置响应数据

    设置响应行:

    1. 格式:HTTP/1.1 200 ok

    2. 设置状态码:

      void setStatus(int sc)
      
      • 1

    设置响应头:

    void setHeader(String name, String value)
    
    • 1

    设置响应体:

    使用步骤:

    1. 获取输出流

      字符输出流:PrintWriter getWriter()

      字节输出流:ServletOutputStream getOutputStream()

    2. 使用输出流,将数据输出到客户端浏览器中

    responce重定向

    image-20220705142311253

    responce响应字符、字节数据

    @WebServlet("/resp1")
    public class resp extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html;charset=utf-8");
            //1.获取字符输出流:(默认编码iso,中文会乱码)
            PrintWriter write = resp.getWriter();
    
            //content-type
            //resp.setHeader("content-type","text/html");
            write.write("aaa");
            write.write("<h1>hello</h1>");
    
            //细节:字符流不需要关闭
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    @WebServlet("/resp2")
    public class resp2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1.读取文件
            FileInputStream fis = new FileInputStream("d://a.jpg");
    
            //2.获取response字节输出流
            ServletOutputStream os = resp.getOutputStream();//重要代码
    
            //3.完成流的copy
            
    //        byte[] buff = new byte[1024];
    //        int len = 0;
    //        while ((len = fis.read(buff))!=-1){
    //            os.write(buff,0,len);
    //        }
            
            //或者采用工具类的copy方法:
            IOUtils.copy(fis,os);
            
            fis.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    JSP

    Java Server Pages:java服务端页面

    一种动态的网页技术,既可以定义Html,js,css等静态内容,还可以定义Java代码的动态内容

    JSP=HTML+Java

    JSP本质上就是一个Servlet

    image-20220705173251452

    JSP的脚本:

    JSP定义Java代码的方式

    <% 代码 %>:定义的Java代码,在service方法中。service可以定义什么,该脚本中就可以定义什么。
    <%! 代码 %>:定义的Java代码,在jsp转换后的java类的成员位置。
    <%= 代码 %>:定义的Java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
    
    • 1
    • 2
    • 3

    MVC三层架构:

    image-20220705173840145

  • 相关阅读:
    Spring AOP浅谈
    【JSP】JSTL汇总——源码解析
    ORM 单表记录与字段操作
    Linux C 基于tcp和epoll在线聊天室
    2023.9.7 关于 TCP / IP 的基本认知
    Java GUI实现桌球小游戏
    Unity3D ugui获取ui控件屏幕坐标
    韩国程序员面试考什么?
    深度学习——BRNN和DRNN
    Flutter笔记:目录与文件存储以及在Flutter中的使用(下)
  • 原文地址:https://blog.csdn.net/weixin_51614272/article/details/125625912