转发与重定向的区别
转发
- 地址不变
- 浏览器一次请求
- 服务器内部跳转
重定向
- 地址会变
- 浏览器二次请求
- 浏览器跳转
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>