servlet学习总结——servlet入门

1、Servlet

1.1 servlet的概述

1.1.1 什么是servlet

● Servlet(Server Applet)是Java Servlet的简称,称为服务器端小程序,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
● 狭义的Servlet是指Java语言实现的一个接口
● 广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

1.1.2 使用Servlet

● 编写一个Java类实现Servlet的接口
● 在web.xml中,配置Servlet

1.1.3 编写servlet入门程序

新建web项目
image
修改发布路径
image
导包
image
image
编写servlet程序


//1.编写一个类实现Servlet接口
//2.我们首先编写一个实现Servlet接口的类,谁来调用?
//3.谁来创建对象,谁来调用  tomcat来创建和调用
public class HelloServlet implements Servlet {



    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {

        System.out.println("HelloServlet被调用了...");

        response.getWriter().write("Hello Servlet!");

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

配置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>
    <!--servlet名字-->
    <servlet-name>HelloServlet</servlet-name>
    <!--servlet的全限定名-->
    <servlet-class>com.gxa.servlet.HelloServlet</servlet-class>
  </servlet>
  
  <!--配置虚拟路径-->
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  
  
</web-app>

1.1.4 总结

image

Tomcat的访问流程
image

Tomcat引擎执行的操作

  1. 接受并解析客户端浏览器的请求 "/day04/hello"
  2. 创建2个对象 request, response
  3. 在webapps找访问的资源 "com.gxa.servlet.HelloServlet"
  4. 反射技术创建类的对象
  5. 调用对象中的方法 service, 传递参数 request, response
  6. 数据写在了 reponse对象的缓冲区中
  7. service方法结束后,数据从response对象的缓冲区取出,组装成HTTP的响应信息, 回传给浏览器

2、ServletContext

image

3、ServletConfig

ServletConfig对象封装Servlet的相关信息,获取Servlet的名字,可以获取Servlet的初始化参数,获取ServletContext的引用。
image

4、HttpServlet

有两个service方法,一个方法向下转型,然后传给重写的service

public abstract class HttpServlet extends GenericServlet {
    
  //实现service方法
  public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        //向下转型
        HttpServletRequest request;
        HttpServletResponse response;
        try {
            request = (HttpServletRequest)req;
            response = (HttpServletResponse)res;
        } catch (ClassCastException var6) {
            throw new ServletException(lStrings.getString("http.non_http"));
        }
        //调用重载的service方法
        this.service(request, response);
    }
    
    
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求的方式,判断调用doGet还是doPost方法
            String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
                this.doGet(req, resp);
         
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        }

    }
    
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = lStrings.getString("http.method_get_not_supported");
        this.sendMethodNotAllowed(req, resp, msg);
    }
    
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = lStrings.getString("http.method_post_not_supported");
        this.sendMethodNotAllowed(req, resp, msg);
    }

}

image

5、HttpServletResponse

HttpServletResponse我们可以往里面去设置响应行,响应头,响应体,tomcat解析response对象,封装成http的响应,返回给浏览器。

解决中文乱码问题:
中文乱码有两个点:

// 一个是服务器字符流的编码设置为UTF-8  
response.setCharacterEncoding("UTF-8");

// 一个是要告诉浏览器用UTF-8的格式打开 
response.setHeader("content-type","text/html; charset=utf-8");
// 或者简写为
 response.setContentType("text/html; charset=utf-8");

重定向问题:
告诉浏览器重定向,重定向浏览器的行为,浏览器的地址栏会发生变化

    response.setStatus(302);
    // 告诉重定向的网址
    response.setHeader("location","http://www.baidu.com");

    // 封装便捷方式
    response.sendRedirect("http://localhost:8080/day05_web/responseServlet03");

6、HttpServletResponse

tomcat把http请求的信息封装到了request对象中,并且把该对象通过service方法传给了我们,我们可以取出请求行,请求头,请求体。
对于get与post请求等不同的请求,若不需要区分可以通过继承HttpServlet再重写Service方法避免代码的重复编写

解决请求乱码(post)

解决post请求乱码  与get请求无关
req.setCharacterEncoding("UTF-8");

转发问题:
转发是服务器内部的行为,一次请求一次响应 浏览器地址没有变化 request域的数据可以传递,同一个request对象

//转发
req.getRequestDispatcher("/requestDemo08").forward(req,resp);

防盗链技术:
referer 请求来源,如果我们通过一个网页的超连接访问某个资源,浏览器会携带一个referer头,告诉服务器请求的来源。
可以根据referer 的值来进行判断是否来自我们希望的地址

posted @ 2022-07-28 22:35  夜色哪里都是美  阅读(65)  评论(0)    收藏  举报