JavaEE应用-Servlet
JavaEE应用-Servlet
JavaEE 基础
一:Servlet 实现
继承抽象类 HttpServlet 的重写部分方法(常用)
添加注解 @WebServlet(“/LoginServlet”)
servlet3.0 引入了 @WebServlet,@WebFilter 等注解,可以代替在 web.xml 中通过
等标签进行配置 , 从而可以摆脱掉 web.xml,@WebServlet(“/LoginServlet”)
1 | 创建 Indexservlet 的类 |
二:Servlet 的工作流程与生命周期
Servlet 的生命周期可以分为四个阶段,即装载类及创建实例阶段、初始化阶段、服务阶段和实例销毁阶段。
- 1、初始化阶段 调用 init () 方法
- 2、响应客户请求阶段。调用 service () 方法,由 service () 方法根据提交的方式选择执行 doGet () 或者 doPost () 方法
- 3、终止阶段 调用 destroy () 方法
工作流程:
- 通过请求头获知浏览器访问的是哪个主机
- 在通过请求行获取访问的是哪个 web 应用
- 再通过请求行中的请求路径获知访问的是哪个资源
- 通过获取的资源路径在配置中匹配到真实路径
- 服务器会创建 servlet 对象,(如果第一次访问时,创建 - servlet 实例,并调用 init 方法进行初始化操作)
- 调用 service(request,response)方法来处理请求和响应的操作
- 调用 service 完毕后返回服务器 由服务器将 response 缓冲区的数据取出
三,HttpServleRequest 对象
作用:主要用来接受客户端发送过来的请求信息。例如:请求的参数,发送的头信息等都属于客户端发来的信息,service () 方法中的形参接受的是 HttpServletRequest 接口的实例化对象,表示对象主要运用在 HTTP 协议上,该对象有 Tomcat 封装好传递过来
接受请求:
常用方法:
getRequestURL ():获取客户端发出请求时的完整 URL
getRequestURL ():获取请求行中的资源名称部分(项目名称开始)
getQueryString ():获取请求行中的参数部分
getMethod ():获取客户端的请求方式
getProtocol ():获取 HTTP 版本号
getContextPath ():获取 webapp 名字(站点名)
1 | String url = req.getRequestURL().toString(); |
1 | /** |
请求转发:
请求转发,是一种服务器的行为,当客户端请求达到后,服务器进行准发,此时会将请求对象进行保存,地址栏中的 URL 地址不会改变,得到响应后,服务端在响应发送给客户端,从始至终只有一个请求发出。
1 | request.getRequestDispatcher(url).forward(request.response); |
Request 作用域
通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务跳转有效
1 | //设置域对象内容 |
request 域对象中的数据在一次请求中有效,则经过请求转发,request 域中的数据依然存在,则在请求转发的过程中可以通过 request 来传输 / 共享数据
响应数据
接收到客户端请求后,可以通过 HttpServletResponse 对象直接进行响应,响应时需要获取输出流。
有两种形式:
getWriter() 获取字符流 (只能响应回字符)
getOutputStream() 获取字节流 (能响应一切数据)
重定向
重定向是一种服务器指导,客户端的行为。客户端发出第一个请求,被服务器接收处理后,服务器会进行响应,在响应的同时,服务器会给客户端一个新的地址,当客户端接收到响应后,会立刻、马上、自动根据服务器给的新地址发起二个请求,服务器接收请求并作出响应,重定向完成。
resp.sendRedirect("url");
请求转发与重定向的区别
- 请求转发的地址栏不发生改变,重定向的地址会被改变
- 请求转发是服务端跳转,重定向是客户端跳转
- 请求转发是一次请求,重定向是两次请求
- 请求转发是 request 作用域可以共享,重定向是不可以共享
- 请求转发的地址是跳转到当前项目的资源,重定向可
跳转到任意资源
- 请求转发的地址是跳转到当前项目的资源,重定向可
1 | package com.example.demo2; |
Cookie 对象
通过 new Cookie (“key” “value”); 来创建一个 Cookie 对象,要想将 Cookie 随响应发送到客户端,需要先添加到 response 对象中,response.addCookie (cookie); 此时该 cookie 对象则随着响应发送至了客户端。在浏览器上可以看见
cookie 获取
1 | Cookie cookie =new Cookie("uname","admin"); |
Cookie 的路径
Cookie 的 setPath 设置 cookie 的路径,这个路径直接决定服务器的请求是否会从浏览器中加载某些 cookie。
// 1.当前服务器下,任务项目的任意资源,都可获取Cookie对象
Cookie cookie01=new Cookie("aa","AA");
cookie01.setPath("/");
resp.addCookie(cookie01);
// 2.在当前项目下,可以获取cookie对象(默认)
Cookie cookie02=new Cookie("bb","BB");
cookie02.setPath("/zhongsheng");
resp.addCookie(cookie02);
// 3.在指定项目下,可获取cookie对象(指定项目站点名:/s05)
Cookie cookie03=new Cookie("cc","CC");
cookie03.setPath("/ser05");
resp.addCookie(cookie03);
// 4.在指定项目的指定资源下,以获取cookie对象
Cookie cookie04=new Cookie("dd","DD");
cookie04.setPath("/zhongsheng/test");
resp.addCookie(cookie04);
Cookie 的 setPath 设置 cookie 的路径,这个路径直接决定服务器的请求是否会从浏览器中加载某些 cookie。
*
当前项目:站点名为:/zhongsheng
当前服务域名为:localhost:8080
设置路径:setpath (), 默认当前项目的站点名
setPath(“/zhongsheng”)
*
- 当前服务器下,任务项目的任意资源,都可获取 Cookie 对象
- serpath(“/”);
- 在当前项目下,可以获取 cookie 对象(默认)
- setPath(“/zhongsheng”)
- 在指定项目下,可获取 cookie 对象(指定项目站点名:/s05)
- setPath(“/s05”)
- 在指定项目的指定资源下,以获取 cookie 对象
setPath(“/zhongsheng/ser12”);
- 在指定项目的指定资源下,以获取 cookie 对象
HttpSesion 对象
对于服务器而言,每一个连接到它的客户端都是一个 session,servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。可以通过此接口查看和操作有关某个会话的信息,比如会话标识符、创建时间和最后一次访问时间。在整个 session 中,最重要的就是属性的操作。
session 无论客户端还是服务器端都可以感知到,若重新打开一个新的浏览器,则无法取得之前设置的 session,因为每一个 session 只保存在当前的浏览器当中,并在相关的页面取得。
Session 的作用就是为了标识一次会话,或者说确认一个用户;并且在一次会话(一个用户的多次请求)期间共享数据。我们可以通过 request.getSession () 方法,来获取当前会话的 session 对象。
//创建获取Session
HttpSession session =req.getSession();
//设置sessiony
标识符 JSESSIONID
Session 既然是为了标识一次会话,那么此次会话就应该有一个唯一的标志,这个标志就是 sessionld。
每当一次请求到达服务器,如果开启了会话 (访问了 session),服务器第一步会查看是否从客户端回传一个名为 JSESSIONID 的 cookie,如果没有则认为这是一次新的会话,会创建一个新的 session 对象,并用唯一的 sessionld 为此次会话做一个标志。如果有 JESSIONID 这个 cookie 回传,服务器则会根据 JSESSIONID 这个值去查看是否含有 id 为 JSESSION 值的 session 对象,如果没有则认为是一个新的会话,重新创建一个新的 session 对象,并标志此次会话;如果找到了相应的 session 对象,则认为是之前标志过的一次会话共享。
这里提到一个叫做 JSESSIONID 的 cookie,这是一个比较特殊的 cookie,当用户请求服务器时,如果访问了 session,则服务器会创建一个名为 JSESSIONID,值为获取到的 session (无论是获取到的还是新创建的) 的 sessionld 的 cookie 对象,并添加到 response 对象中,响应给客户端,有效时间为关闭浏览器。
所以 Session 的底层依赖 Cookie 来实现。
package com.shsxt.servlet.Session;
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的作用域
*
* 再一次会话中有效
* 通过setAttribute(name , value)方法向域对象中添加数据
* 通过getAttribute(name)从域对象中获取数据
* 通过removeArribute(name)从域对象移除数据
*
* request作用域
* 知在一次请求有效
* 只在请求转发跳转有效
* session作用域:
* 在一次会话中有效,会话中包含多次请求
* 在请求转发与重定向跳转后都有效
*
**/
@WebServlet("/ses02")
public class Session02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建获取Session
HttpSession session =req.getSession();
System.out.println("session02"+session.getId());
//request作用域
req.setAttribute("requestMsg","request的作用域");
//session作用域
session.setAttribute("sessionMsg","session的作用域");
//请求转发
// req.getRequestDispatcher("index.jsp").forward(req,resp);
//重定向
resp.sendRedirect("index.jsp");
}
}