自定义写一个MyGenericServlet.java实现Servlet、ServletConfig接口

//自定义一个MyGenericServlet
public abstract class MyGenericServlet implements Servlet , ServletConfig {

    private ServletConfig config;

    @Override
    public void init(ServletConfig config) throws ServletException {
        this.config = config;

        //调用init()方法
        init();
    }

    public void init(){

    }

    @Override
    public ServletConfig getServletConfig() {
        return this.config;
    }

    @Override
    public abstract void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException ;

    @Override
    public String getServletInfo() {
        return "我是一个漂亮的Servlet";
    }

    @Override
    public void destroy() {
    }

    @Override
    public String getServletName() {
        return this.getServletConfig().getServletName();
    }

    @Override
    public ServletContext getServletContext() {
        return this.getServletConfig().getServletContext();
    }

    @Override
    public String getInitParameter(String name) {
        return this.getServletConfig().getInitParameter(name);
    }

    @Override
    public Enumeration getInitParameterNames() {
        return this.getServletConfig().getInitParameterNames();
    }

}

//=====================================
//写一个servlet去继承刚才自己写的MyGenericServlet
public class CServlet extends MyGenericServlet {

    @Override
    public void init() {

        System.out.println("我是CServlet的初始化操作!!");
    }

    @Override
    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException {

        //获取phone的值
        String phone = getInitParameter("phone");

        System.out.println("phone = "+phone);


        System.out.println("Hello Servlet");

        res.getWriter().print("Hello");

    }

}

//================================
web.xml
    <servlet>
        <servlet-name>CServlet</servlet-name>
        <servlet-class>
        com.atguigu.servlet.CServlet</servlet-class>
        <init-param>
             <param-name>phone</param-name>
             <param-value>138888888</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
    <servlet-name>CServlet</servlet-name>
    <url-pattern>/CServlet</url-pattern>
    </servlet-mapping>
//===================================

=================================
HttpServlet

/**
    创建一个Servlet有三种方式
        实现Servlet接口
        继承GenericServlet抽象类
        继承HttpServlet抽象类

    当通过继承HttpServlet创建一个Servlet时,只需要根据要处理的请求的不同去重写不同的方法:
     如果要处理get请求,则重写doGet方法
     如果要处理post请求,则重写doPost方法


*/
public class DServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //doGet会在接收get请求时调用
        System.out.println("doGet");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //doPost会在接收post请求时调用
        System.out.println("doPost");
    }

}

===========================

HttpServletRequest:重点

/**
代表:代表浏览器发送给服务器的请求报文

获取:该对象由服务器创建,最终作为参数传递到doGet或doPost方法中

功能4个:
    --可以获取用户发送的请求参数
            String getParamter(String name)
    --可以获取项目名(主要用来设置绝对路径)
            String getContextPath()
    --可以作为一个域对象在不同的web资源之间共享数据。
    --请求的转发
            request.getRequestDispatcher(路径).forward(request,response);

*/

=========================

HttpServletResponse:重点

/**
    代表:服务器发送给浏览器的响应报文

    获取:该对象由服务器创建,最终作为参数传递到doGet或doPost方法中

    功能2个:
        --向浏览器发送一个页面或页面片段
            response.getWriter().print();
        --请求的重定向
            response.sendRedirect(路径);


*/

===========================

转发和重定向:

/**
转发和重定向比较:


                        转发(request)     重定向(response)   

浏览器发送的请求次数           1次                  2次
发生的位置                   服务器               浏览器
地址栏的改变                  不变                 改变
浏览器是否感知                不知道                知道




*/

============================

HttpServletRequest和HttpServletResponse代码测试:
1、建servlet继承自HttpServlet
2、配置web.xml
3、访问地址路径:http://localhost:8080/项目名/映射URL

/**
转发和重定向比较:


                        转发(request)     重定向(response)   

浏览器发送的请求次数           1次                  2次
发生的位置                   服务器               浏览器
地址栏的改变                  不变                 改变
浏览器是否感知                不知道                知道

 */
public class HServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 请求首行
         * 请求头
         * 空行
         * 请求体
         * 
         * 
         * HttpServletRequest
         * 代表:浏览器发送给服务器的请求报文
         * 获取:该对象由Tomcat服务器创建,最终作为参数传递给doGet或doPost方法
         * 功能:
         *  【1】获取请求参数
         *  【2】可以获取项目名
         *  【3】可以作为一个域对象在不同的web资源之间共享数据(request servletContext)
         *  【4】可以做请求的转发
         */

        //获取请求参数
        /*
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //在页面中输出用户名
        response.getWriter().print("<h1>username = "+username+"</h1>");
        System.out.println(password);*/

        //获取项目名
        //这个方法主要用来设置绝对路径
        /*
        String contextPath = request.getContextPath();
        System.out.println(contextPath);
        */


        //请求的转发
        /**
         * 所谓的转发就是servlet收到浏览器发送的请求以后,
         * 当前servlet不去处理请求,
         * 而是去调用服务器内部的其他资源去处理请求。
         * 转发的特点:
         *  转发时浏览器发送了1次请求
         *  转发是在服务器内部进行的
         *  浏览器的地址栏不会发生改变
         *  浏览器不知道转发的发生
         * 
         */
        //1.获取一个请求的派发器
        RequestDispatcher dispatcher = request.getRequestDispatcher("target.html");
        //2.通过dispatcher发起转发操作
        dispatcher.forward(request, response);



    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 响应首行
         * 响应头
         * 空行
         * 响应体
         * 
         * 
         * HttpServletResponse
         * 代表:代表服务器发送给浏览器的响应报文
         * 获取:该对象由服务器创建,最终作为参数传递到doGet或doPost方法中,我们可以在这两个方法中直接使用
         * 功能:
         *  【1】向浏览器输出一个页面或者是页面片段
         *  【2】可以发起请求的重定向
         * 
         */

        //【1】向浏览器输出一个页面或者是页面片段
        //response.getWriter().print("");
        //获取一个字符输出流
        PrintWriter out = response.getWriter();
        //通过流向浏览器响应一段信息
        out.print("<h1>Hello</h1>");

        //【2】可以发起请求的重定向
        /**
         * 重定向指的是当服务器收到一个请求后,返回给浏览器一个特殊的响应
         * 这个特殊的响应告诉浏览器再去向另一个地址发送请求。
         * 
         * HTTP/1.1 302 Found
           Location: http://localhost:8080/08_WEB_Servlet/target.html

           这个特殊的响应的响应状态码是302,还有一个特殊的头Location,Location指向一个新的地址
           当浏览器收到302这个响应状态码,他会想Location头所指向的地址再次发送请求

           重定向的特点:
            重定向时浏览器发送了2次请求
            重定向是发生浏览器端
            重定向时浏览器的地址栏发生改变
            浏览器可以感知重定向的发生
         */
        response.sendRedirect("target.html");

    }

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

<servlet>
    <servlet-name>HServlet</servlet-name>
    <servlet-class>com.atguigu.servlet.HServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HServlet</servlet-name>
    <url-pattern>/HServlet</url-pattern>
  </servlet-mapping>
</web-app>

============================
tips:新建servlet的快捷方式

/**
    window--Customize Perspective--Shortcus--Web--Servlet

*/

这里写图片描述

===============================
tips:隐藏项目的快捷方式:
选中项目–右键–Close Projects
这里写图片描述

接着选中Filtrs–Close Projects
这里写图片描述

那如果要打开隐藏的项目呢。
选择Project–Open Project
这里写图片描述

==================================
未完待续!

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐