5. Servlet应用
request:客户端会将所有的请求放入request中等待服务器的响应
response:服务器接收到客户端发出的请求会将做出的响应存入response中
get:发出请求的方法,不安全,提交的数据可见 ,get请求可以缓存,后退页面不会提交
post:较为安全,提交的数据不可见,post 请求不可缓存,后退页面会重新提交
为什么要重写doPost,doGet方法:处理客户端发出的请求, 就是HttpServlet 做了一次封装会判断 HTTP 请求的类型,如果是 get 请求就调用 doGet()方法,如果是 post 请求就调用 doPost()方法。
使用Post控制台会出现乱码:由于客户端是以UTF-8字符进行编码,因此服务器端也要以UTF-8编码
解决方案:使用从ServletRequest接口继承而来的setCharacterEncoding(charset)方法进行统一编码
req.setCharacterEncoding("utf-8")
response响应数据出现乱码问题
resp.setContentType("text/html;charset=utf-8");
5.1 request实现转发跳转
转发定义:转发是作用在服务器上的,是让服务器接收到操作后将请求发给其他的资源,来共同完成一次请求
页面跳转
//跳转代码
request.getRequestDispatcher("/目标URL-pattern").forward(request,response);
- 使用forward跳转时,是在服务器内部跳转,地址栏不会发生改变,属于同一次请求
- forward 中request 的作用域:拥有存储数据空间,作用范围是一次请求有效(一此请求可以多次转发)
- 可以传递任何基本数据类型
- 存数据,以键值对形式进行存储在request作用域中。key 为String类型,value为Object 类型
- 取数据,通过String类型key访问Object类型value
数据传递
//存数据
request.setAttribute(key,value);
//取数据
request.setAttribute(key)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGSle6KG-1657189602286)(D:\浏览器下载文件\转发和重定向.png)]
重定向:
重定向是作用在客户端,请求发送给服务器,服务器会发送一个新的请求地址,客户端重新发送请求
例:就好比你打电话给A,A在给你一个B的电话让你打
页面跳转代码
//跳转代码
response.sendRedirect("目标URL");
数据传递
- sendRedirect 跳转时,地址栏改变,属于两次请求
- response没有作用域
- 传递数据:通过URL的拼接进行传递(“/webproject/b?username = tom”); 一般不用
- 获取数据:request.getParameter(“username”); 只能获取String类型的数据,不推荐
总结:当两个servlet要传递数据时,选择forward转发,不建议使用sendRedirect进行传递
5.2 servlet生命周期
实例化:只执行一次
初始化:只执行一次,init()
服务:接受请求,响应结果 ,servletConfig getServletConfig()
销毁:destory()
5.3 Cookie:(客户端)
使用目的:记录用户一次请求时的状态
理解:cookie就是一个记录客户端与服务器的一次请求标记,初次访问,便会生成一个cookie,表示该信息的name,value组成
创建cookie:
Cookie ck = new Cookie("code",code);
ck.setPath("/webs");//设置cookie的路径,指定某一个servlet访问/项目名称/具体的servlet name
ck.setMaxAge(-1);//内存存储,取值有三种,<0 内存存储,默认-1,=0 关闭浏览器就消失, >0 cookie村在的有效期
response.addCookie(ck);//添加到response对象中,响应时发送给客户
获取cookie:用数组for循环遍历
//获取Cookie
Cookie[] cks = request.getCokkie();
//遍历cookie
if(cks! = null){
for(Cookie ck : cks){
System.out.println(cks.getName()+""+cks.getValue())
}
}
//避免面空指针异常
修改cookie:
在另一个servlet中创建同名cookie两者访问时会发生覆盖
//创建Cookie
Cookie ck01 = new Cookie("username",liu);
ck01.setPath("/webs");//设置cookie的路径,指定某一个servlet访问/项目名称/具体的servlet name
ck01.setMaxAge(-1);//内存存储,取值有三种,<0 内存存储,默认-1,=0 关闭浏览器就消失, >0 cookie村在的有效期
response.addCookie(ck01);//添加到response对象中,响应时发送给客户
Cookie 编码与解码
//设置中文编码识别,控制台正常输出cookie信息
Cookie ck01 = new Cookie("姓名",URLEncoder.encode("张三","UTF-8");
//获取cookie的servlet时
System.out.println(URLDecoder.decode(cks.getName())+""+URLDecoder.decode(cks.getValue()))
Cookie 优缺点:
优点
- 可以配合知到期规则
- 简单性
- 数据持久性
缺点
- 传输数据小,一般只有4-8K
- 安全性不高,容易被篡改
- 浏览器会禁用cookie
5.4 Session对象:(服务器端)
使用目的: 是一次会话记录,用于记录用户的状态,session在一段时间内,客户端与web服务器交互的过程。在一个session中客户可能会多次访问同一个资源,也可能会访问各种不同的服务器。
- session是由服务端创建的,每一次会话都会分配一个session,并创建cookie存储sessionId发送给客户端
- 同一个浏览器发生的请求属于同一次会话
获取session:
//获取session
HttpServlet session01 = request.getSession();
System.out.println(""+session01.getId);
保存数据:
//以键值对的方式存储数据,attribute 只识别String,所以强转
String string = (String)session.setAttribute("username",盘潘)
移除session:
//移除session
session01.removeAttribute("username");
session生命周期
- 第一次请求就会产生
- 浏览器关闭或session超时,旧的会话自动销毁,开启则会创建一个新的会话
- session.invalidate() 手工销毁,时效设置 :session.setMaxInactiveInterval(10*10); 100秒后失效
一些浏览器会禁用cookie解决办法
- 服务器可以使用URL重写的方式lai发送sessionId
实现URL重写
HttpSession session01 = request.getSessio();
String newURL = response.encodeRedirectURL("/新的地址");
System.out.println(newUr1);
response.sendRedirect(newURL1);
request和session的区别:request一次请求有效,请求改变,request改变,session一次会话有效,浏览器改变,session改变。
5.5 ServletContext对象
使用目的:全局对象,作用域,是对于一个tomcat应用
当web服务器启动时,会为每一个web应用程序创建一块共享的存储区,服务器启动时创建,关闭时销毁
//获取方式
ServletContext servletContext = this.getServletCOntext();
//通过request获取
ServletContext servletContext = request.getServletContext();
//通过session获取,先创建sesion对象,不推荐使用
HttpSession session = request.getSession();
ServletContext servletContext2 = session.getServletContext();
ServletContext作用
- 获取真实路径
//强转String
String reaplath = servletContext.getRealPath();
- 获取上下文路径
System.out.println(servletContext.getContextPath());
System.out.println(request.getContextPath());
- 作为全局容器,存数据取数据
servletContext.setAttribute("name",value);
servletContext.getAttribute("name");
servletContext.removeAttribute("name");
- 特点:只对一个应用有效,生命周期只要容器不关闭或不卸载,servletContext就存在
6. 过滤器
目的:解决代码冗余,多个servlet要重写重复的一些代码(乱码设置等)
概念:是处于客户端与服务器目标资源之间的一道过滤技术
过滤器的作用:
- 执行地位在servlet执行之前,客户端发送请求时,会先经过Filter,在达到目标servlet中,响应时会根据执行流程再次返回执行Filter
- 可以解决多个servlet共性代码冗余问题
过滤器的编写:创建一个servlet重写如下方法:servlet API提供一个Filter接口
package com.pan.servlectproject.utils;
import javax.servlet.*;
import java.io.IOException;
@webFilter(value = "/Myservlet")
public class DbUtils implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("----myFilter----");
//请求继续
filterChain.doFilter(servletRequest,servletResponse);
//响应后继续运行
System.out.println("继续运行");
}
@Override
public void destroy() {
}
}
过滤器的注解配置
自定义在Filter类上使用注解**@webFilter(value= “/过滤目标资源”)**
拦截路径
- /index.jsp /servlet
- *.jsp *.html 等
- /*
如果有web.xml 优先过滤