Servlet
学习地址
1. HTTP
超文本传输协议,规定了客户端和服务端的传输规则
客户端发送给服务器:请求
服务器返回给客户端:响应
2.1 Http的特点
- 支持客户/服务器模式
- 简单快速:只需请求方法和路径
- 灵活:传输类型不限定
- 无连接:处理完请求,接受应答后断开连接
- 无状态:无法处理之前的事务
2.2 HTTP-URL
http-url:是一种特殊的url
URI 在于I(Identifier)是统一资源标示符,可以唯一标识一个资源。URL在于Locater,一般来说(URL)统一资源定位符,可以提供找到该资源的路径,比如http://www.zhihu.com/question/21950864,但URL又是URI,因为它可以标识一个资源,所以URL又是URI的子集。
http://+IP:+端口(port)+/访问资源路径(abc_path)
- http:// 通过http协议定位网络资源
- host:主机域名/IP地址
- port:端口号,缺省为80端口
- abc_path:指定资源的URI
2.3 Http请求
Http请求有三部分组成:
- 请求行:请求方式+请求地址+请求版本
- 请求头:键值对
- 请求正文:get 没有post有
2.4 Http响应
- 响应行:协议版本、响应状态码、说明
- 响应头:键值对
- 响应正文:浏览器中看到的
2.5 消息头
2.5.1 请求头
referer : 请求是从哪个页面发出的(防盗链、百度竞价)
例如:邀请好友,点击好友的链接…
2.5.2响应头
Location:重定向接收者的新位置,常用于更换域名
Refresh : 自动跳转(秒)
3.Servlet创建
- 创建jiavaweb工程
- 创建类实现Servlet规范,继承HttpServlet类
- 业务实现,重写service方法,处理请求
- 设置注解@WebServlet("/ss") :ss:访问标记
3.1 Servlet生命周期
- 实例和初始化时机:请求到达容器
- 就绪、调用、服务阶段:调用Servlet的service反法
- 销毁时机:关闭容器、应用程序停止时,servlet实例会销毁
4 Servlet的HttpServletRequest对象
HttpServletRequest:用于接受客户端请求信息,由服务器直接通过Servlet容器获取
4.1常用方法
获取请求时完整路径(http—>?): request.getRequestURL();
获取请求时部分路径(项目名—>?): request.getRequestURI();
获取请求时参数字符串(?之后):request.getQueryString();
获取请求方式(get 、post):request.getMethod();
获取协议版本:request.getProtocol();
获取项目站点名( 项目对外访问路径):request.getContextPath();
url:http://localhost:8080/ss/ss01
uri:/ss/ss01
qs:null
method:GET
pro:HTTP/1.1
cp:/ss
4.2获取指定名称的参数值
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String[] classes = request.getParameterValues("classes");
System.out.println("name:" + name+"\n"+"password:"+pwd);
name:ys
password:ys116291
4.3表单提交:ss01为service所在的那个@WebServlet("/ss01")
<form action="ss01" method="post">
姓名 <input type="text" name="name"> <br>
密码 <input type="password" name="pwd"> <br>
<button>登录</button>
</form>
设置接受请求的字符集(只针对post请求):
//接受请求的字符集
request.setCharacterEncoding("UTF-8");
4.4 请求转发
填写url:转发到哪个service
request.getRequestDispatcher("ss02").forward(request,response);
也可以跳至html jsp
request.getRequestDispatcher("tz.html").forward(request,response);
1. 地址栏不变
2. ss01 ss02都执行了同一个请求,数据共享
4.5request作用域
通过该对象可以在一次请求中传递数据,作用范围:一次请求—>服务器跳转有效
让两个service传输数据
setAttribute() 设置域对象
getAttribute() 获取域对象
@WebServlet("/ss03")
request.setAttribute("name","aaa");
request.setAttribute("age",22);
request.getRequestDispatcher("/ss04").forward(request,response);
@WebServlet("/ss04")
Object name = request.getAttribute("name");
Object age = request.getAttribute("age");
System.out.println(name);
System.out.println(age);
5. Servlet的HttpServletResonse对象
通过resonse对象向客户端输出数据
5.1 响应数据
5.1.1 getwrite(); 字符输出流(输出字符串)
5.1.2 getOutputStream(); 字节输出流(输出任意数据)
//输出流
PrintWriter writer = response.getWriter();
writer.write("hello");
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("这是一个输出字节流".getBytes());
只能存在一种输出流
两种输出流都会乱码,因此需要设定服务端、客户端的编码格式。
5.1.3 设置客户端、服务端编码集
//同时设定两端编码集
response.setContentType("text/html;charset=UTF8");
6.重定向
服务器指导,客户端的行为。客户端请求1,服务器响应1,并给客户端一个新的url,客户端立刻自动访问这个url,发出请求2,服务器处理请求2,重定向完成。
response.sendRedirect("ss04");
- 服务端指导,客户端行为
- 两次请求
- 地址栏发生改变,参数无法共享,区别于请求转发。
7.请求转发于重定向的比较
当前后两个页面有数据传递时,例如查询了数据需要在页面显示时,用请求转发
当没有数据传递,例如做了更新操作跳转到其他页面,就用重定
想要跳转的地址不是当前项目下的只能用重定向,即请求转发不能跨域
8 Cookie对象
将一些只需保存在客户端的数据,放到本地计算机中,不需要通过网络传输,Cookice是服务器端保存在客户端的信息,安全性较差。
8.1Cookie创建 及发送
//创建cookie
Cookie cookie = new Cookie("name","ys");
//发送cookie
response.addCookie(cookie);
8.2获取cookie
//获取cookie数组
Cookie[] cookies = request.getCookies();
//遍历
for (Cookie i:cookies
) {
System.out.println("name:"+i.getName());
System.out.println("nvalue:"+i.getValue());
}
}
8.3Cookie的到期时间
Cookie的默认到期时间为了浏览器关闭时失效
通过setMaxAge(int time)
- 负整数:关闭浏览器则失效
- 正整数:指定存活秒数,将数据存在磁盘中。
- 0:删除指定的cookie
cookie.setMaxAge(30);
cookie.setMaxAge(-1);
cookie.setMaxAge(0);
8.4 Cookie的注意点
- 只存储在当前浏览器中,当前磁盘中
- COOkie不能存储中文
- 重复的Cookie会覆盖
- 有上限、有大小限制
8.5 Cookie的路径
四种情况:
- 当前服务器下任何项目都可以访问到Cookie
- 当前项目下的资源可以访问到Cookie
- 指定项目下的资源可以访问到Cookie
- 指定目录下的资源可以访问到Cookie
9.HttpSession对象
session是为了标记一次会话或者一个用户,并且再一次会话期间共享数据,session保存在当前浏览器中,并在相关页面获得。
9.1获取session
HttpSession session = request.getSession();
获取session时,若不存在则创建session
获取sessionid
String id = session.getId();
E68DAA7ED656C391EE9A7CEA417B5977
E68DAA7ED656C391EE9A7CEA417B5977
E68DAA7ED656C391EE9A7CEA417B5977
每当一次请求到达,如果开启了session,
- 服务器会查看从客户端传回的名为JSESSIONID的cookie,如果没有则创建新的session,
- 如果有则是否含有id与传回的id相同的session,没有则创建新的会话,
- 反之不创建,返回该重复的session对象实现数据共享。
JSESSIONID:会话标识符
9.2Session域对象
创建session域对象
session.setAttribute("sname","ys");
session.setAttribute("spwd","ys116");
获取session域对象
String sname = (String) request.getSession().getAttribute("sname");
String spwd = (String) request.getSession().getAttribute("spwd");
结论:session域中的对象,无论是重定向,还是请求转发,都能共享数据,而request域中的对象,仅仅在请求转发时才能共享数据,重定向后就无法共享。即无法跨域。
9.3 Session对象的销毁,共享的数据失效
- 默认销毁时间:30分钟(不操作开始计时)
- 自定义 在tomcat 的web.xml的配置文件中ctrl-f :session-config 修改
- session.setMaxInactiveInterval();修改指定的session 参数是秒
- ** 立即销毁:session.invalidate(); (常用)**
- 关闭浏览器失效,因为session依赖的Jsessionid是一个cookie,而cookie默认为关闭浏览器失效。
10. ServletContext对象
10.1获取servletcontext对象
- 通过request获取(常用)
ServletContext servletContext = request.getServletContext();
- 通过session获取
ServletContext servletContext1 = request.getSession().getServletContext();
- 通过servletConfig对象获取
ServletContext servletContext2 = getServletConfig().getServletContext();
- 直接获取
ServletContext servletContext3 = getServletContext();
10.2常用方法
获取当前服务器版本信息
request.getServletContext().getServerInfo();
Apache Tomcat/9.0.56
获取项目的真是路径
request.getServletContext().getRealPath("/");
D:\servlet_learn\target\servlet_learn-1.0-SNAPSHOT\
10.4servletcontext域对象
整个应用程序有效,服务器关闭才失效,但是不推荐使用
Servlet的三大域对象
1. request域对象:仅仅在一次请求中有效,重定向失效
2. session域对象:在一次会话中有效。session销毁失效
3. servletcontext域对象:整个应用程序有效,服务器关闭失效