5 web资源:
在http协议当中,规定了请求和响应双方,客户端和服务器。与web相关的资源。
静态资源:
html、css、css
动态资源:
Servlet/jsp
6 什么是Servlet?
一个java程序,运行在web服务器上,用于接收和响应http请求
更多的是配合动态资源来做,当然静态资源也需要使用到servlet,只不过
7 Servlet的通用写法:
Servlet(接口,通用规范)---->GenericServlet(通用实现)----->HttpServlet(用于处理http请求,覆盖doget,dopost)
8 Servlet的生命周期
生命周期:从创建到销毁的一段时间
生命周期方法:
init():初次访问执行此方法
service():服务器 每收到一次请求,则执行一次service方法
destory():Servlet销毁的时候,调用此方法(从tomcat里面移除,或者正常关闭tomcatshutdown.bat)
9 Servlet初始化提前
默认情况下,只有在初次访问Servlet的时候,才会执行init方法。
有时可能需要在这里执行一些初始化的操作,或者耗时的逻辑。
此时,初次访问,可能会在init方法中逗留太久的时间。
可以在Servlet中做如下配置,使得Tomcat启动时就初始化该Servlet.给定的数越小,越早初始化。一般不写负数,从2开始即可。
<load-on-startup>2</load-on-startup>
10 ServletConfig Servlet配置对象
ServletConfig config = getServletConfig()
//拿到servletname
String name = config.getServletName()
//拿到初始化参数init-param
String address = config.getInitParameter("address");
System.out.println("address:"+address);
11 ServletContext Servlet环境,上下文
There is one context per "web application"
per Java Virtual Machine.
*每个web工程只有一个ServletContext,指向同一个内存地址
作用:
1 获取全局参数
2 获取web资源(通过获取绝对路径,然后根据Properties)
3 存储数据,Servlet间共享数据,ServletContext域对象
(1)先得到路径,然后自己new InputStream
context.getRealPath("");//此处得到项目在Tomcat里面的根目录
context.getRealPath("/file/.priperties");//此处得到属性文件在Tomcat里面的根目录
(2)getReasourceAsStream获取资源,流对象
InputStream is = context.getResourceAsStream("/file/config.properties");
properties.load(is);
(3)用getClassLoader
InputStream is = this.getServletContext().getClassLoader().getResourceAsStream("../../file/config.properties");
properties.load(is);
12 HttpServletRequest和HttpServletResponse
request:包含请求的信息,封装了客户端提交过来的一切数据
request.getHeader(hNames):可以获得请求头信息
response:响应数据给客户端
13 ServletContext对象何时销毁?
服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象
从服务器移除托管,或是关闭服务器。
ServletContext的作用范围:
只要在这个项目里都可以
A项目存,B项目取,是取不到的。
14 获取头信息
request.getHeaderNames()
request.getHeader(hNames);
15 解决Servlet中文乱码问题
(1)Request中的中文乱码:
如果是get,直接在Tomcat里面配置URIEncoding="UTF-8",以后编码都是默认UTF-8
如果是post,在取数据之前设置request的编码:request.setCharacterEncoding("UTF-8");这个对get无效
(2)Response的中文乱码:
//设置的是http协议的编码,在浏览器页面呈现的编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
16 Response下载资源
//获取需要下载的文件名
String filename = request.getParameter("filename");
//获取Tomcat下的绝对路径
String path = getServletContext().getRealPath("file/"+filename);
//让浏览器收到这份资源的时候,以下载的方式提醒用户,而不是直接以流的方式展示
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//流
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
//执行流读取输出操作
17 请求转发和重定向 (面)
//重定向早期写法
response.setStatus(302);//设置状态码为重定向
response.setHeader("Location", "login_success.html");
//重定向新写法
response.sendRedirect("login_success.html");
//请求转发写法
request.getRequestDispatcher("login_success.html").forward(request, response);
请求转发:
1 地址上显示的是请求Servet的地址
2 请求次数只有一次,因为是服务器内部帮客户端执行了后续的工作,状态码是200OK
3 可以跳转到任意路径,不是自己的工程也可以跳
4 因为只执行一次请求,所以效率高一点
5 后续的请求可以使用上一次Request请求存储的对象
重定向:
1 地址栏显示的是最后资源的路径
2 请求次数最少两次,服务器在第一次请求后会返回302以及一个地址location,浏览器根据这个地址执行第二次访问
3 只能跳转自己项目的资源路径
4 效率相较要低,执行两次请求
5 后续的请求无法使用上一次Request存储的对象,因为这是两次不同的请求
18 Cookie
*Cookie:服务器存储在客户端上的一份小数据,由于存储在客户端上,有安全隐患
*Cookie的创建和销毁:
创建:有服务器创建响应给客户端
Cookie c = new Cookie("time",""+System.currentTimeMillis());
response.addCookie(new Cookie());
销毁:
会话Cookie:关闭浏览器就失效
持久Cookie:在指定的限期内有效。setMaxAge();
*应用场景:自动登录,浏览记录,购物车
*为什么有Cookie:
http的请求是无状态。
客户端与服务器在通讯的时候是无状态的(不同的请求之间无法传递数据)
为了更好的收集用户习惯【大数据】。
Cookie的常用方法:
//Cookie的有效期
cookie1.setMaxAge(60*60*24*7);//此方法返回以秒为单位的生存时间,默认为-1,浏览器关闭就结束
//只有请求了指定的域名,才会带上Cookie
cookie1.setDomain(".itheima.com");
//只有访问该域名下的CookieDemo的这个路径地址才会带Cookie
cookie1.setPath("/CookieDemo");
//添加Cookie
reponse.addCookie(cookie);
*Cookie的简单使用:
1 在响应的时候,添加Cookie
2 客户端收到的信息里面,响应头多了一个字段name=value
//设置编码
//response.setContentType("text/html;charset=UTF-8");
response.setHeader("Content-Type", "text/html;charset=UTF-8");
//cookie 服务器发送给客户端,并且保存在客户端的小数据
Cookie cookie = new Cookie("CookieName", "CookieValue");
//服务器响应客户端,发送Cookie给客户端
response.addCookie(cookie);
response.getWriter().write("请求成功了");
//服务器获取客户端带过来的cookie
Cookie[] cookies = request.getCookies();
if(cookies !=null){
for (Cookie c : cookies) {
String cookieName = c.getName();
String cookieValue = c.getValue();
System.out.println("Name:"+cookieName+"\nValue:"+cookieValue);
}
}
19 显示上一次登录的访问时间
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
response.setContentType("text/html;charset=utf-8");
//拿到页面表单的数据,完成登录功能
String username = request.getParameter("username");
String password = request.getParameter("password");
//日期格式化
String pattern = "yyyy年MM月dd日 HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
// String strTime = sdf.format(d);
if("admin".equals(username) && "123".equals(password)){
//拿到Cookie数组
Cookie[] cookies = request.getCookies();
//找到需要的Cookie
Cookie timeCookie = CookieUtils.findCookie(cookies,"time");
//判断是否第一次登录
if(timeCookie==null){
Cookie c = new Cookie("time",""+System.currentTimeMillis());
c.setMaxAge(60*60);
response.addCookie(c);
response.getWriter().write("欢迎您!"+username);
}else{
//不是第一次登录
response.getWriter().write("欢迎您!</br>");
Long visitTime = Long.parseLong(timeCookie.getValue());
response.getWriter().write("您的上一次登录时间是:"+sdf.format(new Date(visitTime)));
timeCookie.setValue(""+System.currentTimeMillis());
response.addCookie(timeCookie);
}
}else{
response.getWriter().write("登录失败");
}
}
20 Session
session:是什么?
基于cookie的一种会话技术。 数据存放在服务器端,会在Cookie里面添加一个字段JSESSIONID
cookie 是可以把数据存放在客户端, 下一次来访的时候,带上那个数据,服务器就知道客户端是谁了。 ---》 安全隐患。
Session : 数据存放在服务器端。 并且把这个session对应的sessionID ,是通过Cookie去传递的,传递给客户端。
下一次客户端在来访的时候,带上那个sessionID ,就可以取到以前的数据了。
常用方法:
//得到会话ID
String id = session.getId();
session.setAttribute(name, value);
session.getAttribute(name);
session.removeAttribute(name);
session的创建和销毁:
创建:
request.getSession
如果有在Servlet里面调用代码,则创建
销毁:服务器关闭,会话超时(默认30分钟),调用invalidate方法
session是存放在服务器内存中的一份数据,可以持久化.redis.
即使关了浏览器,session也不会销毁.关闭服务器、会话时间过了有效期(默认30分钟)则销毁