Java Servlet

请求

请求行 方式 uri http/1.1

请求头

请求体

form表单标签提交Get请求时,参数以键值对形式放在url后,不放在请求体里,Get方式的请求也是可以有请求体的

Post请求时,放在请求头里面


Servlet  (server applet) 是运行在服务端(tomcat)的Java小程序,是sun公司提供一套定义动态资源规范; 从代码层面上来讲Servlet就是一个接口

  • 用来接收、处理客户端请求、响应给浏览器的动态资源。在整个Web应用中,Servlet主要负责接收处理请求、协同调度功能以及响应数据。我们可以把Servlet称为Web应用中的控制器

Java Servlet_第1张图片

Java Servlet_第2张图片

Java Servlet_第3张图片

package cn.nanchengyu.servlet;

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

/**
 * ClassName: UserServlet
 * Package: cn.nanchengyu.servlet
 * Description:
 *
 * servlet开发流程
 * 1.创建Javaweb项目,同时将tomcat添加为当前项目的依赖
 * 2.重写service方法,service(HttpServletRequest req, HttpServletResponse resp)
 * 3.在service方法中,定义业务处理代码
 * 4.在web.xml中配置Servlet对应的请求映射路径
 * @Author 南城余
 * @Create 2023/11/20 11:26
 * @Version 1.0
 */
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        1.从request对象中获取请求中的任何信息(username参数)
        String username = request.getParameter("username");
//        2.处理业务代码
        String info = "yes";
        if("nanchengyu".equals(username)){
            info = "no";
        }
//        3.将响应的数据放入response中
        // 应该设置Content-Type响应头
        response.setHeader("Content-Type","text/html");
        PrintWriter writer = response.getWriter();
        writer.write(info);

    }
}




    
        
        userServlet
        com.atguigu.servlet.UserServlet
    


    
        
        userServlet
        
        /userServlet
       
        
       
    

xml大段编写太过麻烦,一般采用@WebServlet注解源码

@WebServlet(
        name = "userServlet",
        //value = "/user",
        urlPatterns = {"/userServlet1","/userServlet2","/userServlet"},
        initParams = {@WebInitParam(name = "encoding",value = "UTF-8")},
        loadOnStartup = 6
)
public class UserServlet  extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String encoding = getServletConfig().getInitParameter("encoding");
        System.out.println(encoding);
        // 获取请求中的参数
        String username = req.getParameter("username");
        if("atguigu".equals(username)){
            //通过响应对象响应信息
            resp.getWriter().write("NO");
        }else{
            resp.getWriter().write("YES");
        }
    }
}

servlet生命周期

  1. 实例化 构造器 第一次请求 1
  2. 初始化 init 构造完毕 1
  3. 接受请求 service 每次请求 每刷新一次+1
  4. 销毁 destory 关闭服务 1

Servlet在tomcat中是单例的

servlet的成员变量在多个线程中是共享的

不建议在service方法中修改成员变量

继承HttpServlet后,要么重写service方法,要么重写doGet/doPost方法

ServletConfig和ServletContext

ServletConfig是什么

  • 为Servlet提供初始配置参数的一种对象,每个Servlet都有自己独立唯一的ServletConfig对象
  • 容器会为每个Servlet实例化一个ServletConfig对象,并通过Servlet生命周期的init方法传入给Servlet作为属性

Java Servlet_第4张图片

ServletContext是什么

  • ServletContext对象有称呼为上下文对象,或者叫应用域对象(后面统一讲解域对象)
  • 容器会为每个app创建一个独立的唯一的ServletContext对象
  • ServletContext对象为所有的Servlet所共享
  • ServletContext可以为所有的Servlet提供初始配置参数

    Java Servlet_第5张图片

请求转发和响应重定向

什么是请求转发和响应重定向

  • 请求转发和响应重定向是web应用中间接访问项目资源的两种手段,也是Servlet控制页面跳转的两种手段
  • 请求转发通过HttpServletRequest实现,响应重定向通过HttpServletResponse实现
  • 请求转发生活举例: 张三找李四借钱,李四没有,李四找王五,让王五借给张三
  • 响应重定向生活举例:张三找李四借钱,李四没有,李四让张三去找王五,张三自己再去找王五借钱

请求转发特点

Java Servlet_第6张图片

  1. 请求转发是通过HttpServletRequst对象实现的
  2. 请求转发只产生一次请求 服务器只产生了一对request和response对象
  3. 请求转发是服务器内部行为,对客户端是屏蔽的
  4. 客户端的地址栏是不变的
  5. 请求的参数是可以继续从传递的
  6. 目标资源可以是servlet动态资源,也可以是HTML静态资源
  7. 目标资源可以是WEB-INF下受保护的资源,该方式也是WEB-INF下资源的唯一访问方式
  8. 请求转发不可以是外部资源
响应重定向特点

Java Servlet_第7张图片

302重定向

  1. 重定向是通过HttpServletRespose对象的sendRedirect方法实现的
  2. 响应重定向是在服务器提示下的,客户端行为
  3. 客户端的地址栏是变化的
  4. 客户端至少发送了两次请求, 也可以产生多次请求
  5. 请求产生了多次 后端就会有多个request对象 此时请求中的参数不能继续自动传递
  6. 目标资源可以是视图资源(即图片文字等)
  7. 目标资源不可以是WEB-INF资源
  8. 目标资源可以是外部资源

如果两种方式都可以完成页面跳转,优先考虑重定向

乱码问题(get和post)

Java Servlet_第8张图片

相对路径和绝对路径

相对路径

以当前资源的所在路径为出发点去找目标资源

语法:

不以/开头

./表示当前资源的路径

../表示当前资源的上一层路径

绝对路径

始终以固定的路径作为出发点去找目标资源 和当前资源的所在路径没有关系

语法

以/开头

不同的项目中,固定的路径出发点可能不一致,可以测试一下 http://localhst:8080/demo5/static/img/logo.png

解决上述问题

一般采用绝对路径加不设置项目路径上下文

Java Servlet_第9张图片

MVC

Java Servlet_第10张图片

你可能感兴趣的:(南城余的Java学习,java,servlet,开发语言)