dopost,doget,response,request ,cookie,session,servletContext必须了解servlet的信息

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 优先过滤

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值