JAVA Web

转发与重定向的区别

转发

  1. 地址不变
  2. 浏览器一次请求
  3. 服务器内部跳转

重定向

  1. 地址会变
  2. 浏览器二次请求
  3. 浏览器跳转

Servlet与Request的生命周期

Servlet
第一次被访问时,由Tomcat创建,创建1次,线程不案例
项目卸载时,由Tomcat销毁

Request
每次发送请求时,由Tomcat创建
响应结束时,由Tomcat销毁

响应体乱码应如何解决

response.setContentType(“text/html; charset=utf-8”)

ServletContext

获取真实路径

  • String application.getRealPath(String relativePath)
  • InputStream application.getResourceAsStream(String relativePath)
@WebServlet("/context_real_path")
public class ContextRealPathServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext application = getServletContext();

        // 不会做"文件是否存在"的判断
        // 只是单纯地字符串拼接
//        String realPath = application.getRealPath("WEB-INF/druidd.properties");
//        FileInputStream is = new FileInputStream(realPath);
//        is.close();
//        System.out.println(realPath);

        InputStream is = application.getResourceAsStream("WEB-INF/druid.properties");
        is.close();

        // 相对于ContextRealPathServlet所在的路径
        // ContextRealPathServlet.class.getResourceAsStream("druid.properties");

        // 相对于src路径
        // ContextRealPathServlet.class.getClassLoader().getResourceAsStream("druid.properties");

        // 相对于web路径
        // application.getResourceAsStream()
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

获取文件的方式

  • new FileInputStream(String absolutePath)

    通过绝对路径获取输入流

  • 类名.class.getResourceAsStream(String relativePath)

    相对于***类名***所在的路径

  • 类名.class.getClassLoader().getResourceAsStream(String relativePath)

    相对于src路径

  • application.getResourceAsStream(String relativePath)

    相对于web路径

获取全局初始化参数

  • String application.getInitParameter(String name)
@WebServlet("/context_init_param")
public class ContextInitParamServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取上下文域对象
        ServletContext application = getServletContext();

        // 获取在web.xml中配置的全局初始化参数
        String url = application.getInitParameter("url");
        String username = application.getInitParameter("username");
        String password = application.getInitParameter("password");
        String driverClassName = application.getInitParameter("driverClassName");

        System.out.println(url);
        System.out.println(username);
        System.out.println(password);
        System.out.println(driverClassName);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

上下文域

请求域: 每个用户的每次请求
上下文域: 所有用户的所有请求

案例: 统计某一个Servlet的访问次数

@WebServlet("/count")
public class CountServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html; charset=utf-8");
        PrintWriter out = response.getWriter();

        // 获取上下文域
        ServletContext application = getServletContext();

        // 要明确当前是第几次
        // 那么就需要先知道上一次是第几次
        // 想要知道上一次是第几次,就需要先把作用域里面的值读出来
        Integer count = (Integer) application.getAttribute("count");

        // 如果读到一个null,代表没有
        // 本次才是第一次
        if (count == null) {
            count = 1;
        }

        // 如果读到了一个数字,代表有
        // 那么累计即可
        else {
            count++;
        }

        application.setAttribute("count", count);

        out.write("<h1>访问了" + count + "次</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

会话技术

Cookie

  • response.addCookie(Cookie cookie)

    向浏览器发送一个cookie
    浏览器接收到了的话,那么就会保存此cookie

  • request.getCookies()

    在服务器接收浏览器发送过来的所有cookie

  • new Cookie(String name, String value)

    创建一个Cookie对象
    注意,并不会因为创建了,就发送给浏览器的
    需要借助response.addCookie才能发送

  • cookie.getName()

    获取cookie名

  • cookie.getValue()

    获取cookie值

  • cookie.setValue()

    修改cookie值
    注意,是在服务器内部修改的,并不会因为修改了,就发送给浏览器的
    浏览器的cookie数据,还是以前的
    需要借助response.addCookie(cookie)
    重新将cookie发送给浏览器
    此时浏览器才会覆盖

@WebServlet("/cookie_send")
public class CookieSendServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("username", "zhangsan");
        response.addCookie(cookie);

        Cookie password = new Cookie("password", "123456");
        response.addCookie(password);

//        response.addHeader("Set-Cookie", "username=zhangsan");
//        response.addHeader("Set-Cookie", "password=123456");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

Cookie中文解决方案

  • URLEncoder.encode(String str, String unc)
  • URLDecoder.decode(String str, String unc)

Cookie设置超时时间

默认的Cookie的超时时间为: 只要浏览器不关,就一直存在。直到浏览器关闭掉
设置Cookie的超时时间,并且下次关闭浏览器且打开浏览器后,只要超时时间不过
那么,就依然存在

  • cookie.setMaxAge(int expiry)

    设置超时时间,单位为秒

@WebServlet("/cookie_send")
public class CookieSendServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("username", "zhangsan");
        response.addCookie(cookie);

        Cookie password = new Cookie("password", "123456");
        response.addCookie(password);

        Cookie realname = new Cookie("realname", URLEncoder.encode("张三", "utf-8"));
		
		// 设置超时时间为24小时
        realname.setMaxAge(24 * 60 * 60);
        response.addCookie(realname);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

Session

入门程序

@WebServlet("/session_fund")
public class SessionFundServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html; charset=utf-8");
        PrintWriter out = response.getWriter();

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // 获取session对象
        HttpSession session = request.getSession();

        out.write("<h1>创建时间: " + format.format(session.getCreationTime()) + "</h1>");
        out.write("<h1>Id: " + session.getId() + "</h1>");
        out.write("<h1>上次访问时间: " + format.format(session.getLastAccessedTime()) + "</h1>");
        out.write("<h1>Is new: " + session.isNew() + "</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

Session销毁相关

单独设置session的超时时间

@WebServlet("/inactive_interval")
public class InactiveIntervalServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();

        // 设置session的最大非活动时长
        session.setMaxInactiveInterval(30);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

立即销毁session

@WebServlet("/session_invalid")
public class SessionInvalidServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();

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

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

配置session的默认超时时间

  • web.xml
    <session-config>
	    <!-- 配置session的超时时间,10分钟 -->
        <session-timeout>10</session-timeout>
    </session-config>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值