Servlet

Servlet是一种用Java编写的服务器端组件,用于处理客户端(通常是Web浏览器)发来的请求并生成动态内容。

Tomcat服务器

1.什么是Tomact

Tomcat 是一个开源的软件,用于运行和管理使用 Java 编程语言创建的网站和网络应用程序。它充当了一个服务器,可以理解和执行这些应用程序,然后将它们提供给用户通过网页浏览器访问。实际上,它是一个能够处理网站的“机器”,使开发人员能够在互联网上展示和运行他们的 Java 程序。

2.MAC安装Tomcat

1.进入Tomcat官网 Apache Tomcat® - Welcome!

2下载Tomcat10 解压到桌面 给权限

sudo  chmod 755 /Users/likedx/Desktop/tomcat10/bin/*.sh

3.启动

sh  /Users/likedx/Desktop/tomcat10/bin/startup.sh 

4.访问 http://127.0.0.1:8080/ 或者本机ip加上端口

5.停止服务

sh /Users/likedx/Desktop/tomcat10/bin/shutdown.sh 

MAC IDEA配置Tomcat

1.MAC打开IDEA创建新的工程按照如下勾选

2.继续下一步

Servlet实现方式

1.在java包下创建一个新的包名

2. 创建一个新的类名并设置注解

package com.demo.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

//设置注解并指定访问路径
@WebServlet("/ser01")
public class servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Hello Servlet!!");
    }
}

3.修改路径

在IDEA中选择Run - Editconfigurations..

1 可修改路径

2 打勾为在启动Tomcat时默认打开谷歌浏览器 也可以选其他

Servlet创建方式

1.继承HttpServlet类

package com.demo.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

/*
* 实现servlet
* 1. 创建普通java类
* 2. 实现servlet的规范,继承HttpServlet类
* 3. 重写service方法,用来处理请求
* 4. 设置注解,指定访问路径
* */

@WebServlet(name = "ser01", value = "/ser01")
public class servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Hello Servlet");
        resp.getWriter().write("Hello Servlet!!! ");
    }
}

2.继承GenericServlet类

package com.demo.servlet;

import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;

import java.io.IOException;

@WebServlet("/ser03")
public class servlet03 extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("继承GenericServlet类");
    }
}

3.实现Servlet接口

package com.demo.servlet;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebServlet;

import java.io.IOException;

@WebServlet("/ser02")
public class servlet02 implements Servlet {

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

    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("实现servlet接口");
    }

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

    @Override
    public void destroy() {

    }
}

HttpServletRequest对象

主要用来接收客户端发送过来的请求信息,例如:请求的参数,发送的头信息等都属于客户端发来的信息,service()方法中形参接收的是HttpServletRequest接口实例化对象,表示该对象主要应用在Http协议上,该对象是由Tomcat封装好传递过来。

1.常用方法

属性说明
getRequestUrl()获取客户端发出请求的完整url
getRequestUrl()获取请求中的资源名称部分
getQueryString()获取请求中的参数部分
getMethod()获取客户端请求方式
GetProtocol获取http版本号
getcontextPath()获取webapp名字
package com.demo.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/ser04")
public class ServletQuest extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取客户端请求的完整url
        String url = req.getRequestURL().toString();
        System.out.println("获取客户端请求的完整url是:" + "\t" +url);


        //获取客户端请求的部分url
        String uri = req.getRequestURI();
        System.out.println("获取客户端请求的部分url:" +  "\t" +uri);

        //获取请求中的参数部分
        String querystring = req.getQueryString();
        System.out.println("获取请求中的参数部分是" + "\t" + querystring);

        //获取客户端的请求方式
        String method = req.getMethod();
        System.out.println("获取客户端的请求方式" + "\t" + method);

        //获取http版本号
        String protocol = req.getProtocol();
        System.out.println("http的版本号是:" + "\t" + protocol);

        //获取指定名称的参数值 返回字符串
        //http://localhost:8080/demo/ser04?name=likedx&passwd=123
        String username = req.getParameter("name");
        String passwd = req.getParameter("passwd");
        System.out.println(username + "\t" + passwd);  // 取账号为likedx 密码为123

        //获取指定名称的参数所有参数值 返回字符串数组 (用于复选框传值)
        //
        String[] hobbys = req.getParameterValues("hobby");

        //判断数组是否为空
        if (hobbys != null && hobbys.length > 0) {
            for (String hobby : hobbys) {
                System.out.println("爱好: " + hobby); // 爱好:rap  爱好:跳舞
            }
        }

    }
}

2.解决乱码

servlet类

package com.demo.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/login")
public class Servlet04 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //req.setCharacterEncoding("UTF-8"); Tomcat8 post会乱码  
      // 获取前端url的用户名和密码
        String username = req.getParameter("name");
        String passwd = req.getParameter("passwd");
        System.out.println("账号: " + username);
        System.out.println("密码: " + passwd);
    }
}

Login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
    <form method="get" action="login">
        姓名:<input type="text" name="name"> <br>
        密码:<input type="password" name="passwd"> <br>
        <button>登录</button>
    </form>
</body>
</html>

在Tomcat8版本 post请求输入中文会乱码 则需添加指定格式

在Tomcat7版本 get请求乱码 也需添加指定编码格式

3.请求转发

用于将一个HTTP请求从一个Servlet发送到另一个Servlet进行处理。这种转发机制允许不同的Servlet协同工作来处理同一个请求,从而实现更复杂的业务逻辑和功能。

新建一个Servlet05和Servlet06类

package com.demo.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/ser05")
public class Servlet05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String username = req.getParameter("name");
        System.out.println("Servlet05 username : " + username);

        //请求转发到06
        //req.getRequestDispatcher("ser06").forward(req,resp);
        req.getRequestDispatcher("login.jsp").forward(req,resp);
                // 除了请求路径还可以是jsp和html
        //地址栏不变 结果改变
    }
}
package com.demo.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
@WebServlet("/ser06")
public class Servlet06 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String username = req.getParameter("name");
        System.out.println("Servlet06 username : " + username);

    }
}

4.作用域

Servlet作用域可以在以下多种情况下发生:

  1. 请求转发(Request Forwarding): 当一个Servlet通过请求转发将请求传递给另一个Servlet时,作用域可以用于在两个Servlet之间共享数据。
  2. 会话管理(Session Management): 在用户会话期间,通过会话作用域可以共享数据,无论是在同一个Servlet中还是在不同的Servlet之间。
  3. 全局应用程序范围(Application Scope): 上下文作用域(Application Scope)在整个应用程序生命周期内有效,允许不同的Servlet和请求之间共享数据。
  4. 请求响应周期中的不同阶段: 请求作用域可用于在同一次请求的不同阶段传递数据,而会话作用域可以在整个用户会话期间保持数据。
  5. 跨不同用户的请求: 通过会话作用域,不同用户之间可以在不同请求之间共享数据。
属性说明
request.setAttribute("key", "value");设置域对象内容
request.getAttribute("key");获取域对象内容
request.removeAttribute("key");删除域对象内容

假设某一个购物功能 有一个购物车用来存商品信息 用户在浏览不同的页面需要保持购物车的商品信息 此时需要用到作用域来进行数据共享 保证数据不会丢失

新建一个servlet07和servlet08类 07设置作用域 08负责获取作用域的数据 通过一次性转发来实现

package com.demo.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/ser07")
public class Servlet07 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("Servlet07!!!");

        //设置对象域内容
        req.setAttribute("name","admin");
        req.setAttribute("age",18);

        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbbb");
        req.setAttribute("list",list);

        req.getRequestDispatcher("ser08").forward(req,resp);
    }
}
package com.demo.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/ser08")
public class Servlet08 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("servlet08 !!");
        //获取对象域内容
        String name = (String) req.getAttribute("name");
        System.out.println("name :" + name);
        Integer age = (Integer) req.getAttribute("age");
        System.out.println("age :" + age);

        List<String> list = (List<String>) req.getAttribute("list");
        System.out.println(list.get(0));

    }
}

HttpServletResponse对象

是 Java Servlet API 中的一个类,它代表了一个HTTP响应。在Servlet中,当服务器接收到客户端(通常是Web浏览器)发送的HTTP请求后,它会生成一个相应的HttpServletResponse对象,用于构建和发送HTTP响应给客户端

1.解决响应乱码问题

package com.demo2.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/demo")
public class ServletTest extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 字符流
        // PrintWriter pw = resp.getWriter();
        // pw.write("Hello");
        // pw.close();
        //设置客户端和服务端的编码格式
        resp.setContentType("text/html;charset=UTF-8");
        //字节流
        ServletOutputStream sos = resp.getOutputStream();

        //输出数据 指定编码
        sos.write("你好".getBytes("UTF-8"));
        //关闭流
        sos.close();
    }
}

2.重定向

重定向可以分为两种类型:客户端重定向和服务器端重定向。

1.客户端重定向: 客户端重定向是通过发送特定的HTTP响应状态码和Location头来实现的。在Servlet中,你可以通过设置响应的状态码为"302 Found"或者其他重定向相关的状态码,并在响应头中设置Location字段来指定要重定向到的URL。客户端收到这个响应后,会自动向新的URL发起请求,从而实现重定向。

response.setStatus(HttpServletResponse.SC_FOUND; // 302状态码
response.setHeader("Location", "new_page.jsp"); // 要重定向的URL

2.服务器端重定向: 服务器端重定向是通过将请求转发给另一个URL来实现的。在Servlet中,你可以使用RequestDispatcher的forward方法将请求转发给另一个Servlet或JSP页面,然后由另一个页面处理请求并生成响应。

RequestDispatcher dispatcher = request.getRequestDispatcher("new_page.jsp");
dispatcher.forward(request, response); // 转发请求给新的页面

重定向的一个主要应用是在用户提交表单后进行页面跳转,以避免用户重新提交表单数据。此外,重定向还可以用于实现页面的简单跳转和URL的美化。

ServletTest02重定向ServletTest03类 02会执行完毕后在跳转到03 地址栏会发生变化

package com.demo2.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/demo2")
public class ServletTest02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Demo2.....");
        resp.sendRedirect("demo3");
    }
}
package com.demo2.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/demo3")
public class ServletTest03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo3...");
    }
}

3.请求转发和重定向的区别

请求转发:

  1. 地址不变
  2. 请求转发只有一次请求
  3. 请求转发时request对象可以共享
  4. 请求转发是服务端行为
  5. 请求转发时地址只能是当前站点下的资源

重定向:

  1. 地址会变
  2. 重定向有两次请求
  3. 重定向时request对象不可以共享
  4. 重定向是客户端行为
  5. 重定向时地址可以是任何地址

Cookie对象

Servlet中的Cookie对象是一种用于在Web应用程序中存储少量数据的机制。它允许服务器向客户端的浏览器发送一小段数据,并要求浏览器在随后的请求中将该数据带回服务器。这样,服务器可以在不同的HTTP请求之间保持一些状态信息,或者在客户端存储一些临时数据。

1.Cookie的创建和发送

package com.demo.cookie;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/cookie")
public class cookie extends HttpServlet {
   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //创建cookie
       Cookie cookie = new Cookie("name","admin");

       //发送cookie
       resp.addCookie(cookie);
   }
}

2.Cookie的获取

package com.demo.cookie;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
@WebServlet("/cookie02")
public class cookie2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // Cookie的获取 需要创建cookie数组
        Cookie[] cookies = req.getCookies();
        //判断cookie是否为空
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies){
                //获取cookie的名称和值
                String name = cookie.getName();
                String value = cookie.getValue();

                System.out.println("获取到的name :" + name + "获取到的value : " + value);
            }
        }
    }
}

3.Cookie设置到期时间

package com.demo.cookie;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/cookie3")
public class cookie3 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("name","zhangsan");
        Cookie cookie2 = new Cookie("name","lisi");

        cookie.setMaxAge(30); //存活30秒
        cookie2.setMaxAge(-1); //关闭浏览器失效
        cookie2.setMaxAge(0); //删除cookie

        //发送cookie
        resp.addCookie(cookie);
        resp.addCookie(cookie2);

    }
}

5.Cookie的路径

当前服务器下任何项目的任意资源都可以获取Cookie对象

Cookie cookie = new Cookie("xxx","xxx");
cookie.serPath("/");
resp.addCookie(cookie);

指定项目下的资源可获取Cookie对象

Cookie cookie = new Cookie("xxx","xxx");
cookie.serPath("/ser02");
resp.addCookie(cookie);

指定目录下的资源可获取Cookie对象

Cookie cookie = new Cookie("xxx","xxx");
cookie.serPath("/ser02/aaa");
resp.addCookie(cookie);

HttpSession对象

HttpSession允许你在用户访问你的网站时创建一个会话,并将一些数据存储在这个会话中。这些数据可以是用户的登录状态、购物车内容、用户首选项等等。每当用户发送新的HTTP请求时,服务器可以从会话中获取存储的数据,而不需要用户在每个请求中都提供这些数据。

1.标识符 JSESSION

package com.demo.session;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;
/*
* session 对象获取
*   request.getSession()
*   当获取session对象时会判断session对象是否存在 如果存在则获取session对象 不存在会创建session对象
*  */
@WebServlet("/session")
public class Session01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取session对象
        HttpSession session = req.getSession();

        //获取session会话标识
        String id = session.getId();
        System.out.println(id);

        //获取session的创建时间 时间戳
        System.out.println(session.getCreationTime());

        //获取最后一次访问时间
        System.out.println(session.getLastAccessedTime());

        //判断是否是新的session对象
        System.out.println(session.isNew());
    }
}

2.Session域对象

Session域对象就是一个存储在服务器端的容器,用于存放和管理与用户会话相关的数据。与其他域对象(如请求域和应用域)相比,Session域对象中存储的数据在整个会话过程中都是可用的。

当用户第一次访问你的网站时,服务器会为该用户创建一个唯一的会话,并为该会话创建一个Session域对象。随后,你可以将数据存储在这个Session域对象中,这些数据将在用户会话期间一直存在,直到用户退出或会话超时。

package com.demo.session;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;
/*
* session域对象
*   setAttribute() 设置域对象
*   getAttribute() 获取域对象
*   removeAttribute() 移除域对象
* 请求转发
*   一次请求
*   request作用域有效
*   session作用域有效
* 重定向
*   二次请求
*   session作用域有效
* */
@WebServlet("/session02")
public class Session02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取session对象
        HttpSession session = req.getSession();

        //设置域对象
        session.setAttribute("name","admin");
        session.setAttribute("pwd","666666");

        //移除域对象
        session.removeAttribute("pwd");


        //request域对象
        req.setAttribute("username","zhangsan");

        // 请求转发到index.jsp页面
        //req.getRequestDispatcher("index.jsp").forward(req,resp);
        
        // name: null pwd: null username: null
        // name: null pwd: null username: null
        // name: admin pwd: null username: zhangsan

        //重定向跳转到jsp页面
        resp.sendRedirect("index.jsp");
        // name: admin pwd: null username: null
    }
}
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>获取域对象</title>
</head>
<body>
<%
    //获取session域对象
    String name = (String) request.getSession().getAttribute("name");
    String pwd = (String) request.getSession().getAttribute("pwd");

    //获取request对象
    String username = (String) request.getAttribute("username");
    System.out.println("name: " + name + " pwd: " + pwd + " username: " + username);

%>

</body>
</html>

3.Session对象的销毁

Session域对象销毁指的是在用户会话结束或会话过期时,Session域对象中存储的数据被清除并且Session本身被关闭的过程。这意味着会话中存储的数据不再可用,而且后续的HTTP请求将无法访问之前存储在Session域中的数据。

  1. 手动设置到期时间

    //获取session对象
    HttpSession session = req.getSession();
    //设置session的最大不活动时间
    session.setMaxInactiveInterval(15); //15秒
    
    //查看session的最大不活动时间
    int time = session.getMaxInactiveInterval();
    System.out.println(time); //1800 30分钟
  2. 立即失效

    //立即销毁
    session.invalidate();
  3. 服务器重启
package com.demo.session;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

@WebServlet("/session03")
public class Session03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取session对象
        HttpSession session = req.getSession();
        //设置session域对象
        session.setAttribute("name","admin");
        //设置session的最大不活动时间
        session.setMaxInactiveInterval(15); //15秒

        //查看session的最大不活动时间
        int time = session.getMaxInactiveInterval();
        System.out.println(time); //1800 30分钟

        //立即销毁
        //session.invalidate();
    }
}

ServletContext对象

ServletContext对象是在Java Web应用程序中表示整个Web应用程序环境的一个重要对象。它提供了访问应用程序范围内的配置信息、资源和功能的方式,可以在整个Web应用程序中共享数据和状态。

1.通过request对象获取

ServletContext servletContext = req.getServletContext();

2.通过session对象获取

ServletContext servletContext1 = req.getSession().getServletContext();

3.通过servletConfig对象获取

ServletContext servletContext2 = getServletConfig().getServletContext();
package com.demo.ServletContext;

import jakarta.servlet.Servlet;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
/*
* 获取ServletContext对象
*
* */
@WebServlet("/s01")
public class Servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //通过request获取
        ServletContext servletContext = req.getServletContext();

        //通过session对象获取
        ServletContext servletContext1 = req.getSession().getServletContext();

        //通过ServletConfig对象获取
        ServletContext servletContext2 = getServletConfig().getServletContext();

        //直接获取
        ServletContext servletContext3 = getServletContext();

        // 常用方法
        // 1.获取当前服务器版本信息
        String serverinfo = req.getServletContext().getServerInfo();
        System.out.println(serverinfo); //Apache Tomcat/10.1.11

        //2.获取项目真实路径
        String realPath = req.getServletContext().getRealPath("/");
        System.out.println(realPath); // /Users/likedx/Desktop/ideaProject/target/ideaProject-1.0-SNAPSHOT/
    }
}

ServletContext域对象

Application(ServletContext)域是一种在整个 Web 应用程序范围内存储数据的机制。在整个应用程序生命周期内,不同的 Servlet 可以通过 Application 域共享数据。这种数据共享适合于应用程序级别的配置信息、全局数据等。

//获取ServletContext对象
ServletContext servletContext = req.getServletContext();

//设置域对象
servletContext.setAttribute("name","zhangsan");

//获取域对象
String name = (String) servletContext.getAttribute("name");

//移除域对象
servletContext.removeAttribute("name");

Servlet三大域对象

1.Request 域: 在一次请求中有效。请求转发有效,重定向失效。

2.Session 域:在一会话中有效。请求转发和重定向都有效,session销毁后失效。

3.Application(ServletContext)域:在整个应用程序中有效。Application 域中的数据在应用程序关闭时失效。

文件上传

1.前台页面

upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<!--
    文件上传
      1.准备表单
      2.设置表单类型 method="post"
      3.设置表单类型为文件上传表单
      4.设置文件提交的地址
      5.准备表单元素
        1.普通的表单项
        2.文件项
      6.设置表单元素的name属性值
-->
  <form method="post" enctype="multipart/form-data" action="uploadServlet">
    姓名<input type="text" name="uname"> <br>
    文件<input type="file" name="myfile"> <br>
    <!-- button默认提交表单是 "submit"   -->
    <button>提交</button>
  </form>
</body>
</html>

2.后台实现

package com.xxx.demo;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;

import java.io.IOException;

@WebServlet("/uploadServlet")
@MultipartConfig //如果是文件上传 必须要设置该注解
public class uoloadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("文件上传");

        //设置请求的编码格式
        req.setCharacterEncoding("UTF-8");

        String uname = req.getParameter("uname"); //这个uname是表单中表单元素的值
        System.out.println("uname: " + uname);

        //获取Part对象
        Part part = req.getPart("myfile"); //表单中文件域的属性值

        //通过Part对象得到上传的文件名
        String fileName = part.getSubmittedFileName();
        System.out.println("上传文件名: " + fileName);

        //得到文件存放的路径
        String filePath = req.getServletContext().getRealPath("/");
        System.out.println("文件存放的路径: " + filePath);

        part.write(filePath + "/" + fileName);

    }
}

解决jdbc连接tomcat出现的问题

最后修改:2023 年 08 月 16 日
如果觉得我的文章对你有用,请随意赞赏