ServletRequest和ServletResponse的总结

2024-04-18 05:58

本文主要是介绍ServletRequest和ServletResponse的总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.Servlet路径处理和特征

1.1 重定向

浏览器发送HTTP请求 ==> 服务器
服务器接收到请求之后 发送302状态码 新的location ==> 浏览器
浏览器收到302状态码 + location 按照新的location发送新的请求 ==> 服务器

特征:
    1. 该操作是浏览器行为
    2. 重定向最少存在两次的浏览器请求
    3. 重定向情况下,浏览器的地址栏会发生改变
    4. 重定向操作存在两个或者两个以上的请求,每一次新的请求,都会丢失之前的请求数据,也就是request对象【requeset作用域范围】
    5. 重定向可以访问任何资源,不管是当前WEB服务器资源,还是网络端的资源都是可以访问

 

1.2 代码展示

 

HTML代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>重定向展示</title>
</head>
<body><form action="RedirectServlet" method="post"><span>姓名:</span><input type="text" name="userName"><br><span>密码:</span><input type="password" name="paseword"><br><input type="submit" value="提交"></form></body>
</html>

 

jsp代码

 

<%--Created by IntelliJ IDEA.User: 刘朝阳Date: 2020/5/20Time: 15:57To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title></head><body><form method="get"><h1>重定向操作</h1></form></body>
</html>

java代码

package com.a_url;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 java.io.IOException;@WebServlet("/RedirectServlet")
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//请求和相应乱码问题解决req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");//获取用户提交的参数String userName = req.getParameter("userName");String password = req.getParameter("password");System.out.println(userName+":"+password);//重定向操作,重定向当前WEB Application中的index.jsp//重定向操作,要求浏览器访问https://www.baidu.com//resp.sendRedirect("https://www.baidu.com");resp.sendRedirect("index.jsp");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}

1.2 请求转发

浏览器发送HTTP请求 ==> 服务器
服务器接收到请求之后内部资源处理跳转 ==> 服务器其他资源
服务器其他资源处理完毕之后,才通过原始的请求和响应返回数据 ==> 客户端

特征:
    1. 转发是服务器行为
    2. 转发情况下浏览器有且只发送了一次请求
    3. 转发情况下浏览器的地址栏没有发生任何改变
    4. 转发情况下,浏览器的请求数据时被保存的,是通过request进行传递的
    5. 转发情况下有且只能转发WEB Application整个项目的内容资源

 

请求代码展示

DispatchServlet1

 

package com.a_url;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 java.io.IOException;/*** 转发演示,用户请求DispatchServlet1*/@WebServlet("/dispatch")public class DispatchServlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("用户请求DispatchServlet1,转发。。。。。。");//给Request对象加入一个属性,属性名 Tag 属性值  小刘req.setAttribute("Tag","小刘");// 转发到WEB Application内部资源// getRequestDispatcher("dispatch2") 指定的内部资源名字// forward(req, resp) 转发到指定资源,并且带有当前对应用户请求的request对象和response对象req.getRequestDispatcher("dispatch2").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}

 

DispatchServlet2

 

package com.a_url;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 java.io.IOException;/*** 转发目标DispatchServlet2*/
@WebServlet("/dispatch2")
public class DispatchServlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//DispatchServlet1 中存贮一个键值对数据在Request对象中,如果是同一个请求Request对象//可以取出相应的数据Object tag = req.getAttribute("Tag");System.out.println("DispatchServlet1 设置的Request对象Tag属性"+tag);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}

1.3 请求资源路径

 

浏览器输入: 
    http://localhost:8080/Day42/dispatch
    
HOST:
    http://127.0.0.1:8080
    
资源名:
    Day42/dispatch

Tomcat收到Day42/dispatch,资源请求之后,首先找到Day42项目或者说路径,然后在web.xml或者注解中找到url-pattern 为 dispatch的内容。从而执行对应的Servlet

url-pattern是存在匹配原则
    精确匹配
        /具体名字
    后缀名匹配
        *.do *.action 
        *.xxx  主要是按照规定结尾的url-pattern都可以触发对应的Servlet程序
    通配符匹配
        /* 匹配所有请求,服务器端所有资源都可以匹配

 

1.4 单Servlet实现多请求

 

    WEB Application中Servlet是整个WEB项目的核心,Servlet用于接收用户的请求,并且处理用户响应,每一个业务逻辑都有一个对应的Servlet,Servlet非常非常多,对于Servlet容器是存在一定压力的。
    采用Servlet做一个分发操作,分发用户去请求和对应的响应,让别人处理。Servlet程序做的事情就非常的Easy了
    
    需要对于用户请求的URL进行解析操作,通过一写特定的参数完成分发操作,让一个Servlet程序能够满足多个条件处理。
    
后缀名匹配:
    *.do匹配

 

单Servlet分发操作代码演示

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 java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;/*** 分发操作的Servlet,使用*.do匹配,并且解析操作,执行对应的方法** @author MI 2020/3/31 11:09*/
@WebServlet("*.do")
public class TransferServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String requestURI = req.getRequestURI();System.out.println(requestURI);String method = requestURI.substring(requestURI.lastIndexOf("/") + 1, requestURI.lastIndexOf("."));System.out.println(method);Class<ExecuteMethod> executeMethodClass = ExecuteMethod.class;Method method1 = null;try {method1 = executeMethodClass.getMethod(method);method1.invoke(null);} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

 

 

 

/*** 目标执行方法** @author MI 2020/3/31 11:10*/
public class ExecuteMethod {public static void add() {System.out.println("Add Method");}public static void delete() {System.out.println("Delete Method");}public static void update() {System.out.println("Update Method");}public static void select() {System.out.println("Select method");}
}

 

 

 

2. ServletContext Servlet上下文对象

 

2.1 ServletContext 概述

    Servlet上下文对象,当WEB Application启动时,Tomcat服务器会根据web.xml以及注解方式,创建一个唯一的ServletContext对象,包含整个项目中很多核心的资源数据,并且是一个整个WEB Application的【公共区域】,所有的Servlet程序和JSP程序都可以使用ServletContext中存储的数据。当WEB Application项目关闭时,ServletContext对象被销毁

2.2 如何获取ServletContext 对象

方式一:GenericServlet可以通过getServletContext方法获取
方式二:ServletConfig接口中提供了getServletContext方法获取
方式三:HttpSession提供getServletContext方法获取
方式四:HttpServletRequest提供getServletContext方法获取

2.3 ServletContext对象操作演示

ServletContext对象特征1. 唯一性,不管通过哪一个方式获取,都是同一个对象2. WEB Application启动时加载创建,退出时销毁3. ServletContext中存储的数据时一个共享资源,使用小心4. ServletContext是一个【域对象】

 

import javax.servlet.ServletContext;
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;/*** @author MI 2020/3/31 11:28*/
@WebServlet("/TestServletContext")
public class TestServletContext extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 可以直接通过当前Servlet对象来获取对应的ServletContext数据 【墙裂推荐】ServletContext servletContext1 = this.getServletContext();// 2. 通过ServletConfig对象获取对应的ServletContext对象ServletContext servletContext2 = this.getServletConfig().getServletContext();// 3. 通过Request请求对象获取对应都是ServletContext对象ServletContext servletContext3 = req.getServletContext();// 4. 通过HtttpSession对象获取ServletContext对象HttpSession session = req.getSession();ServletContext servletContext4 = session.getServletContext();System.out.println(servletContext1 == servletContext2);System.out.println(servletContext2 == servletContext3);System.out.println(servletContext3 == servletContext4);/*有效方法1:获取当前项目的发布路径*/System.out.println(servletContext1.getRealPath("/"));/*有效方法2:获取服务器版本号可以资源的根目录*/System.out.println(servletContext1.getServerInfo());System.out.println(servletContext1.getContextPath());/*有效方法3:作为数据传递的容器*/servletContext1.setAttribute("Tag", "骚磊");/*有效方法4:ServletContext 刚刚区域数据存储还是删除*/System.out.println(this.getServletContext().getAttribute("Tag"));this.getServletContext().removeAttribute("Tag");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
 

3. HttpServletRequest对象

 

    HttpServletRequest对象是有服务器根据用户的请求创建得到,一个请求对应一个Request对象。
​
继承关系interface ServletRequest--| interface HttpServletRequestTomcat完成的符合HttpServletRequeset接口的实现类对象,对应Requeset----| org.apache.catalina.connector.RequestFacade
​
Request对象中存在一大堆的方法
方法名功能
getMethod()获取请求方式 GET or POST
getRequestURL()获取用户访问浏览器的完整路径
getRequestURI()获取用户请求资源名
getContextPath()获取虚拟目录名 Application Context
getQueryString()GET请求的所有参数,POST请求通过请求实体无法获取
getProtocol()获取当前使用的网络传输协议 HTTP/1.1
getRemoteAddr()获取客户端IP地址
getRemoteHost()主机地址
getRemotePort()用户请求当前资源的端口号
getRemoteUser()用户名字
Enumeration<String> getHeaderNames()获取所有请求头名字
getHeader(String)获取指定请求头名称对应的值

请求参数相关方法【重点】

方法功能
String getParameter(String)根据指定的参数名获取对应的值,返回值类型为String
Enumeration<String> getParameterNames()获取所有参数的名字
String[] getParameterValues(String)获取指定参数名对应的字符串数组参数值 例如: 多选
Map<String, String[]> getParameterMap()获取当前Request请求中所有参数和参数值的Map双边队列,而且可以存着数组形式【框架常用】

5. HttpServletResponse

    用户发送请求到服务器,服务器会对应当前用户的请求针对性的提供的响应,对应的就是HttpServletResponse对象服务器可以通过response对象发送响应告知浏览器,浏览器可以根据服务器响应数据进行解析操作。
方法功能
setContentType()设置当前响应返回数据类型
PrintWriter getWriter()字符流对象
setHeader(name, value)设置响应头信息
setStatus(int)设置当前页面的状态码
getOutputStream()输出字节流对象

 

 

 

 

 

 

 

 

这篇关于ServletRequest和ServletResponse的总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913944

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

暑期学习总结

iOS学习 前言无限轮播图换头像网络请求按钮的configuration属性总结 前言 经过暑期培训,完成了五个项目的仿写,在项目中将零散的内容经过实践学习,有了不少收获,因此来总结一下比较重要的内容。 无限轮播图 这是写项目的第一个难点,在很多项目中都有使用,越写越熟练。 原理为制造两个假页,在首和尾分别制作最后一页和第一页的假页,当移动到假页时,使用取消动画的方式跳到