Servlet
一:什么是Servlet?
浏览器访问服务器获取资源的时候,其中数据是通过java实现Servlet的类来获取的。继承了Servlet的类可以与前端进行交互。
实现Servlet接口的类被称为Servlet资源
二:Servlet接口中的5个重要方法:
1. 被创建:执行init方法,只会执行一次 (说明Servlet只会被创建一次,是单例模式)
2. 被调用:执行service方法,没调用一次就执行一次
3. 被销毁:执行destroy方法,当tomcat正常关闭时调用,也只会调用一次
4. 获取Servlet配置对象:getServletConfig(了解)
5. 获取Servlet信息:getServletInfo(要十分了解) ,版本、作者等.
三:注解配置
java中需要和前端交互的类是需要配置一个虚拟路径的,方便找到。使用注解就可以配置。
在类上使用@WebServlet(urlPatterns = " ",loadOnStartup = 0) 其中第一个是虚拟路径,第二个是创建时机,如果不写创建时机的话直接传入虚拟路径字符串就可以
四:路径的定义规则
1. /xxx :一直在用
2. /xxx/xxx:多层路径,也叫做目录结构
3. *.do :所有的以.do结尾的请求。 不要加/。
演示
1. /xxx/xxx :
@WebServlet("/user/demo4")
@WebServlet("/user/*")
@WebServlet("/*"):注意:*的优先级最低
2. /*.do
@WebServlet("*.do")
五:HttpServlet:Servlet的替代品,是Servlet的实现类,比Servlet要好。
浏览器向服务器请求数据时会根据需求的不同请求方式也不同,HttpServlet里有各种请求所对应的方法,比如get 对应doGet方法。
六:在继承HttpServlet的class中获取前端请求的页面信息
例:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
不论是对应哪种请求方式的方法,其中都有2个参数,一个是前端传来的各种信息(req),另一个可以向前端响应信息(resp)。
1:req中的一些方法:
获取请求行的信息:
(1)req.getMethod() //获取请求方式
(2)req.getContextPath() //获取虚拟目录
(3)req.getServletPath() //获取Servlet路径
(4) req.getQueryString() //获取get方式的请求参数
(5)req.getRequestURI() //获取请求的uri(从虚拟路径开始)
(6) req.getRequestURL() //获取请求的uri(从ip开始)
(7)req.getProtocol() //获取协议和版本
(8)req.getRemoteAddr() //获取客户端的ip地址
获取请求头的信息:
(1)req.getHeader(String str) //获取传入的名称的信息
(2)req.getHeaderNames() //获取所有的头信息,返回值是Enumeration<String>
获取请求体的信息:
1. String getParameter(String name) :根据参数名称获取参数值。
如:username=zhangsan 传入username就可以得到zhangsan
2. String[] getParameterValues(String name) :根据参数名称获取参数值的数组
适用于多选的情况,如:hobby=xxx&hobby=bbb&hobby=ccc
3. Enumeration<String> getParameterNames() :获取所有的请求参数名称
获取这些么名称的方式跟刚才一样,遍历Enumeration
4. Map<String,String[]> getParameterMap() :获取所有的参数的Map集合
key:参数名称 String类型
value:参数的值 String[]类型
2:resp中的方法
(1): resp.setStatus() //设置状态码
(2): resp.setHeader() //设置响应头
(2): resp.getWriter().writer() //字符输出
七:乱码问题:
1:前端传来的请求信息乱码问题:
get方式在Tomcat8以及更高版本自动解决
post需要在方法第一行设置request.setCharacterEncoding("utf-8");
2:Servlet资源向页面输出汉字时的乱码
设置编码格式和浏览器一致即可
resp.setCharacterEncoding("gbk")
八:转发:
有时候前端向服务器请求资源时,一个Servlet资源无法完成全部需求,会跳转到其他Servlet资源完成其余需求,这就是转发
语法:req.getRequestDispatcher(要转发到的Servlet资源路径).forward(req,resp);
特点:
1. 浏览器不会发生 变化
2. 只能转发到当前服务器的内部资源中
3. 转发是一次请求(在浏览器中按f12看请求的次数)
九:重定向
有时候前端向服务器请求资源,请求的Servlet资源无法完成需求,返回路径让前端向其他Servlet资源请求,这就是重定向
语法:resp.sendRedirect(服务器虚拟路径/Servlet资源路径)
特点:
1. 冲定向地址栏会发生变化(地址会显示最后请求的资源路径)
2. 重定向可以请求当前服务器之外的资源
3. 重定向是两次请求,无法使用request域对象来共享数据
十:reques域
我们使用请求转发,很可能多个Servlet之间需要共享数据才能完成某一个功能,可以使用域对象来完成共享
1:request域:在转发的Servlet资源中共享数据
语法:(1):setAttribute(key,value) //添加数据
(2):getAttribute(key) //获取数据
(3):removeAttribute(key) //删除数据
十一:ServletContent
ServletContent:servlet上下文,整个项目都可以共享其中的数据,可以用于Servlet之间的通信和跟服务器进行通信(ServletContent对象在应用中是唯一的)
功能:1:获取MIME类型
例:String img = "a.jpg"
System.out.print(this.getServletContext().getMimeType(img)) //打印 image/jpeg
2:作为域对象来共享数据
(1)设置数据 setAttribute()
(2)获取数据 getAttribute()
(3)删除数据 removeAttribute()
3:获取服务器资源文件的真实路径
getRealPath()
获取ServletContent对象的方式:
1:通过request对象获取:request.getServletContent()
2:通过HttpServlet来获取:this.getServletContent()
十二:Cookie
Cookie是存储在浏览器上的一些信息
特点:1:Cookie存在客户端浏览器上,相对来说不太安全,别人拿到你的Cookie会泄露信息
2:大小有限制,一般是4k
3:同一个域下的Cookie个数也有限制,一般是40个
作用:1:一般存储少量且不重要的信息
2:在不登录的情况下完成用户认证
3:记住账号之类的
添加Cookie:
Cookie coo = new Cookie(key,value);
resp.addCookie(coo)
获取Cookie:
Cookie[] coo = req.getCookies();
设置Cookie存储的时间:
resp.setMaxAge(秒数,也可以设置日期)
十三:Session
概念:服务器端会话技术,在一次会话中多次请求间共享数据,将数据保存在服务器端的的对象中。HttpSession
同一个会话中,只有一个Session对象
原理:会话第一次,创建一个Session对象,然后分配一个id给他。响应前端时,将id以Cookie的形式发送给前端,接下来每次都通过id寻找对应的Session对象
细节:1、一般浏览器关闭之后下次就不是同一个Session了,因为Cookie里的id没了,可以设置Cookie时间存储时间来获得同一个Session对象
2、客户端不关闭,服务器关闭,下次就不是同一个Session对象了,但数据不会丢失。因为Tomcat自带有钝化技术和活化技术
(1)钝化:在服务器关闭之前,将Session对象序列化在磁盘上
(2)活化:在服务器启动后,将磁盘上的Session文件转化为内存中的Session对象
3:Session什么时候被销毁?
(1). 服务器关闭
(2). sessoin对象调用invalidate();
(3). session默认失效时间30分钟
特点:没有大小限制且安全
可以存储任意类型任意大小的数据
可以将一次会话的多次请求的数据存储在服务器上
获取Session对象:
HttpSession se = req.getSession();
设置数据:
setAttribute(key,value)
获取数据:
getAttribute(key)
删除数据:
removeAttribute(key);