Java Servlet

简介: Java Servlet

请求

请求行 方式 uri http/1.1

请求头

请求体

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

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


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

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

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);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <servlet>
        <!--给UserServlet起一个别名-->
        <servlet-name>userServlet</servlet-name>
        <servlet-class>com.atguigu.servlet.UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--关联别名和映射路径-->
        <servlet-name>userServlet</servlet-name>
        <!--可以为一个Servlet匹配多个不同的映射路径,但是不同的Servlet不能使用相同的url-pattern-->
        <url-pattern>/userServlet</url-pattern>
       <!-- <url-pattern>/userServlet2</url-pattern>-->
        <!--
            /        表示通配所有资源,不包括jsp文件
            /*       表示通配所有资源,包括jsp文件
            /a/*     匹配所有以a前缀的映射路径
            *.action 匹配所有以action为后缀的映射路径
        -->
       <!-- <url-pattern>/*</url-pattern>-->
    </servlet-mapping>
</web-app>

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作为属性

ServletContext是什么

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

请求转发和响应重定向

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

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

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

302重定向

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

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

乱码问题(get和post)

相对路径和绝对路径

相对路径

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

语法:

不以/开头

./表示当前资源的路径

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

绝对路径

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

语法

以/开头

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

解决上述问题

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

MVC

目录
相关文章
|
6天前
|
Java
学院管理系统【JSP+Servlet+JavaBean】(Java课设)
学院管理系统【JSP+Servlet+JavaBean】(Java课设)
25 3
学院管理系统【JSP+Servlet+JavaBean】(Java课设)
|
6天前
|
Java
排课系统【JSP+Servlet+JavaBean】(Java课设)
排课系统【JSP+Servlet+JavaBean】(Java课设)
19 5
|
6天前
|
Java
仓库管理系统【JSP+Servlet+JavaBean】(Java课设)
仓库管理系统【JSP+Servlet+JavaBean】(Java课设)
16 1
|
6天前
|
Java
学校教师管理系统【JSP+Servlet+JavaBean】(Java课设)
学校教师管理系统【JSP+Servlet+JavaBean】(Java课设)
18 2
|
6天前
|
Java
校园帮【JSP+Servlet+JavaBean】(Java课设)
校园帮【JSP+Servlet+JavaBean】(Java课设)
9 1
|
6天前
|
Java
新闻发布系统【JSP+Servlet+JavaBean】(Java课设)
新闻发布系统【JSP+Servlet+JavaBean】(Java课设)
16 2
|
6天前
|
Java
学校人员管理系统【JSP+Servlet+JavaBean】(Java课设)
学校人员管理系统【JSP+Servlet+JavaBean】(Java课设)
13 2
|
6天前
|
Java
学生信息管理系统【JSP+Servlet+JavaBean】(Java课设)
学生信息管理系统【JSP+Servlet+JavaBean】(Java课设)
17 1
|
6天前
|
Java
图书信息管理系统【JSP+Servlet+JavaBean】(Java课设)
图书信息管理系统【JSP+Servlet+JavaBean】(Java课设)
10 0
|
6天前
|
Java
个人信息管理系统【JSP+Servlet+JavaBean】(Java课设)
个人信息管理系统【JSP+Servlet+JavaBean】(Java课设)
11 0