ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Servlet学习笔记

2022-05-16 02:33:07  阅读:148  来源: 互联网

标签:http servlet request 笔记 学习 cookie import Servlet javax


第一个servlet程序

第一种方式

package com.hz.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.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");
        //通过流输出数据到浏览器
        resp.getWriter().write("hello servlet");
    }
}

image-20220514163206911

第二种方式

package com.hz.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/s2")
public class servlet02 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("继承GenericServlet方式...");


    }
}

第三种方式

package com.hz.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/s3")
public class servlet03 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() {

    }
}

servlet生命周期

package com.hz.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/s4")
public class Servlet04 extends HttpServlet {
    /**
     * 就绪/服务方法(处理请求数据)
     * 系统方法,服务器自动调用
     * 当有请求到达servlet时,就会调用该方法
     * 该方法可以被多次调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet被调用了");
    }

    /**
     * 销毁方法
     * 系统方法,服务器自动调用
     * 当服务器关闭或应用程序停止时,调用该方法
     * 这个方法也只执行一次
     */
    @Override
    public void destroy() {
        System.out.println("servlet被销毁了");
    }
  //初始化方法 系统方法,服务器自动调用  当请求到达servlet容器时,servlet会判断该servlet对象是否存在,如果不存在,则创建实例并初始化
  // 方法只会执行一次。
    @Override
    public void init() throws ServletException {
        System.out.println("servlet被创建了");
    }
}

常用方法

package com.hz.servlet02;

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

@WebServlet("/s001")
public class Servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 常用方法
         * 1.获取请求时的完整路径(从http开始到?前面结束)
         * 2.获取请求时部分路径(从项目的站点名开始,到?前面结束)
         * 3.获取请求时的参数字符串(从?后面开始,到最后的字符串)
         * 4.获取请求方式(GET/POST)
         * 5.获取协议版本(HTTP/1.1)
         * 6.获取项目的站点名(项目的对外访问路径)
         */
        String url = request.getRequestURL().toString();
        System.out.println("请求时完整路径"+url);

        String uri= request.getRequestURI().toString();
        System.out.println("获取部分路径"+uri);

        String queryString = request.getQueryString();
        System.out.println("获取请求时的参数字符串"+queryString);

        String method = request.getMethod();
        System.out.println("获取请求方式"+method);

        String protocol = request.getProtocol();
        System.out.println("获取当前的协议版本"+protocol);

        String contextPath = request.getContextPath();
        System.out.println("获取项目的站点名"+contextPath);//上下文路径

        /**
         * 获取请求的参数
         * 1.获取指定名称的参数值,返回字符串(!!!!!)
         * 2.获取指定名称的参数的所有参数值(用于复选框传值)
         */
        String uname=request.getParameter("uname");
        String upwd=request.getParameter("upwd");
        System.out.println("uname:" +uname);
        System.out.println("upwd:" +upwd);

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



    }
}

打印输出结果

image-20220514180550050

请求乱码问题

package com.hz.servlet02;

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

/**乱码原因:
 *     由于在解析过程中默认使用的编码格式为ISO-8859-1(此编码不支持中文),所以解析时一定会出现乱码
 * 请求乱码问题
 * Tomcat 8以上版本   GET请求不会乱码
 *                   POST请求会乱码,通过设置服务器解析编码格式
 *                    //设置请求的编码格式    放在获取参数前面
 *                      req.setCharacterEncoding("UTF-8");
 *
 * 乱码情况
 *    POST请求:无论什么版本的服务器,post请求中文都会乱码  解决方式 req.setCharacterEncoding("UTF-8");
 *    注意:req.setCharacterEncoding("UTF-8"); 只针对POST请求乱码
 */
@WebServlet("/s002")
public class Servlet02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求的编码格式    放在获取参数前面
        req.setCharacterEncoding("UTF-8");

        //获取客户端传递的参数
        String uname = req.getParameter("uname");
        String upwd = req.getParameter("upwd");
        System.out.println("姓名:"+ uname);
        System.out.println("密码:"+ upwd);
    }
}

请求转发

package com.hz.servlet02;

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

/**
 *请求转发跳转  request.getRequestDispatcher(url).forward(request,response);
 *    可以让请求从服务器跳转到客户端(或者转到指定的Servlet)
 *
 *    特点:
 *    1.服务端行为
 *    2.地址栏不发生改变
 *    3.从始至终只有一个请求
 *    4.数据可以共享
 */
@WebServlet("/s003")
public class Servlet03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //接收参数
        String uname = request.getParameter("uname");
        System.out.println("Servlet03 uname" +uname);

          //请求转发到servlet04
//        request.getRequestDispatcher("s004").forward(request,response);
        //请求转发到jsp页面
//        request.getRequestDispatcher("login.jsp").forward(request,response);
        //请求转发到html页面
        request.getRequestDispatcher("login.html").forward(request,response);
    }
}

image-20220514190340659

获取域对象内容

package com.hz.servlet02;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 *request作用域
 * 通过该对象可以再一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效(请求转发跳转时有效)
 *
 */
@WebServlet("/s005")
public class Servlet05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("servlet05..........");

         //设置域对象
        request.setAttribute("name","admin");
        request.setAttribute("age",18);
        List<String> list= new ArrayList<>();
        list.add("aaaa");
        list.add("bbbb");
        request.setAttribute("list",list);
        //请求转发跳转到servlet06
//        request.getRequestDispatcher("s006").forward(request,response);
        //请求转发跳转到jsp  并通过域对象传递数据
        request.getRequestDispatcher("index.jsp").forward(request,response);
    }
}

<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <h2>index页面</h2>
<%--    若果要在jsp中写java代码,需要写在脚本段中--%>
  <%
    //获取域对象
    //获取域对象内容
    String name= (String) request.getAttribute("name");
    System.out.println("name:"+name);
    Integer age= (Integer) request.getAttribute("age");
    System.out.println("age:"+age);
    List<String> list= (List<String>) request.getAttribute("list");
    System.out.println(list.get(0));
  %>
  </body>
</html>

HttpResponse

package com.hz.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;

/**
 * 响应数据
 *    getWrite() 字符输出流  输出字符串
 *    getOutputStream() 字节输出流  输出一切数据
 *
 *    两种流不可同时使用,同时使用会报错
 *    java.lang.IllegalStateException: 已为此响应调用getWriter()
 *
 */
@WebServlet("/s01")
public class Servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        getWrite() 字符输出流  输出字符串
        //获取字符输出流
        PrintWriter writer = response.getWriter();
        //输出数据
        writer.write("hello");

        //getOutputStream() 字节输出流
        //得到字节输出流
        ServletOutputStream outputStream = response.getOutputStream();
        //输出数据
        outputStream.write("HI".getBytes());
    }
}

字符流响应数据乱码问题

package com.hz.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;

/**
 * 字符流响应数据
 * 乱码解决:
 * 1.设置服务端的编码格式
 * response.setCharacterEncoding("UTF-8");
 * 2.设置客户端的编码格式
 * response.setHeader("content-type","text/html;charset=UTF-8");
 *
 * 总结:设置服务器端和客户端的编码都支持中文,且保持一致
 *
 * 同时设置客户端和服务端的编码
 *response.setContentType("text/html;charset=UTF-8");
 */
@WebServlet("/s02")
public class Servlet02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        getWrite() 字符输出流  输出字符串
        /*//设置服务端编码格式
        response.setCharacterEncoding("UTF-8");
        //设置客户端的编码格式和响应的MIME类型
        response.setHeader("content-type","text/html;charset=UTF-8");*/

        //同时设置服务端和客户端的编码格式
        response.setContentType("text/html;charset=UTF-8");
        //获取字符输出流
        PrintWriter writer = response.getWriter();
        //输出数据
        writer.write("<h2>你好呀</h2>");

    }
}

字节流乱码格式解决

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

/**
 * 字节流响应数据
 *
 */
@WebServlet("/s03")
public class Servlet03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        //getOutputStream() 字节输出流
        //同时设置服务端和客户端的编码格式
        response.setContentType("text/html;charset=UTF-8");
        //得到字节输出流
        ServletOutputStream outputStream = response.getOutputStream();
        //输出数据
        outputStream.write("<h2>你好</h2>".getBytes());
    }
}

重定向

package com.hz.servlet;

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

/**
 * 重定向
 * 服务端指导,客户端行为
 * 存在两次请求
 * 地址栏会发生改变
 */
@WebServlet("/s04")
public class Servlet04 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Servlet04........");
        //接收参数
        String uname = request.getParameter("uname");
        System.out.println("servlet04:"+uname);

        //重定向到s05
        response.sendRedirect("s05");
    }
}

package com.hz.servlet;

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

/**
 * 重定向
 */
@WebServlet("/s05")
public class Servlet05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Servlet05........");

        //接收参数
        String uname = request.getParameter("uname");
        System.out.println("servlet05:"+uname);



    }
}

请求转发和重定向区别

请求转发request.getRequestDispatcher().forward() 重定向response.sendRedirect();
一次请求,数据在request域中共享 两次请求,request域中数据不共享
服务器端行为 客户端行为
地址栏不会发生变化 地址栏发生变化
绝对地址定位到站点后 绝对地址可写到http://
package com.hz.servlet;

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

/**
 * 请求转发与重定向区别
 * 1.请求转发地址栏不会发生改变,重定向的地址栏会发生改变
 * 2.请求转发只有一次请求,重定向有两次请求
 * 3.请求转发request对象可共享,重定向request不共享
 * 4.请求转发是服务端行为,重定向是客户端行为
 * 5.请求转发的地址只能是当前站点下(当前项目)的资源,重定向时地址可以是任何地址
 */
@WebServlet("/s06")
public class Servlet06 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Servlet06........");

        //接收参数
        String uname = request.getParameter("uname");
        System.out.println(uname);

        //设置request域对象
        request.setAttribute("upwd","123456");

        //请求转发
//        request.getRequestDispatcher("index.jsp").forward(request,response);
        //重定向跳转到百度
//        response.sendRedirect("http://www.baidu.com");
        //请求转发到百度(404找不到)
        request.getRequestDispatcher("http://www.baidu.com").forward(request,response);


    }
}

Cookie对象

image-20220515162559426

cookie创建

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

/**
 * Cookie的创建和发送
 */
@WebServlet("/cook01")
public class Cookie01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //cookie的创建
        Cookie cookie = new Cookie("name","admin");
        //发送(响应)cookie对象
        response.addCookie(cookie);
        
    }
}

cookie获取

package com.hz.cookie;

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

/**
 * Cookie获取
 * 返回的是cookie数组
 */
@WebServlet("/cook02")
public class Cookie02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //获取cookie数组
        Cookie[] cookies= request.getCookies();

        //判断cookie是否为空
        if (cookies!=null&&cookies.length>0){
            //遍历cookie数组
            for (Cookie cookie : cookies) {
                //获取cookie的名称和值
                String name=cookie.getName();
                String value=cookie.getValue();
                System.out.println("名称:"+name);
                System.out.println("值:"+value);
            }
        }

    }
}package com.hz.cookie;

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

/**
 * Cookie获取
 * 返回的是cookie数组
 */
@WebServlet("/cook02")
public class Cookie02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //获取cookie数组
        Cookie[] cookies= request.getCookies();

        //判断cookie是否为空
        if (cookies!=null&&cookies.length>0){
            //遍历cookie数组
            for (Cookie cookie : cookies) {
                //获取cookie的名称和值
                String name=cookie.getName();
                String value=cookie.getValue();
                System.out.println("名称:"+name);
                System.out.println("值:"+value);
            }
        }

    }
}

cook到期时间

package com.hz.cookie;

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

/**
 * cookie的到期时间
 */
@WebServlet("/cook03")
public class Cookie03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //到期时间:负整数(默认值-1  表示只在浏览器内存中存活,关闭浏览器失效)
        Cookie cookie = new Cookie("uname1","张三");
        cookie.setMaxAge(-1);//关闭浏览器失效
        response.addCookie(cookie);


        //到期时间:正整数(表示存活指定秒数,会将数据存在磁盘中)
        Cookie cookie2 = new Cookie("uname1","张三");
        cookie.setMaxAge(30);//存活30秒
        response.addCookie(cookie2);

        //到期时间:0(表示删除cookie)
        Cookie cookie3 = new Cookie("uname1","张三");
        cookie.setMaxAge(0);//删除cookie
        response.addCookie(cookie3);


    }
}

cookie乱码问题

package com.hz.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;

/**
 * cookie的到期时间
 */
@WebServlet("/cook04")
public class Cookie04 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     //cookie存中文
        String name="姓名";
        String value="李四";

        //将中文通过编码
        name= URLEncoder.encode(name);
        value=URLEncoder.encode(value);

        //创建cookie对象
        Cookie cookie = new Cookie(name,value);
        //响应cookie
        response.addCookie(cookie);

         //获取cookie通过解码获取
        Cookie[] cookies=request.getCookies();

        //判断非空
        if (cookies!=null&&cookies.length>0){
            //遍历
            for (Cookie cookie1 : cookies) {
                //解码
                System.out.println(URLDecoder.decode(cookie1.getName()));
                System.out.println(URLDecoder.decode(cookie1.getValue()));

            }
        }
    }
}

cookie注意点:

  1. cookie只在当前浏览器中有效(不跨浏览器和电脑)
  2. cookie不能存中文
    • 如果一定要存中文需要通过URLEncoder.encode()方法进行编码,获取时通过URLDecoder().decode()方法进行解码
  3. 如果出现同名的cookie对象,则会覆盖
  4. cookie的存储数量是有上限的,不同浏览器的

cookie的路径问题

package com.hz.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;

/**
 * cookie的路径问题
 * 
 * 总结:只有访问的路径中包含cookie对象的path值,才可以获取到该cookie对象
 */
@WebServlet("/cook05")
public class Cookie05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.当前服务器的任何项目的任意资源都可获取Cookie对象
        Cookie cookie01 =new Cookie("cookie01","cookie01");
        //设置路径为"/",表示在当前服务器下的任何项目都可访问到cookie对象
        cookie01.setPath("/");
        response.addCookie(cookie01);

        //2.当前项目下的资源可以获取cookie对象(默认不设置cookie的path)
        Cookie cookie02 =new Cookie("cookie02","cookie02");
        //默认不设置cookie的path或者设置为当前站点名
        cookie02.setPath("/sr04");
        response.addCookie(cookie02);

        //3.指定项目下的资源可以获取cookie对象
        Cookie cookie03 =new Cookie("cookie03","cookie03");
        //默认不设置cookie的path或者设置为当前站点名
        cookie03.setPath("/sr03");
        response.addCookie(cookie03);


        //4.指定目录下的资源可以获取cookie对象
        Cookie cookie04 =new Cookie("cookie04","cookie04");
        //默认不设置cookie的path或者设置为当前站点名
        cookie04.setPath("/sr04/cook02");
        response.addCookie(cookie04);
    }
}

HttpSession对象

image-20220515182314274

package com.xxxx.servlet;

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

/**
 * session对象的获取
 *     request.getSession()
 *     当获取session对象时,会判断session对象是否存在,如果存在,则获取session对象,如果不存在,则创建session对象
 */
@WebServlet("/ser01")
public class Session01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session
        HttpSession session = request.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());
    }
}

session失效时间

package com.xxxx.servlet;

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

/**
 *Session对象的销毁
 * 1.默认到期时间是30分钟
 *2.手动设置到期时间
 * 3.立即销毁
 * 4.关闭浏览器
 *     session底层依赖cookie,cookie对象默认只在浏览器内存中存活,关闭浏览器即失效
 * 5.关闭服务器失效
 */
@WebServlet("/ser03")
public class Session03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();

        //对象的最大不活动时间
//        System.out.println("session对象的最大不活动时间"+session.getMaxInactiveInterval());

        //修改最大不活动时间
//        session.setMaxInactiveInterval(15);

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

servletContext

package com.xxxx.servlet;

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

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

        //2.通过session对象获取
        ServletContext servletContext02 = request.getSession().getServletContext();

        //3.通过servletConfig对象获取
        ServletContext servletContext03 = getServletConfig().getServletContext();

        //4.直接获取
        ServletContext servletContext04 = getServletContext();

        //常用方法
        //1.获取当前服务器的版本信息
        String serverInfo = request.getServletContext().getServerInfo();
        System.out.println("版本信息:"+serverInfo);

        //2.获取项目的真实路径
        String realPath = request.getServletContext().getRealPath("/");
        System.out.println("真实路径:"+realPath);

    }
}

image-20220515200047337

Servlet的三大域对象

1.request域对象

在一次请求中有效。请求转发有效,重定向失效

2.session域对象

在一次会话中有效。请求转发和重定向有效,session销毁后失效

3.servletContext域对象

在整个应用程序中有效,服务器关闭后失效

文件上传

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<!--   文件上传
              1.准备表单
              2.设置表单的提交类型  method="post"
              3.设置表单类型为文件上传表单  enctype="multipart/form-data"
              4.设置文件提交的地址
              5.准备表单元素
                   1.普通表单项 type="text"
                   2.文件项   type="file"
              6.设置表单元素的name属性值(表单提交一定要设置表单元素的name属性值,否则后台无法接受数据)


   -->
<form method="post" enctype="multipart/form-data" action="uploadServlet">
    姓名:<input type="text" name="uname"><br>
    文件:<input type="file" name="myfile"><br>
<!--    button默认类型是提交类型  type="submit"-->
    <button>提交</button>


</form>
</body>
</html>

后台代码

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;

/**
 * 文件上传
 * 使用@MultipartConfig将一个servlet标识为支持文件上传
 * servlet将multipart/form-data的POST请求封装成Part对象,通过Part对上传的文件进行操作
 */

@WebServlet("/uploadServlet")
@MultipartConfig//如果是文件上传,必须要设置该注解!!!!!
public class UploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("文件上传");
        //设置请求的编码格式
        request.setCharacterEncoding("UTF-8");
        //获取普通表单项(获取参数)
        String uname=request.getParameter("uname");//表单中表单元素的name属性值
        System.out.println("uanme:"+uname);

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

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

        //得到文件存放的路径
        String filePath=request.getServletContext().getRealPath("/");
        System.out.println("文件存放的路径"+filePath);
        //上传文件到指定目录
        part.write(filePath+"/"+fileName);
    }
}

image-20220515221018461

文件下载

超链接下载

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
<!--              超链接下载-->
<!--                  当使用超链接(a标签)时,如果遇到浏览器能够识别的资源,则会显示内容:若果遇到浏览器不能识别的资源,则会进行下载-->
<!--        浏览器能够识别的资源-->
        <a href="download/任务书胡征.doc">文本文件</a>
        <a href="download/胡征证件照.jpg">图片文件</a>
<!--        浏览器不能识别的资源-->
        <a href="download/2022届软件学院毕业设计材料模板(不要改动模板格式及日期由老师确定).zip">压缩文件</a>
        <hr>
        <a href="download/胡征证件照.jpg" download="证件照.jpg">图片文件</a>

</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
<!--              超链接下载-->
<!--                  当使用超链接(a标签)时,如果遇到浏览器能够识别的资源,则会显示内容:若果遇到浏览器不能识别的资源,则会进行下载-->
<!--        浏览器能够识别的资源-->
        <a href="download/任务书胡征.doc">文本文件</a>
        <a href="download/胡征证件照.jpg">图片文件</a>
<!--        浏览器不能识别的资源-->
        <a href="download/2022届软件学院毕业设计材料模板(不要改动模板格式及日期由老师确定).zip">压缩文件</a>
        <hr>
        <a href="download/胡征证件照.jpg" download="证件照.jpg">图片文件</a>
        <hr>
            <form action="downloadServlet">
                文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名">
                <button>下载</button>

             </form>
</body>
</html>
package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 文件下载步骤
 * 1.
 */
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("文件下载.....");

        //设置请求的编码格式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //获取参数(得到要下载的文件名)
        String fileName=request.getParameter("fileName");

        //参数的非空判断    trim():去除字符串的前后空格
        if (fileName==null||"".equals(fileName.trim())){
            response.getWriter().write("请输入要下载的文件名");
            response.getWriter().close();
            return;
        }

        //得到图片存放的路径
        String path=request.getServletContext().getRealPath("/download/");

        //通过路径得到file对象
        File file=new File(path+fileName);

        //判断文件对象是否存在并且是一个标准文件
        if (file.exists()&&file.isFile()){
            //设置响应类型,浏览器无法使用某种方式或激活某个程序来处理MIME类型
            response.setContentType("application/x-msdownload");
            //设置头信息
            response.setHeader("Content-Disposition","attachment;filename="+fileName);
            //得到file文件的输入流
            InputStream in= new FileInputStream(file);
            //得到字节输出流
            ServletOutputStream out=response.getOutputStream();
            //定义byte数组
            byte[] bytes=new byte[1024];
            //定义长度
            int len=0;
            //循环输出
            while ((len=in.read(bytes))!=-1){
                //输出内容
                out.write(bytes,0,len);
            }

            //关闭资源
            out.close();
            in.close();
        }else {
            response.getWriter().write("文件不存在,请重试");
            response.getWriter().close();
        }
    }
}

标签:http,servlet,request,笔记,学习,cookie,import,Servlet,javax
来源: https://www.cnblogs.com/huzheng1023/p/16275505.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有