JavaWeb学习笔记(6)__Servlet篇

JavaWeb学习笔记

本文章基于B站UP主:楠哥教你学Java 的课程《Java Web从入门到实战【完整版】》进行整理补充,本文章仅用于个人学习交流使用。

1.Servlet篇

1.Tomcat

1.安装与配置

2.Tomcat的目录结构

bin:存放各个平台下启动和停⽌ Tomcat 服务的脚本⽂件。
conf:存放各种 Tomcat 服务器的配置⽂件。
lib:存放 Tomcat 服务器所需要的 jar。
logs:存放 Tomcar 服务运⾏的⽇志。
temp: Tomcat 运⾏时的临时⽂件。
webapps:存放允许客户端访问的资源(Java 程序)。
work:存放 Tomcat 将 JSP 转换之后的 Servlet ⽂件。

3.集成开发环境工具Intellij Idea的配置

2.Servlet简介
  • 什么是 Servlet?
    Servlet 是 Java Web 开发的基⽯,与平台⽆关的服务器组件,它是运⾏在 Servlet 容器/Web 应⽤服务器/Tomcat,负责与客户端进⾏通信。
  • Servlet 的功能:
    1、创建并返回基于客户请求的动态 HTML ⻚⾯。
    2、与数据库进⾏通信。
  • 如何使⽤ Servlet?
    Servlet 本身是⼀组接⼝,⾃定义⼀个类,并且实现 Servlet 接⼝,这个类就具备了接受客户端请求以及
    做出响应的功能。
package com.lut.myservlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

public class ServletTset implements Servlet { //实现Servlet 接⼝
    @Override
    public void init(ServletConfig var1) throws ServletException{

    };
    @Override
    public ServletConfig getServletConfig(){
        return null;
    };
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException{
      String id=servletRequest.getParameter("id");
      //在网页地址栏后面输入  ?id=100
      System.out.println("我是Servlet,我已经接收到客户端发来的请求,参数是:"+id);//在控制台输出
      servletResponse.setContentType("text/html;charset=UTF-8");//使中文可以正常显示/GBK
      servletResponse.getWriter().write("我是中文,页面上有显示吗?");//写到页面上
    };
    @Override
    public String getServletInfo(){
        return null;
    };
    @Override
    public void destroy(){

    };
}

浏览器不能直接访问 Servlet ⽂件,只能通过映射的⽅式来间接访问 Servlet,映射需要开发者⼿动配置,有两种配置⽅式。

  • 基于 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">
    
    <servlet>
        <servlet-name>myServlet</servlet-name>
        <servlet-class>com.lut.myservlet.myservlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <url-pattern>/demo02</url-pattern>
    </servlet-mapping>
</web-app>
  • 基于注解的方式
@WebServlet("/demo01")
public class myservlet implements Servlet {
    
}

上述两种配置⽅式结果完全⼀致,将 demo2 与 HelloServlet 进⾏映射,即在浏览器地址栏中直接访问demo 就可以映射到 HelloServlet。

地址栏后面输入: /demo01 或 /demo02

3.Servlet生命周期

1、当浏览器访问 Servlet 的时候, Tomcat 会查询当前 Servlet 的实例化对象是否存在,如果不存在,则通过反射机制动态创建对象,如果存在,直接执⾏第 3 步。

2、调⽤ init ⽅法完成初始化操作。

3、调⽤ service ⽅法完成业务逻辑操作。

4、关闭 Tomcat 时,会调⽤ destory ⽅法,释放当前对象所占⽤的资源。


Servlet 的⽣命周期⽅法:⽆参构造函数、 init、 service、 destory

1、⽆参构造函数只调⽤⼀次,创建对象。

2、 init 只调⽤⼀次,初始化对象。

3、 service 调⽤ N 次,执⾏业务⽅法。

4、 destory 只调⽤⼀次,卸载对象。

package com.lut.myservlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/demo01")
public class myservlet implements Servlet {

    public myservlet(){
        System.out.println("构造函数:创建了Servlet对象");
    }


    public void init(ServletConfig servletConfig) throws ServletException{
        System.out.println("对Servlet对象完成初始化操作...");
    };

    public ServletConfig getServletConfig(){
        return null;
    };

    public void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException{
        System.out.println("执行了Servlet对象的业务方法...");
    };

    public String getServletInfo(){
        return null;
    };


    public void destroy(){
        System.out.println("释放了Servlet对象...");
    };

}
4.ServletConfig

该接⼝是⽤来描述 Servlet 的基本信息的。

getServletName() 返回 Servlet 的名称,全类名(带着包名的类名)

getInitParameter(String key) 获取 init 参数的值(web.xml)

getInitParameterNames() 返回所有的 initParamter 的 name 值,⼀般⽤作遍历初始化参数

5.ServletContext

getServletContext() 返回 ServletContext 对象,它是 Servlet 的上下⽂,整个 Servlet 的管理者。

  • ServletConfig 和 ServletContext 的区别:

    ServletConfig 作⽤于某个 Servlet 实例,每个 Servlet 都有对应的 ServletConfig,

    ServletContext 作⽤于整个 Web 应⽤,⼀个 Web 应⽤对应⼀个 ServletContext,

    多个 Servlet 实例对应⼀个ServletContext。

    ⼀个是局部对象,⼀个是全局对象。

package com.lut.myservlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/demo01")
public class myservlet implements Servlet {

    String username;

    public myservlet(){
    }

    public void init(ServletConfig servletConfig) throws ServletException{
        //了解
        System.out.println(servletConfig.getServletName());
        //获取名称 com.lut.myservlet.myservlet
        this.username=servletConfig.getInitParameter("username");
        //获取初始化参数,不能用注解方式,要用XML,拿XML里面的参数
        Enumeration<String> enumeration= servletConfig.getInitParameterNames();
        //获取所有参数名的集合
        while (enumeration.hasMoreElements()){
            String element=enumeration.nextElement();//获取名字
            String element2=servletConfig.getInitParameter(element);//获取值
            System.out.println(element+" "+element2);
        }
        
        //熟知,ServletContext 侧重于全局
        ServletContext servletContext = servletConfig.getServletContext();
        //拿到整个服务的信息
        System.out.println(servletContext.getServletContextName());//名字
        System.out.println(servletContext.getContextPath());
        //在Tomcat中 Deplayment下Applyaction text
        System.out.println(servletContext.getServerInfo());//tomcat版本信息

    };

    public ServletConfig getServletConfig(){
        return null;
    };

    public void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException{
    };

    public String getServletInfo(){
        return null;
    };

    public void destroy(){
    };
}
<?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">
    
    <servlet>
        <servlet-name>myServlet</servlet-name>
        <servlet-class>com.lut.myservlet.myservlet</servlet-class>
       
        <!--初始化参数-->
        <init-param>
            <param-name>username</param-name>
            <param-value>admin</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123456</param-value>
        </init-param>
        <init-param>
            <param-name>type</param-name>
            <param-value>super</param-value>
        </init-param>
        <!--初始化参数-->
        
    </servlet>
    
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <url-pattern>/demo02</url-pattern>
    </servlet-mapping>
</web-app>
6.Servlet 的层次结构

Servlet —> GenericServlet —> HttpServlet
HTTP 请求有很多种类型,常⽤的有四种:
GET 读取
POST 保存
PUT 修改
DELETE 删除
GenericServlet 实现 Servlet 接⼝,同时为它的⼦类屏蔽了不常⽤的⽅法,⼦类只需要重写 service ⽅
法即可。HttpServlet 继承 GenericServlet,根据请求类型进⾏分发处理, GET 进⼊ doGET ⽅法, POST 进⼊
doPOST ⽅法。开发者⾃定义的 Servlet 类只需要继承 HttpServlet 即可,重新 doGET 和 doPOST。

1.继承 HttpServlet 的实现

package com.lut.myservlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/test")
public class TestServlet extends HttpServlet {
    //通过继承 HttpServlet 实现 servlet 接口
    //功能一样,但代码比较简化
    //根据不同的请求,自动分发给 GET 和 POST
    //处理get(获取)请求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("hello extends HttpServlet");
        //super.doGet(req, resp);
        resp.getWriter().write("GET");
    }
    //获取post(保存)请求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("POST");
        //super.doPost(req, resp);
    }
    //还有 doDelet,doPut 但不常用
}

2.优化Servlet接口的实现(不用)

针对 Servlet接口 代码较长的一种处理方法

1.建一个类 ServletTset 实现 Servlet 接口,重写Servlet中所有的方法

2.建第二个类 ServletTset2 继承 ServletTest,只实现需要的方法

3.建第三个类继承 ServletTest2,只实现 doGet 和 doSet

其实就是模拟 extends HttpServlet 的过程,使用时直接 extends HttpServlet 就好

package com.lut.myservlet;
//***第一层
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/demo03")
public class ServletTset implements Servlet {
    //针对代码较长的一种处理方法
    //1.建一个类 ServletTset 实现 Servlet 接口,重写Servlet中所有的方法
    //2.建第二个类 ServletTset2 继承 ServletTest,只实现需要的方法
    @Override
    public void init(ServletConfig var1) throws ServletException{

    };
    @Override
    public ServletConfig getServletConfig(){
        return null;
    };
    @Override
    public void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException{
      //有用的,其他的不用
        //向浏览器中写入数据,不支持中文(需要其他)
        var2.getWriter().write("hello implements Servlet ");
    };
    @Override
    public String getServletInfo(){
        return null;
    };
    @Override
    public void destroy(){

    };
}
package com.lut.myservlet;
//***第二层
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ServletTest2 extends ServletTset{

    //在这里只实现了 service 方法,把其他不用的方法屏蔽掉
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //获取请求对象,这一层继续分发doget ,dopost
        //向下转型,获取 ServletRequest 类的子类 HttpServletRequest
        HttpServletRequest request=(HttpServletRequest) servletRequest;
        HttpServletResponse response=(HttpServletResponse) servletResponse;
        //获取请求类型
        String method=request.getMethod();
        switch (method){
            case "GET":
                this.doGet(request,response);
                break;
            case "POST":
                this.doPost(request,response);
                break;
        }

    };

    public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{

    }

    public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException{

    }
}
package com.lut.myservlet;
//***第三层
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//模拟 extends HttpServlet 的过程,使用时直接 extends HttpServlet
//继承 ServletTest2,只实现 doGet 和 doSet
@WebServlet("/hello")
public class HelloServlet extends ServletTest2  {
    //实现 doGet 和 doSet
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
       response.getWriter().write("helloGet");
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
        response.getWriter().write("HelloPost");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值