尚硅谷Servlet

本文详细介绍了Servlet技术,包括Servlet的定义、如何编写Servlet程序、URL到Servlet的映射过程、Servlet生命周期、请求处理方式、HttpServlet的使用以及IDEA创建Servlet的步骤。此外,还探讨了ServletConfig和ServletContext的作用,HttpServletRequest类的功能,如请求转发、重定向以及Web路径的解析。
摘要由CSDN通过智能技术生成

Servlet技术

什么是Servlet
  • JavaEE接口之一
  • JavaWeb包含Servlet程序、Filter过滤器、Listener监听器三大组件。
  • 是运行在服务器上的Java程序,可以接收客户端请求,并响应数据给客户端
编写Servlet程序
  1. 创建工程并设置好Tomcat
  2. 在src下实现Servlet接口
package myServlet;

import javax.servlet.*;
import java.io.IOException;

public class HelloServlet implements Servlet{
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        
    }

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

//  Service方法是专门用来处理请求和响应的
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("visit!");
    }

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

    @Override
    public void destroy() {

    }
}

  1. 配置web.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标签给tomcat配置servlet程序-->
    <servlet>
        <!--servlet-name给程序起别名(通常是类名)-->
        <servlet-name>Helloservlet</servlet-name>
        <!--servlet-class是Servlet程序的全类名-->
        <servlet-class>myServlet.HelloServlet</servlet-class>
    </servlet>
    <!--servlet-mapping 标签给servlet程序配置访问地址-->
    <servlet-mapping>
        <servlet-name>Helloservlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
</web-app>
  1. 输入http://localhost:8080/06_servlet/hello即可得到访问提示
url到servlet程序的过程

image.png
/hello路径资源——web.xml中的servlet-mapping——对应url-pattern——映射到Helloservlet——找到具体的类名myServlet.HelloServlet

Servlet生命周期
  1. Servlet构造器方法
  2. init初始化方法

1、2步在第一次访问的时候,创建Servlet程序调用

  1. Service方法(每次访问都会调用)
  2. destroy方法(Web工程停止时调用)
package myServlet;

import javax.servlet.*;
import java.io.IOException;

public class HelloServlet implements Servlet{
    public HelloServlet() {
        System.out.println("构造器");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始化");
    }

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

//  Service方法是专门用来处理请求和响应的
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service");
    }

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

    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

GET和POSt请求分发处理
//向下转型到HttpServletRequest子类
HttpServletRequest hsr=(HttpServletRequest) servletRequest;

//获取请求方式
String method=hsr.getMethod();
继承HttpServlet实现Servlet程序

一般通过继承HttpServlet类的方式去实现Servlet程序,编写HttpServlet子类——根据业务需要重写doGet/doPost方法——到web.xml中配置Servlet程序的访问地址。

//修改method的post和get即可
<form action="http://localhost:8080/06_servlet/hello2" method="post">
  <input type="submit">
</form>
package myServlet;

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

public class HelloServlet2 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!");
    }
}
IDEA的Create New Servlet

没有点这里

Servlet类继承体系

image.png

ServletConfig类

  • ServletConfi类的三大作用:获得servlet-name的值、获取初始化参数init-param、获取servletContext对象
  • 配置文件
<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.study.service.HelloServlet</servlet-class>

    <!--初始化参数-->
    <init-param>
        <!--参数名-->
        <param-name>username</param-name>
        <!--参数值-->
        <param-value>root</param-value>
    </init-param>
    <init-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/test</param-value>
    </init-param>
</servlet>
  • 获取servletConfig对象
ServletConfig servletConfig = getServletConfig();
String username=servletConfig.getInitParameter("username");
System.out.println(username);

ServletContext类

  • 什么是ServletContext:ServletContext是一个接口,表示Servlet上下文对象。一个Web工程只有一个ServletContext对象实例,它是一个域对象。在Web工程部署时创建,工程停止时销毁。
  • 域对象:整个Web工程范围,像Map一样存取的对象。
  • 用途:
    • 获取Web.xml中context-param
<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.study.service.HelloServlet</servlet-class>
</servlet>
    <!--配置上下文参数(整个文件共享)-->
    <context-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>pwd</param-value>
    </context-param>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>
  • 获取当前工程路径
ServletConfig sc=getServletConfig();
sc.getContextPath();	//获取当前工程路径
sc.getRealPath("/");	//获取绝对路径
  • 获取工程部署后在服务器硬盘尚的绝对路径(Tomcat会将Web文件下的全部内容拷贝)

image.png

  • 像Map一样存取数据
context.setAttribute("key1","value1");
System.out.print(context.getAttribute("key1));

HttpServletRequest类

  • 作用:每次只要有请求进入Tomcat服务器,Tomcat就会把请求过来的Http协议信息解析好封装到Request对象中,然后传递到service方法(doGet/doPost)中给我们使用。可以通过HttpServletRequest对象获取到所有请求的信息。
  • 常用方法

image.png

  • 解决中文乱码
//doGet
String username=req.getParameter("username");	//获取请求参数
username=new String(username.getBytes("iso-8859-1"),"UTF-8");	//iso编码,utf8解码
//doPost
req.setCharacterEncoding("UTF-8");
请求转发

请求转发:服务器收到请求后,从一个资源跳转到另一个资源的操作,地址栏地址不变。
image.png

  • servlet1
package com.study.service;

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

public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("程序====01=====做一些在程序1中的事情:(共享Request域中的数据)");
        System.out.println("获取参数");
        System.out.println(req.getParameter("username"));
        req.setAttribute("key","value:盖章");

        System.out.println("=========请求转发======");
        // 斜杠表示 : http://ip:port/工程名/ , 映射到 IDEA 代码的 web 目录
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
        System.out.println("出发……");
        requestDispatcher.forward(req,resp);
    }
}
  • servlet2
package com.study.service;

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

public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("====servlet2程序====");
        System.out.println("查看参数:"+req.getParameter("username")+"  "+req.getAttribute("key"));
        System.out.println("处理自己的业务");
    }
}
HTML的Base标签

base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转。

### HttpServletResponse类
  • 作用:HttpServletResponse表示响应信息,通过该类可以对响应信息设置。
  • 输出流:getOutputStream();常用于下载,传递二进制数据。 getWriter();常用于回传字符串。两种方法不能同时使用。
  • 回传数据与中文乱码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    PrintWriter writer = resp.getWriter();
    writer.write("sevlet 回传数据");
}

//中文乱码
//设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");
//通过响应头,设置浏览器也是用UTF-8字符集
resp.setHeader("Content-Type","text/html;charset=UTF-8");

//同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
//此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html;charset=UTF-8");
请求重定向

请求重定向,是指客户端给服务器发送请求,然后服务器告诉客户端一个新的访问地址。
image.png

//方式一
resp.setStatus(302);
resp.setHeader("Location","http://localhost:8080");

//方式二
resp.sendRedirect("http://localhost:8080");
Web中的路径和斜杠/
  • 相对路径:.当前路径 …上一级目录
  • 绝对路径:http://ip:port/工程路径/资源路径
  • 实际开发中:绝对路径/ base+相对。
  • 斜杠/
    • 浏览器解析:http://ip:port/
    • 服务器解析:http://ip:port/工程路径
    • 特殊情况:response.sendRedict("/"); 把斜杠发送给浏览器解析,得到http://ip:port/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值